01-编码器原理
跟着这位up学的,up讲的好棒
【7分钟让你彻底搞懂编码电机的原理和玩法】 https://www.bilibili.com/video/BV1wN4y1D7LR/?share_source=copy_web&vd_source=985ed259d2e2be1d81c218c58be165b9
1-基本组成
由转子和两个霍尔原件(那两个小黑东西)组成,转子内部由N组电磁铁组成,分为N极与S极。在转动过程中,当N极经过霍尔元件时,产生高电平,当S极经过霍尔元件时,产生低电平。两个霍尔元件之间刚好差90度。
所以,在转动过程中会形成方波,两个元件产生的方波会有1/4周期的相位差。
2-测量转动方向
在某一极性下,若正转A相领先,则反转B相领先,通过这个方式便能检测出转动方向了
3-测速
已知编码器转子与电机原始轴相连。
电机大多配有减速比,即原始轴转N圈,实际轴(轮子连的轴)转一圈。减速比为N:1.
若霍尔编码器内部有13块电磁铁,则原始轴转一圈,每一相产生13个方波,即为13线霍尔编码器。
测量在时间周期T内某一相位上升沿数目(或下降沿)Num,之后与减速比P,N线,车轮周长C相结合,便能计算出速度。
综上,有速度计算公式 v = ( Num / N ) / P * C
02-CubeMX配置
1-编码器模式
STM32单片机自带正交解码函数,采用定时器的编码器模式,所以一个电机需要采用两个定时器通道来采集A、B相信号。
2-图形化配置
编码器配置
03-代码编写
首先初始化
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);//开启编码器模式的定时器
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_Base_Start_IT(&htim4);//开启用于测速中断的定时器
然后在主函数main.c编写相关检测速度函数
getTIMx_DetaCnt 函数用于从计时器中获取差值计数,
Get_Motor_Speed 函数用于获取电机速度。使用回调函数,HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim),在
计时器周期结束时被触发。
/* USER CODE BEGIN 4 */
int getTIMx_DetaCnt(TIM_HandleTypeDef *htim)
{
int cnt;
cnt = htim->Instance->CNT - 0x7FFF;
htim->Instance->CNT = 0x7FFF;
return cnt;
}
void Get_Motor_Speed(int *leftSpeed, int *rightSpeed)
{
*leftSpeed = getTIMx_DetaCnt(&htim2);
*rightSpeed = getTIMx_DetaCnt(&htim4);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == &htim6)
{
Get_Motor_Speed(&leftSpeed, &rightSpeed);
}
}
/* USER CODE END 4 */