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.

[参考译文] DRV8234:如何停止纹波计数漂移?

Guru**** 2455560 points
Other Parts Discussed in Thread: DRV8214, DRV8234

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1339097/drv8234-how-do-i-get-ripple-counting-drift-to-stop

器件型号:DRV8234
主题中讨论的其他器件:DRV8214

Howdy,

我尝试使用 DRV8214或 DRV8234通过纹波计数进行位置控制、但我一直在努力使跟踪功能随着时间的推移变得更完美。  

它似乎最终会偏离位置。  我如何解释这一点和/或提高性能或集成位置控制? 是否需要添加霍尔传感器等外部位置传感器?  

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

    Jennifer、您好!

    有几个因素会影响位置漂移。  

    具有 RC_THR_SCALE 分辨率的 RC_THR

    如果您使用器件的内置功能来驱动到给定的纹波计数然后停止、那么您可能已经注意到了器件分辨率的限制、因为它将驱动到 RC_THR * RC_THR_SCALE。  RC_THR 是10位值、即0至1023。 标度选项为2、8、16或64。   您只能驱动到这些值中的任意倍数- 0至1023 * 64。  因此、如果您希望驱动到20,000个纹波、则可以得到的最接近的结果是19968或20,032 (因为20,000 / 64 = 312.5)。  您不能使用较小的刻度、例如16、因为1023 * 16 < 20,000。  为了摆脱这种限制、您可以使用具有中断的 MCU 来手动计算纹波数、并在纹波刚好超过20,000次后停止电机。  或者、您可以在 RC_HIZ 设置为0的情况下驱动至19968 (当 RC_CNT 超过阈值时、H 桥保持启用状态)、然后使用 MCU 上的中断来检测 nFAULT 变为低电平、即 RC_CNT 超出阈值。  然后发送一条命令将标度更改为2并将 RC_THR 设置为 16 (以使 RC_THR_SCALE * RC_THR_SCALE = 16 * 2 = 32)、从而降落在20,000个纹波的最终目标位置。  

    缺少启动/停止波纹

    器件在电机启动时通常会错过1-4个纹波。  不过、在相同的工作条件下、该器件将  每次都连续丢失相同数量的纹波。  因此、在代码中、只需从目标纹波计数中减去漏纹波即可轻松解决该问题。  请参阅下图、在该图中、电机在每次运行时都会在启动时错过1或2个纹波。  

    传动比不正确

    如果您使用的是现成的有刷直流电机、您可能无法信任它宣传的传动比、因为为方便起见、这些传动比通常是圆形的。  以 Pololu 99:1金属减速电机 为例: 它被列为99:1传动比、但随后在产品页面上澄清实际传动比大约为98.78:1、并给出传动比来计算它:

    您也可以在代码中考虑这一点。  每次选择要驱动的波纹数时、使用至少5个小数点的实际传动比计算该值。  然后将纹波计数目标设置为舍入数、并跟踪漏掉的部分纹波十进制。  错过的部分纹波十进制大于1后、向目标纹波数添加1、并将其从该十进制中删除。  这样、一旦器件由于传动比下降1个完整纹波、它将重新添加。 下面的伪代码说明了这一点

    int numberRevolutions = 2;
    float gearRatio = 98.7779466;
    
    float   perfectTarget = numberRevolutions * gearRatio;  // == 197.5558
    int rippleTarget = floor(perfectRipples);               // == 197
    float missedRipples = perfectRipples - rippleTarget;    // == 0.5558
    
    /* Rotate to Target */
    
    perfectTarget = numberRevolutions * gearRatio;          // == 197.5558
    int rippleTarget = floor(perfectRipples);               // == 197
    missedRipples = missedRipples + (perfectRipples - rippleTarget);    // == 1.1116
    
    if (missedRipples > 1)
    {   rippleTarget = rippleTarget + 1;                    // == 198
        missedRipples = missedRipples - 1;                  // == 0.1116
    }
    
    /* Rotate to Target */
    //etc
        

    不驱动电机时的移动

    我们的 DRV8214/DRV8234器件只能在主动驱动电机时控制电机位置。  如果在禁用驱动器输出时电机上出现任何外部力、例如电机反向驱动、那么我们的器件将不知道相关情况。  使用这些器件的系统将需要某种方式通过将电机移动到已知位置来使电机"归一"-通常会驱动至末端停止位置并检测失速电流、或者使用限位开关或其他类似器件。   

    此致、

    雅各布