DSP

利用28335的epwm产生spwm波的总结

2019-07-13 10:39发布

一、SPWM设计简介

设计的内容是产生倍频的SPWM波,也即是用的是同一个调制波,两个桥臂上的载波相差180度。产生spwm时,利用TB产生载波,也即是三角波。(计数方式采用增减模式即可),CC中放的是要比较的数值,当TB中的值等于CC中的值就可产生相应的动作。此动作可由AQ进行设定。当达到一定条件的时候也可以触发中断。我采用的是规则采样法,所以一个载波周期后产生中断,在此中断内修改比较寄存器的值。      

二、ePWM概要                        

28335有多个epwm模块,每个epwm模块可以产生2个波。这是28335的epwm模块的结构图及外部连接图。

其中EPWMxSYNCI为时间基准同步输入,用来将时间基准计数器和ePWM模块同步。对于第一个ePWM模块,该信号来自外部引脚,而其他模块该信号来自其他ePWM模块。 EPWMxSYNCO为时间基准同步输出。

三、ePWM各子模块讲解


ePWM模块总共有7个模块:

3.1时间基准模块   ----------TB    

为输出PWM产生时钟基准TBCLK,配置PWM的时钟基准计数器TBCTR,设置计数器的计数模式,配置硬件或软件同步时钟基准计数器,确定ePWM同步信号输出源; TBCTL(控制寄存器)配置定时器的时钟、计数模式、同步模式 TBSTS(状态寄存器) TBPHSHR(高速PWM用) TBPHS(相位寄存器)计数器的起始计数位置,例如寄存器为0x0100则计数器从0x0100开始计数 TBCTR(计数器) TBPRD(周期寄存器)设置计数器的计数周期。只有TBPRD(周期寄存器)有影子寄存器。
当TBCTL[PHSEN]置位的时候,若有同步信号EPWMxSYNCI过来,此时该ePWM模块的时基计数器(TBCTR)将会自动装载相位寄存器(TBPHS)存储的值,然后从此值开始计数。也可直接向TBCTR写入开始计数的值,但是只要时钟信号一到就开始计数了,无法与上个ePWM模块保持一个相位的延时(不过似乎可以先计算出产生这样一个延时的应该放入TBCTR的值)。 为了使下一级的ePWM模块与该ePWM模块之间有个延时,可以在下一级的TBPHS中赋给相应的值,然后由这一级的ePWM模块产生同步信号EPWMxSYNCO来使下一级的ePWM加载TBPHS,从而完成相应的延时。如上图所示,同步的方法有好多种,由TBCTL[SYNCOSEL]控制。(此级的EPWMxSYNCO接的是下一级的EPWMxSYNCI

3.2计数器比较模块----------CC

确定PWM占空比,以及ePWM输出高低电平切换时间; CMPCTL (比较控制寄存器)设置CMPA、CMPB的重载模式 CMPAHR(高速PWM用), CMPA(比较值寄存器A)设置EPWMxA的比较值,有影子寄存器。 CMPB(比较值寄存器B)设置EPWMxB的比较值,有影子寄存器。

3.3动作限定模块   ----------AQ

确定计数器和比较寄存器匹配时产生动作,即ePWM 高低电平的切换; AQCTLA (输出A比较方式控制寄存器)设置EPWMA的比较方式有CBD、CBU、CAD、CAU、PRD、ZRO,无影子寄存器,立即装载 AQCTLB (输出B比较方式控制寄存器)设置EPWMB的比较方式有CBD、CBU、CAD、CAU、PRD、ZRO,无影子寄存器,立即装载 AQSFRC (软件强制控制寄存器)设置AQCSFRC重载方式(RLDCSF),通过(OTSFB、ACTSFB)设置EPWMB、(OTSFA、ACTSFA)设置EPWMA启动一次强制置位无效、置零、置高、反向,当OTSFB、OTSFA被写1时,动作一次,写0无效,无影子寄存器 AQCSFRC (软件连续强制控制寄存器)可以强制EPWMA、EPWMB的输出为low或high或AQCSFRC不起作用,有影子寄存器,当寄存期被加载后的第二个时钟开始作用,如TBCLK=0时加载,TBCLK=1时开始起作用 说明: CBD为TBCTR(计数器)与CMPB在down计数时相等使输出为low或high或反向或不动作 CBU为TBCTR(计数器)与CMPB在up计数时相等使输出为low或high或反向或不动作 CAD为TBCTR(计数器)与CMPA在down计数时相等使输出为low或high或反向或不动作 CAU为TBCTR(计数器)与CMPA在up计数时相等使输出为low或high或反向或不动作 PRD为TBCTR(计数器)与TBPRD(周期寄存器)相等时使输出为low或high或反向或不动作 ZRO为TBCTR(计数器)计到零时使输出为low或high或反向或不动作 注意:以上均是相等时起作用,其它时间不管,只有AQCSFRC(软件连续强制控制寄存器)持续起作用 Action-qualifier (AQ) module比较方式预设模块配置如下:AQCTLA (输出A比较方式控制寄存器)的CAU置高,CAD置低,其它无效。在初始化中配置。 AQCSFRC (软件连续强制控制寄存器)通过AQSFRC(软件强制控制寄存器)的RLDCSF配置为TBCTR(计数器)计到零时装载,根据需要每次中断配置CSFA置高、置低或软件连续强制无效。其优先级最高,强制时CAU置高,CAD置低不起作用,无效时CAU置高,CAD置低起作用。 AQSFRC(软件强制控制寄存器)的ACTSFA配置为置低,当本周期软件连续强制无效时,向OTSFA写1,保证有效高周期的起始是低状态,防止上一周期结束时为高。

3.4死区控制模块   ----------DB

配置输出PWM上升沿或下降沿延时时间,也可以将A、B两通道配置成互补模式,我做的逆变器就是将ePWM配置成互补模式。死区时间可以编程确定; DBCTL(死区控制寄存器)设置S5,S4,S3,S2,S1,S0开关选择的 DBRED(死区上升沿延时)上升沿延时时间 DBFED(死区下降沿延时)下降沿延时时间


死区控制中的极性控制这个寄存器,既然有这个选项,那么一开始动作限定模块还选择达到比较的值后epwmb的输出是什么干啥呢?因为完全可以只选择epwma输出什么,然后此处互补输出就行了啊?
1. 上升沿和下降沿都是EPWMA的输入波形来产生,EPWMB靠的是EPWMA的反相。高电平有效互补就是说输出的电平还是PWMA是高电平。
2. 是可以这么做呀,只要PWMA就可以产生互补波形。只不过C2000的PWM很灵活,满足其他应用的需求。
所以我输入选择默认模式,输出选择高电平有效互补输出的时候相当于EPWMxB的输入没有使用,EPWMxB的输出是通过EPWMxA得到的。(可以通过上面的框图得出,所以 对寄存器的配置功能不明白的时候或有疑问的时候可以看下该模块结构图,这样可能会使你明白,也能更好的决定选择何种配置方案)

3.5PWM斩波模块 ----------PC

编程载波频率 编程第一个脉冲宽度 编程第二个和后续脉冲的占空比 可以不使用该功能

3.6错误控制模块   ----------TZ

当外部有错误信号产生时,对PWM输出进行相应处理,比如全置高,或拉低,或置为高阻态,从而起到保护作用。当然该功能也可以通过软件强制产生;

3.7事件触发模块   ----------EZ

使能ePWM中断,使能ePWM触发ADC采样,确定事件产生触发的速度和清除相关事件标志位。 Event-trigger (ET) module中断事件模块 ETSEL(中断选择寄存器)使能及事件源选择(SOCA触发ADC转换,SOCB触发ADC转换,中断) ETPS(中断预设寄存器)xxxCNT记录时间发生次数,当与xxxPRD相等时,发出中断信号,xxxCNT停止计数,当标志为清除时xxxCNT置零重新计数 ETFLG(中断标志寄存器)状态标志位,中断时为1 ETCLR(中断标志清除寄存器)写1清除相应标志位 ETFRC(强制中断寄存器)写1强制相应中断发生 ePWM模块的7个模块就像一条生产线,一级一级的经过,但DSP更高级,可以实现通过配置,使得ePWM只经过我选择的生产线,没有被选择上的就不要经过。例如,死区控制模块可以需要也可以不需要,这就看实际系统需不需要了。在实际使用ePWM时,正常的发出PWM波往往只要要配置TBCCAQDBET五个模块。 以上部分内容参考了这篇博客http://blog.163.com/xueweilin123@126/blog/static/164918622201310217233945/,在此表示感谢。