一,原件介绍
编码电机和直流电机最大的不同就是,编码电机侧面多了一个电路板,这个电路板通过两个霍尔原件输出相位差90度的方波,通过单片机中定时器的编码器模式通道输入,获取速度以及转向。
上面两个黑块就是霍尔元件了,电机主轴转一圈,这个小圈转33圈。
二,引脚配置
点击TIME4,找到最下面的组合通道,配置为编码器模式
在下方encoder mode里面选择Encode TI1 and Encode TI2这样在编码器的两个通道里面产生上升沿就都会计数了,等于是灵敏度翻倍了
这里挺有意思的概念是,这个定时器的输入“时钟源”就是霍尔传感器产生的方波,方波频率很小,就用不到分频器了,定时器的本质就是计数器,在这里很能体现。我每隔10ms(用另一个定时器)就读取记录方波上升沿的计数器的值,这样就可以算出速度了,这里TIM4定时器的作用就是数数,数方波上升沿的个数。
三,编写代码
代码思路:1.开启编码器模式,捕获霍尔传感器产生的方波,开始计数
2.每隔10ms读取计数值,并且将它清零,等下一个10ms读取他
3.显示出来。
1.开启编码器模式,这一步在外设使用里面很容易遗忘,以为用cubemx配置完端口就可以正常使用了,其实并不是,配置完端口只是设置好了这些端口工作时的一些参数,就好像我们要出门,告诉了cubemx我们要什么颜色的,什么型号的车,然后cubemx把车停在我们面前,但是真正要启动,还是我们来,如何启动?就是sart函数了,这里是HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_ALL);函数
注意不要和HAL_TIM_IC_Start(&htim4,TIM_CHANNEL_ALL);这个函数搞混,这个是启动输入捕获的,而我们在cubemx里面配置的是编码器模式,所以用上面那个函数,车钥匙得找对了。
2.每隔10ms读取计数器的值,这里我选用uwTick这个自带的滴答定时器来计时,uwTick在HAL_Delay函数定义里面可以找到,他每隔1ms加一
void read()
{
if(uwTick-systick<10)
return;//不满足if条件就返回
get=speed_get();//注意get定义为int型,这样才能显示负转
systick=uwTick
}
void speed_get(HAL_TIM_IC_Start(&htim4,TIM_CHANNEL_ALL)
{
int temp;
temp=(short)__HAL_TIM_GetCounter(htim); //这里强制转换short是为了取出负数,转速有正有负
__HAL_TIM_SetCounter(htim,0);
return temp;
}
3.显示出来。
sprintf((char *)display_buf,"Encoder_R:%d ",get);
OLED_ShowString(0,6,display_buf,16);
完成