关于#c语言#的问题:正在学习DSP28335的EPWM发波模块,我发波要同时用到CMPA和CMPB 两个比较器

正在学习DSP28335的EPWM发波模块,有一个小疑问,我发波要同时用到CMPA和CMPB 两个比较器,代码需要如何写呢?或者说在同时使用CMPA和CMPB的时候,AQ动作模块的代码要怎么写?

img

在同时使用CMPA和CMPB的情况下,EPWM的AQ(Action Qualifier)动作模块可以用来控制每个比较器的动作,以控制输出波形的特征。在DSP28335的EPWM模块中,每个CMPx比较器(x为A或B)都有对应的AQ动作模块寄存器,分别为AQCTLA和AQCTLB。这些寄存器的位控制如下:

  • AQCTLA和AQCTLB共同的位:

    • 位0和位1:用于选择当前PWM周期和下一个PWM周期的AQ动作。具体来说,位0和位1组合可以选择以下动作之一:

      • 00:无操作
      • 01:置高
      • 10:置低
      • 11:翻转
  • AQCTLA独有的位:

    • 位2和位3:用于选择当前PWM周期的CMPA比较结果的AQ动作。具体来说,位2和位3组合可以选择以下动作之一:

      • 00:无操作
      • 01:置高
      • 10:置低
      • 11:翻转
    • 位4和位5:用于选择下一个PWM周期的CMPA比较结果的AQ动作,具体方式与位2和位3类似。

  • AQCTLB独有的位:

    • 位2和位3:用于选择当前PWM周期的CMPB比较结果的AQ动作,具体方式与AQCTLA的位2和位3类似。

    • 位4和位5:用于选择下一个PWM周期的CMPB比较结果的AQ动作,具体方式与AQCTLA的位4和位5类似。

因此,如果要同时使用CMPA和CMPB比较器,可以按照以下步骤设置AQ动作模块的寄存器:

  1. 设置AQCTLA寄存器的位0和位1,选择当前PWM周期和下一个PWM周期的AQ动作。

  2. 设置AQCTLA寄存器的位2和位3,选择当前PWM周期的CMPA比较结果的AQ动作。

  3. 设置AQCTLB寄存器的位2和位3,选择当前PWM周期的CMPB比较结果的AQ动作。

  4. 根据需要,设置AQCTLA寄存器的位4和位5,选择下一个PWM周期的CMPA比较结果的AQ动作;设置AQCTLB寄存器的位4和位5,选择下一个PWM周期的CMPB比较结果的AQ动作。

例如,以下代码将CMPA和CMPB分别设置为产生一个50%的占空比方波:

// 设置AQCTLA寄存器
EPwm1Regs.AQCTLA.bit.ZRO = 1; // 当PWM计数器为0时,CMPA输出高电平
EPwm1Regs.AQCTLA.bit.CAU = 2; // 当PWM计数器等于CMPA时,CMPA输出低电平

需要注意的是,AQ动作模块的设置可以在EPWM模块初始化之后随时进行修改,而不必在每个PWM周期之前重新设置。如果需要改变输出波形的特征,只需修改相应的AQ动作模块寄存器即可。另外,EPWM模块的其他寄存器(如CMPA和CMPB)也可以在运行时修改,以实现动态调整PWM的输出特性。

DSP28335学习记录(三)——ePWM
可以借鉴下
https://blog.csdn.net/qq_30835339/article/details/125432037

该回答引用ChatGPT
在使用CMPA和CMPB的情况下,可以通过在AQ动作模块中设置COMPA和COMPB位来分别控制CMPA和CMPB的输出动作。具体代码示例如下:

c
// 设置EPWM的PWM输出模式
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 当 CMPA = CMPAHR 时,设置 EPWM 输出为高电平
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 当 CMPA = CMPAHR 时,设置 EPWM 输出为低电平
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; // 当 CMPB = CMPBHR 时,设置 EPWM 输出为高电平
EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR; // 当 CMPB = CMPBHR 时,设置 EPWM 输出为低电平


其中,AQ_SET和AQ_CLEAR是EPWM模块中定义的枚举类型,分别表示设置输出为高电平和低电平。在使用前需要包含头文件"../include/F28377S_EPwm_defines.h"。

需要注意的是,具体的动作模式还要看你的具体需求,可以通过修改CMPA和CMPB寄存器的配置来实现不同的动作模式。此处只是提供基本的示例代码供参考。

该回答基于gpt和阿里大佬的指导:
在DSP28335的EPWM模块中,可以同时使用CMPA和CMPB比较器来控制PWM波形。为了设置AQ动作模块的代码,您需要按照以下步骤进行操作:

首先,确保已经配置了正确的EPWM模块和引脚功能。

在初始化EPWM模块之后,您需要设置CMPA和CMPB的动作。
// 设置CMPA动作
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 当计数器等于CMPA时,设置输出为高电平
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 当计数器等于CMPA时,设置输出为低电平

// 设置CMPB动作
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; // 当计数器等于CMPB时,设置输出为高电平
EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR; // 当计数器等于CMPB时,设置输出为低电平
上述代码中,EPwm1Regs是指向EPWM1寄存器的指针,您需要根据您所使用的EPWM模块进行相应的更改。

接下来,您可以根据需要调整CMPA和CMPB的比较值,从而调整PWM波形的占空比。比如,设置CMPA的比较值为500,CMPB的比较值为250:
EPwm1Regs.CMPA.bit.CMPA = 500;
EPwm1Regs.CMPB.bit.CMPB = 250;
最后,根据您的需求,设置PWM计数器的周期和其他参数。比如,设置计数器周期为1000:
EPwm1Regs.TBPRD = 1000;

通过以上步骤,您就可以同时使用CMPA和CMPB比较器,并设置相应的AQ动作模块代码来控制EPWM模块的输出波形。