作者:沉尸(5912129@qq.com)
1)时钟分析
我们直接打开文件“Firmware\Board\v3\Odrive.ioc”:

图1-1
从上面可以看出:APB1时钟:42MHz; APB1相连的定时器时钟:84MHz
APB2时钟:84MHz; APB2相连的定时器时钟:168MHz
下图来自 stm32f407数据手册中“2.2 Device overview Figure 5. STM32F40xxx block diagram”

图1-4
总共用到的定时器有TIM1~TIM5,TIM8,TIM13,TIM14
于是可知,本项目中用到的定时器时钟
TIM1、TIM8 :168MHz
其它 :84MHz
2)TIM14
这个用来作为Hal库的时基定时器。

图2-1
看代码:

图2-2
3)TIM1和TIM8

图3-1
main.h中有定义:
#define TIM_1_8_PERIOD_CLOCKS 3500
图3-2
于是可以知道 TIM1和TIM8的频率为:
168MHz/(3500*2) = 24KHz // 因为是中间对齐,所以式子中要*2
直接总结如下:
| 定时器 |
输入频率 |
周期 |
功能 |
| TIM1 |
168MHz |
168M/(3500*2)=24KHz |
#1电机(M0)的UVW驱动 |
| TIM2 |
84MHz |
84M/(4096*2)=10.25KHz |
CH3(PB.10)和CH4(PB.11)作为pwm输出,duty相反 |
| TIM3 |
84MHz |
用作计数 |
#1电机之旋编检测,计满到0xfffff |
| TIM4 |
84MHz |
用作计数 |
#2电机之旋编检测,计满到0xfffff |
| TIM5 |
84MHz |
用作计数 |
定时器的CH3(PA.2)和CH4(PA.3)作为捕获输入口 |
| TIM8 |
168MHz |
24KHz |
#2电机(M1)的UVW驱动 |
| TIM13 |
84MHz |
8KHz |
启动时和TIM1及TIM8同步;任务耗时测量 |
| TIM14 |
84MHz |
1KHz |
作为HAL库的时基 |
表3-1
FOC控制,很关键一点是采样相电流,在什么时刻采集?这个是软件设计很关键的一点,下面我们来剖析。
先分析:TIM8_UP_TIM13_IRQHandler()
分析之前看TIM8的初始化代码:

图3-3
TIM8控制的pwm波形为中间对齐,这里设置RCR=2,也就是每(2+1)次更新会中断一次。

图3-4
这里可以如此理解:RCR=0, 每次上溢下溢均会中断;RCR=1,间隔1个;RCR=2,间隔2个。
搞清楚中断的间隔问题,现在再来看TIM8_UP_TIM13_IRQHandler()的源代码

图3-5
就很容易理解了,因为中断肯定是一次上溢一次下溢,上面“图3-5”红方框中代码,就是检测是否漏掉了一次中断的判断。
修改时间戳“timestamp_”为下一次中断时间点:

本文详细分析了STM32F407微控制器的时钟系统,特别是APB1和APB2时钟及其连接的定时器。文章通过实例展示了定时器TIM1、TIM8、TIM14的配置和使用,强调了它们在电机控制中的作用,如FOC中的电流采样。此外,文章还探讨了TIM13作为时基定时器和软中断控制循环的角色,以及TIM13如何与TIM1的更新事件同步。文章最后讨论了控制循环中断的处理流程和时间同步的重要性。
最低0.47元/天 解锁文章
570





