霍尔编码器测速

本文详细介绍了基于STM32的霍尔编码器配置和使用,包括Cubemx的配置、定时器设置、编码器中断处理以及速度计算方法。通过两个霍尔开关传感器和铁氧体磁环,利用编码器模式的定时器进行电机速度测量,每秒进入一次中断,计算编码器的计数值并输出电机转速。文章还提供了关键代码片段和计算公式解析,帮助理解编码器脉冲计数和速度计算的原理。
摘要由CSDN通过智能技术生成

内容主要是我自己的学习笔记,有些内容考虑了我个人的情况。

编码器介绍

这里介绍的是霍尔编码器,这个编码器一共由两个霍尔开关传感器+铁氧体磁环。霍尔开关传感器是霍尔效应制作的一个磁场检测开关。
在这里插入图片描述

Cubemx配置

忽略掉常规的配置,一共主要一共使用了3个定时器,一个串口,时钟频率设置为168M
定时器1 PWM输出 通道1及其互补通道
1
在这里插入图片描述
在这里插入图片描述
最好把速度设置为高

在这里插入图片描述
在这里插入图片描述
2 定时器3 编码输出
在这里插入图片描述
选择编码器模式,勾选中断,其他不用管

3定时器7 作为计时
在这里插入图片描述
在这里插入图片描述

在我的配置中,每隔一秒进入一次中断
在这里插入图片描述
配置中断

代码

初始化

	HAL_TIM_Base_Start(&htim1);
  
  /* 启动定时器通道和互补通道PWM输出 */
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);	    //
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);//开启定时器Pwm通道1互补通道
  HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_1); // 
  HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_2); // 
  HAL_TIM_Base_Start_IT(&htim7);                // 
	HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
  start_flag=1;
  /* 通用定时器初始化并配置输入捕获功能 */
  __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);//控制转速和方向

中断函数 重要代码

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  static uint32_t count=0;
  if(start_flag) // 
  {
    time_count++;         // ??1ms×??ˉ??ò?
    if(time_count==1000)  // 1s
    {
      /* Get the current direction */
      uwDirection = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);      
      CaptureNumber=__HAL_TIM_GET_COUNTER(&htim3);
      
      printf("当前编码器定时器的计数方向:%d\n",uwDirection);
      printf("输入捕获值:%d\n",CaptureNumber);
      printf("1s内编码器的计数值:%d\n",CaptureNumber>=count?CaptureNumber-count:CaptureNumber+65535-count);

      printf("电机的转动速度:%0.2f\n",(float)(CaptureNumber>=count?CaptureNumber-count:CaptureNumber+65535-count)/13/30/4);
      count=CaptureNumber;
      time_count=0;
    }
  }
}

其他
1 实现打印函数
usart.c中

int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}


int fgetc(FILE * f)
{
  uint8_t ch = 0;
  while(HAL_UART_Receive(&huart1,&ch, 1, 0xffff)!=HAL_OK);
  return ch;
}

usart.h
一定记得声明 #include <stdio.h>

重要原理

在之前配置的过程中,可以参考以下两篇文章。链接在末尾,我觉得我之前比较难懂的地方在于到底是如何进行计算的,一共有两种方法,我使用的是编码器接口。
在这里插入图片描述
编码器的A B相会输出像上面的信号,在一个周期内,他可以计数4个脉冲。他的真实含义是相对信号的电平计数模式。什么是相对信号?其实就是CHA相对CHB的的电平或者CHB相对CHA的电平。
我们来分析下这行代码,这是我之前不能理解的。

(float)(CaptureNumber>=count?CaptureNumber-count:CaptureNumber+65535-count)/13/30/4

前面一部分就是一圈的脉冲数,13和30,4为什么要除以这些,13表示铁氧气磁环上面有多少对极,30表示减速电机的比值,表示一个周期4个脉冲。
再记录最后一个
在这里插入图片描述

https://blog.csdn.net/QWQ_DIODA/article/details/116519580?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162813212516780255239475%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162813212516780255239475&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-18-116519580.first_rank_v2_pc_rank_v29&utm_term=+%E9%9C%8D%E5%B0%94%E7%BC%96%E7%A0%81%E6%B5%8B%E9%80%9F&spm=1018.2226.3001.4187

https://blog.csdn.net/weixin_44270218/article/details/114045057?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162813191116780271548067%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162813191116780271548067&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-12-114045057.first_rank_v2_pc_rank_v29&utm_term=HAL+%E7%BC%96%E7%A0%81%E6%B5%8B%E9%80%9F&spm=1018.2226.3001.4187

  • 5
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值