基于F28335的Simulink代码生成(二)——EPWM模块同步设置问题

本文详细阐述了如何基于F28335的Simulink代码中配置EPWM模块的同步,包括时基时钟同步和计数器同步策略。通过实例演示了同步设置的关键步骤,并讨论了不同同步方法对PWM输出的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于F28335的Simulink代码生成系列文章目录

基于F28335的Simulink代码生成(一)——搞懂模型的运行逻辑
基于F28335的Simulink代码生成(二)——EPWM模块同步设置问题
基于F28335的Simulink代码生成(三)——EQEP模块获取光电编码器的速度与角度信息
基于F28335的Simulink代码生成(四)——如何链接可以访问底层文件的外部源文件和头文件
基于F28335的Simulink代码生成(五)——DMA的使用
基于F28335的Simulink代码生成(六)——如何修改变量的存储类型
基于F28335的Simulink代码生成(七)——成果展示



EPWM模块

28335由于其强大的浮点运算能力而被广泛用于逆变以及电控等相关领域。PWM作为一种常用的外设功能,其准确的使用对于电控等场合是非常重要的。

两个概念

对于EPWM,我们在设置好频率以及占空比输入,死区设置后仍然需要进行一些配置,例如中断,又如对于电控的使用,因此就会产生对于EPWM信号的同步需求,那么就会涉及到其时基的配置。
ePWM的同步分为两个步骤:

  1、时基的时钟同步,同步所有的ePWM时基的时钟。

  2、时基计数器的同步,通过EPWMSYNCI来同步所有的时基计数器。

如何同步所有的EPWM时基的时钟

在Simulink模型中并没有办法在模型配置上达成同步时基时钟的目的,然而我们又无法修改工程文件,因为每次编译模型的时候初始化函数都会被重新覆盖。因此我想了两种解决方案:第种是直接将EPWM模块的所有配置函数都添加进“sysytem initialize”模块,这样就能覆盖PWM模块产生的配置函数。值得注意的是这样做要注意“sysytem initialize”模块生成的函数必须在PWM模块产生的配置函数的下面才能达到覆盖的目的。
第一种是直接将EPWM模块的所有配置函数都添加进“sysytem initialize”模块,这样就能覆盖PWM模块产生的配置函数。值得注意的是这样做要注意“sysytem initialize”模块生成的函数必须在PWM模块产生的配置函数的下面才能达到覆盖的目的。
第二种是使用时基同步配置的办法,将时基时钟配置函数加在epwm配置函数的前后,达到同步时基时钟的功能。我是用的是“sysytem start”模块(见下图),该模块可以选择不同的位置进行代码编写,生成的代码都是在初始化函数里的。这样的话就大大加强了模型的意义以及可用性。不然使用第一种方法即是放弃了PWM模块的配置功能。
在这里插入图片描述
曾多次
另外值得说明的是,这种同步时基时钟的方式必须在计数器的值为0时周期寄存器TBPRD转载影子寄存器的值,如下,不然配置会没有效果。
在这里插入图片描述

如何同步时基计数器

这个概念与前者相对接近,28335在片内可以通过配置EPWM1为同步信号的输出,该输出信号会经过其他pwm模块进行自动同步。这个芯片的同步信号是从EPWM1到EPWM2和EPWM4,PWM2到PWM3,EPWM4到EPWM5,EPWM5到EPWM6。这种方式可以通过实现后面PWM模块的同步,但PWM1并不一定可以同步起来,因为其同步的时基将PWM1输出同步信号瞬间的TBPHS设置的值置入计数器,这个过程是会有一定的延迟。
例如设置EPWM1. SYNCOSEL = 01 (CTR = 0时输出同步脉冲),只要你后续的模块EPWM2、EPWM3、EPWM4、EPWM5都设置了SYNCOSEL = 00 (输入脉冲直接输出),那么这个信号对于后续模块都是在CTR = 0同时到达的,这一点可以通过状态寄存器TBSTS的同步事件状态位观察是不是在该时刻发生了同步事件。
只是后续模块在当前时刻不置数,1个周期后CTR = 1也不置数,2个周期后CTR = 2的上升沿才置数,即TBPHS置入TBCTR,即发生了同步。如果设置TBPHS = 200, 那么你会发现实际的计数值差是198,这是因为2个周期之后才置数;所以若要想保持差值是200,就要考虑延时,设置TBPHS = 200 + 2 = 202,这样差值就是200。计数值实质上就是TBPRD的个数(如果是增减模式下,则是2*TBPRD个数)。
在这里插入图片描述
同步脉冲的配置方式如下图
PWM1
在这里插入图片描述
PWM2
在这里插入图片描述
其他PWM模块如PWM2所示设置。
另外补充一下手册截图
在这里插入图片描述同步脉冲同步是指将相位值置入计数器中,实际上是“计数器同步”。而时基时钟同步位PCLKCRO0.TBCLKSYNC负责同时开启或停止所有EPWM模块的时钟,实际上是“时钟同步”。计数器置入相位值,可以保持EPWM模块之间的相位差;时钟同步是为了保证所有EPWM计数器在同一时刻开始工作!
在这里插入图片描述

最后我再举个例子

我要生成三路同步的PWM脉冲频率为10KHz,TBCLK为150MHz,分别使用PWM1-3,使用1作为同步脉冲同步输出,其他两个模块为同步输入,此时TBPHS均为0.得到的三路脉冲信号如下
在这里插入图片描述
在这里插入图片描述
可以看到上面的PWM1的电平下降提早于其他两路PWM0.01us,这个0.01us实质上就是1个TBCLK,那么我只要让后面两路PWM的相位提早1个TBCLK就行了,也就是TBPHS给1。但是会有个问题,如何判断是提前还是滞后?但设置计数模式为增或者减时,只能通过一直增加相位,也就是TBPHS给15001,但是实际测试并不支持给这么大的值。
当设置为增-减模式时,会出现一个选择当同步信号过来时,计数器是增还是减的选项,如下
在这里插入图片描述
那么如前所述,我只要让后面两路的PWM计数器增加1即可,这样就能实现三路PWM是同相位的目的,也就可以实现类似于时基同步的目的了,结果如下图所示。当然,计数器同步像这么用没有必要,如果只是简单实现PWM时基同步,使用第一种方法即可。
在这里插入图片描述

对比尝试

最后在完成了两者的测试后,有了一个想法,即同时开启时基同步和计数器同步,得到的结果依旧是三路PWM是同步的。但我取消PWM2和3的相位补偿后,PWM1依旧会和PWM2和3相位产生差别。因此,两者显然是计数器同步占优。但是我在实践的过程中也发现,计数器同步产生的延迟并不一定是恒定的,比如我之前测是延迟0.01us,后来测试是延迟0.02us,虽然对于整个系统并没有什么影响,但是当涉及到高精度的场合依然是要值得注意的问题。
综上所述,如果要完成PWM的同步输出,采用时基同步即可。如果要在PWM的相位差上做文章,采用计数器同步也可以实现。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LEODWL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值