最近接近寒假,打游戏都打倦了,准备着手继续学习单片机。
想做一个平衡车,突然发现由于时间较长很多知识已经都忘记了,比如说霍尔编码器测速,这在平时不太常用,但是在小车中至关重要,因此想写一篇文章随时能够复习,以后就不用再去嘎嘎找别人的博客啦。
参考文献:STM32Cube HAL库——霍尔编码器测速(电机转速测量)
仅做参考,方法并不一样。 芯片为:stm32f401ccu6
那下面就直接开始。
首先,是对带编码器电机的一点点介绍。
如图,这是我手上的一个带编码器的电机,可以看到编码器上的转子,在电机转时,转子也会一起转。【霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。由霍尔码盘和霍尔元件组成。霍尔码盘是在一定直径的圆板上等分地布置有不同的磁极。霍尔码盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。】(摘自文章开头大佬的文章)
可以看到编码器上有六根线,普通电机只有红黑两根电机线,而这里为
M1:电机1
GND:编码器地线
C2:编码器B相
C1:编码器A相
VCC:编码器正极
M2:电机2 (若使用tb6612驱动板驱动,则M1和M2分别接ao1和ao2)
然后,是代码部分
一,总体设计。
用tb6612驱动电机,然后在oled上显示瞬时速度和角度。
二,代码编写。
1,先拿出我们的传家宝:配置好u8g2的文件。这样我们就可以直接开始配置编码器测速了。
2,打开.ioc文件,对外设进行初始配置。
3,如下图,选择两个时钟(有多少电机就开多少个)改为编码器模式,每个时钟会自动选择前两个时钟通道。然后统一 一下自动重装载值。
4, 开启一个时钟用来计时,按需调整预分频值和自动重装载值,并开启中断
生成代码。
5,在main函数中使能计数器和定时器功能
HAL_TIM_Base_Start_IT(&htim4);
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
6,定义一大堆需要测量或测量途中的变量
float speed;//测速需要
float angle;//测速需要
int32_t cnt;//测速需要
int32_t last_cnt;//测速需要
float speed1;//测速需要
float angle1;//测速需要
int32_t cnt1;//测速需要
int32_t last_cnt1;//测速需要
int n=1,n1=1;//测速需要
7,利用定时器中断回调,计算实时速度和电机转动角度
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim4)
{
cnt = (short)TIM2->CNT;
cnt1 = (short)TIM3->CNT; //tim2计数器的值
speed = -(float)(cnt - last_cnt) / 22.0f / 20 * 50;
speed1 = (float)(cnt1 - last_cnt1) / 22.0f / 20 * 50;//计算速度
angle = -((float)cnt) / 22.0f / 20 * 360;
angle1 = ((float)cnt1 ) / 22.0f / 20 * 360; //计算角度
last_cnt = cnt; //保存上一次计数器的值
last_cnt1 = cnt1;
n=angle/360;
n1=angle1/360;
angle=angle-n*360;
angle1=angle1-n1*360;//控制角度在-360到360之间
}
}
8,在while(1)中使用u8g2库在屏幕上显示实时速度和角度
u8g2_FirstPage(&u8g2);
do
{
u8g2_SetFont(&u8g2, u8g2_font_7x13_tr);
u8g2_printf(&u8g2, 0, 15, "%.2f", speed);
u8g2_printf(&u8g2, 0, 40, "%.2f", speed1);
u8g2_printf(&u8g2, 70, 15, "%f", angle);
u8g2_printf(&u8g2, 70, 40, "%f", angle1);
HAL_Delay(50);
}
while (u8g2_NextPage(&u8g2));
结束,直接上视频。(电池不在旁边,就直接手扭咯)
https://www.bilibili.com/video/BV1ea4y117xy/?spm_id_from=333.999.list.card_archive.click