JGA25-371电机驱动
这段时间我在帮学校Robocon战队做辅导,遇到了JGA25-371电机,外形如下:
以前我还没遇到过这种电机,一直用的是大疆的三相无刷电机,而这个是带编码器和减速箱的直流电机,一共6根线,其中四根线是编码器的,两根线是电机的电源线。
电机的驱动很简单,这里使用了L298N驱动器,使用三根线控制,两根线控制电机的转向,一根线输出PWM波控制输出的电压,进而控制电机的力矩。
这个电机关键的地方在于获取它的转速和转向,也就是获取编码器的值。我之前使用的大疆电机采用的霍尔传感器,而这个电机采用的是光电编码器,它的具体介绍可以看这个网站
编码器速度和方向检测,371电机方向与速度检测,stm32编码器接口模式。
最关键的就是下面这张图,只要理解了这张图就能读取转向和转速了。
我采用了两种方法获取电机的转速。第一种是使用定时器的输入捕获功能,设置为上升沿触发,通过记录A相或B相两次上升沿的间隔来计算电机的转速,我测量的是A相,然后在中断中判断B相的电平高低来区分电机的转向。
另一种方法是使用GPIO的外部中断,配置为上升沿中断,给每个电机设置一个计数,在中断中对计数进行++操作,通过计数的大小来计算转速。
获取到转速就可以进行PID控制了,上面的原理很简单。
这里可以提一下,在使用定时器输入捕获的时候,如果在中断中判断是又哪个通道产生的:
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1))
{
//...
}
else if((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1))
{
//...
}
else if((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1))
{
//...
}
//...
}
这样就可以啦!