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.

[参考译文] DRV1.0983万:HWiLimitThr设置的结果不一致

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/656841/drv10983-hwilimitthr-setting-has-inconsistent-results

部件号:DRV1.0983万

我正在使用DRV1.0983万开发一个定制设计的主板,并使用运行PI速度控制回路的外部MCU。  电机速度通过I2C读取,通过PI回路运行,速度控制寄存器更新以保持电机速度一致。  电机已根据TI文档进行了调整,并且运行正常。  将TEK示波器与电流探头配合使用时,我通过电机相位的峰值电流为1.49A (峰值,而不是RMS)。  在调谐速度控制回路时,我发现DRV1.0983万一直跳闸Lock0故障。  我的HWiLimitThr寄存器的原始设置是0x06,它应该等于2.8A。  发现此问题时,我将HWiLimitThr增加到0x07,该值应等于3.2A。  令我困惑的是,我发现我实际上是在操作过程中在较低的峰值电流阈值下跳闸了Lock0故障。  在发现这一点后,我将HWiLimitThr降低到0x05,该值应等于2.4A,而在这个较低的阈值下,我现在看到我的峰值工作电流比HWiLimitThr值更高时的工作时间更长。  我仍然看到Lock0故障,这是一个问题,所以我需要一些帮助来了解为什么我看到较高的HWiLimitThr值的阈值较低。  特别是考虑到我现在的示波器测量值接近当前的断路值。  我能够捕获在HWiLimitThr = 0x07中出现Lock0故障的跳闸点,当小于1A通过电机相位时DRV1.0983万跳闸。

如有任何帮助,我们将不胜感激,

标记

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

    您好,Mark,

    如果我理解正确的话,听起来好像你在不同级别遇到了与HWiLimitThr不对应的电流限制Lock0。

    对此的一个解释是在  所有3个相位上都监控电流限制。 我假设您仅在三个相位中的一个相位上监测电流,而不提供有关电流触发水平的信息。 在一个相位上完全可能存在低电流,而流经其他2的电流则为高电流。 如果您有3个电流探头,这将提供完整的故事。 否则,尝试 通过 多次监测3个阶段中的每个阶段来进行实验(假设电流限制锁易于复制),这 可能会也可能不会帮助回答问题。

    另一条有用的信息是您遇到当前限制时。 这是在开环还是闭环操作期间? 注意:当计算开环或闭环时,其它一些电流限制也会起作用。 提供您的EEPROM设置(最好使用GUI)可以帮助我们更好地了解更大的情况。

    最佳,

    -Cole

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

    所以我有一个类似的想法,认为相电流是不同的。  我只有一个电流探头,但故障很容易重现,当故障在每个阶段发生多次时,我捕获了电流。  我可以想象,从统计角度来看,电流故障可能总是处于与我所测量的不同的阶段, 但如果使用星形绕线电机,我认为我在测试中的某个时间点会看到异常,或者至少会看到一个电流接近2.4 3.2A设定的阈值,而我从未看到任何阶段的峰值高于1.49A。

    所有这些错误都是在DRV1.0983万运行闭环时发生的,我可以很容易地看到闭环功能接管时的作用域。

    我已经在代码中围绕DRV1.0983万构建了一些框架,因此它是通过代码结构进行初始化以实现可移植性的。  大多数设置都是使用枚举配置的,这应该很容易确定值。  初始化代码使用正确的位移和从枚举的屏蔽将寄存器写入:

    /// DRV1.0983万配置。
    静态连接drv1.0983万_device_config_t DRV1.0983万_device_config =

    .doubleFreq = drv1.0983万_motor_param_DoubleFreq_25kHz,
    .rm = 0x5B,// 3.4 欧姆
    .AdjMode = drv1.0983万_motor_param_AdjMode_FullCycle,
    KT = 0x3A,// 73.3 mV/Hz
    CtrlAdvMode = drv1.0983万_motor_param_CtrlAdvMode_FixedTime,
    .Tdelay = 0x4C,// 480us
    .ISDThr = drv1.0983万_sys_opt_ISDThr_6Hz,
    .IPDAdvAgl = drv1.0983万_sys_opt_IPDAdvAgl_30d,
    .isden = drv1.0983万_sys_opt_isden_disable,
    .RvsDrEn = drv1.0983万_sys_opt_RvsDrEn_disable,
    .RvsDrThr = drv1.0983万_sys_opt_RvsDrThr_6P3Hz,
    .OpenLCurrr = drv1.0983万_sys_opt_OpenLCurr_0P4A,
    .OpLCurrRt = drv1.0983万_sys_opt_OpLCurrRt_0P7VCCps,
    .BrkDoneThr = drv1.0983万_sys_opt_BrkDoneThr_disable,
    CtrlCoef = drv1.0983万_sys_opt_CtrlCoef_1,
    .StAccel2 = drv1.0983万_sys_opt_StAccel2_14Hzps2,
    .StAccel = drv1.0983万_sys_opt_StAccel_38Hzps,
    .Op2ClsThr = 0x11,// 25.6Hz
    .AlignTime = drv1.0983万_sys_opt_AlignTime_0P33s,
    .faultEn3 = drv1.0983万_sys_opt_FaultEn3_enable,
    .LockEn2 = drv1.0983万_sys_opt_LockEn2_disable,//待办-启用LockEn2 -异常KT
    .LockEn1 = drv1.0983万_sys_opt_LockEn1_enable,
    .LockEn0 = drv1.0983万_sys_opt_LockEn0_enable,
    AVSIndEn = drv1.0983万_sys_opt_AVSIndEn_disable,//待办-启用感应式AVS
    .AVSMEn = drv1.0983万_sys_opt_AVSMEn_enable,
    .AVSMMd = drv1.0983万_sys_opt_AVSMMd_AVS_to_VCC,
    .ipDRlsMd = drv1.0983万_sys_opt_ipDRlsMd_Brake_Release,
    .SWILimitThr = 0x0A,// 2A // TODO -考虑限制加速电流
    //.HWiLimitThr = 0x04,// 2A
    //.HWiLimitThr = 0x06,// 2.8A // TODO -如果降低加速电流,可能会降低锁定电流限制
    .HWiLimitThr = 0x05,// 2.8A// TODO -如果我们降低加速电流,可能会降低锁定电流限制
    .LockEn5 = drv1.0983万_sys_opt_LockEn5_enable,
    .ClsLpAccel = drv1.0983万_sys_opt_ClsLpAccel_0P77VCCps,
    .deadtime = 0x09,// 400ns //待办-可能会增加deadtime
    .IPDCurrThr =0,// IPD已禁用
    .LockEn4 = drv1.0983万_sys_opt_LockEn4_enable,
    .VregSel = drv1.0983万_sys_opt_VregSel_5V,
    .IPDClk = drv1.0983万_sys_opt_IPDClk_24Hz,
    .FGOLse = drv1.0983万_sys_opt_FGOLse_Op_and_CL,
    .FGcycle = drv1.0983万_sys_opt_FGcycle_1_puls_per_per _1_cycle,
    .KtLckThr = drv1.0983万_sys_opt_KtLckThr_Hi_2Kt_Lo_1d2Kt,
    Check Alignment of PHs>.SpdCtrlMd = drv1.0983万_sys_opt_SpdCtrlMd_PWM,
    .CLoopDis = drv1.0983万_sys_opt_CloopDis_disable,
    .MaxSpd = 405,
    MinSpd = 60
    };

    注意:MaxSpd和MinSpd不是寄存器值,它们是我通过测试此项目以限制操作范围而确定的SpdCtrl寄存器的最大值和最小值。

    另一个我最初没有提到的有趣的注意事项是,我运行测试设置的时间已超过一个月,没有任何故障条件,但最近才开始看到故障状况。  使这一变化产生于PI速度控制回路。  以前,代码只是根据按键在6种不同速度间循环,将单个值写入SpdCtrl寄存器,但每次按键时,SpdCtrl仅写入一次,并且不考虑电机的实际速度。  为了清除工作条件下速度的变化,我编写了一个简单的PI速度控制回路,它通过I2C读取电机速度,运行PI回路,然后每隔10毫秒向SpdCtrl写入一个新值。  我写了一个快速数据记录器,它会轮询上次测量的速度,目标速度,PI错误,PI内部和输出SpdCtrl值,以查看可能触发错误的SpdCtrl值中是否有较大的波动。 但是,当出现错误时,对SpdCtrl只做了非常小的更改。  我还使用逻辑分析器验证了这一点,查看Lock0故障发生之前和之后的I2C活动。

    所以我想我最好奇的是:是否有一个最大的频率可以写出SpdCtrl更新?  由于PI循环是固定频率,我可能在相位零交叉之间多次更新SpdCtrl寄存器,这是否会导致问题?  如果不定期写出SpdCtrl更新,我似乎没有问题,因此似乎这可能与SpdCtrl写入速度有关。

    如果您有任何其他问题,我可以回答以帮助您解决,请告诉我。

    标记

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

    您好,Mark,

    为延迟道歉,我想我已经将您的设置汇总到下图中,如果有不一致的地方,请告诉我。

    我们将暂时搁置当前的限制问题,并讨论您的PI循环。 所以如果我理解正确的话,你可以 用I2C来控制电机的输入速度命令。 为此,您可以启用SpeedCtrl2[7](启用I2C速度控制)的覆盖位,并在  SpeedCtrl1寄存器中写入一些值,如果速度足够快,也可以在SpeedCtrl1中使用位0。

    如果这是真的,那么这个数量被转换成一个速度命令百分比,这个百分比被推到SpeedCmd[7:0]。 查看您的设置(稍后将介绍更多信息)后,它最终 推送到速度命令缓冲区(spdCmdBuffer[7:0]),然后转换为以Hz为单位的电频率(电机速度1和2)。 然后,使用方程式RPM = 60*f_electrice/(n_pole_pairs_motor)将电频率传输到RPM。 希望这能让您了解为什么我认为快速更新SpdCtrl Register 会是个问题。

    控制I2C的最大速度命令在SpeedCtrl1中为0xFF,在SpeedCtrl2[0]中为"1"。 对于SpdCtrl[8:0],这类似于0x1FF。 希望这能满足您写入寄存器的最大速度。

    现在为您解决当前的限制问题。 我注意到您的闭环加速率相当高;这会导致速度命令缓冲器快速变化,如果  新的速度命令比原来的速度命令高得多(PI回路可能会这样做),则会导致电流快速飙升。 例如,尝试降低IT 0.091 VCC/s, 查看电流限制是否仍然存在(如果仍然存在,让我们看看哪个级别)。

    请告诉我这是否有帮助,

    -Cole