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.

[参考译文] TMS320F28379D:速度确定

Guru**** 2805425 points

Other Parts Discussed in Thread: TMS320F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1608078/tms320f28379d-determination-of-speed

部件号: TMS320F28379D

Hello Forms、

测试用例:使用 512 PPR 的绝对编码器 (AS5147 - A、B、I 和 PWM)、  以不同的转速旋转电机时、如下所示。1.

问题:集是速度、计算速度正好是设定速度的一半。

信息:  
 与编码器读取外设和速度计算相关、如下所示。
==================================
编码器的初始化
==================================
void eQEP-1_init (){
  //
  //设置 eQEP 模块输入信号的极性。
  //
  eQEP-setInputPolarity (eQEP_1_BASE、false、false、false、false、false);
  //
  //配置 eQEP 模块的正交解码器单元。
  //
  eQEP-setDecoderConfig (eQEP_1_BASE、(eQEP_CONFIG_正 交| eQEP_CONFIG_2X_resolution | eQEP_CONFIG_NO_SWAP | eQEP_CONFIG_IGATE_DISABLE));
  //
  //设置 eQEP 模块的仿真模式。
  //
  eQEP-setEmulationMode (eQEP-1_BASE、eQEP-EMULATIONMODE_RUFREE);
  //
  //配置 eQEP 模块位置计数器单元。
  //
  eQEP-setPositionCounterConfig (eQEP_1_BASE、eQEP_POSITION_RESET_MAX_POS、2047U);
  //
  //设置当前编码器位置。
  //
  eQEP-setPosition (eQEP-1_BASE、0U);
  //
  //禁用 eQEP 模块单元计时器。
  //
  eQEP-disableUnitTimer (eQEP-1_BASE);
  //
  //禁用 eQEP 模块看门狗计时器。
  //
  eQEP-disableWatchdog (eQEP-1_base);
  //
  //配置可以锁存位置计数的正交模式。
  //
  eQEP_setLatchMode (eQEP_1_BASE、(eQEP_LATCH_UNIT_TIME_OUT|eQEP_LATCH_RISING_SELECTION|eQEP_LATCH_RISING_INDEX);
  //
  //配置位置计数器初始化模式。
  //
  eQEP-setPositionInitMode (eQEP_1_BASE、(eQEP_INIT_RISING_SELECTION));
  //
  //设置编码器位置计数器的软件初始化。
  //
  eQEP-setSWPositionInit (eQEP-1_base、false);
  //
  //设置编码器位置计数器的初始值。
  //
  eQEP-setInitialPosition (eQEP-1_BASE、0U);
  //
  //启用 eQEP 模块。
  //
  eQEP-enableModule (eQEP_1_BASE);
  //
  //配置 eQEP 模块边沿捕获单元。
  //
  eQEP-setCaptureConfig (eQEP_1_BASE、eQEP_CAPTURE_CLK_DIV_8、eQEP_UNIT_POS_Evnt_DIV_128);
  //
  //启用 eQEP 模块边沿捕获单元。
  //
  eQEP_enableCapture (eQEP_1_BASE);
  //
  //配置 eQEP 模块位置比较单元。
  //
  eQEP-setCompareConfig (eQEP_1_BASE、(eQEP_COMPARE_NO_SYNC_OUT | eQEP_COMPARE_NO_SHADOW)、0U、0U);
  //
  //启用 eQEP 模块位置比较单元。
  //
  eQEP_enableCompare (eQEP_1_BASE);
}

==================================
 使用以下函数计算速度
==================================

Void SpeedFinder (void)

  uint16_t Overs Flow_Flag =(eQEP_getStatus (eQEP_1_BASE));
  if (((覆盖 Flow_Flag & EQEP_STS_CAP_OVRFLW_ERROR)!=0)
  {
    TotalTicks +=65535;
    eQEP-clearStatus (eQEP-1_BASE、eQEP-STS_CAP_OVRFLW_ERROR);
  }

  if (((覆盖 Flow_Flag & EQEP_STS_UNIT_POS_Evnt)!=0)
  {
    eQEP-clearStatus (eQEP-1_BASE、eQEP-STS_UNIT_POS_Evnt);
    uint16_t QCPRD = eQEP_getCapturePeriod (eQEP_1_BASE);
    FullCountTicks = TotalTicks + QCRRD;
    IF(FullCountTicks >0L)
    {
      RPS =(float) 781250/FullCountTicks;(781250 =((UPPs[128]*(SYSCLK[100.000,000]/CP[8]))/(CPR[2048]))
      MECH_rpm =(浮动)RPS*60;
      TotalTicks = 0;
      FullCountTicks = 0;
    }
    暴露
    {
      RPS = 0;
    }   
  }
}

提前感谢、
Soumitri Kumar



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

    您好、  

    这是因为在一个周期中、由于分辨率是 2 倍、位置计数器在上升沿和下降沿都递增。

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

    尊敬的 Divesh:

    根据上述建议、 我尝试 将 分辨率更改为 1x、计算以及下面随附的结果。

    乘数推导:

    第 128 章

    SYSCLK - 1000000

    CP - 8.

    CPR - 2048

    乘数 :(UPPS*(SYSCLK/CP))/(CPR))=>    应该是 781250,但当我放置 1562500(781250*2) 作为乘数时, 我能够找到确切的速度  


    结果:

    电机转速 最大位置计数 乘法器   速度读取
    1x(仅上升沿计数)
    150 2048 1562500 150
    1000 2048 1562500 1000
    500 2047 1562500 500
    150 2048 781250 75
    1000 2048 781250 500
    500 2048 781250 250
    2x(仅限上升沿计数和失败边缘计数)
    150 2048 1562500 150
    1000 2048 1562500 1000
    500 2047 1562500 500
    150 2048 781250 75
    1000 2048 781250 500
    500 2048 781250 250


    感谢您的回答、
    Soumitri Kumar。

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

    您好、

    您是否同时使用 QEPA 和 QEPB 输入?

    谢谢、

    Divesh

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

    你(们)好

    此外、您是否将 SYSCLK 更改为 100MHz? 因为它是用于 TMS320F28379D 的 200MHz。

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

    您好、  

    假设:每转 512 个脉冲。

    采集时钟频率= SYSCLK/8(根据您的代码)= SYSCLK/8 100MHz。

    如果我们将 A 和 B 信号连接到 eQEP 模块并对上升沿进行计数、则 电机旋转一周将产生 1024 个脉冲。 周期寄存器 (QCRRD) 给出了 连续单元位置事件之间所用的时间(此处为 128 个计数)。  

     捕获 128 个脉冲所需的时间=(FullCountTicks * 8)/10^8

    一个脉冲所需的时间=(( FullCountTicks * 8)/10^8)/128。

    在电机旋转一周后、将产生 1024 个脉冲。

    完成一次旋转所需的时间=(1024*( FullCountTicks *8)/10^8)/128。

    频率= 1/时间= 1562500/FullCountsTicks。

    在代码中、使用 2048 代替 1024。 因此、测得的转速不正确。

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

    尊敬的 Divesh:

    当  eQEP_getCapturePeriod () 被使用时,我从索引重置后得到了 2047 个周期 — 这里是相关的视频


    e2e.ti.com/.../WhatsApp-Video-2026_2D00_01_2D00_23-at-6.20.27-PM.mp4

    谢谢、
    Soumitri

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

    您好、

    2 倍分辨率的情况也是如此。 那么乘数也将保持不变。

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

    您好、

    是、 将 Multiplier (倍频器)设置为 781250 时、将速度读取设为一半(带和不带) 2 倍分辨率、  为了测试目的,我乘以 2 倍,以得到 1562500 ,以匹配电机转速。

    谢谢、
    Soumitri

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

    您好、

    请参阅上文的解释、乘数将保持不变。 如果分辨率为 2x、则脉冲数(如果 pos count 为 128)为 64。 如果分辨率为 2 倍、则 位置计数将为 2048、而不是 1024。 对于 1x 和 2x 分辨率、乘数将保持不变。 无论分辨率如何、乘数都将为 1562500、而不是 781250。 希望这能解决您的问题。

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

    尊敬的 Divesh:

    我们考虑脉冲数“1000",“,每、每转一圈读取一次 150RPM、当仅上升沿被视为 1X 分辨率为 (1000) 时、当 两个边沿被视为 2x (2000) 时。

    在本例中为 512 PPR
    2 倍分辨率-(512*2) - 1024
    以 1x 分辨率-(512*1) - 512

    如果是这种情况、则执行上述测试以验证这一点。
    但我没有得到减少的节拍。

    谢谢、
    Soumitri。