51单片机一个io口输出不同的4个不同的pwm

51单片机一个io口输出不同的4个不同的pwm,第1张

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功能的单片机来满足设计要求了。

可以,只要速度跟得上,还可以再多。

用这个定时器的中断给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控制器吧。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11293533.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存