|
下面是一個(gè)STC15單片機(jī)的硬件輸出PWM程序其硬件PWM的計(jì)數(shù)脈沖我設(shè)置的是使用定時(shí)器2的中斷溢出脈沖作為計(jì)數(shù)脈沖
自己琢磨了好久目前功能是實(shí)現(xiàn)了但是計(jì)算來計(jì)算去都搞清楚 最終的PWM頻率是怎么來的目前輸出頻率是20HZ邏輯分析
儀測(cè)試出來的想問問論壇有經(jīng)驗(yàn)的老鐵幫忙解答一下?
#define CYCLE 0x1f4L //定義PWM周期(最大值為32767)
#define DUTY 50L //定義占空比為50%
/*---------------------------------------------------------------------*/
/*STC15Fxx 系列 單片機(jī)硬件PWM利用定時(shí)器2溢出脈沖作為計(jì)數(shù)器計(jì)數(shù)脈沖實(shí)例 */
/*--------工作頻率為12MHz-----------------------------*/
void Timer2Init(void) //100微秒@12.000MHz"中斷周期為200us"
{
AUXR&=0xFB; //定時(shí)器時(shí)鐘12T模式
T2L = 0x9C; //設(shè)置定時(shí)初始值
T2H = 0xFF; //設(shè)置定時(shí)初始值
AUXR|=0x10; //定時(shí)器2開始計(jì)時(shí)
IE2&=0xFB; //允許定時(shí)器2申請(qǐng)中斷
IE2|=0x04; //允許定時(shí)器2申請(qǐng)中斷
EA=1; //允許所有的中斷源申請(qǐng)中斷
}
void PWM_INIT()//STC15Fxx 系列 輸出任意周期和任意占空比的PWM初始化函數(shù)
{
P_SW2|=0x80;//置1"EAXSFR"允許訪問RAM隨機(jī)存儲(chǔ)器區(qū)的特殊功能寄存器
PWMCFG=0x00;//(置0"CBTADC位不使能ADC轉(zhuǎn)換")(置0"C2INI使能PWM2端口初始化電平為0")
PWMCR=0x01;//置0"ENPWM"(先關(guān)閉不啟動(dòng)計(jì)時(shí)總控位) "置1"ENC20"(使能PWM2通道口為PWM輸出受波形發(fā)生器控制)"
PWMC=CYCLE;//設(shè)置PWM周期
PWMCKS|=0x10;//(置"1" "SELT2")時(shí)鐘來源定時(shí)器T2的溢出脈沖 其他位保持不變
//占空比為(PWM2T2-PWM2T1)/PWMC
PWM2T1=0x0000;//設(shè)置PWM2第1次反轉(zhuǎn)的PWM計(jì)數(shù)
PWM2T2=CYCLE*DUTY/100;//設(shè)置PWM2第2次反轉(zhuǎn)的PWM計(jì)數(shù)
PWM2CR&=0xF7;//選擇PWM2輸出到P2.7,其他功能不使能
PWM2CR|=0x08;//選擇PWM2輸出到P2.7,其他功能不使能
PWMCR|=0x80;//最后使能"ENPWM"總控位使內(nèi)部計(jì)數(shù)器開始計(jì)數(shù)(必須全部特殊功能寄存器設(shè)置完畢后才可以使能此位)
P_SW2&=~0x80;//置0"EAXSFR"禁止訪問RAM隨機(jī)存儲(chǔ)器區(qū)的特殊功能寄存器
}
void Timer2_Interrupt_Service(void) interrupt 12
{
P30=~P30;
}
|
|