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/TMS320F28069:当我更新 PWM1时、程序不运行

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/740192/ccs-tms320f28069-program-does-not-run-when-i-update-pwm1

器件型号:TMS320F28069
主题中讨论的其他器件:LAUNCHXL-F28069M

工具/软件:Code Composer Studio

您好!

我正在使用电路板 LAUNCHXL-F28069M。

我的程序的目的是为电源转换器生成两个正弦波形。 为此、我将使用 PWM1和 PWM2。 两个 PWM 的配置方式完全相同。

由于输出是正弦波形、因此占空比必须持续变化。 在开发的当前阶段、我尝试在两个 PWM 中获得相同的输出。 为此、我将 PWM 更新为:

EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD *占空比;

EPwm2Regs.CMPA.half.CMPA = EPwm2Regs.TBPRD *占空比;

在更新之前、我始终确保占空比介于0和1之间。 占空比定义为浮点值。

这是我的问题:

 

-如果 Duty 是一个常量值或由我作为表达式手动更改,则一切都正常工作。

-如果正弦模式下的占空比发生变化,则程序会编译但不运行。

-如果我将 PWM1的占空比固定为一个常量值、并且我让它因 PWM2而异、它会编译并运行。 这种方法不起作用(固定 PWM2和改变 PWM1)。

 

是否有任何线索知道可能会发生什么情况?

 

此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只需添加、我将使用 Code Composer 版本:7.4.0.00015和编译器版本 TI v18.9.0.ST。

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

    Cristina、

       感谢您对问题的详细解释并提供一些初始调试!

    • 您在代码中的哪个位置更新 CMPA 值? 最好的方法是在您的 PWM ISR 中执行此操作。
      • 其次、如果您要更新 ISR 中的 PWM、您的 ISR 是如何配置的?
    • 当您说程序不运行时、会发生什么情况?

    我们将需要对此进行更多调试...

    1. 代码是否加载到器件上?
    2. 器件如何发生故障? ...它是否停止、它是否执行了错误的代码、PWM 输出是否有任何变化?
    3. 您是否使用内存浏览器验证了配置?
    4. 在写入 EALLOW 受保护寄存器之前、您是否使用 EALLOW?

    此致、
    Cody

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

    您好、感谢您的回答。

    我使用 ePWM1来生成周期性 ADC SOC - ADCINT1、因此我在 ADC 中断结束时、也就是在清除标志之前更新 CMPA 值。 我这样做是因为稍后我需要通过 ADC 读取一些传感器。 这是 ADC 配置:  

    AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1;//启用非重叠模式
    AdcRegs.ADCCTL1.bit.INTPULSEPOS= 1;// ADCINT1在 AdcResults 锁存
    
    AdcRegs.INTSEL1N2.bit.INT1E 之后跳闸 = 1;//启用 ADCINT1
    AdcRegs.INTSEL1N2.bit.INT1CONT = 0;//禁用 ADCINT1连续模式
    AdcRegs.INTSEL1N2.bit.INT1SEL= 1; //设置 EOC1来触发 ADCINT1来触发
    
    AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; //选择内部基准模式
    AdcRegs.ADCCTL1.bit.VREFLOCONV = 1; //选择 B5上的 VREFLO 内部连接 

    这就是我知道它没有运行的方式:每当我运行 CCS 程序时、我都会放置一些表达式以供观察并启用持续刷新、因此我知道该程序正在直观地运行、因为我看到黄色更新。 此外、PCB 中有一个 LED、它只是在主器件中虚拟打开、而不是这样做。 最后、我使用示波器进行检查、但我没有任何 PWM 输出。  

    关于其余问题:

    1.我不确定如何检查它是否确实在加载到器件上。

    2.我已经回答了以上问题。

    3.同样,我不确定如何使用内存浏览器验证配置。

    4.我有一些初始化函数、只是为了确保我在每个函数的开头写入 EALLOW。 我相信 CMPA 不受保护、但如果我在更新之前尝试写入 EALLOW、但没有任何变化。

    此致。

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

    Cristina、

    请查看以下帮助文档、它应指导您如何使用工具(断点、单步执行和内存浏览器)来帮助您了解问题所在。

    此致、
    Cody  

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

    我没有考虑使用断点、因为我假设程序甚至没有加载、但这是不正确的。 现在我比以前更困惑了。

    在 while (1){}之前、我在 main 中添加了一个断点。 我在该环路之前打开一个 LED、并且正在打开。 遗憾的是、如果在这之后我一步一步、指针在 while (1)中堆栈、无论我按多少次 step 进入、指针都不会移动。 步越也不起作用。 这就像中断没有发生一样、但这毫无意义、因为在两个代码之间更改的唯一内容是我尝试向 CMPA 添加的值、这是在中断中的某些代码行之后发生的。

    此致、

    Cristina。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Cristina、
    在每个中断中设置断点、然后运行代码。 如果它执行中断、它应该停止程序计数器。

    然后再次运行它、看看它是否再次进入中断。 如果它没有再次进入中断、您可能需要检查您是否正确地确认了中断。

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

    您好!

    我的程序中只有一个中断、即 ADC 中断。 我在这里设置一个断点、它进入中断5次。 然后它停止进入。 这就是我确认中断的方式:

          //下一个 ADC 序列重新初始化

          AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;          //清除 ADCINT1标志下一个 SOC 重新初始化

          PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;      //确认 PIE 中断

     

    我已经在 PWM1的 CMPA 寄存器更新中找出了问题、无论我将代码简化了多少、它都无法正确执行。

    是否可能有某种程度的错误? 因为我在中断时也尝试过这种方法:

    PWM_AUX = EPwm1Regs.TBPRD;

    AUX1 = PWM_AUX * Du;

    AUX2 = AUX1;

    EPwm1Regs.CMPA.half.CMPA = AUX2;

    并定义为全局变量:

    float Du = 0.0;

    unsigned int PWM_aux = 0;

    浮点 AUX1 = 0.0;

    unsigned int AUX2 = 0.0;

      

    嗯、如果我将 AUX2定义为无符号整型、代码的运行次数不会超过这5次。 当我将 AUX2定义为 int 时、它"永久"运行、但显然由于符号原因、结果不正确。

    感谢您努力帮助我。

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

    因此、我设法解决了这个问题。

    我将占空比限制在0.0和1.0之间、当占空比达到1.0时、程序会损坏。 为了解决这个问题、我现在将其限制在0.0和0.99之间。

    尽管这使得代码运行正常、但仍然无法解决该问题仅影响 PWM1而不影响 PWM2的原因。

    此致、并感谢您的帮助。