新手必看!!附源码!!STM32通用定时器-比较输出PWM

一、什么是PWM?

PWM(脉冲宽度调制)是一种用于控制电子设备的技术。它通过调整信号的脉冲宽度来控制电压的平均值。PWM常用于调节电机速度、控制LED亮度、产生模拟信号等应用。

二、PWM的原理

PWM的基本原理是通过以一定频率产生的脉冲信号,通过调整脉冲的宽度(占空比)来模拟电压的不同电平。占空比是指脉冲高电平的时间占整个周期的比例。通过调整占空比,可以在输出端产生不同的电平,从而实现对电机、LED等设备的精确控制。

例如,对于一个50%占空比的PWM信号,脉冲的高电平时间占整个周期的一半,这将导致输出电平的平均值为一半的电压。通过调整占空比,你可以在0%到100%的范围内控制输出电平的变化。

三、PWM模式以及输出PWM原理

ARR: 自动重装载寄存器的值。
CCRx: 捕获/比较寄存器的值。

PWM波周期或频率由ARR决定,PWM波占空比由CCRx决定

(1)PWM模式1
在向上计数时,一旦CNT<CCRx 时输出为有效电平,否则为无效电平。
在向下计数时,一旦CNT>CCRx 时输出为无效电平,否则为有效电平。

如:
在这里插入图片描述
当CNT < CCRx,IO输出1。
当CNT >= CCRx,IO输出0。

在这里插入图片描述
当CNT <=CCRx,IO输出1。
当CNT > CCRx,IO输出0。

(2)PWM模式2
在向上计数时,一旦CNT>CCRx 时输出为有效电平,否则为无效电平。
在向下计数时,一旦CNT<CCRx 时输出为无效电平,否则为有效电平。
如:
在这里插入图片描述当CNT < CCRx,IO输出0。
当CNT >= CCRx,IO输出1。
在这里插入图片描述
当CNT <= CCRx,IO输出0。
当CNT > CCRx,IO输出1。

四、PWM极性设置

当极性为高 (TIM_OCPolarity_High) 时,不进行反相。即按pwm模式正常的去进行比较与输出。
当极性为低 (TIM_OCPolarity_Low) 时,输出通道在比较匹配时为低电平,相当于对输出信号进行反相。

如:pwm模式1向上计数。
设置高极性:当CNT < CCRx,IO输出1。 当CNT >= CCRx,IO输出0。
设置低极性:当CNT < CCRx,IO输出0。 当CNT >= CCRx,IO输出1。

五、配置PWM输出实验步骤

实验内容:将PC6复用为TIM3通道1,用于输出pwm。注:stm32的pwm输出引脚是使用的IO口的复用功能。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(1)具体代码1–寄存器:

    void PWM_Init_TIM3_CH1(u16 ccr)
{
	//1.初始化PC6引脚
	RCC->AHB1ENR |=(0x01 <<2); //开启GPIOC的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //开启AFIO时钟
	AFIO->MAPR |=(0x03 <<10); //定时器3 完全重映射
	
    GPIOC->CRL &= 0XF0FFFFFF;//PC6清0
    GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
      	
	//2.初始化基本定时器配置
	RCC->APB1ENR |= 1 << 1;      //使能TIM3时钟 
	TIM3->SMCR &=~(0x07 << 0);   //选择内部时钟源
	TIM3->CR1 &=~(0x03<<5);  //边沿对齐
	TIM3->CR1 &=~(0X01<<4); //设置为向上计数模式
	TIM3->CR1 |=(0x01 <<7);   //有影子,缓冲。
	
	TIM3->ARR = 99;//设定计数器主动重装值(决定PWM的频率)
	TIM3->PSC = 7199;//预分频器 0为不分频  
	
	//3.初始化输出通道
	TIM3->CCR1 =ccr;   //写入比较值
	TIM3->CCMR1 &=~(0x03 << 0) ;    //通道配置为输出功能
	TIM3->CCMR1 |=(0x01 << 3);    //有影子
	TIM3->CCMR1 &=~(0x01 <<7);    //OC1Ref不受ETRF输入影响。
	TIM3->CCMR1 &= ~0x07 <<4; 
	TIM3->CCMR1 |=(0x06 <<4); //PWM模式1
	
	TIM3->CCER &=~(0x01 <<1); //实际波形=参考波形。 不反相
	TIM3->CCER  |= (0x01 << 0);//输入/捕获1输出使能
	TIM3->EGR |=(0x01 <<0); //产生更新事件,将上面配置更新到影子寄存器
	TIM3->CR1 |= (0X01 << 0);//使能定时器3    
}

主函数:

int main()
{
  //pwm范围为0-ARR。 高低电平随着pwm模式不同而不同。
  //如比较值为90,pwm模式1向上计数,低于比较值90时,为高电平。
   PWM_Init_TIM3_CH1(90);  
   while(1)
  {
  
   }

}

(2)具体代码2–库函数

void TIM3_PWM_Init(u16 arr,u16 psc)
{      
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  qjl;//初始化定时器
	TIM_OCInitTypeDef TIM_OCInitsture;//设置定时器的pwm模式
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE); 
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	
	
	GPIO_Init(GPIOC, &GPIO_InitStructure);     
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
	
	qjl.TIM_Period = arr;    //设置自动重装载寄存器周期的值   ARR 
	qjl.TIM_Prescaler =psc;  //设置时钟频率除数的预分频值  
	qjl.TIM_ClockDivision =TIM_CKD_DIV1;  
	qjl.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
	TIM_TimeBaseInit(TIM3,&qjl);
	
	TIM_OCInitsture.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInitsture.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitsture.TIM_OutputState=TIM_OutputState_Enable;
	
	TIM_OC1Init(TIM3,&TIM_OCInitsture);
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_OC2Init(TIM3,&TIM_OCInitsture);
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);	
	TIM_Cmd(TIM3,ENABLE);		
}

主函数:

u16 dir=1;
u16 ledpwm=100;
int main(void)
{
	
    led_int();
	delay_init(); //延时函数初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设 置 NVIC 中 断 分 组 2
    TIM3_PWM_Init(899,0);
    uart1_init(115200);
	while(1)
	{	 
		delay_ms(2);
		 if(dir)
		 {
			 ledpwm++;
		 }
		 else
		 {		 
			 ledpwm--;
		 }
		 if(ledpwm>900)
			  dir=0;
		 if(ledpwm==0)
			  dir=1; 
		 TIM_SetCompare1(TIM3,ledpwm);
	}
 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/182507.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP 语法||PHP 变量

PHP 脚本在服务器上执行&#xff0c;然后将纯 HTML 结果发送回浏览器。 基本的 PHP 语法 PHP 脚本可以放在文档中的任何位置。 PHP 脚本以 <?php 开始&#xff0c;以 ?> 结束&#xff1a; <?php // PHP 代码 ?> 值得一提的是&#xff0c;通过设定php.ini的相…

Spring配置其他注解Spring注解的解析原理

Spring配置其他注解 Primary注解用于标注相同类型的Bean优先被使用权&#xff0c;Primary是Spring 3.0引入的&#xff0c;与Component和Bean一起使用&#xff0c;标注该Bean的优先级更高&#xff0c;则在通过类型获取Bean或通过Autowired根据类型进行注入时&#xff0c;会选用优…

什么是数据确权?

在数字化时代&#xff0c;数据已经成为一种新型资产&#xff0c;”新的石油“&#xff0c;具有巨大的价值&#xff0c;未来世界经济竞争一定程度上是数字经济的竞争&#xff0c;而非工业的竞争。数据相关法律制度&#xff0c;尚且还不完整&#xff0c;推动数字经济的发展&#…

YOLOv8训练自己的目标检测数据集

YOLOv8训练自己的目标检测数据集 目录标题 源码下载环境配置安装包训练自己的数据集数据集文件格式数据集文件配置超参数文件配置训练数据集命令行训练脚本.py文件训练 进行detect显示detect的效果 源码下载 YOLOv8官方的GitHub代码&#xff0c;同时上面也有基础环境的配置要…

VOC数据集和COCO数据集直接的相互转换

VOC数据集格式 get_list.py import os import random import shutil# 设置随机种子 random.seed(1000)# 判断Annotations和JpegImages是否对应 train_precent=0.8 label_path= "../../Annotations" print(os.path.abspath(label_path)) save="../Main" pr…

前端工程、静态代码、Html页面 打包成nginx 的 docker镜像

1. 创建一个 mynginx的目录 2. 将前端代码文件夹&#xff08;比如叫 front &#xff09;复制到 mynginx 目录下 3. 在mynginx 目录下创建一个名为Dockerfile 的文件&#xff08;文件名不要改&#xff09;&#xff0c;文件内容如下&#xff1a; # 使用官方的 Nginx 镜像作为基…

深度学习图像分类算法研究与实现 - 卷积神经网络图像分类 计算机竞赛

文章目录 0 前言1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

shell 脚本的函数和数组

函数 —— 封装的一个公式&#xff1a;sin、cos、tan —— 函数为脚本的别名 —— 函数就是一个功能模块&#xff0c;在函数中写执行的命令即可&#xff1b;使用函数可以避免代码重复&#xff0c;增加可读性&#xff0c;简化脚本&#xff0c;使用函数可以将大的工程分割为若…

教育数字化转型:塑造未来学习新范式

在国家教育数字化战略行动指引下&#xff0c;我国正积极推动数字化赋能教育高质量发展&#xff0c;以塑造教育发展的新优势。如今&#xff0c;随着科技新基建的普及和数字化赋能教育的深入推进&#xff0c;未来的教育模型正在逐渐形成。 在新的教育模型中&#xff0c;数字化学…

【python海洋专题四十七】风速的风羽图

【python海洋专题四十七】风速的风羽图 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Python海洋专题四】之水深地图图像修饰 【Pyth…

在一个页面里向两张表里插入内容时,有一些复杂的BUG简单化

向两张表里插入内容时&#xff0c;有一些复杂的BUG简单化 当在第一张表里的页面操作&#xff0c;在第一张表查询结果的页面进行编辑&#xff0c;在编辑的时候需要对第二张表里和第一张表都保存内容&#xff0c;而且插入之后两张表的id关联着&#xff0c;这个时候这张表的id就不…

IntelliJ IDEA 16创建Web项目

首先要理解一个概念&#xff1a;在IntelliJ IDEA中“new Project”相当于eclipse中的工作空间&#xff08;Workspace&#xff09;&#xff0c;而“new Module”相当于eclipse中的工程&#xff08;Project&#xff09;。以下均采用Intellij的说法&#xff0c;请自行对照转换理解…

C语言——从键盘输人一个表示年份的整数,判断该年份是否为闰年,并显示判断结果。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int year 0;printf("请输入年份&#xff1a;");scanf("%d",&year);if((year%4 0) && (year%100!0) || (year%400 0)){printf("%d是闰年\n",year);}else{p…

Using PeopleCode in Application Engine Programs在应用引擎程序中使用PeopleCode

This section provides an overview of PeopleCode and Application Engine programs and discusses how to: 本节概述了PeopleCode和应用程序引擎程序&#xff0c;并讨论了如何: Decide when to use PeopleCode.决定何时使用PeopleCode。Consider the program environment.考…

队列的实现和OJ练习(c语言)

目录 概念 队列的实现 利用结构体存放队列结构 为什么单链表不使用这种方法&#xff1f; 初始化队列 小提示&#xff1a; 队尾入队列 队头出队列 获取队头元素 获取队尾元素 获取队列中有效元素个数 检测队列是否为空 销毁队列 最终代码 循环队列 队列的OJ题 …

git clone -mirror 和 git clone 的区别

目录 前言两则区别git clone --mirrorgit clone 获取到的文件有什么不同瘦身仓库如何选择结语开源项目 前言 Git是一款强大的版本控制系统&#xff0c;通过Git可以方便地管理代码的版本和协作开发。在使用Git时&#xff0c;常见的操作之一就是通过git clone命令将远程仓库克隆…

SHAP - 机器学习模型可解释性工具

github地址&#xff1a;shap/docs/index.rst at master shap/shap (github.com) SHAP使用文档&#xff1a;欢迎使用 SHAP 文档 — SHAP 最新文档 SHAP介绍 SHAP&#xff08;SHapley Additive exPlanations&#xff09;是一种用于解释预测结果的方法&#xff0c;它基于Shapley…

好的程序员有什么特质呢?

程序员想要提升自己&#xff0c;一定要关注到工作中的方方面面。而一个好的程序员&#xff0c;一般都有这些特质&#xff1a; 弱者抱怨环境&#xff0c;强者改变环境 不要试图通过抱怨环境来获得工作环境上的改变&#xff0c;这不仅不会给你带来任何实质性的改变&#xff0c;…

一文详解Vue生命周期

Vue是一种流行的用于构建用户界面的渐进式JavaScript框架。Vue框架在开发过程中&#xff0c;特别强调对生命周期的理解和管理。通过使用生命周期钩子函数&#xff0c;开发者能够精确地控制Vue实例的创建、挂载、更新以及销毁过程。本文将对Vue的生命周期进行详细的介绍&#xf…

Nginx模块开发之http handler实现流量统计(1)

文章目录 一、handler简介二、Nginx handler模块开发2.1、示例代码2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 三、Nginx的热更新总结 一、handler简介 Handler模块就是接受来自客户端的请求并产生输出的模块。 配置文件中使用location指令…
最新文章