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.
从函数发生器中、我在 GPIO24 (ECAP)捕获了方波(脉冲50kHz 和50%占空比)、然后使用 ECAP 模块在 GPIO25和 GPIO26 (GPIO25反相)生成了两个 APWM 信号。 信号具有可控变量:PWM_PERIOD、PWM2_PERIOD=>(针对周期)和 PWM_Duty、PWM2_Duty (针对占空比)。 我需要在 GPIO25和 GPIO26信号中生成死区。 假设我们将任何因素相乘、例如0.5与 PWM_PERIOD 相乘、0.25与 PWM_Duty 相乘。 它提供100kHz 输出和占空比( 反相时为25%和75%)。 在上图中、浅绿色是反相信号(25%)、深绿色是表面化占空比(75%)。 问题在于信号始终以相同的电平(橙色)启动、这会导致电流击穿问题。 如何为代码中的信号创建上升沿和下降沿死区? 请在代码中提供建议。
此致
Arsalan
您好、Ryan、
感谢您的回复。
我是否可以使用 ePWM 模块捕获信号(发生器)、然后生成 PWM 信号、从而捕获信号而不是使用 APWM (来自 ECAP)? 实际上、我看到了使用死区功能并从 ePWM 模块(以下代码)生成 PWM 信号的实验示例(7_6)、但它不捕获信号。 这就是我最初开始使用 ECAP 模块的原因。
code=>
{
EPwm1Regs.TBCTL.bit.CLKDIV = 0;// CLKDIV = 1
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;// HSPCLKDIV = 2
EPwm1Regs.TBCTL.bit.CTRMODE = 2;//向上-向下计数模式
EPwm1Regs.AQCTLA.ALL = 0x0060;//在 CMPA 上设置 ePWM1A
//在 CMPA 递减时清除 ePWM1A
EPwm1Regs.AQCTLB.all = 0x0600;//在 CMPB 上设置 ePWM1B
//清除 CMPB 上的 ePWM1B
EPwm1Regs.TBPRD = 37500;// 1KHz - PWM 信号
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2;//首先占空比为50%
EPwm1Regs.CMPB = EPwm1Regs.TBPRD/2;
EPwm1Regs.DBRED = 750;// 10微秒延迟
EPwm1Regs.DBFED = 750;//针对上升沿和下降沿
EPwm1Regs.DBCTL.bit.OUT_MODE = 3;// ePWM1A =红色
EPwm1Regs.DBCTL.bit.POLSEL = 2;// S3=1 ePWM1B 上的反相信号
EPwm1Regs.DBCTL.bit.IN_MODE = 0;// ePWM1A =红色和 FED 源
}
您能建议我如何将上述代码与我的 ECAP 代码关联? 我想我需要将周期的值传递到我 的 EPwm1Regs.TBPRD 中。 如此=>
EPwm1Regs.TBPRD = PWM_PERIOD;(如果需要、可变系数乘以周期设置)-表示周期
EPwm1Regs.CMPA.half.CMPA = PWM_Duty;(如果需要、可变系数乘以占空比设置)--表示占空比
这是我为我捕获的 ECAP 信号(GPIO24)生成2个 EPWM 信号( 即 EPW1A 和 EPWM1B 反相、具有死区设置(如上所述死区设置代码)的正确方法吗??
注意:我应该在 GPIO 选择中为 EPWM1A 和 EPWM1B 激活多路复用器
请查看代码并提出相应建议
谢谢
此致
Arsalan
您好、Arsalan、
您位于正确的路径上、而不是为 apwm 设置周期和占空比。 您可以改为将 EPWM.TBPRD 寄存器设置为 ECAP 的捕获周期、并将 CMPA 寄存器设置为等于 ECAP 的占空比。 死区必须使用死区寄存器进行设置:
EPwm1Regs.DBRED = 750;// 10微秒延迟
EPwm1Regs.DBFED = 750;//针对上升沿和下降沿
还有许多资源可用于了解 ePWM 特性:
培训 视频
2. C2000 Academy 页面
应用 手册
最棒的
Ryan Ma
您好、Ryan、
我今天测试了代码并查看了您共享的资源。 此外、我对 TBPRD 和我最后一个代码中的比较值遵循了相同的过程 、但我没有从 GPIO0 (ePWM1A)和 GPIO01 (ePWM1B)获得结果。 其次、该寄存器对于 ePWM 中的 TBPRD 为16位、但对于 PWM_PERIODE/Duty 为32位、这可能会导致问题。
然后、我更改了 ePWM 之前的函数 ECAP、以保持 ECAP 捕获来自发生器的信号的顺序、然后为捕获的结果生成 ePWM、这样就完成了函数的更改=>
void Setup_eCAP1 (void);
void Setup_ePWM1 (void);
.
Setup_eCAP1 ();//初始化 eCAP1
Setup_ePWM1 ();//初始化 ePWM1
仍然没有输出。
以下是针对输出和全部四个寄存器 eCAP1、eCAP2、eCAP3和 ePWM1 (A/B)的更新:
在从发生器向 GPIO24 (eCAP1)提供信号之前、寄存器和输出(epWM1A-GPIO0、ePWM1B-GPIO1)的值显示在这里=>
在从发生器向 GPIO24 (eCAP1)提供信号后、输出(epWM1A-GPIO0、ePWM1B-GPIO1)和寄存器值如下所示:
经过一段延迟后、输出端(epWM1A-GPIO0、ePWM1B-GPIO1)没有信号、寄存器值为=>
请相应地查看代码
期待您的反馈
谢谢
此致
Arsalan
您好、Arsalan、
在您发送的最后一个屏幕截图中、TBPRD 小于 CMPA 值。 我假设永远不会达到动作限定符事件、您的动作限定符不会对输出产生影响。 尝试将 CMPA 值设置为小于周期。
我还会确保为 GPA 启用 PUD
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // Enable pull-up on GPIO0 (EPWM1A) GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Enable pull-up on GPIO1 (EPWM1B) GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // Configure GPIO0 as EPWM1A GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // Configure GPIO1 as EPWM1B
正确、TBPRD 为16位。 您是否需要周期需要等于2^32的信号? 这意味着最大周期为28.6s。
另请注意、TBCLK 有两个分频器、默认情况下将 SYSCLKOUT 除以/2。 (HSPCLKDIV)。
ECAPCLK 由 SYSCLK 计时、因此您必须将周期/计数器值除以2、使它们处于同一个 SYSCLK。
此外、ECAP APWM 在技术上是 PWM 信号、处于向上计数模式、其中 CAP1是周期、CAP2是占空比(CMPA)。
最棒的
Ryan Ma
您好、Ryan、
感谢您的回复。
在您发送的最后一个屏幕截图中、TBPRD 小于 CMPA 值。 我假设永远不会达到动作限定符事件、您的动作限定符不会对输出产生影响。 尝试将 CMPA 值设置为小于周期。
对于这个部分、在之前的帖子图片中、当我写入 PWM_Duty 时、CMPA/CMPB 都大于 TBPRD (EPwm1Regs.CMPA.half.CMPA = PWM_Duty;)。 因此、我不是写入 PWM_Duty、而是在 EPwm1Regs.TBPRD/2 Form 中写入类似这样的代码
EPwm1Regs.TBPRD = PWM_PERIOD;// 1KHz - PWM 信号
EPwm1Regs.CMPA.half.CMPA =(EPwm1Regs.TBPRD)/ 2;//首先占空比为50%
EPwm1Regs.CMPB =(EPwm1Regs.TBPRD)/ 2;
通过这种方法、请参阅寄存器。 CMPA 和 CMPB 变为一半...占空比为50%。 (现在它成为 TBPRD 的一半)。
其次、无论您是应用1KHz 还是120kHz、TBPRD 都不会改变、请参阅寄存器。 即使在从发生器施加信号之前、在施加信号后等待延迟后、也不会改变。 TBPRD 不会显示任何值变化。
此外、ECAP APWM 在技术上是 PWM 信号、处于向上计数模式、其中 CAP1是周期、CAP2是占空比(CMPA)。
我还尝试了这种方法、针对该器件进行了写操作(针对行: EPwm1Regs.TBPRD = PWM_PERIOD;// 1KHz - PWM 信号)、就像这样=>
EPwm1Regs.TBPRD = Ecap2Regs.CAP3;(或 Ecap2Regs.CAP1)…… 但无论您应用的频率是多少、该 TBPRD 都不会改变。 请参阅寄存器。
我还会确保为 GPA 启用 PUD
该部件、但也没有产生任何影响。
另请注意、TBCLK 有两个分频器、默认情况下将 SYSCLKOUT 除以/2。 (HSPCLKDIV)。
ECAPCLK 由 SYSCLK 计时、因此您必须将周期/计数器值除以2、使它们处于同一个 SYSCLK
对于这个部件、当我使用预分频器除以2 (通过 ECap1Regs.ECCTL.prescaler (00001))时、这会将我的发生器施加信号的频率减半、正如我不希望的那样(120kHz 时为60kHz)。 因此我保持在预分频器(00000)。 为了使 SYSCLK 设置相同、我在 ePWM 代码中使用了 HSPCLKDIV = 0 (无除法)和 CLKDIV = 0来使 SYSCLK 与 Ecapclk 保持相同。 仍然没有反应。
正确、TBPRD 为16位。 您是否需要周期需要等于2^32的信号? 这意味着最大周期为28.6s。
我想我将32位(PWM_PERIOD)的值复制到不更新 TBPRD 值的 TBPRD (16位)中。 简而言之、TBPRD 必须随着 PWM_PERIOD (取决于发生器信号频率)而相应地改变、而 PWM_PERIOD 似乎不起作用。 请在代码中提供建议:
信号之前=>
从发生器施加120kHz 信号后=>
期待您的回复
谢谢
Arsalan
您好、Arsalan、
您能在计算 PWM_PERIOD 值时向我展示一下吗? 您将需要使用该数字并将其转换为 TBPRD 值。
TBPRD 值可使用 TRM 中的此公式计算得出
您好、Ryan、
它显示在我上一篇文章中的寄存器值图片中。 PWM_PERIOD 和 PWM2_周期相同1250、占空比为625 (PWM_Duty / PWM2_Duty)。
您好、Arsalan、
我认为您的外设未启用、因此不会出现输出。
验证这是否在 InitSysCtl()内启用了 ePWM 外设。
EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; Setup_ePWM1(); // init ePWM1A EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS;
此外、请确保在代码主体内的 while 循环之前编写此代码。
我还会将周期设置为初始化 ePWM 的开始处的某些默认值、以查看 PWM 是否输出某些内容。
最棒的
Ryan Ma
您好、Ryan、
感谢您的回复。
我认为您的外设未启用、因此不会出现输出。
验证这是否在 InitSysCtl()内启用了 ePWM 外设。
此外、请确保在代码主体内的 while 循环之前编写此代码。
我还会将周期设置为初始化 ePWM 的开始处的某些默认值、以查看 PWM 是否输出某些内容。
您是否还在使用 controlCARD TMDSCNCD28335?
EPWM1A 将位于该板上的 GPIO-00 ->引脚23上
答案:
对于该器件、外设已启用、因为当您提供37500 (对于2kHz…… EPwm1Regs.TBPRD = 37500; )无论您关闭 ECAP 模块功能还是代码中没有写入 PWM_PERIOD (32位),您都将在示波器上获得占空比为50%的 PWM 信号(请参阅 Picture1、Picture2)。 因此、这意味着外设启用没有问题。
此外,InitSysstrl()函数没有问题,因为我使用的是 DSP2833x_sysctrl.c,它已经显示 ePWM 外设处于打开状态:=>(请参阅代码 Picture3中的内容):代码也是在代码主函数(CODE_attached)的 while 循环之前编写的。
此外、它是外设板集线站处的 GPIO00、它将控制卡置于 J1接头中(引脚23用于控制卡引脚、而不是用于外设板引脚) 因为我之前已经使用这个 GPIO00端口通过改变 TBPRD、死区时间和占空比等测试过 TI 实验室示例中的简单 PWM 程序实验室 为了满足这一要求、我检查了一次在外设电路板上没有提供任何东西的 GPIO23 (pin23)。 因此、在 GPIO00和 GPIO01中、您可以准确地获取 EPWM1A 和 EPWM1B 信号。
Picture3 (用于 DSP2833x_SYSCTRL.c)
图片1.
图片2.
问题1.
我看到当您给出75000 (对于1kHz 值 EPwm1Regs.TBPRD = 75000;)时、您会在寄存 器中看到类似如下的警告:"70-D 整数转换导致截断"。 (请参阅图4)。 TBPRD 寄存器显示的值不正确、这是由于这种截断错误所致(请参阅图4)。
注意:较小的值,如37500 (2kHz)或18750 (4kHz)或1250 (120kHz)。 TBPRD 寄存器显示正确的值、结果以 ePWM 信号的形式出现在示波器上(没有截断错误的警告标志)。
图4 (TBPRD = 75000时的截断警告)和 TBPRD 寄存器值不正确)。
问题2.
当您更换 TBPRD 编号(75000、37500、18750..1250 (120kHz)... etc)使用 ECAP 信号模块的可变 PWM_PERIOD (32位)、则 TBRD 值不会自行更新。 这意味着 当您在图5中看到寄存器值时、它不会检测变量。
图5.
请建议并检查代码、使变量 PWM_PERIOD (32位)/PWM_Duty (32位)可以工作。
期待您的回复。
谢谢
Arsalan
您好、Ryan、
感谢您的回复。
在 ECAP 中断内、尝试将 TBPRD 设置为更新的周期值。
这意味着、
我应该在中断块中分配 TBPRD 值吗??? 比如这个=>
中断空 eCAP1_ISR (空)
{
ECap1Regs.ECCLR.bit.INT = 1;//清除 ECAP1中断标志
-
-
-
ECap1Regs.ECCTL2.bit.rearm = 1;
EPwm1Regs.TBPRD = PWM_PERIOD;//数字- 75000、37500、18750..etc.
PieCtrlRegs.PIEACK.all = PIEACK_group4;//必须确认 PIE 组4
}
然后是 ePWM1函数- - void Setup_ePWM1 (void){--CLK、动作限定符(此函数中没有 TBRD)、CMP、死区、 ---}
我可以尝试这种方法吗?
谢谢
此致
Arsalan
您好、Arsalan、
很高兴听到这些功能正常工作:)
祝您工作顺利!