PWM應用程序
/*
程序實現功能:PP1口輸出PWM方波
程序說明:通過改變duty和period ,從而控制PWM周期和占空比
duty cycle=duty/period
PWM frequency=1M/(2*period)(Fbus=24M,scla=24)
*/
#include 《hidef.h》 /* common defines and macros */
#include “derivative.h” /* derivative-specific definitions */
void SetBusClock_24MHZ(void);
void PWMDisable(byte channel);
void PWMEnable(byte channel);
void PWMSinglePortSetting(byte channel ,byte period ,byte duty) ;
void PWMsinglePortInitial(byte channel, byte clkab,byte clock, byte polarity,byte align) ;
void Service_WD(void);
void PWMGeneralInitial(byte prclk,byte scla,byte sclb,byte ctl);
void PWMConcatenateSetting(byte channel,word period,word duty);
void main(void)
{
/* put your own code here */
//總線時鐘頻率設置:24M
SetBusClock_24MHZ();
//對預分頻時鐘,分頻時鐘A,分頻時鐘B和控制寄存器的配置
//0分頻 01級聯
PWMGeneralInitial(0,24,0,0x10);
//PWM端口寄存器的配置
// 1通道 SA時鐘 起始高電平 左對齊
PWMsinglePortInitial(1,0,1,1,0);
//PWM級聯輸出配置
//50HZ 占空比12.5%
PWMConcatenateSetting(1,10000,250);
//EnableInterrupts;
for(;;) {
_FEED_COP(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
//*********************************************
//函數名:PWMEnable
//函數功能:PWM單個端口使能
//函數參數:一個 byte 類型channel 代表PWM通道號
// 返回值:無
//********************************************
void PWMEnable(byte channel)
{
if(channel》7) channel=7;
PWME|=(1《《channel); //選擇使能位
}
//**********************************************
//函數名稱:PWMDisable
//函數功能:PWM單個端口禁止
//函數參數:一個byte類型 channel 代表PWM通道號
//返回值:無
//***********************************************
void PWMDisable(byte channel)
{
if(channel》7) channel=7;
PWME&=~(1《《channel); //選擇禁止位
}
//函數功能:啟動看門狗
void Service_WD(void)
{
CPMUARMCOP=0x55;
CPMUARMCOP=0xAA;
}
//函數功能:總線時鐘設置
void SetBusClock_24MHZ(void)
{
CPMUOSC_OSCE=1; //enable osc
/*
時鐘倍頻:24MHz BusClock
48MHz VCO
48MHz PLL
*/
CPMUSYNR=0x00|0x05; //VCOFRQ[1:0],SYNDIV[5:0]
CPMUREFDIV=0x20|0x03;//REFFRQ[1:0],REFDIV[3:0]
CPMUPOSTDIV=0x00; //POSTDIV=0;
while(!CPMUFLG_LOCK)//等待VCO穩定
Service_WD(); //看門狗
CPMUCLKS_PLLSEL=1;
}
//*********************************************
//函數名稱: PWMSinglePortSetting
//函數功能:實現PWM周期寄存器和占空比寄存器通道的單獨輸出
//函數參數:3個 byte類型
//參數1: channel代表了當前配置的PWM通道
//參數2: period 周期配置參數
/*
Left aligned output (CAEx = 0) PWMx Period = Channel Clock Period * PWMPERx
Center Aligned Output (CAEx = 1) PWMx Period = Channel Clock Period * (2 * PWMPERx)
*/
//參數3: duty 占空比配置參數
/*
Polarity = 0 (PPOL x =0) Duty Cycle = [(PWMPERx-PWMDTYx)/PWMPERx] * 100%
Polarity = 1 (PPOLx = 1) Duty Cycle = [PWMDTYx / PWMPERx] * 100%
*/
//返回值:無
//**********************************************
void PWMSinglePortSetting(byte channel ,byte period ,byte duty)
{
if(channel》7) channel=7;
PWMDisable(channel); //禁止該通道
switch(channel)
{
case 0:
PWMPER0=period; //設置周期寄存器
PWMDTY0=duty; //設置占空比寄存器
break;
case 1:
PWMPER1=period; //設置周期寄存器
PWMDTY1=duty; //設置占空比寄存器
case 2:
PWMPER2=period; //設置周期寄存器
PWMDTY2=duty; //設置占空比寄存器
break;
case 3:
PWMPER3=period; //設置周期寄存器
PWMDTY3=duty; //設置占空比寄存器
break;
case 4:
PWMPER4=period; //設置周期寄存器
PWMDTY4=duty; //設置占空比寄存器
break;
case 5:
PWMPER5=period; //設置周期寄存器
PWMDTY5=duty; //設置占空比寄存器
break;
case 6:
PWMPER6=period; //設置周期寄存器
PWMDTY6=duty; //設置占空比寄存器
break;
case 7:
PWMPER7=period; //設置周期寄存器
PWMDTY7=duty; //設置占空比寄存器
break;
default:break;
}
PWMEnable(channel);
}
//*********************************************
//函數名:PWMSinglePortInitial
//函數功能:PWM端口寄存器的配置
//函數參數:5個byte類型
//參數1:channel 代表了當前配置的PWM通道
//參數2:clkab 參數2,3決定了時鐘源的選擇
//參數3: clock
/*
PWM Channel 0,1,4,5
PCLKAB[0,1,4,5] PCLK[0,1,4,5] Clock Source Selection
0 0 Clock A
0 1 Clock SA
1 0 Clock B
1 1 Clock SB
PWM Channel 2,3,6,7
PCLKAB[2,3,6,7] PCLK[2,3,6,7] Clock Source Selection
0 0 Clock B
0 1 Clock SB
1 0 Clock A
1 1 Clock SA
*/
//參數4:polarity PWM極性選擇
// 0 開始為低電平,周期計數開始為高電平
// 1 開始為高電平,周期計數開始為低電平
//參數5:align PWM對齊方式選擇
// 0 輸出左對齊
// 1 輸出中心對齊
//返回值:無
//**********************************************
void PWMsinglePortInitial(byte channel, byte clkab,byte clock, byte polarity,byte align)
{
if(channel》7) channel=7;
//禁止該通道
PWMDisable(channel);
// PWM 時鐘A/B 選擇
if(clkab==0) PWMCLKAB&=~(1《《channel);
else PWMCLKAB|=(1《《channel);
// PWM 時鐘選擇寄存器設置
if(clock==0) PWMCLK&=~(1《《channel);
else PWMCLK|=(1《《channel);
//PWM 極性選擇設置
if(polarity==0) PWMPOL&=~(1《《channel) ;
else PWMPOL|=(1《《channel);
//PWM 對齊方式設置
if(align==0) PWMCAE&=~(1《《channel);
else PWMCAE|=(1《《channel);
}
//**********************************************************
//函數名:PWMGeneralInitial
//函數功能:對預分頻時鐘,分頻時鐘A,分頻時鐘B和控制寄存器的配置
//函數參數:4個byte類型
//參數1 prclk
/*
Clock A or Clock B Prescaler Selects
PCKA/B2 PCKA/B1 PCKA/B0 Value of Clock A/B
0 0 0 Bus clock
0 0 1 Bus clock / 2
0 1 0 Bus clock / 4
0 1 1 Bus clock / 8
1 0 0 Bus clock / 16
1 0 1 Bus clock / 32
1 1 0 Bus clock / 64
1 1 1 Bus clock / 128
*/
//參數2: scla
// Clock SA = Clock A / (2 * PWMSCLA)
//參數3: sclb
// Clock SB = Clock B / (2 * PWMSCLB)
//參數4: ctl
/*
control[CON67,CON45,CON23,CON01,PSWAI,PFRZ]
PWM級聯控制寄存器 CON67,CON45,CON23,CON01
0 單獨一個通道
1 兩個通道級聯
PSWAI 0 等待模式禁止時鐘輸入
1 等待模式允許時鐘輸入
PFRZ 0 凍結模式允許PWM時鐘輸入
1 凍結模式禁止PWM時鐘輸入
//返回值:無
*/
//**************************************************************
void PWMGeneralInitial(byte prclk,byte scla,byte sclb,byte ctl)
{
//禁止所有的PWM通道
PWME=0x00;
//設置預分頻參數
PWMPRCLK=prclk;
//設置A分頻參數
PWMSCLA=scla;
//設置B分頻參數
PWMSCLB=sclb;
//級聯配置
PWMCTL=ctl;
}
//***********************************************************
//函數名稱:PWMConcatenateSetting
//函數功能:PWM級聯輸出配置
//函數參數:1個byte類型,2個word類型
//參數1: channel代表了當前配置的PWM通道
//參數2: period 周期配置參數
/*
Left aligned output (CAEx = 0) PWMx Period = Channel Clock Period * PWMPERx
Center Aligned Output (CAEx = 1) PWMx Period = Channel Clock Period * (2 * PWMPERx)
*/
//參數3: duty 占空比配置參數
/*
Polarity = 0 (PPOL x =0) Duty Cycle = [(PWMPERx-PWMDTYx)/PWMPERx] * 100%
Polarity = 1 (PPOLx = 1) Duty Cycle = [PWMDTYx / PWMPERx] * 100%
*/
//返回值:無
//**************************************************************
void PWMConcatenateSetting(byte channel,word period,word duty)
{
if(channel》7) channel=7;
switch(channel)
{
case 0:
case 1:PWMDisable(0); //禁止通道0
PWMDisable(1); //禁止通道1
PWMPER01=period; //設置周期寄存器
PWMDTY01=duty; //設置占空比寄存器
PWMEnable(0); //使能通道0;
PWMEnable(1); //使能通道1;
break;
case 2:
case 3:PWMDisable(2); //禁止通道2
PWMDisable(3); //禁止通道3
PWMPER23=period; //設置周期寄存器
PWMDTY23=duty; //設置占空比寄存器
PWMEnable(2); //使能通道2;
PWMEnable(3); //使能通道3;
break;
case 4:
case 5:PWMDisable(4); //禁止通道4
PWMDisable(5); //禁止通道5
PWMPER45=period; //設置周期寄存器
PWMDTY45=duty; //設置占空比寄存器
PWMEnable(4); //使能通道4;
PWMEnable(5); //使能通道5;
break;
case 6:
case 7:PWMDisable(6); //禁止通道6
PWMDisable(7); //禁止通道7
PWMPER67=period; //設置周期寄存器
PWMDTY67=duty; //設置占空比寄存器
PWMEnable(6); //使能通道6;
PWMEnable(7); //使能通道7;
break;
default:break;
}
}
評論
查看更多