一、什么是PWM
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制。通过控制高低电平在一个周期内的占比从而输出一定的电压。
向上计数原理介绍
PWM的一个周期
- 定时器从0开始向上计数
- 当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平
- t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平
- 当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程
- 至此一个PWM周期完成
二、定时器介绍
SMT32F1系列共有8个定时器:
高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。
SMT32F4系列共有15个定时器:
高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14);基本定时器(TIM6、TIM7)。
STM32的每个通用定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。
STM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM输出。其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出
三、PWM的工作模式:
PWM模式1(向上计数) :计数器从0计数加到自动重装载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器溢出事件
PWM模式2(向下计数) :计数器从自动重装载值(TIMx_ARR)减到0,然后重新从重装载值(TIMx_ARR)开始递减,并且产生一个计数器溢出事件
设置寄存器TIMx_CCMR1的OC1M[2:0]位来确定PWM的输出模式
PWM模式1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
PWM模式2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
四、代码配置
(1) 查看stm32F407ZG的数据手册,发现LED灯使用的定时器14通道1
(2) 查看TIM14挂载在哪条总线上,TIM14挂载在APB1
(3) 配置为PWM1模式
(4)代码配置
HAL_TIM_PWM_Start(&htim14,TIM_CHANNEL_1); //在初始化部分使用:启动PWM__HAL_TIM_SetCompare(&htim14,TIM_CHANNEL_1,500);//在需要调节占空比的时候使用,改变占空比
//呼吸灯代码
HAL_TIM_PWM_Start(&htim14,TIM_CHANNEL_1); //启动PWM
while (1)
{for(int i=0;i<1000;i++){__HAL_TIM_SetCompare(&htim14,TIM_CHANNEL_1,i);HAL_Delay(1);}for(int i=1000;i>0;i--){__HAL_TIM_SetCompare(&htim14,TIM_CHANNEL_1,i);HAL_Delay(1);}}