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