一、PWM简介
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出!
- PWM相关概念
- 占空比:就是输出的PWM中,高电平保持的时间 与 该PWM的时钟周期的时间 之比
如,一个PWM的频率是2000Hz,那么它的时钟周期就是0.5ms,就是500us,如果高电平出现的时间是200us,那么低电平的时间就是300us,那么占空比就是2:5。 - 分辨率也就是占空比最小能达到多少,如8位的PWM,理论的分辨率就是1:255(单斜率), 16位的的PWM理论就是1:65535(单斜率)。
- 双斜率 / 单斜率
假设一个PWM从0计数到80,之后又从0计数到80… 这个就是单斜率。
假设一个PWM从0计数到80,之后是从80计数到0… 这个就是双斜率。
可见,双斜率的计数时间多了一倍,所以输出的PWM频率就慢了一半,但是分辨率却是1:(80+80) =1:160,就是提高了一倍。
二、用STM32F103输出一路PWM波形
- 博主直接使用的是正点原子的PWM输出实验的例程,采用定时器方法输出PWM波形,完整工程下载地址。
- 定时器 TIM3 的 PWM原理
要使 STM32 的通用定时器 TIMx 产生 PWM 输出,我们会用到 3 个寄存器来控制 PWM 。 - 首先是捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有 2 个,TIMx _CCMR1和 TIMx _CCMR2。TIMx_CCMR1 控制 CH1 和 2,而 TIMx_CCMR2 控制 CH3 和 4
该寄存器的有些位在不同模式下,功能不一样,所以在图 14.1.1 中,我们把寄存器分了 2层,上面一层对应输出而下面的则对应输入。 - 捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入输出通道的开关
该寄存器比较简单,我们这里只用到了 CC2E 位,该位是输入/捕获 2 输出使能位,要想PWM 从 IO 口输出,这个位必须设置为 1,所以我们需要设置该位为 1 - 最后,我们介绍一下捕获/比较寄存器(TIMx_CCR1~4),该寄存器总共有 4 个,对应 4 个输通道 CH1~4。因为这 4 个寄存器都差不多,我们仅以 TIMx_CCR1 为例介绍。
在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果产生相应动作。利用这点,我们通过修改这个寄存器的值,就可以控制 PWM 的输出脉宽了。 - 正点原子的PWM输出经过重映射后在PB5输出,我们使用示波器观察PB5输出波形
- 也可以使用KEIL 5自带的仿真观察输出波形
https://blog.csdn.net/nsnsnbabsb/article/details/111868732
参考资料
1、PWM波的介绍