MSP432P401R编码器电机程序详解
编码器电机的原理网上有很多,如果不懂可以看下这个博主的文章STM32应用(九)编码器及其测速原理、L298N电机驱动控制编码器电机_長空雁的博客-CSDN博客
在这里博主只讨论如何去用软件采集测速。
外部中断采集脉冲
编码器的AB相会输出方波,因为432p系列没有编码器模式,所以我们采用外部中断去获取脉冲值,下面贴上程序(采用了四倍频技术)
四倍频技术
这里要注意的是连线,连线图如下,原理就是把两个IO口通过杜邦线或者跳线帽连接视为一个IO口
四倍频的缺点是比较浪费资源,要使用8个IO口,二倍频仅需要4个IO口。
正面连接图,跳线帽连接采集同个相的上升沿IO口和下降沿IO口
AB相输入从背部连接,这里建议用洞洞板或者是PCB将引脚引出
代码
void PORT2_IRQHandler(void)
{
uint16_t flag;
/*获取中断状态*/
flag = GPIO_getEnabledInterruptStatus(GPIO_PORT_P2);
/*清除中断标志位*/
GPIO_clearInterruptFlag(GPIO_PORT_P2, flag);
/*左轮A相上升沿*/
if (flag & GPIO_PIN4)
{
if (GPIO_getInputPinValue(GPIO_PORT_P4, GPIO_PIN4) == 0)
encoder_L++;
else if (GPIO_getInputPinValue(GPIO_PORT_P4, GPIO_PIN4) == 1)
encoder_L--;
}
/*左轮A相下降沿*/
if (flag & GPIO_PIN6)
{
if (GPIO_getInputPinValue(GPIO_PORT_P4, GPIO_PIN4) == 0)
encoder_L--;
else if (GPIO_getInputPinValue(GPIO_PORT_P4, GPIO_PIN4) == 1)
encoder_L++;
}
}
void PORT4_IRQHandler(void)
{
uint16_t flag;
/*获取中断状态*/
flag = GPIO_getEnabledInterruptStatus(GPIO_PORT_P4);
/*清除中断标志位*/
GPIO_clearInterruptFlag(GPIO_PORT_P4, flag);
/*左轮B相上升沿*/
if (flag & GPIO_PIN4)
{
if (GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN6) == 0)
encoder_L--;
else if (GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN6) == 1)
encoder_L++;
}
/*左轮B相下降沿*/
if (flag & GPIO_PIN6)
{
if (GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN4) == 0)
encoder_L++;
else if (GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN4) == 1)
encoder_L--;
}
}
void PORT5_IRQHandler(void)
{
uint16_t flag;
/*获取中断状态*/
flag = GPIO_getEnabledInterruptStatus(GPIO_PORT_P5);
/*清除中断标志位*/
GPIO_clearInterruptFlag(GPIO_PORT_P5, flag);
/*右轮A相上升沿*/
if (flag & GPIO_PIN4)
{
if (GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN6) == 0)
encoder_R++;
else if (GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN6) == 1)
encoder_R--;
}
/*右轮A相下降沿*/
if (flag & GPIO_PIN6)
{
if (GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN4) == 0)
encoder_R--;
else if (GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN4) == 1)
encoder_R++;
}
}
void PORT6_IRQHandler(void)
{
uint16_t flag;
/*获取中断状态*/
flag = GPIO_getEnabledInterruptStatus(GPIO_PORT_P6);
/*清除中断标志位*/
GPIO_clearInterruptFlag(GPIO_PORT_P6, flag);
/*右轮B相上升沿*/
if (flag & GPIO_PIN4)
{
if (GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN6) == 0)
encoder_R--;
else if (GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN6) == 1)
encoder_R++;
}
/*右轮B相下降沿*/
if (flag & GPIO_PIN6)
{
if (GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN4) == 0)
encoder_R++;
else if (GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN4) == 1)
encoder_R--;
}
}
M法测速
T0是自行设定的时间,一般用定时器处理数据。 M0是在设定时间内的脉冲数。 C是单圈总脉冲数。(直流电机轴旋转一圈在霍尔传感器每个引脚有 13个脉冲信号输出,光电传感器每个引脚有 500个脉冲信号输出) 这里的磁环是固定在直流电机转轴上的,与减速电机的输出轴是不一样的。减速电机的输出轴是经过减速齿轮变换后的,我手上的电机减速比都是1:30, 所以, 如果减速电机输出轴旋转一圈,实际上可以检测到的编码器每相脉冲数量为:13*30=390 个。 再通过单片机的编码器接口4 倍频就是 1560个脉冲信号,也就说电机转一圈输出1560个脉冲 speed = M0/(编码器线数*减速比*倍频数*T0) 这里得到的是电机的转速再乘上你轮子的周长就可以得到速度了
这里贴上四倍频上位机的数据
要代码的可以自行下载msp432代码: MSP432P401R代码