用51单片机定时器中断产生两路占空比可调的pwm波形

希望能通过函数调用可以调的pwm波形,比如p1^0引脚,通过调用setpwm(10),产生占空比为10%的波形,setpwm(20),产生占空比为20%的波形,周期可以任意设定10ms就行,p1^1引脚也是这样,用到定时器0.和1,两路pwm互不影响,谢谢了,急用,下面的是我的程序,但是有问题,不能正常输出

int TMA = 0;//用于定时器0计数
int TMB = 0;//用于定时器1计数
int STH0=0,STL0=0,STH1=0,STL1=0;

void main()
{
IntPwm();//定时器初始化
IntTime(0,10);//定时器0,周期10ms
IntTime(1,10);//定时器1,周期10ms
SetPwmA(40,100);
SetPwmB(50,100);
}

void IntPwm() //´定时器初始化
{
TMOD = 0x11;
TR0 = 1;
TR1 = 1;
ET0 = 1;
ET1 = 1;
EA = 1;
}
void IntTime(int x,int T)//定时器0.1初始化定时,入口定时器0或1
{
int Num;
float One ;计一个数所用时间
One = 12 * (1 / 11059.200);//ms
Num = T/One;要计的数
TH0=0xff;
TL0=0xfe;
TH1=0xff;
TH1=0xfe;
if(x==0)
{ STH0=(65536-Num)/256;
STL0=(65536-Num)%256;
}
if(x==1)
{STH1=(65536-Num)/256;
STL1=(65536-Num)%256;
}
}
void SetPwmA(int x,int y )//pwmA配置占空比x/(x+y)
{

if(TMA < x)
ENA = 1;
else
ENA = 0;
if(TMA == y)
TMA = 0;

}
void SetPwmB(int x,int y )//
{

if(TMB < x)
ENB = 1;
else
ENB = 0;
if(TMB == y)
TMB = 0;

}
void time0_int() interrupt 1 using 1 //
{
TR0=0;
TMA++;
TH0=STH0;
TL0=STL0;
TR0=1;
}
void time1_int() interrupt 3 using 1
{
TR1=0;
TMB++;
TH1=STH1;
TL1=STL1;
TR1=1;
}

只需使用一个定时器,设置为模式2(自重装),定时时间100微秒,在中断程序中比较两个PWM值就可以了,以下为示范:PWM++;if(PWM==100)PWM=0;if(PWM1>PWM)P1.1=0;else P1.1=1;if(PWM2>PWM)P1.2=0;else P1.2=1;追问

我现在碰到另外一个问题,我在单片机调用了 一个函数后,比如我调节占空比为SetPwm(10,10)//两个轮的占空比,延时10ms,想让马达已这个速度走10ms,但是,加了延时后,程序变成了把占空比调的更小了,就会有一停顿一停顿的情况,是什么原因

追答

在这种情况下使用精确延时必须以状态机的方式工作,这个可到阿莫论坛去看看。

温馨提示:答案为网友推荐,仅供参考