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.

[参考译文] MCF8316A:没有 uC 时电机不旋转

Guru**** 1624225 points
Other Parts Discussed in Thread: MCF8316A, MCF8316AEVM, MSP430FR2355
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1369513/mcf8316a-motor-is-not-spinning-without-uc

器件型号:MCF8316A
主题中讨论的其他器件:MSP430FR2355

工具与软件:

您好!

我有关于 MCF8316A 的问题。 我想在没有任何 UC 的情况下使用它。  我使该图与数据表中的示例完全相同、如上图所示[R8、R9、R10、R11= 5.6kohm ]。 制动器通过一个10k 电阻器从外部连接到 GND、方向引脚通过一个10k 电阻器连接到 AVDD。 此时具有所有必需的电压:AVDD=3.3V;DVDD=1.5V;降压/LDO 稳压器处于电阻模式=5V;CP=17V (VM=12V)。 我还插入了 BLDC 电机、即无人机 1 [DJI mini-3]、但未旋转。 在这种情况下、我还应该怎么做才能使电机旋转?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想指定向 SPEED 引脚施加介于2.3-3V 之间的模拟电压

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Vinsch:

    您是否已为电机配置/调优 MCF8316A 寄存器? MCF8316A 需要对其寄存器设置进行一些基本的调优(具体取决于您的电机)、然后才能使电机旋转。

    如果要在没有外部微控制器的情况下使用该寄存器、则需要将寄存器设置编程到器件的内部 EEPROM 寄存器存储器中、以便在上电时加载这些设置。 可以使用 I2C 对寄存器进行配置/编程(请参阅数据表第7.6节" EEPROM 访问和 I2C 接口")。

    这些基本的设置包括:

    • 电机参数
      • 电机相电阻[MOTOR_RES]
      • 电机相电感[MOTOR_IND]
      • 电机 BEMF 常数[MOTOR_BEMF_CONST]
      • 速度环路 Kp [SPD_LOOP_KP]
      • 速度环路 Ki [SPD_LOOP_KI]
      • 如果在上述5个参数中的任何一个为0时发出速度命令、则器件将自动尝试运行其内置的电机参数提取工具(MPET)算法来测量这些值。
      • 如果 MPET 无法测量这些值、可能需要手动输入这些参数。   有关更多详细信息、请参阅此 E2E 常见问题解答。
    • 最大速度[MAX_SPEED]

    您还需要针对您的电机/应用调整和优化许多其他寄存器设置、例如各种电流限制、加速率、故障配置等

    有关如何调整各种参数的说明、请参阅 MCF8316A 调优指南。

    此致、
    Eric C.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,所以我尝试编程注册表,正如你说的[使用 Arduino UNO]和我使用这个代码,我发现在一个论坛:

    #include

     

    const int deviceAddress = 0x01;

     

    void setup(){

     Int error、n;

     

     Wire.begin();

     Wire.setClock(50000);     // 50kHz、正常速度的一半

     

     Serial.begin(115200);

     serial.println ("启动");

     

     //-------------------------------------------------------

     //将数据写入寄存器

     //-------------------------------------------------------

     const byte control_word1[]={0x020x500x000x8A};//<--设置正确的数字

     const byte data1[]={0x00、0x00、0x00、0x00};  //<--设置正确的数字

     

     Wire.beginTransmission(deviceAddress);

     wire.write (control_word1、3);

     wire.write (data1、4);

     错误= Wire.endTransmission ();

     if (error =0)

     {

       serial.println ("数据成功发送");

     }

     delay (1);              //芯片需要一段时间?

     

     //-------------------------------------------------------

     //从寄存器读取数据

     //-------------------------------------------------------

     const byte control_word2[]={0x020x500x00、0x8A}; //<--设置正确的数字

     

     Wire.beginTransmission(deviceAddress);

     wire.write (control_word2、3);

     Error = Wire.endTransmission (false);  //重复启动会出现"false"

     if (error =0)

     {

       serial.println ("已成功选择注册");

     }

     delay (1);              //芯片需要一段时间?

     

     N = Wire.requestFrom (deviceAddress、4);

     if (n =4)

     {

       serial.println ("数据已接收");

       for (int i=0;i<4;i++)

       {

         serial.print ("0x");

         serial.print(Wire.read(), hex );

         serial.print ("、");

       }

       serial.println();

     }

     delay (1);              //芯片需要一段时间?

    }

     

    void loop(){}

    您能检查一下它是否良好吗? 我不是真的知道如何构成控制字、用于在 motor_res、motor_ind、motor_bmef 的闭环2、3、4中写入值。 SPEED_LOOP_KP、SPEED_LOOP_ki。 这最后2个参数应该具有哪些值[SPEED_LOOP_KP、SPEED_LOOP_KI]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Vinsch:

    只是想确认您的 MCF8316AEVM 不正确吗? EVM + GUI 可能是为您的电机配置/调优器件寄存器的最简单方法。

    关于你的 Arduino 代码,我不确定,但 Wire.write ()命令可能会 自动发送起始条件以及目标地址和 R/W 位,所以你可能只需要提供24位控制字。 此外、我会将 CRC_EN 设置为0、以避免需要计算/传输额外的 CRC 字节。 因此、我会尝试更改 control_word1[]={0x10、 0x00 0x8A};

    您还可以参阅此 E2E 常见问题解答、了解如何使用 MSP430FR2355 LaunchPad 通过 I2C 对 MCx 器件进行编程/通信:
    https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1246892/faq-program-mcx-bldc-motor-driver-through-i2c-using-msp430-launchpad

    使用 MSP430FR2355 LaunchPad 的示例项目、您应该可以轻松地修改代码以读取/写入 MCF8316A 器件中的任何寄存器。

    此致、
    Eric C.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Vinsch:

    您能否在 Arduino 上尝试以下代码:

    #include <Wire.h>
    
    void setup()
    {
      Serial.begin(115200);
      
      Wire.begin();
      Wire.setClock(100000);
      
      read32(0x80);  // 32-bit read register 0x80
      write32(0x80, 0x12345678);  // 32-bit write  to register 0x80
      read32(0x80);  // 32-bit read register 0x80
    }
    
    void loop()
    {
    }
    
    void read32(int reg_addr)
    {
      byte reg_addr_H = (reg_addr & 0x0F00) >> 8;
      byte reg_addr_L = (reg_addr & 0xFF);
      
      const byte control_word[] = {0x90, reg_addr_H, reg_addr_L}; // 24-bit control word (CRC_EN = 0)
     
      Wire.beginTransmission(0x01);
      Wire.write(control_word, 3); // send the control word
      Wire.endTransmission();
    
      Wire.requestFrom(0x01, 4);    // request 4 bytes (32-bit read)
    
      unsigned long register_value = 0;
      for (int i = 0; i < 4; i++)
      {
        unsigned long c = Wire.read(); // receive a byte as character
        register_value |= (c << (i * 8)); // reconstruct 32-bit value (LSB is received first)
    //    Serial.println(c, HEX);         // print each received byte
      }
      
      Serial.print("Finished reading register: 0x");
      Serial.println(reg_addr, HEX);
      Serial.print("Value = 0x");
      Serial.println(register_value, HEX);
    }
    
    void write32(int reg_addr, unsigned long writedata)
    {
      byte reg_addr_H = (reg_addr & 0x0F00) >> 8;
      byte reg_addr_L = (reg_addr & 0xFF);
      
      const byte control_word[] = {0x10, reg_addr_H, reg_addr_L}; // 24-bit control word (CRC_EN = 0)
      byte data[] = {0x00, 0x00, 0x00, 0x00};   // 32-bit register data to be written
     
      for (int i = 0; i < 4; i++)
      {
        data[i] = ((writedata & (((unsigned long)0xFF) << (i * 8))) >> (i * 8));
      }
     
      Wire.beginTransmission(0x01);
      Wire.write(control_word, 3); // send the control word
      Wire.write(data, 4);  // send the 32-bit write data
      Wire.endTransmission();
    
      Serial.print("Finished writing to register: 0x");
      Serial.println(reg_addr, HEX);
    }

    我创建了一个简单的读取和写入函数、并验证了它们 在 MSP430FR2355 LaunchPad 上工作

    此致、
    Eric C.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Eric、您好!

    是的、我没有 EVM 板

    我尝试过该代码、这会在串行监视器上产生:

    完成读取寄存器:0x80
    
    值= 0x12345678
    
    写入寄存器:0x80完成
    
    完成读取寄存器:0x80
    
    值= 0x12345678 


    我接下来应该怎么做? 您是否可以让此代码更改必要的参数?
    (motor_res、motor_ind、motor_bemf、SPEED_LOOP_KP、SPEED_LOOP_ki)
    在寄存器 CLOSED_LOOP2、CLOSED_LOOP3和 CLOSED_LOOP4中?

    我从数据表中了解到地址是0x8A;0x8C;0x8E

    最后、我只希望电机旋转、或者至少对相位提供一些反馈以便能够测量电机

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Vinsch:

    我强烈建议使用 EVM 来调整电机的器件寄存器、因为通过 GUI 可以轻松更改寄存器设置。 但是、您可以按照调优指南使用独立的微控制器来实现相同的调优。

    请参阅 MCF8316A 调优指南

    1. 确保在 SPEED 引脚上应用0%速度命令
    2. 将建议的默认值写入调优指南中表3-1的所有相应寄存器中
    3. 根据电机/应用的最大速度配置[MAX_SPEED]
    4. 根据电机的额定峰值电流配置[ILIMIT]
    5. 通过设置[DEV_CTRL]寄存器(地址0xEA)中的[CLR_FLT]位来清除任何潜在的现有故障
    6. 应用非零速命令
      1. 这将自动触发 MPET、因为 MOTOR_RES、MOTOR_IND、MOTOR_BEMF_CONST、SPD_LOOP_KP SPD_LOOP_KI 为0
      2. MPET 将在测量 BEMF 和 KP/KI 速度的同时使电机加速旋转、因此请确保对电机进行钳位。
    7. 如果 MPET 成功完成、您将看到电机短暂减速、然后再次加速到之前命令的非零速。
    8. 通过应用零速命令来停止电机
    9. 读回所有寄存器、并手动将值保存在某个位置
      1. 您可以检查电机参数寄存器以查看 MPET 测量的值
    10.  通过将0x8A500000写入[DEV_CTRL]寄存器(地址0xEA)来触发 EEPROM 写入
      1. 这会将寄存器值从器件的"影子寄存器"存储器区域复制到 EEPROM 寄存器存储器区域、以便在整个下电上电期间保留寄存器设置。

    仅供参考、当您向 MCF8316发送 I2C 命令时、您将读取/写入 EEPROM 寄存器(我们称之为"影子寄存器")的镜像副本 、这些寄存器位于 RAM 中、直接影响电机控制算法的行为。 但是、这些值在整个下电上电过程中并不会保留、因此如果更改某些寄存器设置并希望这些设置持续上电周期、则需要将影子寄存器中的值写入 EEPROM 寄存器。 下面是寄存器存储器的外观概览

    此致、
    Eric C.