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.

[参考译文] TMS320F28377D:QEP 计数器复位

Guru**** 2616675 points

Other Parts Discussed in Thread: AM26LV32

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/693334/tms320f28377d-qep-counter-reset

器件型号:TMS320F28377D
主题中讨论的其他器件:AM26LV32

你好

我正在进行 BLDC 电机控制。

我的板与具有 controlCARD F28377的演示板非常相似

从 exemple IDDK v2.0获取的软件库。

我的反馈是 QEP +霍尔。

在一个校准步骤中、我获得了电气零和 TopZ 事件之间的 QEP 增量数量。

之后、将 QEP 配置为在 TopZ 事件上复位。  通过重新获取该角度来计算电角、以在真实电角上获得 RawValue = 0。

在正常使用寿命中、我获取 霍尔电容器、并根据电容器向 QEP 计数器应用位置(+校准步骤给出的角度偏移)

在第一个霍尔传感器更改值时、我进行了相同的操作、因为现在、我们可以确保完全转换了两个霍尔组合。

然后在 TopZ 事件中、QEP 计数器设置为0、然后我恰好处于良好位置。

这是正确的、但是在 Hal 电容器上升沿和 TopZ 之间的某个时间、我看到 QepCnt 毫无理由地复位为0! (无顶部 Z FLG.IEL = 0)

我正在使用 IDDK exemple 上提供的 QEP 计算、未设置标志 IndexSyncFlag。

什么可以重置 QEP 计数器、但我的情况中的 TopZ 除外??

QEP 配置如下:

/*------------------
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_ENABLE*/0)

/*-----------------
eQEP 位置比较控制寄存器的初始化状态-------------------------------------------------------
*/
#define DV_QEP_QPOSCTL_INIT_STATE PCE_DISABLE

/*-------------------------------------------------------
eQEP 捕捉控制寄存器的初始化状态-------------------------------------------------------
*/
#define DV_QEP_QCAPCTL_INIT_STATE (UPPS_X32 +\
CCPS_X128 +\
CEN 使能)

电角的计算如下:

{ \
float32 ElectThetaTemp; \/*
检查旋转方向*/ \
IF_MotorPosition _iQep.DirectionQep =(* DV_QEP_Regs[2]).QEPSTS.bit.QDF; \
\/*
检查 EQEP1的位置计数器*/ \
if_MotorPosition _iQep.RawTheta =(* DV_QEP_Regs[2]).QPOSCNT - if_MotorPosition _iQep.InitTheta; \
如果
(IF_MotorPosition _iQep.RawTheta < 0) \
IF_MotorPosition _iQep.RawTheta = IF_MotorPosition _iQep.RawTheta +(* DV_QEP_Regs[2]).QPOSMAX + 1; 否则、如果
(if_MotorPosition _iQep.RawTheta >(* DV_QEP_Regs[2]).QPOSMAX) \
IF_MotorPosition _iQep.RawTheta = IF_MotorPosition _iQep.RawTheta -(* DV_QEP_Regs[2]).QPOSMAX - 1; \
\
/*计算机械角度*/ \
if_MotorPosition _iQep.MechTheta= if_MotorPosition _iQep.MechScale* if_MotorPosition _iQep.RawTheta; \/*
计算电角*/ \
ElectThetaTemp = IF_MotorPosition _iQep.PolePairs*IF_MotorPosition _iQep.MechTheta; \
if_MotorPosition _iQep.ElecTheta =(ElecThetaTemp)-Floor (ElecThetaTemp); \
\/*
检查索引出现情况*/ 如果
((* DV_QEP_Regs[2]).QFLG.bit.IEL =1)
\{ \
IF_MotorPosition _iQep.IndexSyncFlag = 0x00F0; \
IF_MotorPosition _iQep.QepCountIndex =(* DV_QEP_Regs[2]).QPOSILAT; \
((* DV_QEP_Regs[2]).QCLR.bit.IEL = 1);//清除中断标志*
\} \
\/*
检查单位时间超时事件以进行速度计算:*/ \/*
在 INIT 函数中,单位定时器配置为100Hz */ \
if ((* DV_QEP_Regs[2]).QFLG.bit.UTO = 1)
\{ \
/***** 低速计算**/ \
if (((* DV_QEP_Regs[2]).QEPSTS.bit.COEF ||(* DV_QEP_Regs[2]).QEPSTS.bit.CDEF))\
{//捕获计数器溢出,因此不执行计算速度*/ \
(* DV_QEP_Regs[2]).QEPSTS.ALL = 0x000C;
\} \
否则、如果((* DV_QEP_Regs[2]).QCPRDLAT!=0xFFFF) \
/*使用捕获计数器值计算低速*/ \
IF_MotorPosition _iQep.QepPeriod =(* DV_QEP_Regs[2]).QCPRDLAT;
\}
\} 

这仅在真正的实际 TopZ 信号之前出现。 以后再也不来了。

感谢你的帮助。

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


    您好!

    "这可以正常工作、但在 Hal 电容上升沿和 TopZ 之间的某个时间、我看到 QepCnt 毫无理由地复位为0! (无顶部 Z FlG.IEL = 0)"

    您是指按 TopZ 事件索引脉冲吗? 您能否检查 QEP 输入端是否存在任何噪声?
    您是否已配置 GPIO 滤波器来滤除系统中可能存在的噪声? 这应该排除计数器是否由于输入噪声而被复位。
    此外、复位是在特定条件下持续发生还是每次都是随机实例?
    当 qepcnt 未复位时、计数器值是否按预期变化? 推断的位置是否与预期位置匹配?

    Bharathi。

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

    提供的初始化代码所示的 QEP 配置为对 A 和 B 事件进行计数。

    QEPMax 为9999 (编码器为2500脉冲/圈)

    此外、它被配置为复位索引脉冲计数(TopZ)。

    然后、我看到 QEP 毫无理由地复位为0、具有随机行为、但始终在到达第一个实数索引脉冲之前。

    然后、通过一些跟踪方法、我确认当这个"虚拟"复位发生时、标志 FLG.IEL 未被置位。

    这表示索引引脚没有噪声、因为如果是这种情况、将设置此标志!

    但我检查了硬件信号。 示波器没有沿触发、没有噪声...

    未在 GPIO 上配置滤波器。 我认为这不是保持良好反应的必要条件。

    当计数器未复位时、计数器值会按预期发生变化、不会出现任何问题。 该计数器在到达 TopZ 之前的某个时间复位。

    如果问题在第一个实际 topZ 之前未发生、则问题永远不会在之后发生。 (截至今天... 也许明天会! :-)

    谢谢

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

    因此、复位仅在第一个索引脉冲发生之前的初始阶段发生。
    复位发生时是否有任何特定的计数值?
    在杂散复位之前/之后计数器是否按预期计数?
    您的软件代码执行中是否有发生复位的特定部分?
    这肯定不是预期行为、因为您说它是随机发生的、因此难以确定问题。

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

    你好

    我发表了一些看法。

    实际上、QEP 电机输出是差分信号(A、B 和 Z)

    在电路板上、这些差分输入通过 AM26LV32 (低电压高速四路差分线路接收器)进行转换。

    在其他器件上、QEP 编码器电源不是直接为5V 电源、而是通过电源管理(TPS25921:具有精确电流限制和过压保护功能的4.5V - 18V 电子保险丝)

    μ µC 在输出端管理使能信号、该信号使 TPS25921能够为民主系统供电。 5V 输出为 QEP 供电 、但也通过"高电平有效选择引脚"启用 AM26LV32的输出

    软件在初始化阶段实现以下操作:

    -设置启用输出

    -。 进行一些其他初始化(与 QEP 无关)

    -初始化 QEP 模块硬件。

    但 TPS25921的反应时间如下:

    -使能输入引脚和开始增加输出电压之间的时间:450µs μ s

    -加电斜坡达到5V 的时间:880µs =>这是启用 AM26LV32的信号。

    结果如下:

    如您所见、在 QEP Coureur 初始化期间、TopZ 输入为高电平。 然后、由于 QEP 中的电源建立以及 AM26LV32的激活、我们得到了顶部 Z 信号。

    然后在管理开始时、我看到 TopZ 索引标志已设置、然后清除。 但是、这似乎会产生问题、因为当 QEP 开始移动(几 个 A 边沿和 B 边沿)时、计数器复位就像它记忆了之前的 TopZ 信号并稍后应用它…??

    在这种情况下,问题是在11次尝试后出现的,然后在4次尝试后出现的。

    然后、在 QEP 硬件初始化之前、我通过将 TPS25921的使能引脚连接到高电压3.3V 来测试 QEP。

    35次尝试后、问题未重现。

    因此、这可以确认问题来自这种情况。 但没有解释为什么、也没有找到解决方案。 我需要在产品生命周期和电路板打开期间启用或禁用 QEP 电源、而无需关闭/打开电路板。

    然后、我必须找到一个不受此 TopZ 干扰影响的软件解决方案。

    我尝试禁用/启用 QEP 模块、但没有成功。 (QEPCTL.QPEN)

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

    您好!

    我同意这种干扰可能会导致 eQEP 模块中出现不可预测的行为。
    请注意器件数据表"eQEP 时序要求"部分中输入的时序要求。
    正如我之前所说、我仍然建议配置 GPIO 滤波器以滤除此类干扰。
    这样、您还可以解决在产品生命周期内动态重置"启用或禁用 QEP 电源"的问题。

    "我尝试禁用/启用 QEP 模块、但没有成功。 (QEPCTL.QPEN)"
    QPEN 不会使系统进入完全复位状态-您可以使用外设软件复位来执行此操作。
    写入 SOFTPRES4寄存器中的相应 eQEP 模块。

    Bharathi。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将测试 SOFTPRES4并返回此处通知您。
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好
    测试后,这不是更好了! :

    我进行了以下测试:
    通过存根代码、可通过置位和清零 SOFTPRES4执行 QEP 复位。
    之后、我将 QEP 寄存器设置为其初始值。
    然后、我将 CNT 设置为 QEP 复位前保存的值
    然后、我清除 IEL 标志、因为它始终在 QEP 复位后置1、而数据表指示复位值= 0 (?????...)

    然后、我移动轴、在第一个电机移动(第一个 QEP A/B 上升)时、QEPCNT 始终返回0!
    :-)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这项工作现在就开始了。
    实际上、在修改 SOFTPRE4寄存器之前、我们必须调用 EALLOW。。。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    太棒了! 是-这是一个 EALLOW 受保护寄存器。