发新帖我要提问
12
返回列表
打印
[应用相关]

编码器及定时器中断

[复制链接]
楼主: 在水一方00
手机看帖
扫描二维码
随时随地手机跟帖
21
在水一方00|  楼主 | 2022-7-30 23:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
设置完成后,点击右上角GENERATE CODE重新生成代码。

使用特权

评论回复
22
在水一方00|  楼主 | 2022-7-30 23:53 | 只看该作者
代码编写
1.读取编码器数值

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

使用特权

评论回复
23
在水一方00|  楼主 | 2022-7-30 23:54 | 只看该作者
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_1|TIM_CHANNEL_2);

使用特权

评论回复
24
在水一方00|  楼主 | 2022-7-30 23:54 | 只看该作者
随后,获取编码器的数据值。数据为正表示正转,数据为反表示反转。

使用特权

评论回复
25
在水一方00|  楼主 | 2022-7-30 23:55 | 只看该作者
在计算电机转速时,通常采用一小段时间内(瞬间)编码器的累加值来估算,故而需要在读取完成后,将定时器清零处理。

使用特权

评论回复
26
在水一方00|  楼主 | 2022-7-30 23:56 | 只看该作者
__HAL_TIM_SET_COUNTER(&htim2,0);

使用特权

评论回复
27
在水一方00|  楼主 | 2022-7-31 17:15 | 只看该作者
2.定时器中断设置
采用函数HAL_TIM_Base_Start_IT()开启定时器中断

使用特权

评论回复
28
在水一方00|  楼主 | 2022-7-31 17:16 | 只看该作者
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  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)

使用特权

评论回复
29
在水一方00|  楼主 | 2022-7-31 20:20 | 只看该作者
参数 *htim:指针,定时器名
开启中断需要重写中断函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

使用特权

评论回复
30
在水一方00|  楼主 | 2022-7-31 20:21 | 只看该作者
3.电机转速获取
对所得编码器数据(信号数)做如下处理:

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

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

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

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

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

使用特权

评论回复
31
在水一方00|  楼主 | 2022-7-31 20:22 | 只看该作者
博主手上的电机减速比为30,编码器孔数为13,故而计算公式如下:

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

转速 = 圈数 * 测量频率

使用特权

评论回复
32
在水一方00|  楼主 | 2022-7-31 20:22 | 只看该作者
经过上述分析,最终代码如下:
  /* 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 */

使用特权

评论回复
33
在水一方00|  楼主 | 2022-7-31 20:23 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则