ODrive0.5.5源码分析(6) 时间戳

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

作者:沉尸(5912129@qq.com)

前言:

本章重点研究时间戳(timestamp)在软件中的使用,可以先复习一下:

ODrive0.5.5源码分析(2) 时钟和定时器

软件中使用时间戳的地方比较多,这里将仅仅聚焦于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_;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值