【STM32Cubemx系列】_003-定时器中断

目的:通过定时器实现定时中断的功能,以采集位置信息并计算速度、加速度信息。


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会卡死,所以我们需要去调高滴答定时器的抢占优先级,调低中断的抢占优先级。
  • 定时器中断实现对于位置、速度及加速度信息的获取存在难点,并未调通,原因在于无法接收信息,故放弃该种方法。
  • 常用方法是通过定时器直接测定编码器的脉冲信号并计数,进而计算速度、加速度信息。但是由于电机驱动封装全面,因此仅能通过通信的方式获取电机信息,该方式必须存在延时函数,无法实时准确获取速度信息,故放弃。
  • 最终采用电机驱动器自带速度,通过通信获得。
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值