
所用工具: 1、芯片:STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE:MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 " ~# g$ H. w# d 知识概括: 通过本文您将学到:
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 3 j# z& U' {( H/ H" f& h+ w/ M& B 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输出。 1 H- ?) v5 p# D 原理讲解: 下图为向上计数模式: 4 |8 A8 |8 J) S$ e/ Z0 R* L" [
PWM的一个周期:
总结:每个定时器有四个通道,每一个通道都有一个捕获比较寄存器, 将寄存器值和计数器值比较,通过比较结果输出高低电平,便可以实现脉冲宽度调制模式(PWM信号)。TIMx_ARR寄存器确定PWM频率,TIMx_CCRx寄存器确定占空比。 若配置脉冲计数器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时,输出低电平(或高电平)。3 o: h; W+ V3 o2 v: \4 Z9 q: _ 如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1)。
设置寄存器TIMx_CCMR1的OC1M[2:0]位来确定PWM的输出模式:
在两种模式下TIMx_CNT(计数器当前值)与TIMx_CCR1(捕获/比较值) 只是决定是有效电平还是无效电平。有效电平可以是高电平也可以是低电平,这需要结合CCER寄存器的CC1P位的值来确定。 PWM的工作过程
1、CCR1寄存器:捕获/比较值寄存器:设置比较值。 计数器值TIMx_CNT与通道1捕获比较寄存器CCR1进行比较,通过比较结果输出有效电平和无效电平。
2、TIMx_CCMR1寄存器:OC1M[2:0]位:用于设置PWM模式。
3、CCER寄存器:CC1P位:输入/捕获1输出极性。
4、CCER寄存器:CC1E位:输入/捕获1输出使能。
5、输出电平信号。 # O. d; ?3 m6 K# k/ e1 L0 p TIM定时器的四路通道TIMx_CHx输出PWM![]() 摘自:《STM32中文参考手册》254页 通用定时器框图 ![]() 具体不同定时器对应引脚在对应芯片数据手册的引脚说明(pin description) 中查看,这里我们以TIM3_CH1 PA6作为讲解。 $ R- l& d6 R0 y# {, q 工程创建过程1.设置RCC 设置高速外部时钟HSE 选择外部时钟源 3 S7 s! P# ]0 j2 `
2.设置定时器 ![]() S% k. d+ V- _" G W) C: p ) o0 ]$ {, [5 l9 _! r
Channel1~4 就是设置定时器通道的功能:
在 Parameter Settings 页配置预分频系数为 71,计数周期(自动加载值)为 499,定时器溢出频率,即PWM的周期,就是 72MHz/(71+1)/(499+1) = 2kHz。 PWM频率:
6 w, b3 X% Q& U& b- g- K2 n 占空比:
5 |# l+ W0 |$ }1 M 比如: 定时器频率Tclk = 72Mhz,arr=499,psc=71,那么PWM频率就是720000/500/72= 2000Hz,即2KHz。 如果arr=499,TIM3->CCR1=250,则pwm的占空比为50%。改CCR1可以修改占空比,修改arr可以修改频率。 ' d( W6 }. p& f$ `0 \3 D6 q# z 3.时钟源设置
32的时钟树框图 如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》 ! {) r# b0 z; r' K- |6 k( T5 V
4.项目文件设置 $ g+ y, V! I% T. F' @
5.创建工程文件 点击GENERATE CODE 创建工程。 新建的工程所有配置都是默认的 我们需要自行选择下载模式,勾选上下载后复位运行。 ![]() 3 {) W; o# w7 s 例程 这里我们创建一个呼吸灯的例程 定义变量:
" S5 F3 f6 Y) ]5 l; d1 Y) n. n7 d/ [ 使能TIM3的PWM Channel1 输出:
$ i5 |, l% Z" L+ a; ~1 Z 在while循环中添加代码:
) q4 t1 J" J! j& Q/ @ 或者直接修改CCRx寄存器的值:
实验现象如下: ![]() |
实战经验 | Keil工程使用NEAI库的异常问题
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化
【Hot!】STM32全系列开发板都支持Arduino开发,你知道吗?