新手入门
- 积分
- 9
- 金钱
- 9
- 注册时间
- 2019-4-16
- 在线时间
- 1 小时
|
小弟新手一枚,调试CAN通过指令请求四个铭朗驱动器反馈当前编码器计数,驱动器能正常反馈编码器计数,但是单片机只能接收到一个ID的数据,其余的都接收不到,但通过CAN TEST发现四个都有反馈。通过CANTEST按照四个驱动器反馈的格式,发送指令,单片机四个指令都能收到。另外,CAN只连接一个驱动器,就能正常反馈。我通过解析函数将四个驱动器的编码器计数存到了一个全局变量中,再通过串口发送给上位机,采用的控制板是STM32F103VE, 驱动器是铭朗的MLDS3610-B。跪求各位大佬指导!我的CAN初始化程序:
void Can_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE
NVIC_InitTypeDef NVIC_InitStructure;
#endif
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=ENABLE;
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode= CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;
CAN_InitStructure.CAN_Prescaler=12;
CAN_Init(CAN1, &CAN_InitStructure);
CAN_FilterInitStructure.CAN_FilterNumber=0; //1yÂËÆ÷0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//电机速度模式初始化
while(SetDriverModel(MOTOR1, DRIVER_SPEED_MODEL)!=FUN_SUCCESS);
delay_ms(100);
while(SetDriverModel(MOTOR2, DRIVER_SPEED_MODEL)!=FUN_SUCCESS);
delay_ms(100);
while(SetDriverModel(MOTOR3, DRIVER_SPEED_MODEL)!=FUN_SUCCESS);
delay_ms(100);
while(SetDriverModel(MOTOR4, DRIVER_SPEED_MODEL)!=FUN_SUCCESS);
delay_ms(100);
CANTROLLER_Init();//按十毫秒间隔下发位置请求指令
}
can 接收中断函数:
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
OnCanMsgReceived(&RxMessage);
}
can接收函数:
void OnCanMsgReceived(CanRxMsg* msg)
{
uint8_t encoder_counts[4];
uint8_t motor_id = 0;
if(msg->Data[2] == 0x9B)
{
int i = 0;
motor_id = msg->Data[1];
encoder_counts[0] = msg->Data[4];
encoder_counts[1] = msg->Data[5];
encoder_counts[2] = msg->Data[6];
encoder_counts[3] = msg->Data[7];
switch(motor_id)
{
case MOTOR1:
{
for(i=0; i<4; i ++)
{
response_pos[i+4] = encoder_counts[i];
}
break;
}
case MOTOR2:
{
for(i=0; i<4; i ++)
{
response_pos[i+9] = encoder_counts[i];
}
break;
}
case MOTOR3:
{
for(i=0; i<4; i ++)
{
response_pos[i+14] = encoder_counts[i];
}
break;
}
case MOTOR4:
{
for(i=0; i<4; i ++)
{
response_pos[i+19] = encoder_counts[i];
}
break;
}
default:
{
break;
}
}
}
}
跪求各位大佬指点迷津!!!
|
|