F28335學習(二)EPWM

28335的PWM模塊是加強模塊,這個加強表現在它各個ePWM的獨立性,每個ePWM小模塊都由兩路ePWM輸出組成,分別爲ePWMxA和ePWMxB,
這一對PWM輸出,可以配置成三種輸出

兩路獨立的單邊沿PWM輸出
兩路獨立的但互相對稱的雙邊沿PWM輸出
一對雙邊沿非對稱的PWM輸出
F28335共有6對這樣ePWM模塊,因爲每對PWM模塊中的兩個PWM輸出均可以單獨使用,所以也可以認爲有12路單路ePWM。
另外還有6路加強版PWM,是通過CAP模塊配置而來,所以F28335可以認爲由18路PWM輸出,這是非常強大的。

結構圖如下圖所示:
總體而言,PWM模塊是由七個模塊組成,

時基模塊 TB
比較計數模塊 CC
動作模塊 AQ
死區模塊 DB
PWM斬波模塊 PC
事件觸發模塊 ET
聯防模塊 TZ
每個模塊各自作用如下:
TB :爲輸出PWM產生始終基準TBCLK,配置PWM的時鐘基準計數器TBCTR,設置計數器的計數模式,配置硬件或軟件同步時鐘基準計數器,確定ePWM同步信號輸出源;
CC:確定PWM佔空比,以及ePWM輸出高低電平切換時間;
AQ:確定計數器和比較寄存器匹配時產生動作,即ePWM 高低電平的切換;
DB:配置輸出PWM上升沿或下降沿延時時間,也可以將A、B兩通道配置成互補模式,我做的逆變器就是將ePWM配置成互補模式。死區時間可以編程確定;
PC:產生高頻PWM載波信號;
TZ:當外部有錯誤信號產生時,對PWM輸出進行相應處理,比如全置高,或拉低,或置爲高阻態,從而起到保護作用。當然該功能也可以通過軟件強制產生;
EZ:使能ePWM中斷,使能ePWM觸發ADC採樣,確定事件產生觸發的速度和清除相關事件標誌位。
ePWM模塊的7個模塊就像一條生產線,一級一級的經過,但DSP更高級,可以實現通過配置,使得ePWM只經過我選擇的生產線,沒有被選擇上的就不要經過。例如,死區控制模塊可以需要也可以不需要,這就看實際系統需不需要了。在實際使用ePWM時,正常的發出PWM波往往只要要配置TB、CC、AQ、DB、ET五個模塊。
小結:
因爲我們是做控制的,PWM模塊是重中之重。PWM的原理我們瞭解即可,在F28335的應用中最主要的還是這七個模塊的配置。PWM最基本的屬性週期頻率,幅值,佔空比,死區時間,故障保護還有與其他ePWM模塊的配合,都是通過配置以上模塊中的寄存器來實現的,在我們能夠了解這些原理之後,做實驗自己配置下載到芯片中,並在示波器裏觀察波形,這樣才能做到熟悉和了解,後面的文章將具體的記載ePWM各個模塊的寄存器配置。

這個代碼的功能
是在ePWMA 即GPIO0口輸出一個週期爲100us,佔空比爲50%的PWM波。

#include “DSP2833x_Device.h”
#include “DSP2833x_Examples.h”

#if (CPU_FRQ_150MHZ)
#define CPU_CLK 150e6
#endif
#if (CPU_FRQ_100MHZ)
#define CPU_CLK 100e6
#endif
#define PWM_CLK 10e3
#define SP CPU_CLK/(2*PWM_CLK)
#define TBCTLVAL 0x200A

void EPwmSetup()
{
InitEPwm1Gpio();
EPwm1Regs.TBSTS.all=0; //時基狀態寄存器初始化
EPwm1Regs.TBPHS.half.TBPHS=0; //時基相位寄存器清0
EPwm1Regs.TBCTR=0; //時基計數器清0

EPwm1Regs.TBCTL.bit.CTRMODE=TB_UP_DOWN; //計數模式
EPwm1Regs.TBCTL.bit.PHSEN=TB_DISABLE; //禁止相位寄存器
EPwm1Regs.TBCTL.bit.PRDLD=TB_IMMEDIATE; //禁止影子寄存器,即刻裝載模式
EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_DISABLE;//禁止同步信號輸出
EPwm1Regs.TBCTL.bit.SWFSYNC=0; //禁止強制脈衝
EPwm1Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1; //高速時鐘分頻 1倍分頻
EPwm1Regs.TBCTL.bit.CLKDIV=TB_DIV1; //時基時鐘分頻 1倍分頻
EPwm1Regs.TBCTL.bit.PHSDIR=0; //同步信號來時 向下計數
EPwm1Regs.TBCTL.bit.FREE_SOFT=0; //仿真模式位,爲0 即可一般不設置

EPwm1Regs.TBPRD=SP;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_LD_DISABLE; //禁止影子寄存器A裝載
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_LD_DISABLE; //禁止影子寄存器B裝載
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE; //CMPA立即裝載
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE; //CMPB立即裝載

EPwm1Regs.CMPA.half.CMPA =SP/2;
EPwm1Regs.CMPB=0;

EPwm1Regs.AQCTLA.bit.CAU= AQ_SET; // CTR上升至CMPA值 置1 ePWMA輸出高
EPwm1Regs.AQCTLA.bit.CAD= AQ_CLEAR; // CTR下降至CMPA值 置0 ePWMA輸出低
EPwm1Regs.AQCTLB.bit.CBU= AQ_SET; // CTR上升至CMPB值 置1 ePWMB輸出高
EPwm1Regs.AQCTLB.bit.CBD= AQ_CLEAR; // CTR下降至CMPB值 置0 ePWMB輸出低

EPwm1Regs.AQSFRC.all=0; //動作強制寄存器清0
EPwm1Regs.AQCSFRC.all=0;

EPwm1Regs.DBCTL.bit.OUT_MODE=0X03; //死區使能雙邊沿延時
EPwm1Regs.DBRED=0; //死區上升沿延時計數器
EPwm1Regs.DBFED=0; //死區下降沿延時計數器

EPwm1Regs.TZSEL.all=0; //聯防關閉
EPwm1Regs.TZCTL.all=0;
EPwm1Regs.TZEINT.all=0;
EPwm1Regs.TZFLG.all=0;
EPwm1Regs.TZCLR.all=0;
EPwm1Regs.TZFRC.all=0;

EPwm1Regs.ETSEL.all=0; //事件觸發關閉
EPwm1Regs.ETFLG.all=0;
EPwm1Regs.ETCLR.all=0;
EPwm1Regs.ETFRC.all=0;

EPwm1Regs.PCCTL.all=0; //斬波關閉

}

關於影子寄存器:
採用影子寄存器來更新比較值CMPA和CMPB 能夠有效的防止在PWM週期內出現故障以及毛刺。
一般對計數控制寄存器的配置主要是配置好影子寄存器。
配置方式:

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; //CMPA影子裝載模式
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; //CMPB影子裝載模式
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //CTR=0 影子寄存器A裝載
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; //CTR=0 影子寄存器B裝載

死區模塊:
2.2 死區模塊DB的工作特點

如上圖所示:

死區模塊具有2組獨立的選擇機制

ePWMA作爲上升沿下降沿輸入源,系統默認選擇
ePWMA作爲上升沿輸入源,ePWMB作爲下降沿輸入源
ePWMB作爲上升沿輸入源,ePWMA作爲下降沿輸入源
ePWMB作爲上升沿下降沿輸入源
輸出模式可選擇

禁止邊沿延時,禁止死區功能
禁止上升沿延時,使能下降沿延時
禁止下降沿延時,使能上升沿延時
雙邊沿延時
輸出極性可選擇

ePWMA和ePWMB都不翻轉
ePWMA翻轉,ePWMB不翻轉
ePWMB翻轉,ePWMA不翻轉
ePWMA和ePWMB都翻轉

作者:沉沙丶
來源:CSDN
原文:https://blog.csdn.net/sy243772901/article/details/83181656
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章