目的:通过定时器实现定时中断的功能,以采集位置信息并计算速度、加速度信息。
1. 定时器原理
基本定时器主要由下面三个寄存器组成。
- 计数器寄存器 (TIMx_CNT):当前的计数值
- 预分频器寄存器 (TIMx_PSC):多少个脉冲计一次数
- 自动重载寄存器 (TIMx_ARR):多少个计数值触发一次溢出,并产生中断
定时器中断周期,计算方法如下
Tout
=
(
a
r
r
+
1
)
(
p
s
c
+
1
)
T
c
l
k
\text { Tout }=\frac{(a r r+1)(p s c+1)}{T c l k}
Tout =Tclk(arr+1)(psc+1)
若定时1ms,Tclk已知为72Mhz,设置psc为719,arr为99,即可产生1ms中断。
TIM3配置中选择内部时钟作为时钟源,查看数据手册或者查看代码可以知道TIM3是挂接到APB1时钟线上,查看Cubemx中APB1的时钟频率即为Tclk。
2.Cubemx配置
- 定时器3选择内部时钟作为时钟源
- 配置相应的psc和arr的值
- 开启中断
3.代码添加
- 在主函数中添加如下代码------启动基本定时器中断模式计数
HAL_TIM_Base_Start_IT(&htim3);
- 在定时器函数TIM最后,添加中断回调函数,代码如下
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim3.Instance)
{
/* Toggle LED */
}
}
注意事项:
- 定时器中断服务函数中不可以用HAL_Delay()!
HAL_Delay函数是基于系统滴答定时器中断来累增计数产生延时效果。这表明如果该函数被调用在外设的中断处理函数里,系统滴答定时器的中断就必须比这个外设中断的优先级高,否则这个外设中断将被阻塞。
系统时钟设置里给滴答定时器的抢占优先级为15,所以在中断里调用HAL_Delay会卡死,所以我们需要去调高滴答定时器的抢占优先级,调低中断的抢占优先级。 - 定时器中断实现对于位置、速度及加速度信息的获取存在难点,并未调通,原因在于无法接收信息,故放弃该种方法。
- 常用方法是通过定时器直接测定编码器的脉冲信号并计数,进而计算速度、加速度信息。但是由于电机驱动封装全面,因此仅能通过通信的方式获取电机信息,该方式必须存在延时函数,无法实时准确获取速度信息,故放弃。
- 最终采用电机驱动器自带速度,通过通信获得。