这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » TI » MSPM0G3507之FDCAN远程控制直线滑台

共4条 1/1 1 跳转至

MSPM0G3507之FDCAN远程控制直线滑台

助工
2024-07-20 09:25:43     打赏

【实验目的】

实现FDCAN远程控制直线滑台。

【实验器材】

1、MSPM0G357开发板

2、FDCAN_TTL

3、步进电机

4、步进电机驱动器

5、直线滑台

6、直流电源

7、FDCAN分析仪

8、3144霍尔传感器

【项目框图】

image.png

项目中,FDCAN接收上位机的运行指令,同时会把直线滑台的状态发送给上位机。在接收到指令后,产生PWM来驱动电机带动直线模组运行,两个3144霍尔传感器如果检测滑台到位,产生中断,更新状态。

【syscfg配置】

1、FDCAN配置,在图形化配置中,打开FDCAN,设定波特率:

image.png

配置FDCAN的消息缓冲区

image.png

配置FDCAN中断

image.png

配置FDCAN的收发IO

image.png

2、配置3144的检测IO以及中断配置,配置他的起始两个检测IO为PA14,PA12,中断输入模式,下降沿触发。

image.png

3、配置PWM,配置其为pwm输入IO为PB0,占空比为50,频率为1kHz。

image.png

同时配置驱动电机方向为PA2。

【主要代码简介】

1、FDCAN收发,在接收到数后,判断是否指定的ID,发果是则更新驱动器的状态。

void processRxMsg(DL_MCAN_RxBufElement *rxMsg)
{
    uint32_t idMode;
    uint32_t id;

    idMode = rxMsg->xtd;

    if (ID_MODE_EXTENDED == idMode) {
        id = rxMsg->id;
    } else {
        /* Assuming package is using 11-bit standard ID.
         * When package uses standard id, ID is stored in ID[28:18]*/
        id = ((rxMsg->id & (uint32_t) 0x1FFC0000) >> (uint32_t) 18);
    }

    switch (id) {
        case 0x3:
            if(mydoor_t.run_dir != rxMsg->data[1])
            {
                mydoor_t.run_dir = rxMsg->data[1];
                set_dir();
            }

            break;
        default:
            /* Don't do anything */
            break;
    }
}

如果达到指定的时间,测由FDCAN发送电机运行状态到上位机:

        if(Tick >= 500)
        {
            DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
            Tick = 0;
            txMsg0.data[0] = mydoor_t.run_state;
            txMsg0.data[1] = mydoor_t.run_dir;
            txMsg0.data[2] = mydoor_t.start_flage;
            txMsg0.data[3] = mydoor_t.stop_flage;
            /* Write Tx Message to the Message RAM. */
             DL_MCAN_writeMsgRam(MCAN0_INST, DL_MCAN_MEM_TYPE_BUF, 0, &txMsg0);

             /* Add request for transmission. */
             DL_MCAN_TXBufAddReq(MCAN0_INST, 0);
        }

2、中断检测,在中断中,如果检测到了中断变化,测更新电机运行状态。

void get_start_stop_value(void)
{
   if(mydoor_t.run_dir == 0)
   {
       if( DL_GPIO_readPins(EXTI_3144_PORT, EXTI_3144_EXTI_3144_START_PIN) != 0)
       {
           mydoor_t.start_flage = 0;
       }
       else
       {
           mydoor_t.start_flage = 1;
       }
   }
   else
   {
       if( DL_GPIO_readPins(EXTI_3144_PORT, EXTI_3144_EXTI_3144_END_PIN) != 0)
       {
           mydoor_t.stop_flage = 0;
       }
       else
       {
           mydoor_t.stop_flage = 1;
       }
   }
}

3、在大循环中,根据电机驱动状态机,是否输出PWM来驱动电机

void run_motor(void)
{
    if(mydoor_t.run_state == 1)
    {
        DL_TimerG_startCounter(PWM_0_INST);
    }
    else
    {
        DL_TimerG_stopCounter(PWM_0_INST);
    }
}

【实验方法】

从FDCAN分析仪中发出指令,可以实现电机的指定方式实现直线滑台的运动,到达指定位置后自运停止,也可以发现停止指令实现电机的实时停止。

image.png

【实验效果】

huatai.gif




关键词: MSPM0     G3507     FDCAN     直线滑台    

高工
2024-07-20 09:31:22     打赏
2楼

谢谢分享


高工
2024-07-21 12:09:14     打赏
3楼

感谢分享


专家
2024-07-21 12:38:43     打赏
4楼

感谢分享


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]