OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2210|回复: 0

各位大佬,求解答CAN读取铭朗驱动器编码器反馈问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-4-16
在线时间
1 小时
发表于 2019-11-19 00:22:55 | 显示全部楼层 |阅读模式
小弟新手一枚,调试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;
                        }
                }
        }
        }


跪求各位大佬指点迷津!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 19:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表