打开syscfg文件,左侧control栏中找到EPWM,点击,发现TI提供了一些帮助文档,帮助了解如何使用syscfg以及如何了解EPWM。我们结合配置过程去理解如何使用。
设计目标
使用EPWM1;增减计数;PWM频率为10kHz;高有效互补;死区为1us;开启EPWM中断。
开始设置
首先,点击“ADD”,开始EPWM的设计。
这里的名字是可以自定义的,我们以EPWM1为例,参考命名方式,命名成myEPWM1。选择Hardware 为 EPWM1 BP。指的是用板载的EPWM接口。
下面的“Load EPWM Settings From Device Memory Export”和“Copy Settings”不适用于初次配置EPWM。
“Template Code Generation”是指是否需要生成一个模板,勾选与否不影响我们的使用,勾选了之后,syscfg会除了帮我们生成一个初始化的函数之外,额外会生成一个模板,用处不大。
“EPWM Global Load”是对多个通道进行全局加载,我们也不需要。
时基寄存器设置
EPWM Time Base,称之为时基模块,用于给EPWM提供时间基准。
调试模式设置
“Emulation Mode”调试模式,主要设置调试过程中时基模块如何运行,选择第一个“Stop after next Time Base counter increment or decrement”意思是时基模块会即时停止。
分频设置
按照推荐的设置,但是需要掌握如何计算EPWM的时钟频率,这关系到PWM的频率设置。图中给了计算方法,时基模块的时钟等于TBCLK=EPWMCLK/(HSPCLKDIV*CLKDIV)。其中EPWMCLK指的是EPWM模块的时钟。CLKDIV和HSPCLKDIV分别对应了 Time Base Clock Divider和High Speed Clock Divider。因此,按照默认设置就是将EPWM模块的时钟2分频。
在Clock Tree中观察EPWM模块的时钟频率,如下图所示。
EPWM的时钟频率是100MHz。因此时基模块的频率为100MHz/2=50MHz,即时基模块计数一次,时间是1/(50M)s。
加载模式设置
这里是选择是否使用影子寄存器模式,在EPWM中,有很多地方可以将加载模式设置成使用影子寄存器模式,影子寄存器可以等待当前计数周期完成后,再去加载,对当前计数周期没有影响,这样更加的安全。
加载事件,指的是当达到什么事件时,将时基加载到寄存器中。我们可以不设置同步,只让计数器计数到0时装载,这里的同步指的是不同EPWM模块之间的同步。
计数模式及周期设置
我们要求PWM的频率为10kHz,前面我们设计了时基模块的频率为50MHz,在设计时基周期时,需要配合计数模式。当选择增计数或者减计数时,PWM计数时锯齿波,而选择增减计数时,是三角波。
其与PWM频率之间的关系是
因此,10kHz需要计数器计数到 50MHz/10kHz/2=2500。相应的设置Time Base Period 为2500。
比较寄存器设置
PWM是脉冲宽度调制,需要通过设计比较值与计数器进行比较,才能改变电平的宽度。我们以占空比50%为例进行设置,则比较寄存器的值设置为2500。注意到,一个EPWM模块可以设置4个比较寄存器的值,来触发不同的事件,他们的功能是相同的,这里我们只设置CMPA。
动作寄存器设置
用来配置EPWM在发生特殊事件时,应该如何动作。注意!每一个EPWM可以有两个输出,分别是EPWMxA和EPWMxB。两者可以相互独立设置。在本篇博客中,我们要设置A和B互补,所以只需要设置A即可。设计规则参考PWM原理,当调制波大于载波时输出高电平,调制波小于载波时输出低电平,则
死区寄存器设置
在控制逆变器时,我们需要避免上下管同时导通,所以需要配置死区。syscfg贴心的为开发者准备了常见的模式。图中解释了上升沿和下降沿延时。从图中可以发现,我们需要的是高有效互补,意思是高电平有效,A和B互补。
我们只需要点击一下,则帮助我们配置好了逻辑关系。如图所示
接下来我们需要配置影子寄存器模式以及延时的时间,我们需要死区大小为1us,则计数设置为1us/(1/50MHz)=50。
以上便完成了死区的设置。
其余模块对于生成基本的PWM用处不大,具体地功能和应用方法参考应用手册。
生成board.c 和.h文件
编译工程,观察board.c
在IO初始化中,对EPWM的引脚进行了初始化
在EPWM初始化中,对EPWM的功能进行了初始化
注意事项!
- 如果想上电即看到PWM波形,需要关闭强制低电平,否则会看到一个始终高电平 一个始终低电平,因为设置了两个互补 。
- 需要在main.c中加入对器件的初始化函数,直接调用即可,初始化的主要是时钟
- 需要预定义变量,_LAUNCHXL_F28379D
未预定义时,代码块是灰色的。这个Device_init()函数默认是给control_Card使用的,不是launchPad。
复制_LAUNCHXL_F28379D,右键工程,选择Properties,如下图依次点击,然后apply and close
注意已经发生了变化。修改后,相应的代码块不是灰色了。
示波器查看结果
(1) 不预定义 _LAUNCHXL_F28379D
开关频率为5kHz,死区位2us
(2) 预定义 _LAUNCHXL_F28379D
开关频率为10kHz,死区位1us
(忽略我的小破示波器没有校准的问题~谢谢)