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.

[参考译文] TMDSCNCD28379D:DAC 未显示正确的信号;可能的代码溢出以及如何解决?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/992620/tmdscncd28379d-dac-not-showing-the-correct-signal-possible-code-overrun-and-how-to-solve-it

器件型号:TMDSCNCD28379D
主题中讨论的其他器件:TMDSCNCD28335

大家好、我遇到了一个奇怪的问题。 我使用 MATLAB Simulink 2018a 创建和加载应用程序代码。 应用代码包括 ADC 块、正弦基准、控制、PWM 基准和 PWM 块(标准三相逆变器闭环控制)

有四种不同的情况、每种情况都有不同的结果、我难以解释。 在每种情况下、我都会监控 DAC 上的两个信号(DACOUTA 和 DACOUTB):CH1是正弦基准、而 CH4是空间矢量 PWM 基准。

  1. 我加载应用程序代码(Build、Load、Run 和 Boot from Flash (stand-alone))。 CH1是正弦基准(50Hz)、而 CH4是空间矢量 PWM 基准(50Hz)->扩展结果
  2. 相同的应用代码、但现在处于外部模式:CH1是正弦基准(50Hz)、而 CH4也是正弦基准(50Hz)。
  3. 删除了大部分代码、仅保留正弦基准和 PWM 基准计算(开环控制)。 我加载应用程序代码(Build、Load、Run 和 Boot from Flash (stand-alone))。 CH1是正弦基准(100Hz)、而 CH4是空间矢量 PWM 基准(100Hz)。
  4. 相同的简化应用代码、但现在处于外部模式:CH1是正弦基准(100Hz)、CH4也是正弦基准(100Hz)

情况1 (构建、加载、运行)和2 (外部模式):

案例3 (构建、加载、运行)和4 (外部模式):

不确定为什么 DACOUTB (CH4)在情况1和2中显示不同的结果;这是否意味着空间矢量引用的代码未执行?

此外、当波形频率从50Hz 增加到100Hz 时、为什么情况1和3之间存在差异? 这是否意味着在前一种情况下(案例1和2)所有代码的执行速度都较慢。 如果我知道"较大"代码的基波和任何其他采样时间都高2倍、我可以使用哪种方法?

我对 TMDSCNCD28335也有类似的问题、 并在 MATLAB 论坛中提出了一个问题 、他们在该论坛中建议该问题可能是由溢出引起的、我应该优化正弦基准块的生成。 因此、我转到 TMDSCNCD28379D、在两个 CPU 之间拆分代码、并实现了一个新的正弦基准计算: 现在、我正在代码中使用优化的 C28x DMC 和 IQmath 块、并仅生成斜坡(0 - 2pi、20ms)、通过使用 Park 逆变换(Vd 设置为1、VQ 和 V0设置为0)、我计算三相正弦基准。

更新:

不同的波形问题已解决。

在空间矢量波形计算块中 、代码中有几个 Simulink 开关、因此与标准构建、加载和运行选项相比、当外部模式运行时、它们似乎保持在不同的位置。 零序列波形未注入正弦基准、因此波形相同。 现在、我移除了开关、波形符合预期... 开关块似乎有问题!

频率差异仍然存在。

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

    Mike、

    感谢您联系 C2000 E2E。  

    一种方法是从 C2000寄存器设置中返回跟踪此情况、并确认案例1和3之间 PWM 控制寄存器设置的差异。  

    由于情况3中的频率是双倍、Simulink 可能已向 PWM 添加另一个比较值、或从向上计数更改为向上/向下计数或类似的值。  它可能会像 PWM 周期减半一样简单。

    我认为有一种方法可以输出生成的 C 代码、我们可以检查这两种情况之间的差异。  希望我们可以将其重新连接到 Simulink 块中的配置之一。

    我们还可以连接 CCS 并通过这种方式检查 ePWM 寄存器设置。  让我知道您最喜欢哪种方法、我们可以从这种方法开始。

    最棒的
    Matthew

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

    您好、Matthew、

    我已经在两个代码(inber_000_test.c 和 inber_001.c)中完成了代码(不是专家,因此使用 Simulink:) ePWM 也被初始化:

        /*-- Setup Time-Base (TB) Submodule --*/
        EPwm5Regs.TBPRD = 12500;           // Time Base Period Register

    用于调整输出频率的"分辨率"(不确定这是否正确)将"速率转换"""输出端口采样时间"参数从10e-5 (较小的代码 inber_000_test)更改为5e-5 (较大的代码 inber_001)。 块名称为'Rate Transition1'。

    在 inbiler_000_test.c 和 inbiler_001.c 中、'rate Transition1'除以

      /* RateTransition: '<Root>/Rate Transition1' */
      if (Inverter_001_M->Timing.RateInteraction.TID0_1) {
        Inverter_001_B.RateTransition1 = Inverter_001_DW.RateTransition1_Buffer0;
      }
    
      /* End of RateTransition: '<Root>/Rate Transition1' */

    逆变器_001.c 中

      /* Update for RateTransition: '<Root>/Rate Transition1' incorporates:
       *  Constant: '<Root>/Constant14'
       */
      Inverter_001_DW.RateTransition1_Buffer0 = Inverter_001_P.Constant14_Value_m;

      /* Computed Parameter: Constant14_Value_m
       * Referenced by: '<Root>/Constant14'
       */
      230.0F,

    逆变器_000_TEST.c 中

      /* Update for RateTransition: '<Root>/Rate Transition1' incorporates:
       *  Constant: '<Root>/Constant14'
       */
      Inverter_000_test_DW.RateTransition1_Buffer0 =
        Inverter_000_test_P.Constant14_Value_mo;
    }

      /* Computed Parameter: Constant14_Value_mo
       * Referenced by: '<Root>/Constant14'
       */
      230.0F

    因此、在两个代码中、速率转换块常量都是230.0F... 仍然需要研究该数字与5e-5的关系。

    请查找随附的两种情况的代码。 正弦波形被发送到 DACOUTA 和 DACOUTB。


    e2e.ti.com/.../Inverter_5F00_000_5F00_test_5F00_ert_5F00_rtw.zip -->类似的代码,100Hz 波形

    e2e.ti.com/.../Inverter_5F00_001_5F00_ert_5F00_rtw.zip -->更详细的代码,50 Hz 波形

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

    Mike、

    感谢您提供更多背景信息并分享 Simulink 代码。  

    我不了解 C2000 PWM 和输出 DAC 之间的初始关联。  我错误地假设 DAC 更新与 C2000 PWM 本身的更新速率/事件相关联、而不是来自并行馈送这两个数据的通用更新算法。  PWM 寄存器设置可能与我们看到的内容无关。

    我知道您直接在 C2000上使用 DAC、该 DAC 由 Simulink 计算值提供(该值会进入 C2000 PWM、但与您在示波器上测量的值无关)。  

    我认为您正处于速率转换设置的正确轨道上、因为我们使用 C28x CPU 手动将该值写入 DAC 输出寄存器、因此写入的时序对于保持频率非常重要。  我怀疑当您细化代码时、C28x 具有更大的 CPU 带宽、可以使用调制1块的输出来更新 DAC 块。

    我看到馈入 DAC 的输出转换块由变量"Tcontrol"控制、我想这会使两个版本的代码之间的更新速率保持恒定。  

    看起来这也用于控制逆变器_001中控制块的更新。  不确定是否对 DAC 进行独特的更新控制会在添加更多代码时修复此问题。

    我要让 MW 的一些人在这里多评论一点;如果我用 C 语言编码、我可能会将 DAC 更新与其中一个 PWM ISR 相关联、以使该更新与 PWM 时基本身保持一致; 但是、对于多个更新块、这些可能都与通用 CPU 计时器及其 ISR 相关联。

    最棒的

    Matthew

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

    你好,Matthew --我还 记录了在外部模式下运行时的信号。 DAC 和 GPIO 测量50Hz 信号、记录信号提供100Hz 波形;与"更强"代码相同。 PWM 基准(控制)信号为50Hz。

    PWM 信号是正确的开关频率(5kHz)。 没有针对 DACGPIO 的额外更新设置。 将 DAC 同步信号设置为 PWMSYNC5不能解决问题。 信号仍然是50Hz、但分辨率略小。

    较小应用代码和较大应用代码之间的信号频率差异是否意味着代码过大且运行过度?

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

    尊敬的 Mike:

    您能否提供与原始模型不同版本的模型文件、但仍能帮助我们重现问题。

    此致、

    Venkatesh C

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

    您好、Venkatesh、

    是的、没问题。 这是较小应用代码(文件名:inverter_000_test.slx)的布局;100Hz DAC 输出。 较大代码中使用了相同的元素(文件名:inverter_001.slx);50Hz DAC 输出

     e2e.ti.com/.../ApplicationCodeF28379D.zip

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

    尊敬的 Mike:

    这是一个模型溢出条件、会导致这种情况发生。 基本上、型号  inver_001.slx 会超频50usec 基本任务。 如果您在此模型(模型的顶层)内进行 GPIO 切换、则 GPIO 切换将以5kHz 的速率发生。 因此、在第一个100 μ s 内、GPIO 将变为高电平、下一个100 μ s 内将变为低电平。 因此、在200uC 下、它将完成一个周期。 因此为5kHz。  这意味着该模型每100us 更新一次。 可以看出、生成1个斜坡周期需要10ms、假设步长为50uC。 这将生成100Hz DAC 输出。 但是、如果模型过度运行、那么要生成1个斜坡周期、需要20ms、因为我们现在以100us 的步长运行。 因此生成50Hz DAC 输出。

    HTH、

    此致、

    Venkatesh C

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

    您好、Venkatesh、

    非常感谢。 在每次步进时切换信号有助于找出问题。 即使是其他任务也是过度运行、即步进时间增加了2。 我增加了步进时间(对于斜坡和 ADC)、并将它们设置为等于控制采样时间(10kHz)、现在它按预期工作。

    非主题:您可能知道实现斜坡信号和生成正弦基准的更优方法?