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.

[参考译文] CCS/TMS320F28379D:具有 ePWM 复位信号的 SDFM 数据同步读取器件

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/720159/ccs-tms320f28379d-sdfm-data-sync-read-probem-with-epwm-reset-signal

器件型号:TMS320F28379D
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

大家好,、我对 SDFM 和 ePWM 有几个问题。

我们使用 ePWM1-3作为电机 PWM 输出、并使用 ePWM12来同步复位 SDFM 模块、但我们希望 SDFM 模块在每次 ePWM1-3启动触发时都能获取数据。 如何同步 ePWM1和 ePWM12?

在 TI 演示(D:\ti\controlSUITE\development_kits\TMDSIDDK_v2.0\IDDK_PM_Servo_F2837x_v2_00_00_00)中、我找到以下设置:  

"EPwm11Regs.CMPC = EPwm11Regs.TBPRD - SDFM_TICK*(OSR_RAT+1)*3/2;
EPwm11Regs.CMPA.bit.CMPA =(SDFM_TICK*(OSR_RATE + 1)*3/2)+ 500;// 500是任意的
EPwm11Regs.CMPD = 0;"

当我们想要在 ePWM1-3启动触发时获取 SDFM 数据、但 SDFM 模块需要 延迟(延迟为38.9us)时、我设置 ePWM11:CMPC/D = CMPA = 0;在100us-MotorControlISR 模块中、我添加"while"、等待(大约38.9us) SDFM.SDIFLG.AF1、然后清除所有标志。 但我没能找到程序在几秒钟后停止运行。 为什么?

3.根据28379的规范,我不太理解 CMPC 和 CMPA 值的设置:sinc 滤波器延迟= sinc 滤波器的阶数* OSR /调制器数据速率,然后在 CMPC 和 CMPA 中的公式应为(3*(OSR_RAT+1)/SDFM_TICK/2 )*100,但为什么 TI 演示将值设置为上述值?

谢谢大家。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题1.我已经知道解决问题1的方法、只需使用以下设置即可:
    SyncSockRegs.SYNCSELECT.BIT.EPWM10SYNCIN = 0;
    EPwm10Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
    问题4. 但我现在还有另一个问题、因为 SINC 滤波器的延迟大约为3个采样周期(对于我们而言、数据速率为78.125k、即12.8uS/采样)、 但该规格告诉我们、只有"sinc3滤波器的前两个样本不正确"、因此我将 CMPC 的双采样时间(25.6us)设置为比 CMPA 更低的值、因此、我认为我可以在电机 ISR 触发时获取 SDFM 数据、 但仍然需要一个采样周期(12.8us)、因此我会在" while "中等待 SDFM.SDIFLG.AF1-3全部为1、我认为它需要大约12.8us、但我的测试显示它不会花费这么多时间、就像与 MotorISR 同步一样。 这是为什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    应根据载波峰值点进行采样。 同步滤波器处理 N 个样本后、本机延迟为 N/2。 因此、我们在载波峰值点之前的 N/2样本处开始新的转换、并在峰值点之后等待另一个 N/2样本以读取数据。 500的任意计数只是额外的周期、以确保 SDFM 寄存器在 ISR 读取数据时完全更新。 当然、这500个计数的完成量非常大、可以减少20倍以上。
    至于您在等待 SDFM 标志方面的经验、我们需要弄清楚正在发生的情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yonglu、

    所有3个滤波器通道(滤波器1 / 2 / 3)的配置方式是否相同? 否则、SINC 滤波器的数据速率会有所不同。

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

    感谢您的回复。

    是的、3个滤波器通道的配置方式相同。 比较器:Sinc3滤波器、OSR_32。 数据滤波器:Sinc3、OSR_128、DATA_16位、SHIFT_6_BIT。 启用 MFE、启用 EXTERNAL_RESET、 启用 MFIE 中断、启用 AE 中断。

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

    我需要对数据确认标志问题进行澄清。 您是否担心标志未按预期设置?

    请澄清。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 MotorISR 中、我将"while"添加如下:
    while (!((* SDFM[gPeripheralNumber]).SDIFLG.bit.AF1
    &&(* SDFM[gPeripheralNumber]).SDIFLG.bit.af2
    &&(* SDFM[gPeripheralNumber]).SDIFLG.bit.AF3);
    在此之后、我获取数据、然后清除下面的标志:
    (* SDFM[gPeripheralNumber]).SDIFLGCLR.bit.AF1 =(* SDFM[gPeripheralNumber]).SDIFLG.bit.AF1;
    (* SDFM[gPeripheralNumber]).SDIFLGCLR.bit.af2 =(* SDFM[gPeripheralNumber]).SDIFLG.bit.af2;
    (* SDFM[gPeripheralNumber]).SDIFLGCLR.bit.AF3 =(* SDFM[gPeripheralNumber]).SDIFLG.bit.AF3;
    有问题吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您正在使用 while 循环等待全部3个标志(AFX)发送。 没关系。
    无需单独清除标志。 只需指令即可清除所有3标志。 但是、这是由您决定的。

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

    您好,Ramesh

    我仍然对延迟的值感到困惑。 根据 TI 的 Femula 演示,"SDFM_TICK*(OSR_RAT+1)*3"的结果是1920,我想它的意思是时间值是1920/100=19.2us,这是否与您所说的"N"相同? 但根据28379d 的规格、  "sinc 滤波器阶数*(OSR+1)/SDFM_TICKs "应为76.8us、为19.2us 的4倍。  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    胡永禄

    SDFM_TICKs 的值取决于 SD 调制器频率。 如果 SD 调制器以20MHz 运行、则 SDFM_TICKs 为5 (表示5ns (1/20MHz))。 当调制器以10MHz 运行时、SDFM_TICKs 为10 (表示10ns (1/10MHz))。

    在 TRM 中提到的示例中、它假定 SD 调制器频率为10MHz 并且 DOSR = 256。 如果您之前的帖子提到您的 DOSR = 128。

    "n"是您希望在一个 PWM 周期内从 SDFM 滤波器读取的样本数。 在 IDDK_PM_Servo_F2837x_v2_00_00_00示例中、读取的样本数/PWM 周期为1。 因此、N = 1。

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

    您好,Manoj、

    非常感谢。 我错误地采用了频率为5MHz 的频率。 根据20MHz 频率、"sinc 滤波器的数据速率"等于156.25K 样本/秒(6.4us)、"sinc 滤波器延迟"等于19.2us (=3*6.4us)。 如规范所述、Sinc3滤波器的前两个样本不正确、因此我可以将时间值19.2us 理解为采样时间的三倍、以获取正确的数据。 但是、如果我想与点 PWM1-3触发器(ET_CTRL_PRD)同步、CMPC vale 不应该为"EPwm11Regs.TBPRD-(SDFM_TICK*(OSR_RAT+1)*3*2/3)"、即 EPwm11Regs.TBPRD--(6.4 2 = 12.8)?

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

    使用 SINC3滤波器时、您的案例所需的总样本数为384 (OSR=128、OSR_RATE = 127)。 (总时间为19.2us、中点为9.6us)。 要将中点与 EPWM PRD 事件同步、SDFM 应在 PRD 事件之前的9.6us 开始。

    9.6us =>(SDFM_TICK*(OSR_RATE + 1)*3/2

    因此、CMPC = PRD - 9.6us  

    => EPwm11Regs.TBPRD-(SDFM_TICK*(OSR_RATE + 1)*3/2)

    希望这对您有所帮助。

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

    您好、Ramesh、

    很抱歉、我刚才看到了您的回复、但我仍然不清楚。  

    是的、我同意总时间为19.2us、但"在载波峰值点之前的 N/2样本开始新转换"使我感到困惑。 我认为19.2us = 3*6.4us、6.4us、这意味着 SDFM 采样周期(我对吗?)。 根据规范、sinc3的前2个样本不正确、因此、如果我想使 SDFM 数据与 ePWM PRD 事件同步、 为什么它不是“在载波峰值点之前开始 N*2/3个样本的新转换,并在峰值点之后等待 N*1/3个样本来读取数据”?  

    期待您的回复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    添加:
    -导致 SINC 滤波器的数据速率= 20MHz/128=1156.25K 采样/秒、那么一个采样周期应为128/20MHz=6.4us。 我是对的吗?
    ——上面最后一句话,我是说提前2个采样(2*6.4us=12.8us)开始转换,然后在峰值点之后等待1个采样(6.4us)来读取数据。 为什么 TI 演示在转换后使用1.5个采样和1.5个采样?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于前两个样本在 sinc3滤波器中不可用、因此我们忽略它们。 第三个可用。 但是、该输出使用截至该时间的所有192个样本、包括之前被忽略的输出中使用的128个样本。 1.5采样是因为 sinc3是 FIR、其输出将有一个 N/2采样的延迟。 因此、sinc3滤波器的输出将对应于192/2 = 96个样本、或者换句话说、自启动 FIR 以来为96个样本。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ramesh

    非常感谢您对患者的解释。 我明白了。