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.

[参考译文] DRV8711:停止步进电机

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1253253/drv8711-stop-the-stepper-motor

器件型号:DRV8711

你(们)好。

我需要你的帮助。

我正在为我的项目使用 DRV8711。我的要求是按顺序只需几秒即可停止步进电机的运行。(失速检测)

我将使用5个位置的步进电机。第二个位置添加了一个机械挡块停止电机。 因此机械挡块停止电机时、我生成了一个中断

void Stepper_GPIOIntHandler (void)
{

GPIOIntClear (GPIO_PORTP_BASE、GPIO_PIN_1);
IF (GPIOPinRead (GPIO_PORTP_BASE、GPIO_PIN_1)
{
G_Cal_RSU_SucSmall.stall Arm_Motor = 1;

否则
{

if (STALL_Flag==1)
{

G_Cal_RSU_SucSmall.stall Arm_Motor = 0;
Motor_Stop_Sequence ();
RSU_STALL_Flag = 0;

当中断出现时、步进序列发生了 STALL=1 (电机运行)、进入 STALL=0 (电机停止)、但我需要在 STALL=0后停止步进、我使用了停止序列、但它不起作用。

我需要在几秒钟后停止电机、然后电机才会移动到下一个位置。

我的停止序列是

空 Motor_Stop_Sequence (空)
{
Stepper_Sleep 输入低电平;

Stepper_Step_Input_Low;

注:在上述代码中,电机将免费。 不移动下一个位置。\n 请 建议如何停止电机。

请检查我的上述停机顺序是否正确? 请提供一个解决方案、让失速0后在步进电机进入下一个序列后停止步进电机几秒钟。

客观:

当机械止动装置停止电机时、失速检测将启用。

谢谢!

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

    嘿、Tom、

    失速检测是否能在驱动器内正常工作?  请参阅 7.3.10.1内部失速检测。  您是否将 CTRL 寄存器中的 EXSTALL 位设置为0?  如果您执行了此操作、则 STALLn 引脚在检测到失速时应变为1。

    在停止序列中、应更改这些命令的顺序或删除睡眠模式命令。  如果您将 nSLEEP 设置为低电平、它将禁用所有输出、我认为这就是您所说的 freefall。  相反、如果您希望电机保持就位、请勿将 nSLEEP 设置为低电平。   

    void Motor_Stop_Sequence(void)
    {
        Stepper_Step_Input_Low();
        delay(50); // delay for motor to hold in place
        Stepper_SleepMode_Input_Low; // Put device into SLEEP mode, motor driver circuitry disabled
    }

    以下是有关在 DRV8711上运行失速检测的一篇好文章: E2E 链接

    我们还提供了有关 DRV8711衰减模式设置优化的应用手册、请检查波形、并查看是否需要进行任何调整。

    您使用的是什么微步进设置?   在全步进模式下运行时、失速检测不起作用。 必须有一个零电流阶跃来测量反电动势。  此外、必须测量足够的反电动势、零电流阶跃处的时间必须足够长、以使电流达到零并测量反电动势。

    您还可以检查 SDCNT 和 SMPLTH 设置、如以下文章中所述:  https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/843041/drv8711-detection-time-of-stall-condition

    谢谢、

    雅各布

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

    感谢 Jacob、

    现在我得到了停止顺序、它开始工作了。我的要求是从初始位置产生200个脉冲、但机械挡块会在100个脉冲时停止电机。 未检测到失速、并且此阶段正在出现急冲。 失速将在100个脉冲时生成(机械抑制器会停止电机)。并避免急冲。请帮助我如何启用失速检测、以及为了实现失速检测目的、我必须调整什么参数。

    Control_Register。地址= 0x00;
    Control_Register ENBL = 0x01;
    Control_Register。RDIR = 0x00;
    Control_Register = 0x00;
    Control_Register。MODE = 0x02;
    Control_Register = 0x00;
    Control_Register = 0x01;  
    Control_Register。DTIME = 0x03;


    Torque_Register。地址= 0x01;
    Torque_Register .Torque = 0xB4;//Current= 3.89A
    Torque_Register SAMPLTH = 0x00;
    Torque_Register。保留= 0x00;


    Off_Register。地址= 0x02;
    Off_Register.toff = 0x30;
    Off_Register。PWMMODE = 0x00;
    Off_Register。保留= 0x00;

    Blank_Register。地址= 0x03;
    Blank_Register.TBLANK = 0x08;
    Blank_Register = 0x01;
    Blank_Register。保留= 0x00;

    Decay_Register。地址= 0x04;
    Decay_Register。TDECAY = 0x10;
    Decay_Register DECMOD = 0x03;
    Decay_Register。保留= 0x00;

    Stall_Register。地址= 0x05;
    Stall_Register。SDTHR = 0x80;
    Stall_Register。SDCNT = 0x01;
    Stall_Register。VDIV = 0x00;

    Drive_Register。地址= 0x06;
    Drive_Register = 0x01;
    Drive_Register = 0x01;
    Drive_Register = 0x01;
    Drive_Register = 0x01;
    Drive_Register.IDRIVEN = 0x00;
    Drive_Register = 0x00;

    Status_Register。地址= 0x07;
    Status_Register。OTS = 0x00;
    Status_Register = 0x00;
    Status_Register。BOCP = 0x00;
    Status_Register = 0x00;
    Status_Register.BPDF = 0x00;
    Status_Register。UVLO = 0x00;
    Status_Register 标准= 0x00;
    Status_Register。STDLAT = 0x00;
    Status_Register。保留= 0x00;

    请检查我调整的参数是否正确?   检测到失速时遗漏了什么参数。请解决此问题。

    谢谢!

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

    嘿、Tom、

    请尝试更改失速阈值(SDTHR)以及失速生效(SDCNT)和 VDIV 之前的阶跃数、直到获得可靠的失速检测、如数据表的第8.2.2.5节所述。   这些设置因转速和您正在旋转的电机而异。

    您的运转速度是多少?   失速检测设计为在<9000pps 的电压下运行。 除此之外、它可能不起作用。   

    最后、您可以配置 EXSTALL 位= 1并确定相关 BEMF 引脚的范围、从而查看运行和失速条件下得到的电平。  这是一个完整性检查、以在设置内部失速之前查看 BEMF 监测是否完全正常工作。

    此致、

    雅各布

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

    亲爱的雅各布。

    我的步进电机转速为21rpm。 我还可以为 SDCNT=0x01和 VDIV = 0x00设置常数值、并更改 SDTHR 以确定是否发生失速检查。


    Stall_Register。SDTHR = 0x75;
    Stall_Register。SDCNT = 0x01;
    Stall_Register。VDIV = 0x00;

    我的问题是、是否可以为失速检测修改任何其他参数、或者只是上述参数?请提供建议。

    谢谢!

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

    好的、21rpm 应该没问题、21转/分* 1min/60s * 200步/转* 4脉冲/步进=每秒280脉冲(1/4微步进)、因此应该没问题。 (根据 8.2.2.1设置步进速率)  

    根据 7.3.10.1内部失速检测和8.2.2.5配置失速检测、上述和 SMPLTH (反电动势采样阈值)是我用于配置失速检测的唯一参数。   

    此致、

    雅各布

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

    谢谢雅各。

    我一定会尝试这个。我还需要一个问题。

    我为失速检测创建了中断、失速引脚为   GPIO_PORTP_BASE、GPIO_PIN_1。 此引脚读数为1、失速为1 (未检测 到失速)。如果检测到引脚读数为0 、则检测到失速。当我放置中断点时、不会生成中断。请检查我的中断序列是否正确?

    空 GPIOIntHandler (空)
    {

    GPIOIntClear (GPIO_PORTP_BASE、GPIO_PIN_1);
    IF (GPIOPinRead (GPIO_PORTP_BASE、GPIO_PIN_1)
    {
    motor.stall = 1;

    否则
    {

    motor.stall = 0;

    SysCtlDelay (100);
    motor.stall = 1;


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

    嘿、Tom、  

    这在很大程度上取决于您的特定微控制器、我建议您查看其中断函数示例。  您可以手动将引脚拉至高电平/低电平以查看是否触发中断、或连接示波器或逻辑分析仪以查看失速引脚是否在应有的时间变为高电平、从而对其进行测试。  请确保你在全局范围内启用中断并正确设置优先级和触发源。

    此致、

    雅各布  

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

    谢谢你。

    请分享步进脉冲计算的任何示例(步进角、步进数、rpm、频率...) 所有寄存器值的示例(CTRL 寄存器到状态寄存器)。它对我当前的情况非常有帮助。

    注意:我需要具有 DRV8711的 Tiva 示例(不是 MSP ex 代码)。

    请做必需的。

    提前感谢。

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

    嘿、Tom、

    请参阅  数据表中的第8.2.2.1节"设置步进速率"。   

    °步进电阻为1.8 μ s/步进(200步/转)的典型步进电机

    以每分钟转数(RPM)为单位的速度=#Pulse/Sec°* 1.8 μ s/脉冲* 1/微步进* 1reV/360°* 60s/1分钟

    °6000脉冲/秒、1/16微步进= 6000Pulse/1sec * 1.8 μ s/脉冲* 1/16 * 1/360 * 60 = 112.5 RPM

    查看这些资源:

    有关寄存器设置和快速入门、我建议查看 EVM GUI 用户指南的"Operating the EVM"部分。   

    此致、

    雅各布