• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

STC输出PWM,波形抖动怎么解决

 

全部回复(13)
正序查看
倒序查看
anndan
LV.6
2
2015-03-09 09:44

上图是程序,用定时器0产生中断,这个图是PWM输出波形,放电后波形是左右抖动的厉害。如果在主程序中wihle(1)后面没有任何语句就稳定,加随便一个语句就会出现图上那样。请问如何解决?

0
回复
2015-03-09 14:23
@anndan
[图片]上图是程序,用定时器0产生中断,这个图是PWM输出波形,放电后波形是左右抖动的厉害。如果在主程序中wihle(1)后面没有任何语句就稳定,加随便一个语句就会出现图上那样。请问如何解决?
你的主程序中断的时间太久了,明白没有。尽量少去中断定时器,不然就会有抖动。
0
回复
2015-03-10 09:22
@anndan
[图片]上图是程序,用定时器0产生中断,这个图是PWM输出波形,放电后波形是左右抖动的厉害。如果在主程序中wihle(1)后面没有任何语句就稳定,加随便一个语句就会出现图上那样。请问如何解决?
怎么样了现在~?  
0
回复
anndan
LV.6
5
2015-03-12 20:31
@yueyunno1
你的主程序中断的时间太久了,明白没有。尽量少去中断定时器,不然就会有抖动。
有没有具体办法?
0
回复
lvyunzeng
LV.4
6
2015-03-13 08:01

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 ;

}

 

0
回复
lvyunzeng
LV.4
7
2015-03-13 08:02
//=============================================================================
//函 数 名: 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 ;

}
0
回复
anndan
LV.6
8
2015-03-13 08:51
@lvyunzeng
//=============================================================================//函数名:TickInit()//功能:中断初始化程序,对整个的系统的设置进行配置。//说明://调用://全局变量://入口参数://出口参数:无//返回值:无//=============================================================================voidTickInit(){//---定时器0中断初始化,设定时间---//-------------------------------------//50ms10ms5ms1ms//TH00x4B0xDB0xED0xFC//TL00xF90xFE0xFF0x66//-------------------------------------TMOD|=0x11;//===16bittimer===TH0=0x3F;//===50msintterupt===TL0=0x8F;ET0=1;//===enabletimer0===TR0=0;//===timer0stop===//TR0=1;//===timer0run===/*//---定时器1中断初始化,进行显示温度压力时间信息---TH1=0xED;//===50msintterupt===TL1=0xFF;ET1=1;//===enabletimer0===TR1=1;//===timer0run===*///---外部按键中断初始化---IT0=1;//edgetriggerIT1=1;//edgetriggerEX0=1;//enableextint,usedforkeyinputEX1=1;EA=1;//===allintteruptenable===//---电机停止转动程序---CR=0;//---关闭PWM输出。---//----PWM固定的高电平输出----PCA_PWM1=0x00;//---1:固定低电平输出0:固定高输出---CCAP1L=0x00;Qiao_Low_R=1;//===电桥中右桥臂下桥臂控制信号===Qiao_Low_L=1;//===电桥中右桥臂下桥臂控制信号===//-------ADC初始化程序段------InitADC();//InitADCsfrdelay10ms(2);}//=============================================================================//函数名:voidPCA_INIT();//---PCA计数器初始化程序---//功能:PCA计数器初始化程序//说明://调用://全局变量://入口参数://出口参数:NO//返回值:NO//=============================================================================voidPCA_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输出。---}//=============================================================================//函数名:voidPWM_set_data();//---对不同模块设置不同的占空比。---//功能:对不同模块设置不同的占空比?//说明://调用://全局变量://入口参数://出口参数:NO//返回值:NO//=============================================================================voidPWM_set_data(){CCAP1H=PWM_data_buffer1;CCAP0H=PWM_data_buffer0;}

硬件PWM只能产生信号都是原边对齐的波形,我要的是2路互补带死区的PWM波形。

0
回复
2015-03-13 10:49
@anndan
硬件PWM只能产生信号都是原边对齐的波形,我要的是2路互补带死区的PWM波形。
那你用STC15F4K系列的芯片直接就可以了
0
回复
anndan
LV.6
10
2015-03-13 23:14
@yueyunno1
那你用STC15F4K系列的芯片直接就可以了
脚多,价格贵
0
回复
lvyunzeng
LV.4
11
2015-03-14 13:18
@anndan
脚多,价格贵

那你所有程序都在中断中进行,主程序中为空,或者都是标志位。但是不稳当一个没响应过来就死掉了

0
回复
2015-03-14 16:21
@lvyunzeng
那你所有程序都在中断中进行,主程序中为空,或者都是标志位。但是不稳当一个没响应过来就死掉了
用定时器去处理,完全可以实现。
0
回复
2015-03-14 16:24
@yueyunno1
用定时器去处理,完全可以实现。
建议你用硬件去实现死区控制,要不然你在调试的时候你的MOS管都会损坏不少。
0
回复
anndan
LV.6
14
2015-03-15 19:33
@yueyunno1
建议你用硬件去实现死区控制,要不然你在调试的时候你的MOS管都会损坏不少。

不行就还是用3525

0
回复