STM32中PWM移相:角度转定时器Ticks的最佳实现方法
目标:在STM32F303CBT6的TIM1与TIM8 PWM之间实现移相
实现方案
将TIM1/TIM8配置为主从模式,通过修改计数器值调整移相,示例代码:
TIM_SetCounter(TIM1, 0); // 0° 相位偏移 TIM_SetCounter(TIM1, 72); // 180° 相位偏移
问题背景与初始转换逻辑
需要将相位偏移角度转换为写入TIM_SetCounter的Ticks值(0~72 ticks对应0~180°)。已知参数:
- PWM频率f=100kHz,周期10µs,半周期5µs
- 72 ticks对应半周期,全周期为144 ticks,延时范围0~5µs
最初编写的转换函数如下:
int degPhaseShiftCalc(int tdelay) { int phShift = (360 * 100 * tdelay) / 1000; return phShift; } int tDelayCalc(int phShift) { float tdelay = (phShift * 1000) / (360 * 100); int result = round(tdelay / 0.07); return result; }
其中0.07为每tick的微秒数(5µs/72ticks),因系统仅接受整数tick故使用取整。
计算异常现象
- 180° 对应71 ticks(小于预期的72)
- 150° 对应57 ticks
- 36° 对应14 ticks
- 0~35° 均输出0 ticks
推测异常因半周期tick数过少导致,需调整定时器参数使tick数>72。
核心疑问
如何最佳实现角度转Ticks的转换函数?
已解决方案
感谢@Simon Goater、@Chris_B,将计算转换为完整的浮点数运算,修改后的代码如下:
float tdelay = ((float)phShift * 1000.0) / (360.0 * 100.0);
转换为浮点数运算后问题得到解决。
内容的提问来源于stack exchange,提问作者Delta
相关产品推荐
相关产品推荐

