msp432p401r 编码器电机程序

        编码器电机的原理网上有很多,如果不懂可以看下这个博主的文章STM32应用(九)编码器及其测速原理、L298N电机驱动控制编码器电机_長空雁的博客-CSDN博客

        在这里博主只讨论如何去用软件采集测速。

外部中断采集脉冲

编码器的AB相会输出方波,因为432p系列没有编码器模式,所以我们采用外部中断去获取脉冲值,下面贴上程序(采用了四倍频技术)

 四倍频技术

msp432p401r 编码器电机程序_第1张图片

这里要注意的是连线,连线图如下,原理就是把两个IO口通过杜邦线或者跳线帽连接视为一个IO口

四倍频的缺点是比较浪费资源,要使用8个IO口,二倍频仅需要4个IO口。

 

msp432p401r 编码器电机程序_第2张图片

 

正面连接图,跳线帽连接采集同个相的上升沿IO口和下降沿IO口

 

msp432p401r 编码器电机程序_第3张图片

 

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法测速

msp432p401r 编码器电机程序_第4张图片

  • T0是自行设定的时间,一般用定时器处理数据。
  • M0是在设定时间内的脉冲数。
  • C是单圈总脉冲数。(直流电机轴旋转一圈在霍尔传感器每个引脚有 13个脉冲信号输出,光电传感器每个引脚有 500个脉冲信号输出)
  • 这里的磁环是固定在直流电机转轴上的,与减速电机的输出轴是不一样的。减速电机的输出轴是经过减速齿轮变换后的,我手上的电机减速比都是1:30, 所以, 如果减速电机输出轴旋转一圈,实际上可以检测到的编码器每相脉冲数量为:13*30=390 个。 再通过单片机的编码器接口4 倍频就是 1560个脉冲信号,也就说电机转一圈输出1560个脉冲
  • speed = M0/(编码器线数*减速比*倍频数*T0)
  • 这里得到的是电机的转速再乘上你轮子的周长就可以得到速度了

这里贴上四倍频上位机的数据

msp432p401r 编码器电机程序_第5张图片

 要代码的可以自行下载msp432代码: MSP432P401R代码

你可能感兴趣的:(msp432p401r,单片机,mcu)