【实验目的】
实现FDCAN远程控制直线滑台。
【实验器材】
1、MSPM0G357开发板
2、FDCAN_TTL
3、步进电机
4、步进电机驱动器
5、直线滑台
6、直流电源
7、FDCAN分析仪
8、3144霍尔传感器
【项目框图】
项目中,FDCAN接收上位机的运行指令,同时会把直线滑台的状态发送给上位机。在接收到指令后,产生PWM来驱动电机带动直线模组运行,两个3144霍尔传感器如果检测滑台到位,产生中断,更新状态。
【syscfg配置】
1、FDCAN配置,在图形化配置中,打开FDCAN,设定波特率:
配置FDCAN的消息缓冲区
配置FDCAN中断
配置FDCAN的收发IO
2、配置3144的检测IO以及中断配置,配置他的起始两个检测IO为PA14,PA12,中断输入模式,下降沿触发。
3、配置PWM,配置其为pwm输入IO为PB0,占空比为50,频率为1kHz。
同时配置驱动电机方向为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分析仪中发出指令,可以实现电机的指定方式实现直线滑台的运动,到达指定位置后自运停止,也可以发现停止指令实现电机的实时停止。
【实验效果】