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.

[参考译文] RM44L920:测量车轮速度时 ECAP 模块出现随机数据尖峰

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1223026/rm44l920-ecap-module-random-spike-of-data-while-measuring-wheel-speed

器件型号:RM44L920

我使用 eCAP 模块来获得轮速,通过查看数据,我可以看到随机频繁的数据尖峰,即使我们在算法中使用 RC 滤波器和低通滤波器。这里我使用 eCAP 与中断。我正在附加我的代码。

使用 eCAP 寄存器4、启用 eCAP 中断 evt1和 evt4。 我将使用4个 eCAP 脉冲来计算速度。我们是否需要清除 eCAP 计数器的溢出? 我们是否需要为 eCAP 使用 FIQ? 因为我也会每25ms 连同 RTI 一起使用一次。

void calculate_speed()
{       

         volatile uint32 temp1、temp2、temp21、temp22;
         TEMP1 = C1;
         TEMP2 = C4;
                   if (temp2>temp1)
                  {
                      T = temp2 - temp1;
                      fwspeed =(1308.3*180.00*100.00)/T; //Rad/sec
                   }

}

void ecapNotification (ecapbase_t * ecap、uint16标志)

   if (ecap == ecapREG4){
   计数++;
   if (计数%2 == 1)
   {
       c1 = ecapGetCAP1 (ecapREG4);
       pulsesf++;
       标志= 0;
   }
   否则、如果(计数%2 =>= 0)
   {
       c4 = ecapGetCAP4 (ecapREG4);
       计数= 0;
       标志= 1;
   }

}
}

int main(){

 _enable_interrupt_();
   _enable_irq();

ecapInit();

while (1){

       if (flag==1){
           _disable_irq();
           calculate_speed();
           _enable_irq();
       }

}

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

    我还添加了数据尖峰图。

    您可以看到、在某个位置、50处的数据正在某些位置达到峰值。

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

    Karthik、您好、

    输入信号是什么样子的? ECAP 输入信号中是否存在未被滤除的噪声尖峰?

    您不必同时为 EVT1和 EVT4启用中断。 启用 EVT4中断已足够好。  

    您使用 绝对时间戳模式、您是否可以尝试 在事件边沿复位计数器的时差(Delta)模式?

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

    您好、Wang、

    是的,现在我仅使用 EVT4并捕获四个电容值,即使我们使用 RC 滤波器滤除噪声,但捕获值似乎不可用,例如(C1和 C2值相同),(C1值时间捕获比预期快) 在这些情况下,我们可以看到数据的尖峰,如果我们过滤掉这些条件,我们能够得到下降数据。但我需要利用每个脉冲。

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

    您好!

    eCAP 模块支持复位特性:32位计数器可在四个事件载入中的任何一个上被复位。 在您的应用情况下、计数器应在 EVENT1、事件2和事件3处复位。 我建议对事件4上的计数器进行复位。 启用复位功能将避免计数器溢出问题。

      ecapREG4->ECCTL1 =  ((uint16)((uint16) RISTING_EDGE << 0U)/*捕获事件1极性*/
                          |(uint16)((uint16) RESET_DISABLE << 1u )/*计数器重置打开 捕捉事件1 */
                          |(uint16)((uint16) Rising _EDGE << 2u)/*捕获事件2极性*/
                          |(uint16)((uint16) RESET_DISABLE << 3U. )/*计数器重置打开 捕获事件2 */
                          |(uint16)((uint16) RISING_EDGE << 4U)/*捕获事件3极性*/
                          |(uint16)((uint16) RESET_DISABLE << 5U )/*计数器重置打开 捕捉事件3 */
                          |(uint16)((uint16) RISING_EDGE <<6U)/*捕获事件4极性*/
                          |(uint16)((uint16) RESET_ENABLE << 7U )/*计数器重置打开 捕捉事件4 */
                          |(uint16)((uint16) 0U << 8U)/*启用/禁用捕获事件加载*/
                          |(uint16)((uint16) 0U << 9U);/*设置事件过滤器预分频*/

    如果在每个事件中重置计数器、则可能会在事件1和事件4中获得相同的捕获值。