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功能的单片机来满足设计要求了。
可以,只要速度跟得上,还可以再多。用这个定时器的中断给3个寄存器计数并进行终值(最大脉宽)比较,就变成了3个计数器T'1、T'2、T'3。在中断处理中,再用3个输入口或程序条件分别控制这3个T'计数器的运行(即脉宽控制),设定好最小脉宽,用程序补偿反相周期,同时将这3个T'计数器的状态(正相还是反相)输出并锁存到3个输出口,即可得到3个独立的PWM信号。
-----------------------------
其精确程度取决于PWM本身的周期要求和51的时钟频率,以及编程的优化水平。极限的频率水平是定时器只计1个数就产生中断。程序优化方面要考虑每次处理过程消耗相同的时钟数,采用少占时钟数的指令。若51的时钟频率足够高或PWM本身的周期要求不很高,跟原来用一个定时器的方案相比,精确度还是能达到较高水平的。
若要求PWM本身的周期很小(频率很高),超出了51的处理能力,则不要考虑用51编程实现了,直接用硬件的PWM控制器吧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)