This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DRV10987: 电机驱动问题,实际电路开发步骤

Part Number: DRV10987

DRV10987不使用EVM和GUI,直接在自己电路环境中进行软件开发,整体步骤如何?

第一步,还是需要确定电机相关参数:部分参数从点击手册获取,一部分实际测量吗?

第二步,根据参数写0x90~0x96 eeprom寄存器的值

第三步,映射影子寄存器

第四步,设置0x30设置速度

第四步,读取0x01速度反馈

第五步,电机转动

按照以上步骤,可以顺利驱动电机吗?谢谢,盼复

  • 您好,您的问题我们需要升级到英文论坛看下,有答复尽快给您。

  • 您好,请问后续有什么进展跟踪

  • 没太理解您的问题,您是希望在没有 EVM 和 GUI 支持的情况下使用 DRV10987对电机进行调优吗? 

  • 是的,在没有 EVM 和 GUI 支持的情况下使用 DRV10987对电机进行调优,顺利驱动电机转动,可通过IIC的方式控制速度

  • 好的,我们跟进给工程师了。

  • uint16_t reg_data[16] = {0x8000,0x8000,0x0000,0xC0DE,\  
                                0xC04B,0x0049,0x00C0,0x3788,0x3BAF,0x7840,0x007A,0x1006,\  
                                0x1002,0x0000,0xFF}; 
    uint16_t close_reg_data[16] = {0x8000,0x8000,0x0000,0xC0DE,\  
                                0xD04B,0x00BB,0x00C0,0x3788,0x3B0F,0x7840,0x007A,0x1006,\  
                                0x1002,0x0000,0xFF}; 	
    int reg30_data = 0x8000,default_speed = 0x812C,speed = 0,stop_speed = 0,speed_read = 0;
    
    /*开环控制参数*/
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x60,&reg_data[0],2);//禁用电机驱动
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x31,&reg_data[2],2);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x31,&reg_data[3],2);
                    BSP.bldc.method->read(&BSP.bldc.attribute,0x32,&read_data[2],2);
    
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x90,&reg_data[4],2);   //0x004B
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x91,&reg_data[5],2);   //0x49
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x92,&reg_data[6],2);   
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x93,&reg_data[7],2);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x94,&reg_data[8],2);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x95,&reg_data[9],2);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x96,&reg_data[10],2);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x35,&reg_data[11],2);
                    BSP.bldc.method->read(&BSP.bldc.attribute,0x32,&read_data[2],2);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x60,&reg_data[13],2); //启用电机
    
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x30,&reg30_data,2); //override位置1,开启i2c控制模式
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x30,&default_speed,2); //写默认速度
                    BSP.bldc.method->read(&BSP.bldc.attribute,0x30,&speed_read,2);  //读速度
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x60,&reg_data[13],2); //启用电机 
    
    /*闭环控制*/
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x60,&close_reg_data[0],2);//禁用电机驱动
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x31,&close_reg_data[2],2);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x31,&close_reg_data[3],2);
                    BSP.bldc.method->read(&BSP.bldc.attribute,0x32,&close_reg_data[2],2);
    
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x90,&close_reg_data[4],2);   //0x004B
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x91,&close_reg_data[5],2);   //0x49
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x92,&close_reg_data[6],2);   
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x93,&close_reg_data[7],2);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x94,&close_reg_data[8],2);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x95,&close_reg_data[9],2);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x96,&close_reg_data[10],2);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x35,&close_reg_data[11],2);
                    BSP.bldc.method->read(&BSP.bldc.attribute,0x32,&close_reg_data[2],2);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x60,&close_reg_data[13],2); //启用电机
    
    /*锁检测*/
                    BSP.bldc.method->read(&BSP.bldc.attribute,0x00,&read_data[7],2);
                    if(read_data[7] != 0x4){
                        BSP.bldc.method->write(&BSP.bldc.attribute,0x00,&reg_data[14],2);//clear错误寄存器
                        BSP.bldc.method->read(&BSP.bldc.attribute,0x00,&read_data[7],2);
                    }
                    sscanf(optarg,"%x",&speed);
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x30,&reg30_data,2); //override位置1,开启i2c控制模式
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x30,&default_speed,2); //写默认速度
                    BSP.bldc.method->read(&BSP.bldc.attribute,0x30,&speed_read,2);  //读速度
                    BSP.bldc.method->write(&BSP.bldc.attribute,0x60,&reg_data[13],2); //启用电机 

  • 请问后续跟进情况如何?

  • 抱歉,今天是美国的假期,我们先把您更新的信息跟进给工程师,周四之前如果还没有答复的话我们来催促下看看。

  • 好的谢谢,麻烦您了

  • 能否请您对每行代码进行注释? 

  • BSP.bldc.method->init(&BSP.bldc.attribute); //初始化
    os_msleep(10);

    /*开环控制参数*/
    BSP.bldc.method->write(&BSP.bldc.attribute,0x60,&reg_data[0],2);//禁用电机驱动
    BSP.bldc.method->write(&BSP.bldc.attribute,0x31,&reg_data[2],2);//往0x31写0x0000
    BSP.bldc.method->write(&BSP.bldc.attribute,0x31,&reg_data[3],2);//往0x31写0xC0DE
    BSP.bldc.method->read(&BSP.bldc.attribute,0x32,&read_data[2],2);//读0x32为eereadstatus为1

    BSP.bldc.method->write(&BSP.bldc.attribute,0x90,&reg_data[4],2); //0x90写入0xC04B
    BSP.bldc.method->write(&BSP.bldc.attribute,0x91,&reg_data[5],2); //0x91写入0x0049
    BSP.bldc.method->write(&BSP.bldc.attribute,0x92,&reg_data[6],2); //0x92写0x00C0
    BSP.bldc.method->write(&BSP.bldc.attribute,0x93,&reg_data[7],2); //0x93写0x3788
    BSP.bldc.method->write(&BSP.bldc.attribute,0x94,&reg_data[8],2); //0x94写0x3BAF
    BSP.bldc.method->write(&BSP.bldc.attribute,0x95,&reg_data[9],2); //0x95写0x7840
    BSP.bldc.method->write(&BSP.bldc.attribute,0x96,&reg_data[10],2); //0x96写0x007A
    BSP.bldc.method->write(&BSP.bldc.attribute,0x35,&reg_data[11],2); //0x35写0x1006
    BSP.bldc.method->read(&BSP.bldc.attribute,0x32,&read_data[2],2); //读0x32
    BSP.bldc.method->write(&BSP.bldc.attribute,0x60,&reg_data[13],2); //启用电机,0x60写0x0000

    BSP.bldc.method->write(&BSP.bldc.attribute,0x30,&reg30_data,2); //override位置1,开启i2c控制模式
    BSP.bldc.method->write(&BSP.bldc.attribute,0x30,&default_speed,2); //写默认速度
    BSP.bldc.method->read(&BSP.bldc.attribute,0x30,&speed_read,2); //读速度
    BSP.bldc.method->write(&BSP.bldc.attribute,0x60,&reg_data[13],2); //启用电机

    /*锁检测*/
    // BSP.bldc.method->read(&BSP.bldc.attribute,0x00,&read_data[7],2);
    // while(read_data[7] != 0x4 || read_data[7] != 0x0){
    // BSP.bldc.method->write(&BSP.bldc.attribute,0x00,&reg_data[14],2);//clear错误寄存器
    // BSP.bldc.method->read(&BSP.bldc.attribute,0x00,&read_data[7],2);
    // }
    BSP.bldc.method->read(&BSP.bldc.attribute,0x00,&read_data[7],2);
    while(read_data[7] == 0x1 || read_data[7] == 0x2 || read_data[7] == 0x4 || read_data[7] == 0x5){
    BSP.bldc.method->write(&BSP.bldc.attribute,0x00,&reg_data[14],2);//clear错误寄存器
    BSP.bldc.method->read(&BSP.bldc.attribute,0x00,&read_data[7],2);
    }


    /*闭环控制*/
    BSP.bldc.method->write(&BSP.bldc.attribute,0x60,&close_reg_data[0],2);//禁用电机驱动
    BSP.bldc.method->write(&BSP.bldc.attribute,0x31,&close_reg_data[2],2);//往0x31写0x0000
    BSP.bldc.method->write(&BSP.bldc.attribute,0x31,&close_reg_data[3],2);//往0x31写0xC0DE
    BSP.bldc.method->read(&BSP.bldc.attribute,0x32,&close_reg_data[2],2);//读0x32为eereadstatus为1

    BSP.bldc.method->write(&BSP.bldc.attribute,0x90,&close_reg_data[4],2);//0x90写入0xD04B
    BSP.bldc.method->write(&BSP.bldc.attribute,0x91,&close_reg_data[5],2);//0x91写入0x00BB
    BSP.bldc.method->write(&BSP.bldc.attribute,0x92,&close_reg_data[6],2);//0x92写0x00C0
    BSP.bldc.method->write(&BSP.bldc.attribute,0x93,&close_reg_data[7],2);//0x93写0x3788
    BSP.bldc.method->write(&BSP.bldc.attribute,0x94,&close_reg_data[8],2);//0x94写0x3B0F
    BSP.bldc.method->write(&BSP.bldc.attribute,0x95,&close_reg_data[9],2);//0x95写0x7840
    BSP.bldc.method->write(&BSP.bldc.attribute,0x96,&close_reg_data[10],2);//0x96写0x007A
    BSP.bldc.method->write(&BSP.bldc.attribute,0x35,&close_reg_data[11],2);//0x35写0x1006
    BSP.bldc.method->read(&BSP.bldc.attribute,0x32,&close_reg_data[2],2);//读0x32
    BSP.bldc.method->write(&BSP.bldc.attribute,0x60,&close_reg_data[13],2); //启用电机

    sscanf(optarg,"%x",&speed);
    BSP.bldc.method->write(&BSP.bldc.attribute,0x30,&reg30_data,2); //override位置1,开启i2c控制模式
    BSP.bldc.method->write(&BSP.bldc.attribute,0x30,&default_speed,2); //写默认速度
    BSP.bldc.method->read(&BSP.bldc.attribute,0x30,&speed_read,2); //读速度
    BSP.bldc.method->write(&BSP.bldc.attribute,0x60,&reg_data[13],2); //启用电机

  • 好的收到了,我们跟进给工程师看下。

  • 写入 EEPROM 并旋转电机的整个过程是没有问题的。 在运行此代码之前,请确保电源电压介于6.2V 和28V 之间就好。 

  • 可是仍旧不行,闭环转不起来

  • 买了官方的开发板,能否提供相关的FAE支持

  • 您好,

    可是仍旧不行,闭环转不起来

    电机在开环中是否可以旋转? 器件是否会触发任何故障? 您能否读回故障状态寄存器?

    买了官方的开发板,能否提供相关的FAE支持

    您可以寻求local FAE的支持。

  • 可开环旋转,0x01寄存器读出有值,可判断为会触发lock等故障。如何寻求localFAE支持?有何渠道?

  • 请问eeprom寄存器的0x94、0x95这两个地址为何会与我写入的参数寄存器值不一致?其余5个eeprom寄存器读出值与写入值一致

  • 0x01寄存器读回速度。 0x00寄存器读回故障。 您应该要进行批量 EEPROM 写入。 在这种情况下,编程到所有用户可配置寄存器(0x90至0x96)的值应保存到 EEPROM 中。 请确保遵循datasheet第8.3.6节中所述的所有说明。 

    如何寻求localFAE支持?有何渠道?

    这个需要看您的公司哈。目前论坛只提供线上支持。