STC输出PWM,波形抖动怎么解决
STC单片机有内部PWM生成器,十分好用,不占用CPU的资源。冯诺依曼结构的MCU就是这个问题。以下是初始化,PWM初始化,PWM设置程序段
//=============================================================================//函 数 名: TickInit() //功 能:中断初始化程序,对整个的系统的设置进行配置。//说 明://调 用://全局变量://入口参数://出口参数:无//返 回 值:无//=============================================================================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() //功 能:中断初始化程序,对整个的系统的设置进行配置。 //说 明: //调 用: //全局变量: //入口参数: //出口参数:无 //返 回 值:无 //============================================================================= 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路互补带死区的PWM波形。