DSP的PWM信號(hào)
DSP28335共12路16位的ePWM,能進(jìn)行頻率和占空比控制。 ePWM的時(shí)鐘TBCLK=SYSCLKOUT/(HSPCLKDIV×CLKDIV):
PWM信號(hào)頻率由時(shí)基周期寄存器TBPDR和時(shí)基計(jì)數(shù)器的計(jì)數(shù)模式?jīng)Q定。初始化程序采用的計(jì)數(shù)模式為遞增計(jì)數(shù)模式。在遞增計(jì)數(shù)模式下,時(shí)基計(jì)數(shù)器從零開始增加,直到達(dá)到周期寄存器值(TBPDR)。然后時(shí)基計(jì)數(shù)器復(fù)位到零,再次開始增加。
PWM信號(hào)周期與頻率的計(jì)算如下:
端口對(duì)應(yīng)關(guān)系
說明:JP0B的端口號(hào)按“Z”字形順序數(shù)。
初始化程序注釋 void InitPwm1AB(float32 f)
{
Uint16 T= 2343750/f-1.0;//系統(tǒng)時(shí)鐘SYSCLKOUT=150MHz,
TBCLK=6.6666667ns,在連續(xù)增計(jì)數(shù)模式下,f=150000000/(TBPDR+1)
EALLOW;
//先初始化通用輸入輸出口//
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;
EPwm1Regs.TBPHS.half.TBPHS = 0; // 在相位寄存器中設(shè)置計(jì)數(shù)器的起始計(jì)數(shù)位置
//下面兩條語句組合對(duì)PWM的時(shí)鐘進(jìn)行分頻
EPwm1Regs.TBCTL.bit.CLKDIV = 6;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.TBPRD = T; //在周期寄存器中設(shè)置計(jì)數(shù)器的計(jì)數(shù)周期
//TBCTL為定時(shí)器控制寄存器
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //設(shè)置計(jì)數(shù)模式位為連續(xù)增計(jì)數(shù)模式,產(chǎn)生對(duì)稱方波
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 將定時(shí)器相位使能位關(guān)閉
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;//映射寄存器SHADOW使能并配置映射寄存器為自動(dòng)讀寫
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 定時(shí)器時(shí)鐘源選擇,一共有四種時(shí)鐘源
EPwm1Regs.CMPA.half.CMPA= 0.0001*T;// 設(shè)置EPWM1A比較值寄存器的比較值,即體現(xiàn)EPWM1A的占空比
EPwm1Regs.CMPB= 0.0001*T;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//A模塊比較模式 EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//B模塊比較模式 EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // A模塊比較使能,
通過寫0來清除SHDWAMODE位來使能load on CTR=Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // B模塊比較使能,
通過寫0來清除SHDWBMODE位來使能load on CTR=Zero
//AQCTLA為輸出A比較方式控制寄存器
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR(計(jì)數(shù)器)計(jì)到零時(shí)使輸出為反向
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//TBCTR(計(jì)數(shù)器)與CMPA在up計(jì)數(shù)時(shí)相等使輸出為high,這關(guān)系的輸出的占空比
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EDIS;
}
Dsp28335 - ePWM - 50Hz小舵機(jī)的控制 - 代碼例程
使用dsp28335控制舵機(jī),使用pwm信號(hào)。
28xx設(shè)置的sysclk為150MHz,大家用的時(shí)候主頻一定要搞清楚,看看底層代碼,ti的數(shù)據(jù)手冊(cè)雖然是英文的但是看起來很容易,配置起來也很簡單無腦。
初始化不多說,這里我用的pwm只是用的最基本功能,dsp中的ePwm模塊的功能非常強(qiáng)大,很多功能我都使用不到,有需要的可以針對(duì)性的看下。
void InitEPwm3Gpio(void)
{
EALLOW;
/* Enable internal pull-up for the selected pins */
// Pull-ups can be enabled or disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0; // Enable pull-up on GPIO4 (EPWM3A)
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; // Enable pull-up on GPIO5 (EPWM3B)
/* Configure ePWM-3 pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be ePWM3 functional pins.
// Comment out other unwanted lines.
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; // Configure GPIO4 as EPWM3A
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1; // Configure GPIO5 as EPWM3B
EDIS;
}
這里使用的是GPIO4和GPIO5,其他引腳同理。為了提高驅(qū)動(dòng)能力使用Pullup模式。
設(shè)置Mux寄存器為1選擇ePWM功能。
void EPwmSetup(void)
{
InitEPwm3Gpio();
EPwm3Regs.TBSTS.all=0;
EPwm3Regs.TBPHS.half.TBPHS=0;
EPwm3Regs.TBCTR=0;
//EPwm2Regs.CMPCTL.all=0x50; // Immediate mode for CMPA and CMPB
EPwm3Regs.CMPCTL.bit.SHDWBMODE = 0x0;
EPwm3Regs.CMPCTL.bit.SHDWAMODE = 0x0;
EPwm3Regs.CMPCTL.bit.LOADBMODE = 0x0;
EPwm3Regs.CMPCTL.bit.LOADAMODE = 0x0;
EPwm3Regs.CMPA.half.CMPA = 6250;
EPwm3Regs.CMPB=3125;
//EPwm3Regs.AQCTLA.all=0x60; // EPWMxA = 1 when CTR=CMPA and counter inc
// EPWMxA = 0 when CTR=CMPA and counter dec
EPwm3Regs.AQCTLA.bit.CBD = 0x0;
EPwm3Regs.AQCTLA.bit.CBU = 0x0;
EPwm3Regs.AQCTLA.bit.CAD = 0x0;
EPwm3Regs.AQCTLA.bit.CAU = 0x1;
EPwm3Regs.AQCTLA.bit.PRD = 0x0;
EPwm3Regs.AQCTLA.bit.ZRO = 0x2;
//EPwm3Regs.AQCTLA.all = 0x0012;
EPwm3Regs.AQCTLB.bit.CBD = 0x0;
EPwm3Regs.AQCTLB.bit.CBU = 0x1;
EPwm3Regs.AQCTLB.bit.CAD = 0x0;
EPwm3Regs.AQCTLB.bit.CAU = 0x0;
EPwm3Regs.AQCTLB.bit.PRD = 0x0;
EPwm3Regs.AQCTLB.bit.ZRO = 0x2;
//EPwm3Regs.AQCTLB.all = 0x0102;
EPwm3Regs.AQSFRC.bit.RLDCSF = 0x0;
EPwm3Regs.AQCSFRC.all=0x0;
EPwm3Regs.DBCTL.all=0x0;
EPwm3Regs.DBRED=0;
EPwm3Regs.DBFED=0;
EPwm3Regs.TZSEL.all=0;
EPwm3Regs.TZCTL.all=0;
EPwm3Regs.TZEINT.all=0;
EPwm3Regs.TZFLG.all=0;
EPwm3Regs.TZCLR.all=0;
EPwm3Regs.TZFRC.all=0;
EPwm3Regs.ETSEL.all=0; // Interrupt when TBCTR = 0x0000
EPwm3Regs.ETFLG.all=0;
EPwm3Regs.ETCLR.all=0;
EPwm3Regs.ETFRC.all=0;
EPwm3Regs.PCCTL.all=0;
EPwm3Regs.TBPRD=62499;
EPwm3Regs.TBCTL.bit.FREE_SOFT = 0x2;
EPwm3Regs.TBCTL.bit.CLKDIV = 0x2;
EPwm3Regs.TBCTL.bit.HSPCLKDIV = 0x6;
EPwm3Regs.TBCTL.bit.SYNCOSEL = 0x3;
EPwm3Regs.TBCTL.bit.PRDLD = 0x0;
EPwm3Regs.TBCTL.bit.PHSEN = 0x0;
EPwm3Regs.TBCTL.bit.CTRMODE = 0x0;
}
模塊的初始化
1、注意TBxxx的寄存器控制的是ePWM模塊的時(shí)鐘源,還有外部事件發(fā)生的載入計(jì)數(shù)值以及周期寄存器值,這里我只指出常用的寄存器。這里要根據(jù)自己的主頻來,我用的是推薦的最高主頻150MHz,還有一點(diǎn)要注意的是在UpCount和DownCount的計(jì)數(shù)方式下PWM周期為(TBPRD+1)*Ttbclk
//3.125MHz.//period 62500.//1ms-》3125.//2ms-》6250
這里自己一定要算清楚,以上幾個(gè)數(shù)據(jù)分別是在150MHz主頻下此代碼產(chǎn)生的1/Ttbclk、周期寄存器值、1ms對(duì)應(yīng)的CMP寄存器值和2ms對(duì)應(yīng)的CMP寄存器值。
2、CMPxxx控制的是與CTR計(jì)數(shù)器作比較的寄存器值,還有幾個(gè)控制寄存器。其中需要注意的是dsp的pwm和其他mcu一樣為了保護(hù)周期信號(hào)的完整性采用的緩沖格式,具體的是它成為“shadow”的一種模式,可以使能,也可以不使能。因?yàn)榭刂频氖嵌鏅C(jī),必須保證信號(hào)的周期是完整的20ms,所以選擇shadow模式。主要是CMP比較寄存器值的shadow模式,因?yàn)橹芷赑eriod寄存器20ms是固定不變的,設(shè)置不設(shè)置的無所謂了。
3、AQCTLA和AQCTLB寄存器主要控制的是事件發(fā)生時(shí)的電平變化情況,這兩個(gè)寄存器根據(jù)自己的需要可以有很多不同的配制方法,是產(chǎn)生電平變化主要要配置的。PWMxA和PWMxB之間使用共同的PRD、CMPA、CMPB以及一些外部事件,這里我不需要那么復(fù)雜,只需要兩路PWM既可以。
4、剩下幾個(gè)模塊有死區(qū)延遲、斬波處理pwm、強(qiáng)制轉(zhuǎn)換電平、pwm中斷幾種,根據(jù)自己的需要再去看吧,控制舵機(jī)是完全用不上了。修改占空比只需要
EPwm3Regs.CMPA.half.CMPA = 6250;
EPwm3Regs.CMPB=3125;
改變這兩個(gè)寄存器。至于為什么CMPA的寄存器和CMP不同,看看底層就明白了,因?yàn)镃MPA是32位的,其中還有16位是用來組合在HRPWM模塊中使用的。
評(píng)論
查看更多