STM32 高级定时器 最近在研究电机,对TIM定时器研究了一些,将一些存在疑惑的问题,通过试验和示波器分析,得到以下结论,供大家学习参考
1.介绍输出电压高低判断
输出比较时:OC1对外输出电压为示波器可以读取的电压,也是我们最终使用的电压,在这个电压输出前,有很多的配置,如下图 在工作状态时,首先是设置模式。 对应这句TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM2; 比较方法满足后,就根据模式的判断输出相对应的参考电平,参考电平的高低是确定死的 ,相应的值通过你自己设置的比较模式去判断得到参考电平。
然后我们还会配置极性 对应这句 TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH; 极性就是确定参考电平的高低电压来了后,通过我们设置的极性为那种有效,最终决定最终对外输出的电压值值。
TIM_TimeBaseStructure.Init.CounterMode = TIM_COUNTERMODE_UP; 这句就是设置计数是递增还是递减、或者中心模式,也会决定参考电平的高低,详细看参考电平模式详解。
2.周期、频率
定时器计数器的频率计算 名称解释:
TIMxCLK (总线的频率F103 高级定时器72Mhz F407为84Mhz)
PSC :分频因子 一般设置10,系统会认为是11,所以设置时为 PSC=【(你期望的值)-1】 为啥是这个样子,系统设定的,详见参考手册
ARR :重装载寄存器,会影响占空比值,会影响定时器频率值,根据测试此值从0开始计算,所以会出现 ARR =【(你期望的值)-1】
#define PWM_PERIOD_COUNT (1000-1)
#define PWM_PRESCALER_COUNT (1680-1)
频率计算公式f=TIMxCLK/ ((PSC+1)*(ARR+1)) 按照上面代码的值 假设板卡为F407,定时器频率为84Mhz,定时器计数器计算下来的频率为50Hz,要区分定时器频率,这个是固有的,是通过时钟分配频率得出的,而我们调整的是在这个频率下,定时器计数器的频率值
3.占空比
占空比就是在一个周期内,高电平占整个周期的比例 例如周期为20ms的波(50Hz),占空比为50%,则高电平为10ms时长,至于那一段是高电平,这个是你自己的配置决定。
但在stm32配置的时候,运用的思想是这个,但是实际是一些区别的
我们看下面这段错误的代码
TIM_TimeBaseStructure.Init.CounterMode = TIM_COUNTERMODE_UP;
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.Pulse = 0.5/20.0*PWM_PERIOD_COUNT;
TIM_OCInitStructure.OCFastMode = TIM_OCFAST_DISABLE;
TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH;
TIM_OCInitStructure.Pulse = 0.5/20.0*PWM_PERIOD_COUNT; 设置占空比
PWM_PERIOD_COUNT 我们定义 #define PWM_PERIOD_COUNT (1000-1) 就是999
这个TIM_OCInitStructure.Pulse 目标就是设置舵机的占空比 舵机周期是20ms,0.5ms-2.5ms之间决定了自己的转的角度,在这个区间内输出高电平, 就得到你要转的角度 高电平只在0.5ms-2.5ms区间内输出高电平,其他周期内都是低电平。
周期通过PSC和ARR已经计算得出,这个周期继续被(ARR+1)划分,假设ARR为999,则计数器计一次的时钟就是20ms/1000 我们设定的Pulse就是决定在这个周期呢,有效电平的计数时长(最终有效电平对外输出高电平还是低电平,要看你的配置)
为什么上面那一段代码是错误的,实际中可能一些情况对比,是可以运行的 但是是错误的
我们假设要在20ms输出50%占空比高电平,需要持续10ms 则TIM_OCInitStructure.Pulse=500;就可以了
占空比=TIM_OCInitStructure.Pulse/(ARR+1) 那一段代码中ARR值是1000-1,所以分母错误,这一点在很多教程中都没有注意。高频率下问题就会体现,在低频率,因为值比较大,少一点体现不出来。
另外这个TIM_OCInitStructure.Pulse只能是整数 设置小数会被舍去小数点后面的值
如果我们要占空比37.5% 假设ARR=10-1 TIM_OCInitStructure.Pulse=3.75 占空比=TIM_OCInitStructure.Pulse/(ARR+1)在系统中会被设置为30%
那如何调整到37.5% 增大ARR的值,为了保证频率不变,再降低PSC的值 假设ARR=1000-1 TIM_OCInitStructure.Pulse=375 占空比=TIM_OCInitStructure.Pulse/(ARR+1)在系统中会被设置为37.5%
来张总结图
|