STM32学习笔记(7):编码器及定时器中断

编码器

编码器工作原理

编码器是一种将角位移或者角速度转换成一串电数字脉冲的旋转式传感器。分为光电编码器和霍尔编码器

通过在电机的传动轴上加装一个码盘,电机带动码盘转动, 而发射机与接收器成一对:

  • 当光线穿过码盘孔的时候,接收器收到高电平
  • 当光线被码盘阻断的时候,接收器收到低电平

定义从低电平变为高电平的那一瞬间(时刻)叫作上升沿;从高电平变为低电平的那一瞬间(时刻)叫作下降沿。由此,通过计算单位时间内的上升沿次数下降沿次数并用其除以码盘的孔数就可以计算出电机转速。为提高精度,通常同时获得上升沿、下降沿次数并求取平均值后进行计算。

在这里插入图片描述

常用的霍尔编码器也称AB相编码器,它通过电路信号的变化来获取电机的转速,为了得到电机转动的方向,此类编码器通过两个相近的发射器、接收器(A相、B相)同时接收信号值:

在这里插入图片描述

引脚配置

博主所用的编码器电机型号为JGB37-520,其减速比为30F

1.引脚查询

博主所用开发版上封装了四个六线编码器电机接口,以电机接口MOTORA为例,学习如何使用编码器。

  • AOUT1、AOUT2(1、6引脚)连接电机驱动TB6612FNG,用于控制电机正反转
  • 2、5引脚分别接GND和VCC,用于编码器供电
  • PB3、PA15(3、4引脚)为编码器AB相,用于获取编码器数据。

在这里插入图片描述

2.设置引脚

打开CubeMX,设置编码器引脚。点击PB3引脚可以发现存在TIM2_CH2定时器通道,而PB15存在TIM2_CH1定时器通道。由此,我们可以设置2号定时器为编码器模式进行编码器数据的读取。

在这里插入图片描述

点击上方Pinout&Configuration子页面并点击左侧Timers选项卡,选择TIM2并将Combined Channels设置为Encoder Mode,此时默认将设置引脚PA0和PA1为定时器模式,需要点击PB3设置为TIM2_CH2,同时PB15将自动设置为TIM2_CH1。

随后,点击界面下方Parameter SettingsEncoder Mode设置为Encoder Mode TI1 and TI2,即表示同时检测上升沿和下降沿。

在这里插入图片描述

随后开启编码器所在定时器的中断,旋转下方菜单NVIC Settings并勾选Enable。

在这里插入图片描述

3.开启定时器中断

为保证编码器能够不断的读取信息,需要额外开启一个定时器,采用设置频率进行中断执行。选中3号定时器,进行如下设置:

  • Clock Source:Internal Clock
  • 分频频率:7200 - 1
  • 计数周期:100 - 1
  • auto-reload preload:Enable

即设置一个周期为10ms的定时器中断,随后再NVIC Settings选项下勾选Enable,开启中断。

4.中断优先级

由于编码器中断必须在定时器10ms中断内发送,故而编码器中断优先级高于定时器中断。在上方选项卡中确保页面在Pinout&Configuration子页面,选择左侧System Core选项卡下NVIC选项并将TIM3定时器优先级设置为1。

在这里插入图片描述

设置完成后,点击右上角GENERATE CODE重新生成代码。

代码编写

1.读取编码器数值

首先需要启动定时器并读取编码器数据,

HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_1|TIM_CHANNEL_2);

随后,获取编码器的数据值。数据为正表示正转,数据为反表示反转。

short i = __HAL_TIM_GET_COUNTER(&htim2);

在计算电机转速时,通常采用一小段时间内(瞬间)编码器的累加值来估算,故而需要在读取完成后,将定时器清零处理。

__HAL_TIM_SET_COUNTER(&htim2,0);

2.定时器中断设置

采用函数HAL_TIM_Base_Start_IT()开启定时器中断

/**
  * @brief  Starts the TIM Base generation in interrupt mode.
  * @param  htim TIM Base handle
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
  • 参数 *htim:指针,定时器名

开启中断需要重写中断函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

3.电机转速获取

对所得编码器数据(信号数)做如下处理:

  • 由于同时监听上升沿和下降沿,需要将信号数除以2

  • 由于编码器存在AB相,即有两个收发器,需要将信号数除以2

  • 所得平均信号数应除以编码器码盘上的孔数

  • 电机存在减速比,需要除以电机减速比

  • 上述数据处理后,所得为电机的旋转圈数

博主手上的电机减速比为30,编码器孔数为13,故而计算公式如下:

圈数 = 信号数 / 2 / 2 / 13 / 30

转速 = 圈数 * 测量频率

经过上述分析,最终代码如下:

  /* USER CODE BEGIN 2 */
  //  开启AB相编码器定时器
  HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_1|TIM_CHANNEL_2);
  //  开启定时器3中断
  HAL_TIM_Base_Start_IT(&htim3);
  /* USER CODE END 2 */

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  static unsigned char i = 0;
  //  3号定时器中断
  if(htim == (&htim3))
  {
    //  设置测量频率为100Hz(10ms)
    int rate = 100;
    //  获取编码器信号数
    short encoder = __HAL_TIM_GET_COUNTER(&htim2);
    //  计算圈数rpm
    float count = ((float)encoder) / 2 / 2 / 13 / 30;
    //  编码器数据清零
    __HAL_TIM_SET_COUNTER(&htim2, 0);

    //  计算转速
    float speed = count * rate;
    //  扩大100倍输出
    log("speed:%d", (int)(speed) * 100);
  }
}
/* USER CODE END 4 */

在这里插入图片描述

  • 14
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
STM32编码器定时器是指在STM32微控制器中使用的定时器来读取编码器的脉冲信号。通常情况下,编码器的脉冲信号由编码器的DT和CLK线路产生,并通过STM32定时器进行读取。在配置STM32编码器定时器时,有一些重要的参数需要设置。首先,需要设置定时器的周期值(TIM_Period),以确定定时器溢出的时间。其次,需要使用TIM_EncoderInterfaceConfig函数来配置编码器的工作模式和脉冲信号的极性。在使用编码器模式3时,上升沿和下降沿都会被计数。同时,由于编码器的脉冲信号可能会受到干扰,因此在连接编码器的Z信号时,建议加一个电容到GND来稳定信号。通过这样配置和使用STM32编码器定时器,可以实现对编码器脉冲信号的读取和计数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [STM32定时器---正交编码器模式详解](https://blog.csdn.net/childbor/article/details/120891348)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [STM32定时器编码器模式](https://blog.csdn.net/m0_46152804/article/details/123383914)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值