作者:沉尸(5912129@qq.com)
前言:
本章重点研究时间戳(timestamp)在软件中的使用,可以先复习一下:
软件中使用时间戳的地方比较多,这里将仅仅聚焦于FOC相关的代码部分。
1)
软件中的时间戳(timestamp)均以TIM8中的定时器计数值作为标准。
TIM8的定时器是从0开始计数的,而TIM1的计数初始值领先TIM8 “TIM1_INIT_COUNT”个计数值。
有些ADC的触发是被TIM1触发的,所以要注意软件中经常会对时间戳参数采取减去“TIM1_INIT_COUNT”的处理,比如:

上图取自“ControlLoop_IRQHandler()”
参数“timestamp”对应着TIM8发生update中断这个时刻的“时间戳”,函数中要传入“电流测量这个时刻”的时间戳,对于M0来说,它的电流检测ADC是由TIM1触发的,时间上要稍微早一点,于是针对M0的计算,就要减去“TIM1_INIT_COUNT”。
软件中还有好几处类似的处理,以后就不再赘述。
2)
先从“timestamp_”开始,这是一个全局变量,记录的是“TIM8_UP_TIM13_IRQHandler”中断时的时间戳


上图中“A”箭头所指,正是“TIM8_UP_TIM13_IRQHandler”中断的时间间隔,于是“timestamp_”可以描述成最近一次“TIM8_UP_TIM13_IRQHandler”中断对应的时间戳,直到又一次中断发生,“timestamp_”才会被更新。
现在开始看函数“ControlLoop_IRQHandler”
| 523 524 525 |
void ControlLoop_IRQHandler(void) { COUNT_IRQ(ControlLoop_IRQn); uint32_t timestamp = timestamp_; |

本文详细探讨了时间戳在ODrive软件中用于电机控制FOC算法的具体实现,强调了TIM8和TIM1定时器的关系以及TIM1_INIT_COUNT的调整。文章通过代码分析解释了如何在电流测量、控制循环和PWM更新等环节中正确处理时间戳,确保电机控制的精确同步。
602

被折叠的 条评论
为什么被折叠?



