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:eQEP 溢出中断和数据完整性

Guru**** 2468460 points
Other Parts Discussed in Thread: TMS320F28377S

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/990731/tms320f28377s-eqep-overflow-interrupt-and-data-integrity

器件型号:TMS320F28377S

Hallo、

我将 eQEP 用作 TMS320F28377S 内的正交编码器。 每次上溢和下溢都用于递增/递减旋转计数器。

结果是预期的总转子位置。 总位置由转子位置(eQEP 计数器)和总旋转计数器(中断)计算得出。

不幸的是、溢出中断会被阻止或具有较低的优先级、这会导致无效数据:实际读取、只是过载 eQEP_O_QPOSCNT、但中断驱动的旋转计数器不会更新。

请帮助我获取始终有效的数据。


其他信息:

索引脉冲中断用于计数器校正、在第一个索引处进行引用。

过载中断用于扩展计数器。


大家好

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

    您好!

    您能否提供更多有关计数器值不匹配或因中断优先级低而延迟进入 ISR 而无效的详细信息?

    如果您可以在正常操作期间以及延迟时间显示计数器值、这将有所帮助。

    您是否了解了锁存 QPOSCNT?

    此致、

    Nirav

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

    转子位置以弧度为单位计算:2*PI*TOTAL_RINESS_RINESS_2*PI*QPOSCNT/ENMOer_PULSE_COUNT
    在稳定速度驱动期间(预计接近恒定的位置增量),有时会出现对几乎-2*PI 增量读取的单次读取(代替预期值,例如0.01*PI)。
    I 在其他方面、故障值由 QPOSCNT 近0或近 MAX 组成。


    这意味着 QPOSCNT 刚刚超频、但此时 TOTAL_RINESS_RINESS_RINESS_RINESS_RINESS_RINESS_RINESS_RIN
    我直接使用 eQEP_getPosition ()函数读取 QPOSCNT、而不对其进行锁存。
    我想、在执行溢出 ISR 之前、我获得 QPOSCNT。

    如何处理 QPOSCNT 锁存?

    Init_QEP(void){
        // Configure the decoder for quadrature count mode, count edges of both A and B signals.
        EQEP_setDecoderConfig(EQEP_BASE, (EQEP_CONFIG_2X_RESOLUTION |EQEP_CONFIG_QUADRATURE |EQEP_CONFIG_NO_SWAP | EQEP_QDECCTL_IGATE));
    
        EQEP_setEmulationMode(EQEP_BASE, EQEP_EMULATIONMODE_RUNFREE);
    
        // Configure the position counter to reset on overflow, set maximum value (overflow)
        EQEP_setPositionCounterConfig(EQEP_BASE, EQEP_POSITION_RESET_MAX_POS, m_pulse_count - 1);
    
        // Configure the position counter to be latched on - correction of lost impulses
        EQEP_setLatchMode( EQEP_BASE, EQEP_LATCH_SW_INDEX_MARKER );
    
        // Enable Interrupt
        EQEP_enableInterrupt (EQEP_BASE, EQEP_INT_INDEX_EVNT_LATCH | EQEP_INT_PHASE_ERROR | EQEP_INT_DIR_CHANGE | EQEP_INT_OVERFLOW | EQEP_INT_UNDERFLOW);
    
        // Enable the eQEP3 module
        EQEP_enableModule(EQEP_BASE);
    
        // Set counter to zero (will be reset again when over/underflow)
        EQEP_setPosition(EQEP_BASE, 0);
    	
    	// Configure the position counter to reset on overflow, set maximum value (overflow)
        EQEP_setPositionCounterConfig(EQEP_BASE, EQEP_POSITION_RESET_MAX_POS, m_pulse_count - 1);
    }
    
    
    interrupt void index_interrupt_handler(void){
    	...
    
        //IRQ: Over- / Under-flow supports revolution counting
        if ((EQEP_getInterruptStatus(EQEP_BASE) & EQEP_INT_OVERFLOW) != 0U)    {
            m_revolution_counter++; //UPCOUNTING
        }
    	
        if ((EQEP_getInterruptStatus(EQEP_BASE) & EQEP_INT_UNDERFLOW) != 0U)    {
            m_revolution_counter--; //DOWNCOUNTING
        }
    
    
        EQEP_clearInterruptStatus(EQEP_BASE, 0x0FFF);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP5);
    }

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

    您何时获得位置计数? 这意味着何时执行 eQEP_getPosition ()函数。 我在 ISR 中看不到它。

    我仍然不清楚如何对 QPOSCNT 读取进行计时、这意味着您是在索引事件或单元超时时时时执行此操作? 当您读取 QPOSCNT 时、可能已达到最大值、因此当生成溢出中断并读取 QPOSCNT 时、计数器已复位。

    您可以锁定 QPOSCNT on Unit Time Out 事件。 为此、您需要配置单元计时器。

    此致、

    Nirav

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

    函数 eQEP_getPosition () 是按需调用的,完全与 eQEP 事件异步,例如从其他中断调用。

    [引用 userid="214940" URL"~/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/990731/tms320f28377s-eqep-overflow-interrupt-and-data-integrity/3663695 #3663695">您可以锁定 QPOSCNT 的"单位超时"事件。 为此、您需要配置单元计时器。[/quot]

    这可能是我需要的。 但是、如何锁存 QPOSCNT 和过载计数器?

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

    如果 eQEP_getPosition ()被异步调用、那么我认为单元计时器将不起作用。  

    当您读取 QPOSCNT=0或 Max 值时、为什么不能只增加/减少旋转计数器(m_rerot_counter)、这样您就可以获得正确的旋转计数。 递增/递减时、还必须清除中断标志、这样它不会在 ISR 内递增/递减两次。

    此致、

    Nirav

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

    异步读取 QPOSCNT 不会返回0、例如4或7。
    我实施了 simmilar 解决方案。 如果软件读取检测 到0 <=>最大 转换(具有一些容差边界)、则旋转计数器会递增/递减。 那么不再需要来自过载的 ISR。  

    谢谢你 Nirav