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
您好、Arsalan、
我知道您希望对 ECAP 应用死区。 但是、我相信您可以使用 ePWM 模块完成您所尝试的操作。 您不使用 ePWM 的原因是什么?
当对 ECAP 应用死区时、只能通过一些软件干预来实现。 这 是一个能够 为您提供帮助的线程、
最棒的
Ryan Ma
您好、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
您是否还在使用 controlCARD TMDSCNCD28335?
EPWM1A 将位于该板上的 GPIO-00 ->引脚23上
您好、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
您好、Arsalan、
当没有写入 TBPRD 时、您的 epwm1似乎没有将影子加载到活动寄存器中。
在 ECAP 中断内、尝试将 TBPRD 设置为更新的周期值。
此致、
Ryan Ma
您好、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、
是的、请尝试一下。 但请保留在 Setup_ePWM1函数中的内容、在该函数中初始化启动 TBPRD。
最棒的
Ryan Ma
您好、Ryan、
最后、解带功能(上升沿和下降沿)现在被解析。 谢谢。 我将布置另一个线程、用于 EPWM1A 和 EPWM1B 之间的180度相移。
谢谢 Ryan
您好、Arsalan、
很高兴听到这些功能正常工作:)
祝您工作顺利!