0、本文要点
1、PWM简介
1.1 PWM定义
PWM关键词:脉冲宽度&占空比+周期&频率
PWM是脉冲宽度调制(Pulse Width Modulation)的缩写,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。通过调整脉冲的宽度和周期,PWM可以模拟出不同的电压或功率级别。
周期: 一个脉冲信号的时间 1s内测周期次数等于频率
脉宽时间: 高电平时间应用领域:电机控制、LED亮度调节、音频信号生成等
1.2 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频率越大,相应越快
2、PWM详解
2.1 看图说话
下图为向上计数模式:
- 在PWM输出模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)。
- 当CNT小于CCRx时,TIMx_CHx通道输出低电平;
- 当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平。
如上图PWM的一个周期:
- 定时器从0开始向上计数
- 当0-t1段,定时器计数器TIMx_CNT值 < CCRx值,输出低电平
- t1-t2段,定时器计数器TIMx_CNT值 > CCRx值,输出高电平
- 当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程
- 至此一个PWM周期完成
总结:
每个定时器有四个通道,每一个通道都有一个捕获比较寄存器
TIMx_ARR寄存器确定PWM频率,TIMx_CCRx寄存器确定占空比
将寄存器值和计数器值比较,通过比较结果输出高低电平,便可以实现脉冲宽度调制模(PWM信号)
2.2 寄存器级别详解
若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。
而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。
如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1)。
PWM的工作模式:
- 向上计数:计数器从0计数加到自动重装载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器溢出事件
- 向下计数:计数器从自动重装载值(TIMx_ARR)减到0,然后重新从重装载值(TIMx_ARR)开始递减,并且产生一个计数器溢出事件
2.3 PWM的工作过程
1、CCR1寄存器:捕获/比较值寄存器:设置比较值;
计数器值TIMx_CNT与通道1捕获比较寄存器CCR1进行比较,通过比较结果输出有效电平和无效电平
- OC1REF=0 无效电平
- OC1REF=1 无效电平
2、TIMx_CCMR1寄存器:OC1M[2:0]位:用于设置PWM模式
110:PWM模式1
111:PWM模式2
3、CCER寄存器:CC1P位:输入/捕获1输出极性。
- 0:高电平为有效电平
- 1:低电平为有效电平
4、CCER寄存器:CC1E位:输入/捕获1输出使能。
- 0:关闭使能
- 1:打开使能
5、输出电平信号
3、面试题目
1.PWM如何配置使用?
2.PWM遇见毛刺信号如何处理?
3.讲一下PWM占空比的概念?PWM除了占空比还有什么要素?
4.如何使用定时器来输出PWM波?
1.初始化定时器
2.配置定时器通道:选择要用于输出PWM的定时器通道。每个定时器通道可以控制一个PWM输出引脚。配置包括设置通道的工作模式、输出极性等。
3.设置PWM参数,根据需要设置PWM的频率和占空比。频率可以通过调整定时器的计数值来实现
4.启动定时器