stm32 生成PWM信号

STM32的通用定时器和高级定时器都能产生PWM信号,其中每个高级定时器可以产生7路的PWM(有3对是可以互补的),每个通用定时器都能产生4路PWM,这样算下来,STM32f103系列最多能产生30路PWM。
其实用库函数配置STM32并不难,可以很容易就生成PWM信号,但是如果想要了解深入一些,至少要大概知道某些比较重要的参数是由哪几个寄存器控制,这样其实在项目开发中调试起来也要有头绪一些。
这里就用高级定时器TIM1举例,产生一组互补带死区的PWM信号,如果高级定时器弄清楚了通用定时器更就不在话下了。为了便于总结,我事先写好了一个程序,用KEIL软件进行调试,然后看寄存器的值,这样更直观一些。从这个图上可以看出高级定时器一共有20个寄存器,其中CCMR1_Output和CCMR1_Input是一个寄存器,CCMR2_Output和CCMR2_Input是一个寄存器,这里只是分开表示。
stm32 生成PWM信号_第1张图片

ARR(auto-reload register)自动重装载寄存器,当定时器的时钟开启时这个值就默认为0xFFFF,图里的0x000004AF是程序里配置的,一个PWM脉冲周期为1200(这个1200只是一个计数值,不是实际的时间值)
PSC(prescaler)预分频寄存器,存储的是预分频值,这里分频值为3
PWM的频率为72M/(1200*3)=20KHz
CCMR1(Capture/Comprare Mode register)捕获/比较模式寄存器,这个寄存器配置成了0x00006868,根据这个CCMR寄存器定义图我们来分析在这个寄存器里主要完成了哪些事:
这里写图片描述
这里写图片描述
1)CC1S 这两位配置为00,说明通道1被配置成输出模式;
2)OC1FE 这个位是用来加快触发响应的,暂且不管它;
3)OC1PE这个位配置为1开启TIMx_CCR1寄存器的预装载功能,读写操作仅对预装载寄存器操作,TIMx_CCR1的预装载值在更新事件到来时被加载至当前寄存器中;
4)OC1M这三位配置为110, 说明我们配置成了PWM模式1: 在向上计数时,一旦TIMx_CNT < TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
这里写图片描述
CCER(Capture/Compare Enable Register)捕获比较使能寄存器配置为0x00000055,结合上面的定义图,可以看出:
1)CC1E这一位配置为1,通道1配置为输出;
2)CC1P配置为0,在这里定义高电平为有效电平(这里就是对CCMR寄存器里的有效电平做了定义,就是上一页标红色的地方)
CC1NE和CC1NP分别是配置通道1的互补输出和有效电平。
其他通道以此类推
这里写图片描述
BDTR(Break and Dead-time Register)刹车和死区寄存器配置
DTG这8位定义了互补信号之间的死区时间;
DTG[7:5]=0xx => DT=DTG[7:0] * TDTS;
DTG[7:5]=10x => DT=(64+DTG[5:0]) * 2 * TDTS;
DTG[7:5]=110 => DT=(32+DTG[4:0]) * 8 * TDTS; DTG[7:5]=111 => DT=(32+DTG[4:0]) * 16 * TDTS;
TDTS是多少呢,要在另一个寄存器里配置
这里写图片描述
CR1(Control Register)控制寄存器1配置为0x00000001,对照上面这个定义我们来分析:
1)CEN位为1,使能了计数器,这个不用过多解释;
2) UDIS为0,允许更新事件;
3)URS是跟中断或DMA有关,这里没用到暂不提;
4)OPM为0,更新事件时计数器不停(如果我们只需要单脉冲就要让计数器停止了)
5)DIR为0,计数器为向上计数模式;
这里写图片描述
6)CMS这两位为00,边沿对齐模式;
7) CKD这两位为00, 00: TDTS = 定时器频率
这个TDTS就是之前BDTR里控制死区时间的时间因子
CCR用来控制占空比
CNT用是计数器的值
SR是状态寄存器用来标记当前发生的事件或中断

你可能感兴趣的:(stm32开发)