Other Parts Discussed in Thread: C2000WARE
部件号: TMS320F28379D
主题: C2000WARE 中讨论的其他器件
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.
Other Parts Discussed in Thread: C2000WARE
部件号: TMS320F28379D
主题: C2000WARE 中讨论的其他器件
尊敬的 Stevan:
我正在寻找一个线路周期中的相位序列 PWM1、PWM2、PWM3、PWM4。 下一个周期 PWM2、PWM3、PWM4、PWM1 、在下一个周期相位序列 PWM3、PWM4、PWM31PWM2 中。 在下一个周期 PWM4、PWM3、PWM2、PWM1 中。 就像这种 PWM Seq 旋转将继续一样。 你认为,它可以用 TMS320F28379。 因为 PWM 只能通过一种方式触发。
如果你有一个想法,怎么做,请告诉我。

感谢您的回复、
Prashant Gugle
尊敬的 Stevan:
每个线路周期意味着, 50Hz 交流输入电压。我有零交叉信号,在 20ms(50Hz),这是中断 DSP。 对于前 20ms、我想保持相位序列 PWM1、PWM2、PWM3、PWM4。 在接下来的 20ms、我希望保持 PWM2、PWM3、PWM4、PWM1。 在接下来的 20ms、我想保持 PWM3、PWM4、PWM1、PWM2。 对于接下来的 20ms PWM4、PWM1、PWM2、PWM3。 类似这 4 个间隔将在 DSP 固件中继续。
这是为了降低输出电压中的纹波。
谢谢。此致、
Prashant Gugle
您好 Prashant、
由于要每 20ms 或每个 ISR 更改一次 PWM 序列、因此您可以 使用中断服务例程 (ISR) 中基于状态的逻辑将占空比值重新分配到 PWM 通道。 制作一个序列状态计数器:使用一个静态状态变量(例如 SEQUENCE_INDEX)、该变量在 ISR 内从 0 递增至 3、并在第四个间隔后复位为 0。 在 switch 语句内部、为每条语句创建一个“大小写“。
不要进行硬件更改和修改 SyncOut 脉冲、而是保持硬件同步链固定(例如,PWM1 同步 PWM2、PWM2 同步 PWM3 等)、 只需交换写入其占空比 (CMPA) 和相位 (TBPHS) 寄存器的值。 在这种情况下、您无需更改同步输入/同步输出路由。
希望这有所帮助。
Prashant,
您可以使用以下流水线、它将使用 ePWM1 输出、然后将 SYNCSELECT.EPWM7SYNCIN 多路复用器设置为 00、然后使用 EPWM7 SyncOut 作为 EPWM8 同步输入。

这款 C2000 增强型脉宽调制器 (ePWM):时基子模块上有一个很好的视频、详细介绍了如何实现 ePWM 同步:
https://www.ti.com/video/series/C2000-enhanced-pulse-width-modulator.html
尊敬的 Stevan:
正如你所建议的,我保持同步链固定,并试图只旋转相位。 随附代码以供您参考。 但是、每 80ms、每个 PWM 的开关周期就会加倍。 这可能是什么原因? 有没有办法可以消除这种情况?
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
switch(cycle_number)
{
case 1:
EPWM_setPhaseShift(myEPWM2_BASE, 4167);
EPWM_setTimeBaseCounter(myEPWM2_BASE, 4167);
EPWM_setPhaseShift(myEPWM3_BASE, 6250);
EPWM_setTimeBaseCounter(myEPWM3_BASE, 6250);
EPWM_setPhaseShift(myEPWM4_BASE, 8333);
EPWM_setTimeBaseCounter(myEPWM4_BASE, 8333);
EPWM_setPhaseShift(myEPWM5_BASE, 10416);
EPWM_setTimeBaseCounter(myEPWM5_BASE, 10416);
break;
case 2:
EPWM_setPhaseShift(myEPWM2_BASE, 10416);
EPWM_setTimeBaseCounter(myEPWM2_BASE, 10416);
EPWM_setPhaseShift(myEPWM3_BASE, 4167);
EPWM_setTimeBaseCounter(myEPWM3_BASE, 4167);
EPWM_setPhaseShift(myEPWM4_BASE, 6250);
EPWM_setTimeBaseCounter(myEPWM4_BASE, 6250);
EPWM_setPhaseShift(myEPWM5_BASE, 8333);
EPWM_setTimeBaseCounter(myEPWM5_BASE, 8333);
break;
case 3:
EPWM_setPhaseShift(myEPWM2_BASE, 8333);
EPWM_setTimeBaseCounter(myEPWM2_BASE, 8333);
EPWM_setPhaseShift(myEPWM3_BASE, 10416);
EPWM_setTimeBaseCounter(myEPWM3_BASE, 10416);
EPWM_setPhaseShift(myEPWM4_BASE, 4167);
EPWM_setTimeBaseCounter(myEPWM4_BASE, 4167);
EPWM_setPhaseShift(myEPWM5_BASE, 6250);
EPWM_setTimeBaseCounter(myEPWM5_BASE, 6250);
break;
case 4:
GPIO_togglePin(myGPIO0);
EPWM_setPhaseShift(myEPWM2_BASE, 6250);
EPWM_setTimeBaseCounter(myEPWM2_BASE, 6250);
EPWM_setPhaseShift(myEPWM3_BASE, 8333);
EPWM_setTimeBaseCounter(myEPWM3_BASE, 8333);
EPWM_setPhaseShift(myEPWM4_BASE, 10416);
EPWM_setTimeBaseCounter(myEPWM4_BASE, 10416);
EPWM_setPhaseShift(myEPWM5_BASE, 4167);
EPWM_setTimeBaseCounter(myEPWM5_BASE, 4167);
break;
default:
break;
}
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
Prashant,
查看代码后、我发现了一个潜在的问题。 问题在于您设置了两个 相移寄存器 (TBPHS) 和 时基计数器 (TBCTR) 相同的值:
EPWM_setPhaseShift (myEPWM2_base、4167);//设置 TBPHS
EPWM_setTimeBaseCounter (myEPWM2_base、4167);//设置 TBCTR — 不正确
这会导致 PWM 周期每 80ms 加倍一次、因为:
- TBPHS 是加载到计数器中的相位偏移 一次 事件的次数
- TBCTR 是运行计数器、用于确定您在当前 PWM 周期中的位置
-通过在计数器已经运行时强制 TBCTR 为与 TBPHS 相同的值,您每次都有效地“跳过“计数,使有效周期延长两倍。 正确的实现应为:
EPWM_setPhaseShift(myEPWM2_BASE, 4167); // Sets TBPHS
EPWM_setTimeBaseCounter(myEPWM2_BASE, 0); // Reset to 0, NOT the phase value
此外,您可以删除 EPWM_setTimeBaseCounter () 函数,然后执行以下操作:
SysCtl_disablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);
开关 (CYCLE_NUMBER)
{
用例 1:
EPWM_setPhaseShift (myEPWM2_base、4167);
EPWM_setPhaseShift (myEPWM3_base、6250);
EPWM_setPhaseShift (myEPWM4_BASE、8333);
EPWM_setPhaseShift (myEPWM5_base、10416);
休息;
//其他情况
}
SysCtl_enablePeripheral (SYSCTL_PERIPH_CLK_TBCLKSYNC);
Hope this helps.
尊敬的 Stevan:
我尝试了您建议的方式、但仍然会使占空比加倍。 我观察到,当相位从 4167 跳到 10416 时,这一意外事件就会发生。 请参考、我的时基周期是 6250、它处于向上/向下计数模式。
开关 (CYCLE_NUMBER)
{
用例 1:
EPWM_setPhaseShift (myEPWM2_base、4167);
EPWM_setPhaseShift (myEPWM3_base、6250);
EPWM_setPhaseShift (myEPWM4_BASE、8333);
EPWM_setPhaseShift (myEPWM5_base、10416);
休息;
//其他情况
Prashant,
感谢您提供更多详细信息。 您面临的问题很简单、因为相移值不应超过时基周期 (TBPRD)。
TBPRD = 6250
向上向下双向计数模式意味着总 PWM 周期= 2 × TBPRD = 2 × 6250 = 12,500 个计数
但相移值必须≤TBPRD (6250)、而不是总周期
对于 TBPRD = 6250 的向上/向下双向计数模式、您需要重新计算所有相移值、使其处于有效范围 (0 至 6249) 内。 举一个例子、如果您想 使用 具有相等 90°相位间隔的 4 个 PWM 通道、用户可以定义:(还应确保增加值 2 以考虑内部 SyncOut/syncin 同步延迟):
用例 1:
EPWM_setPhaseShift (myEPWM2_base、0+2);// 0°
EPWM_setPhaseShift (myEPWM3_base、156+2);// 90°= 3125/2 = 1562.5≈1562
ePwm_setPhaseShift (myEPWM4_BASE、3125+2);// 180°= 6250/2 = 3125
EPWM_setPhaseShift (myEPWM5_base、4687+2);// 270°= 9375/2 = 4687.5≈4687
休息;
尊敬的 Stevan:
我尝试了根据你的建议下面的代码. 但也会使占空比加倍。 这可能是什么原因?
用例 1:
EPWM_setPhaseShift (myEPWM2_base、0+2);// 0°
EPWM_setPhaseShift (myEPWM3_base、156+2);// 90°= 3125/2 = 1562.5≈1562
ePwm_setPhaseShift (myEPWM4_BASE、3125+2);// 180°= 6250/2 = 3125
EPWM_setPhaseShift (myEPWM5_base、4687+2);// 270°= 9375/2 = 4687.5≈4687
休息;
此致、
Prashant Gugle
尊敬的 Stevan:
我实际上使用以下路径中的 C2000ware 示例: epwm_ex3_synchronous
C:\ti\c2000\C2000Ware_6_00_01_00\driverlib\f2837xd\examples\cpu1\epwm
EPWM_TIMER_TBPRD 为 6250、因此 CMPA 值为 6250/4、我得到 75%的占空比。
Prashant,
请参阅此应用手册以及它们使用 CMPA/CMPB 方法配置三相 120 度相移的器件: https://www.ti.com/lit/an/sprad15/sprad15.pdf?CMPA=1771457208541 ts &ref_url=https ps%253A%252F%252Fwww.google.com%252F
这是了解此方法如何工作的良好起点。 如有任何问题或疑虑、请与我联系。
尊敬的 Stevan:
参考随附的文档、我已经了解 CMPB 是相移、CMPA-CMPB 是 50%占空比。 对于可变占空比、例如正弦三角 PWM、 我们能否 针对 PWM2 和 PWM3 的 CMPB = 1/3 PRD 保持固定值、并计算 CMPA 的 PWM 值。
在下一段中、全局加载是 GLDCTL[GLD]、单次触发模式是 GLDCTL[OSHTMODE]? 以及我们需要如何以及在何处使用它。
首先、在 PWM 1/2/3 中单独配置全局负载、确保 CTR =0 时同时加载周期和比较器 A/B 值。 其次、启用一次性加载、确保只有在控制环路运行完全完成后才加载值、然后才将影子寄存器中的内容加载到活动寄存器中。“
谢谢。此致、
Prashant Gugle
尊敬的 Stevan:
在此示例中、它们一起改变相位和频率。 他们已经讨论了双倍的占空比,是什么与我们听到的相关?
谢谢。此致、
Prashant Gugle