高级定时器输出PWM

主频144M,生成一个频率为1K,占空比为30%的PWM

详细代码参考EVT例程PWM_Output

重要参数说明

TIM_TimeBaseInitStructure.TIM_Period=100-1; 周期或叫重装值

TIM_TimeBaseInitStructure.TIM_Prescaler = 1440-1; 预分频

TIM_OCInitStructure.TIM_Pulse = 30; 比较值

 

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; 向上计数

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; PWM模式1

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 高电平是正极性

前三个数据和频率占空比相关

频率=Clock/((Prescaler+1)*(Period+1))=144M/(1440*100)=1K

占空比=Pulse/(Period+1)=30/100=30%

后三个和输出电平极性相关

如上配置时

定时器CNT计数为0 - 99

0 - 29为高电平

30 - 99为低电平

cubemx 高级定时器配置 高级定时器输出pwm_赋值

 

仅改变一个参数,波形产生的变化

向下计数对波形的影响:先出现低电平 占空比不变

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;

99 - 30为低电平

29 - 0为高电平

cubemx 高级定时器配置 高级定时器输出pwm_High_02

PWM模式2对波形的影响: 和PWM模式1互补关系 改变占空比

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

0 - 29为低电平

30 - 99为高电平

cubemx 高级定时器配置 高级定时器输出pwm_置位_03

低电平是正极性对波形的影响: 极性相反,互补关系

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

0 - 29为低电平

30 - 99为高电平

cubemx 高级定时器配置 高级定时器输出pwm_cubemx 高级定时器配置_04

 

实时改变频率、占空比

直接对寄存器赋值就可以改变三个参数

Period周期(重装值):TIM1->ATRLR=100-1;

Prescaler预分频系数: TIM1->PSC=1440-1;

Pulse比较值:TIM1->CH1CVR=30; CH1CVR表示通道1,不同通道数字不同,如CH2CVR表示通道2

3个参数都不能超过16位,最大65535

 

暂停PWM输出,强制拉高拉低

修改PWM模式就可以强制拉高拉低

使用这个库函数可以实现模式的切换

void TIM_ForcedOC1Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction)

其中OC1的1表示通道1,其他通道有各自的函数

 

强制拉高拉低模式:

TIM_ForcedAction_Active

TIM_ForcedAction_InActive

强制拉高拉低的电平仅和极性参数有关,当配置为TIM_OCPolarity_High则Active为高,InActive为低。反之则反之。

TIM_ForcedOC1Config(TIM1,TIM_ForcedAction_Active);

 

恢复输出PWM模式:

TIM_OCMode_PWM1

TIM_OCMode_PWM2

与之前配置的模式一致即可

TIM_ForcedOC1Config(TIM1,TIM_OCMode_PWM1);

 

其他模式:

其中常用的4种上面已经说明,另外4种模式补充说明一下

1. TIM_OCMode_Timing   冻结 保持实时的输出电平不再变化。

2. TIM_OCMode_Active

3. TIM_OCMode_Inactive  和强制拉高拉低的2个模式最终效果一致,时间上会等到计数值CNT=比较值CH1CVR时才强制拉高拉低,之后不变。

4. TIM_OCMode_Toggle   翻转  当计数值CNT=比较值CH1CVR时,翻转输出电平。当极性配置为TIM_OCPolarity_High初始状态是低电平,与计数方向无关。

 

PWM互补输出

具体代码参考EVT例程ComplementaryOutput_DeadTime

互补输出的意思是OC1和OC1N配置的极性相同时,输出高低电平正好相反。若极性相反,则输出相同。

 

死区时间

TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; Tdts大小设置(= 1/2/4 * TCK)

TIM_BDTRInitStructure.TIM_DeadTime = 0xFF;死区时间设置

DeadTime(如0xFF)的单位是Tdts(如1*TCK),Tdts的单位是定时器时钟(如144M)。为了死区时间有足够大的范围,配置是分区间的。如上配置时,实际的死区时间为0x3F0/144M=7us

0-0x7F       (0-0x7F)*Tdts             0-0x7F

0x80-0xBF     后5位(0-0x3F + 0x40 )*2* Tdts    0x80-0xFE

0xC0-0xDF     后4位(0-0x1F + 0x20 )*8* Tdts    0x100-0x1F8

0xE0-0XFF     后4位(0-0x1F + 0x20 )*16* Tdts   0x200-0x3F0

当定时器的输入时钟为144M时,两个参数设置为TIM_CKD_DIV4和0xFF,这是主频为144M的最大死区时间=0x3F0*4/144M=28us。

 

停止互补PWM,输出固定高低电平

单个PWM中的方法依旧管用,但是有一定局限性。此处使用设置空闲状态,可以独立设置2个停止时的输出电平。

配置参数修改:

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

配置空闲状态电平,Set为高电平,Reset为低电平,和极性、PWM模式等参数无关。

反向的参数中有个N,和正向的参数不一样,赋值时要注意


TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;

使能空闲状态


TIM_BDTRInitStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Disable;

关闭自动置位MOE,后面MOE作为PWM的开关


停止PWM,输出设定电平:

TIM1->BDTR&=~0x8000;

清零MOE位,进入空闲状态,输出设定电平


恢复PWM输出:

TIM1->BDTR|=0x8000;

MOE置1,OCx、OCxN正常输出PWM

 

刹车功能

配置BKIN输入引脚,比如TIM1的PB12配置为下拉输入,刹车输入的极性配置为高电平

TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable; 使能刹车功能

TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; 刹车极性为高电平

当PB12输入高电平时,PWM停止输出,进入空闲状态,如果开启自动置位MOE位,则当PB12输入恢复为低时,会继续PWM输出,如果关闭(Disable)则不会自动恢复输出PWM。

TIM_BDTRInitStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;