1、首先要明白PWM的含义,PWM就是输出不同占空比的脉冲,
2、普通51单片机IO口输出PWM的话,可以用定时器去计时,比如要输出100HZ的占空比50%的PWM。可以配置1ms的定时器中断,在中断中计数,一个中断就是1ms,100HZ的脉冲,周期是10ms,50%的占空比,可以计数到5的时候把Io口取反;程序如下
void main()
{
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x18; // 晶振选择12MHz,配置定时器中断1ms
ET0 = 1;
TR0 =1;
EA= 1;
while(1); //程序停止在这里,,接下来就是去响应中断
}
void Timer0() interrupt 1
{
static unsigned char t = 0;
TH0 = 0xFC;
TL0 = 0x18; //重新装入初值;
t++;
if(t <5)
{
IO = 0;
}
else if(t < 10)
{
IO = 1;
}
else
{
t = 0;
}
}
上面的程序就是周期是10ms,占空比为50%的输出了,,,需要调节占空比的话,只要改变IO口电平电话的时间就可以了;
3、多个IO口 输出不同占空比的PWM;
原理是和1个的是一样的, 多用几个时间变量去计时,判断就可以了。
4、上面说的是普通的51单片机,现在有很多增强型单片机,内部有PWM模块,可以直接使用,赋值一个周期值,比如30000到特定的寄存器里面; 然后改变第一次电平变化的时间和第二次电平变化的时间 就可以实现不同的占空比调节了。具体的可以参考下单片机的数据手册都会有例程说明的,。如果是使用内部PWM模块的话,需要选择含有多路PWM功能的单片机来满足设计要求了。
提供下思路,两个定时器。一个控制高低电平,另一个控制四种PWM的顺序及时长。
不可以,一个具有PWM输出功能的IO口只能输出一路PWM
你需要分时输出吗?不然的话一个IO口就只能输出一路PWM信号。