【实验目的】
实现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分析仪中发出指令,可以实现电机的指定方式实现直线滑台的运动,到达指定位置后自运停止,也可以发现停止指令实现电机的实时停止。

【实验效果】

我要赚赏金
