STC輸出PWM,波形抖動怎么解決
STC單片機有內部PWM生成器,十分好用,不占用CPU的資源。馮諾依曼結構的MCU就是這個問題。以下是初始化,PWM初始化,PWM設置程序段
//=============================================================================//函 數 名: TickInit() //功 能:中斷初始化程序,對整個的系統(tǒng)的設置進行配置。//說 明://調 用://全局變量://入口參數://出口參數:無//返 回 值:無//=============================================================================void TickInit(){ //--- 定時器 0 中斷初始化,設定時間 --- //------------------------------------- // 50ms 10ms 5ms 1ms // TH0 0x4B 0xDB 0xED 0xFC // TL0 0xF9 0xFE 0xFF 0x66 //------------------------------------- TMOD |=0x11; //=== 16bit timer === TH0 =0x3F; //=== 50ms intterupt === TL0 =0x8F; ET0 =1; //=== enable timer0 === TR0 =0; //=== timer0 stop === // TR0 =1; //=== timer0 run === /* //--- 定時器 1 中斷初始化,進行顯示溫度壓力時間信息 --- TH1 =0xED; //=== 50ms intterupt === TL1 =0xFF; ET1 =1; //=== enable timer0 === TR1 =1; //=== timer0 run === */ //--- 外部按鍵中斷初始化 --- IT0 = 1; // edge trigger IT1 = 1; // edge trigger EX0 = 1; // enable ext int, used for key input EX1 = 1; EA =1; //=== all intterupt enable === //--- 電機停止轉動程序 --- CR = 0; //--- 關閉 PWM 輸出。--- //---- PWM固定的 高 電平輸出 ---- PCA_PWM1=0x00; //--- 1:固定低電平輸出 0:固定高輸出 --- CCAP1L = 0x00; Qiao_Low_R = 1; //=== 電橋中 右橋臂 下橋臂 控制信號 === Qiao_Low_L = 1; //=== 電橋中 右橋臂 下橋臂 控制信號 === //------- ADC初始化程序段 ------ InitADC(); //Init ADC sfr delay10ms(2);}
//=============================================================================//函 數 名: void PCA_INIT(); //---PCA計數器初始化程序 ---//功 能 : PCA計數器初始化程序//說 明 ://調 用 ://全局變量://入口參數://出口參數:NO//返 回 值:NO//=============================================================================void PCA_INIT(){ //CMOD=0x02; //--- PCA在空閑模式下停止。PCA時鐘模式為fose/2.禁止PCA計數器溢出中斷。 --- CMOD=0x00; //--- PCA在空閑模式下停止。PCA時鐘模式為fose/12.禁止PCA計數器溢出中斷。 --- CCON=0x00; //--- 禁止PCA計數器工作,清除中斷標志、計數器溢出標志。--- CL =0x00; //--- 清0計數器。--- CH =0x00; //--- 設置模塊1 為8位PWM輸出模式。--- CCAPM1 =0x42; //--- P3.5 --- PCA_PWM1=0x00; //--- 設置模塊1 為8位PWM輸出模式。--- CCAPM0 =0x42; PCA_PWM0=0x00; PWM_set_data(); //---對不同模塊設置不同的占空比。--- //------------------- // CR=1; //--- 打開 PWM 輸出。--- CR = 0; //--- 關閉 PWM 輸出。---} //=============================================================================//函 數 名: void PWM_set_data(); //---對不同模塊設置不同的占空比。---//功 能 : 對不同模塊設置不同的占空比?//說 明 ://調 用 ://全局變量://入口參數://出口參數:NO//返 回 值:NO//=============================================================================void PWM_set_data(){ CCAP1H = PWM_data_buffer1; CCAP0H = PWM_data_buffer0 ;
}
//============================================================================= //函 數 名: TickInit() //功 能:中斷初始化程序,對整個的系統(tǒng)的設置進行配置。 //說 明: //調 用: //全局變量: //入口參數: //出口參數:無 //返 回 值:無 //============================================================================= void TickInit() { //--- 定時器 0 中斷初始化,設定時間 --- //------------------------------------- // 50ms 10ms 5ms 1ms // TH0 0x4B 0xDB 0xED 0xFC // TL0 0xF9 0xFE 0xFF 0x66 //------------------------------------- TMOD |=0x11; //=== 16bit timer === TH0 =0x3F; //=== 50ms intterupt === TL0 =0x8F; ET0 =1; //=== enable timer0 === TR0 =0; //=== timer0 stop === // TR0 =1; //=== timer0 run === /* //--- 定時器 1 中斷初始化,進行顯示溫度壓力時間信息 --- TH1 =0xED; //=== 50ms intterupt === TL1 =0xFF; ET1 =1; //=== enable timer0 === TR1 =1; //=== timer0 run === */ //--- 外部按鍵中斷初始化 --- IT0 = 1; // edge trigger IT1 = 1; // edge trigger EX0 = 1; // enable ext int, used for key input EX1 = 1; EA =1; //=== all intterupt enable === //--- 電機停止轉動程序 --- CR = 0; //--- 關閉 PWM 輸出。--- //---- PWM固定的 高 電平輸出 ---- PCA_PWM1=0x00; //--- 1:固定低電平輸出 0:固定高輸出 --- CCAP1L = 0x00; Qiao_Low_R = 1; //=== 電橋中 右橋臂 下橋臂 控制信號 === Qiao_Low_L = 1; //=== 電橋中 右橋臂 下橋臂 控制信號 === //------- ADC初始化程序段 ------ InitADC(); //Init ADC sfr delay10ms(2); } //============================================================================= //函 數 名: void PCA_INIT(); //---PCA計數器初始化程序 --- //功 能 : PCA計數器初始化程序 //說 明 : //調 用 : //全局變量: //入口參數: //出口參數:NO //返 回 值:NO //============================================================================= void PCA_INIT() { //CMOD=0x02; //--- PCA在空閑模式下停止。PCA時鐘模式為fose/2.禁止PCA計數器溢出中斷。 --- CMOD=0x00; //--- PCA在空閑模式下停止。PCA時鐘模式為fose/12.禁止PCA計數器溢出中斷。 --- CCON=0x00; //--- 禁止PCA計數器工作,清除中斷標志、計數器溢出標志。--- CL =0x00; //--- 清0計數器。--- CH =0x00; //--- 設置模塊1 為8位PWM輸出模式。--- CCAPM1 =0x42; //--- P3.5 --- PCA_PWM1=0x00; //--- 設置模塊1 為8位PWM輸出模式。--- CCAPM0 =0x42; PCA_PWM0=0x00; PWM_set_data(); //---對不同模塊設置不同的占空比。--- //------------------- // CR=1; //--- 打開 PWM 輸出。--- CR = 0; //--- 關閉 PWM 輸出。--- } //============================================================================= //函 數 名: void PWM_set_data(); //---對不同模塊設置不同的占空比。--- //功 能 : 對不同模塊設置不同的占空比? //說 明 : //調 用 : //全局變量: //入口參數: //出口參數:NO //返 回 值:NO //============================================================================= void PWM_set_data() { CCAP1H = PWM_data_buffer1; CCAP0H = PWM_data_buffer0 ; }
硬件PWM只能產生信號都是原邊對齊的波形,我要的是2路互補帶死區(qū)的PWM波形。