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.

[参考译文] TMS320F28377S:索引事件上的 QEP 复位计数器

Guru**** 2460010 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/695303/tms320f28377s-qep-reset-counter-on-index-event

器件型号:TMS320F28377S

您好!

我使用 F28337通过 QEP 反馈控制 BLDC 电机。

QEP HW 配置为在发生索引事件时复位计数器?

与100µs 的多个 IDDK 一样、我们每 μ s 有一个计时器中断。

在其中、我们检查标记 QFLG.IEL

在 fisrt 启动时、QEP 计数器会在任何危险值(取决于上电时的电机位置)越过索引事件

然后、该值被锁存到 QPOSILAT、并且计数器应该被设定为0或 QPOSMAX。

但是在 μ 100µs 中断时、当我将 IEL 标志设置为1时、我会得到计数器值。 我希望该值接近0或 QPOSMax (根据硬件索引事件和 μ 100µs 中断之间的电机距离运行)。

但情况并非如此、当穿越 Topz 时、计数器值始终接近值(然后接近 QPOSILAT)。

为什么 当我设置 IEL 标志时、CNT 还没有复位?

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

    请参阅"索引事件时的位置计数器复位(QEPCTL[PCRM]= 00)部分、了解如何将位置计数器设置为在 n 索引事件发生时复位。

    听起来您只是在索引事件上将当前位置计数器值锁存在 QPOSILAT 中。

    QEPTCL.PCRM 的当前设置是什么? 确保将其设置为00。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好

    QEPCTL[PCRM]= 0 =>索引事件复位。

    我监控了 QEP 信号。 我没有 Index 事件。 仅 A 和 B 信号。

    实际上、这就像我的手动 CNT 分配没有效果。

    我在这个论坛上读取、当 QEP 正在运行时、这个寄存器应该被视为只读。 然后、我尝试设置 QPEN = 0、设置 CNT= XXXX (取决于霍尔 传感器 位置) 、然后设置 QPEN = 1。

    但半个时间、计数器不是由该过程设置的。

    然后、我进行了以下测试:

    我的代码调用以下代码:

    /*------------------
    eQEP 解码控制寄存器的初始化状态-------------------------------------------------------
    */
    #define DV_QEP_QDECCTL_INIT_STATE (XCR_X2 + QSRC_Quad_MODE)
    
    /*---------------
    eQEP 控制寄存器的初始化状态
    ----------------------------------------------- */
    #define DV_QEP_QEPCTL_INIT_STATE (QEP_emulation_free +\
    PCRM_INDEX +\
    0 +\
    IEL_Rising +\
    QPEN_ENABLE +\
    QCLM_TIME_OUT +\
    ute _disable )
    /*-------------------------------------------------------
    eQEP 位置比较控制寄存器的初始化状态-------------------------------------------------------
    */
    #define DV_QEP_QPOSCTL_INIT_STATE PCE_DISABLE
    
    /*-------------------------------------------------------
    eQEP 捕捉控制寄存器的初始化状态-------------------------------------------------------
    */
    #define DV_QEP_QCAPCTL_INIT_STATE (UPPS_X32 +\
    CCPS_X128 +\
    CEN 使能)
    

    /*为 QEP 操作设置 GPIO */ \
    GPIO_SetupPinOptions (DV_QEP_PinCfg[m][PinSet].QepPinA、GPIO_INPUT、GPIO_SYNC);/* QEP1A * \
    GPIO_SetupPinMux (DV_QEP_PinCfg[m][PinSet].QepPinA、GPIO_MUX_CPU1、DV_QEP_PinCfg[m][PinSet].GpioMux); \
    GPIO_SetupPinOptions (DV_QEP_PinCfg[m][PinSet].QepPinB、GPIO_INPUT、GPIO_SYNC);/* QEP1B * \
    GPIO_SetupPinMux (DV_QEP_PinCfg[m][PinSet].QepPinB、GPIO_MUX_CPU1、DV_QEP_PinCfg[m][PinSet].GpioMux); \/*GPIO_SetupPinOptions
    (DV_QEP_PinCfg[m][PinSet].QepPinS、GPIO_INPUT、GPIO_SYNC);*/* QEP1S???*/ \/*GPIO_SetupPinMux
    (DV_QEP_PinCfg[m][PinSet].QepPinS、GPIO_MUX_CPU1、DV_QEP_PinCfg[m][PinSet].GpioMux);*/ \
    GPIO_SetupPinOptions (DV_QEP_PinCfg[m][PinSet].QepPinI、GPIO_INPUT、GPIO_SYNC);/* QEP1I * \
    GPIO_SetupPinMux (DV_QEP_PinCfg[m][PinSet].QepPinI、GPIO_MUX_CPU1、DV_QEP_PinCfg[m][PinSet].GpioMux); \
    \/*
    重置硬件模块*/ \
    开关(m)
    \{ \
    案例1: \
    DevCfgRegs.SOFTPRES4.bit.EQEP1 = 1; \
    DevCfgRegs.SOFTPRES4.bit.EQEP1 = 0; \
    中断; \
    案例2: \
    DevCfgRegs.SOFTPRES4.bit.EQEP2=1; \
    DevCfgRegs.SOFTPRES4.bit.EQEP2=0; \
    中断; \
    案例3: \
    DevCfgRegs.SOFTPRES4.bit.EQEP3 = 1; \
    DevCfgRegs.SOFTPRES4.bit.EQEP3 = 0; \
    中断;
    \} \
    \
    (* DV_QEP_Regs[m]).QDECCTL.ALL = DV_QEP_QDECCTL_INIT_STATE; \
    (* DV_QEP_Regs[m]).QPOSCTL.ALL = DV_QEP_QPOSCTL_INIT_STATE; \
    (* DV_QEP_Regs[m]).QUPRD = 0; /* 100Hz 的单位定时器*/ \
    (* DV_QEP_Regs[m]).QCAPCTL.ALL = DV_QEP_QCAPCTL_INIT_STATE; \
    (* DV_QEP_Regs[m]).QPOSMAX =(4 * v.LineEncoder)- 1; \
    (* DV_QEP_Regs[m]).QEPCTL.ALL = 0; /*通过设置为0和启用、重置 HW QEP */ \
    (* DV_QEP_Regs[m]).QEPCTL.ALL = DV_QEP_QEPCTL_INIT_STATE; \ 

    ((* DV_QEP_Regs[m]).QPOSCNT = 2500);
    
    (* DV_QEP_Regs[m]).QCLR.bit.IEL = 1)
    

    之后、JTAG 处于"暂停"状态。 CNT 为2500。 通过这种方式、我确信我的代码中没有任何会出现不良行为的部分。 我让硬战争"单独"

    °我移动电机(仅1或2 μ s)。 我监控 A、B 和 TopZ 信号。 A 和 B 生成一些上升/下降沿。 TopZ 始终为0。

    但 QEP CNT 返回0并完成9892、这与我的案例对应于一个小动作(从9999到9892)。。。

    CNT 已复位!...QFLG.IEL = 0...


     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好
    我忘记调用 EALLOW、然后调用 EDIS 来访问 SOFTPRES4寄存器。
    之后、解决方案就可以正常工作了。

    要恢复:
    为 QEP 上电后、硬件 QEP 需要软复位、因为在硬件线路上接收到 TopZ 事件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、GIR、

    我很高兴您能够找到解决您问题的方法。 如果您遇到任何新问题、请随时再次发帖。

    -Mark