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.

[参考译文] CCS/DRV8885EVM:DRV8885EVM固件错误?

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/604288/ccs-drv8885evm-drv8885evm-firmware-bug

部件号:DRV8885EVM

工具/软件:Code Composer Studio

大家好,

我在使用DRV8885EVM固件(FW)时遇到一些问题。  固件似乎忽略了来自我的软件和EVM软件的G_MAUNAL_Advance命令。

通常,一旦安装了部件,要移动一定数量的步骤,过程是:

 -通过写入地址0x11A0,将所需的#步数写入G_NUM_Steps。

 -将布尔值TRUE或逻辑1写入0x11CC,即G_MANUAL_Advance变量,这将启动电机移动。

 -轮询0x11C8,即G_MOTOR_CMD_ACLE2变量,直到其清除为止,这应表示马达已完成移动。

我遇到的问题是,可能1/10写入G_MANUAL_Advance似乎被忽略了,当我在写入后刚刚轮询G_MOTOR_CMD_active2时,很明显,当我不可能时,我要求电机移动100步,这应该需要100mS以上。  请参阅随附的串行示波器截图。

重现步骤,请参阅EVM屏幕的图片。

我已在CCS中将固件和类似的EVM拉下来,所有这些似乎都错过了命令。  该问题似乎与来自SW的异步poke / peeks有关,以某种方式导致G_manual_Advance或G_motor_CMD_active2标志清除。  对这些位置的写入似乎只发生在少数几个地方,GUI默认值,但最重要的是,当电机控制状态机确定设备处于空闲状态时,可能会发生。

我们非常感谢您提供任何建议。

此处是DRV8885EVM软件的链接。

谢谢!

亚当

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

    有时MCU不接受该命令。 这可能是由于维修中断或计算浮点数造成的。

    查询G_MOTOR_CMD_ACLE2并看到错误结果后,您可以重新发送命令,直到得到正确的响应。 如果您知道此设备在发出命令和读取状态之间的时间内无法完成移动,则可以接受此操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Duncan,

    感谢您的回复。

    我很肯定字节会被正确接收并写入内存,我已经修改了串行命令处理程序,以便在写入后从内存中回读每一个读数,并使用1字节ACK进行响应。

    我认为,在确定移动和状态机更新发生之前,我写的字节会被阻塞。  可能是因为在空闲时,固件只会放置在该位置以清除所有变量。  也许可以对其进行修改,使其在第一次进入空闲状态时仅清除空闲变量,这至少会限制它发生的可能性,除非字节出现在几个指令之间。  也许我会尽快实施。

    是的,该变通办法可以正常工作,但仅限于我知道无法在轮询之前完成的步骤。  但我真的想让它发挥作用而不是诉诸这种方法。  也许我还可以在开始运行时稍作延迟,这段时间足够长,足以确定写入是一个快速/肮脏的修复方法。

    我认为这可能会被开发人员读取,并且可能会使内存发生转折,从而导致快速修复。

    再次感谢,

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

    我认为我已经解决了这个问题,但已经执行了有限的测试。

    我认为问题就在这里:

    Void MotorStateMachine()
    
    {
    
    //如果需要,更新SteppingRateTMR
    
    //减少计算次数
    
    IF (UpdateSteppingRateTMR == true)
    
    {
    
    SteppingRateTMR = SMCLK_FREQ/SteppingRate;//计算新值
    
    UpdateStepingRateTMR =假; //清除标志
    
    }
    
    开关(加速状态)
    
    {
    
    外壳(空闲):
    
    IF (G_报答== FALSE && G_WAKE == HIGH && G_ENABLE == HIGH)
    
    {
    
    G_MOTOR_CMD_ACLE1 =假;
    
    G_MOTOR_CMD_ACLE2 =假;
    
    G_MOTOR_CMD_ACTIVE3 =假;
    
    G_ENBL_START_STOP =假; //使用false启用,允许开始停止
    
    G_MANUAL_Advance =假; //停止时清除标记
    
    G_ENBL_往 复按钮= FALSE;
    
    g_run_motor =假;
    
    G_ENBL_Move步骤= FALSE;
    
    MoveSteps =假; //清除此处的MoveSteps标志
    
    //如果最后一个命令是运行电机,则重置计时器
    
    IF (LastCommandWasRunSteps == true)
    
    {
    
    TACTL &=~MC_3; //停止时间A
    
    TBCTL &=~MC_3; //停止时间B
    
    }
    
    } 

    空闲情况经常运行,并在DetermineMotorMovement()对这些GUI的所有写入执行操作之前,对它们进行重编。  我添加了一个PrevAccelerateState变量,并在每次更改之前将其设置为AccelerateState。

    现在UpdateStateMachine()仅在第一次转换为空闲时清除GLOBALS:

    Void MotorStateMachine()
    
    {
    
    //如果需要,更新SteppingRateTMR
    
    //减少计算次数
    
    IF (UpdateSteppingRateTMR == true)
    
    {
    
    SteppingRateTMR = SMCLK_FREQ/SteppingRate;//计算新值
    
    UpdateStepingRateTMR =假; //清除标志
    
    }
    
    开关(加速状态)
    
    {
    
    外壳(空闲):
    
    {
    
    IF (PrevAccelerateState ==空闲)
    
    {
    
    //不执行任何操作,确保在状态更改时只清除下面列出的全局}
    
    
    
    否则
    
    {
    
    PrevAccelerateState =空闲; //将状态设置为空闲
    
    IF (G_报答== FALSE && G_WAKE == HIGH && G_ENABLE == HIGH)
    
    {
    
    G_MOTOR_CMD_ACLE1 =假;
    
    G_MOTOR_CMD_ACLE2 =假;
    
    G_MOTOR_CMD_ACTIVE3 =假;
    
    G_ENBL_START_STOP =假; //使用false启用,允许开始停止
    
    G_MANUAL_Advance =假; //停止时清除标记
    
    G_ENBL_往 复按钮= FALSE;
    
    g_run_motor =假;
    
    G_ENBL_Move步骤= FALSE;
    
    MoveSteps =假; //清除此处的MoveSteps标志
    
    //如果最后一个命令是运行电机,则重置计时器
    
    IF (LastCommandWasRunSteps == true)
    
    {
    
    TACTL &=~MC_3; //停止时间A
    
    TBCTL &=~MC_3; //停止时间B
    
    }
    
    }
    
    }
    
    }
    
    

    我将在这里留下一个CCS 7.2 .........0项目,如果其他人有这个问题,这个FW映像自称v 1.1。

    谢谢!
    亚当

    e2e.ti.com/.../DRV8885EVM_5F00_v1p0.zip