单片机如何同时输出三路独立的pwm波

作者&投稿:充钟 (若有异议请与网页底部的电邮联系)
求51单片机PWM程序(一个定时器产生三路PWM 可独立运作) 简单来说就是用三路独立的pwm控制三个LED~

怎么可能搞不了三路独立的呢?楼下那位是被STC12C5A60S2的硬件蒙蔽了视线,他认为,STC12C只有两路PWM,无法实现3路,你却忘记了最原始的办法,不要说STC12有PWM功能,即使是传统的AT89S52这类没有PWM功能的单片机也一样能够实现楼主的要求.
下面我简单的分析一下我的思路,楼主尝试编程,如果不懂,再追问:
你是用三路独立的PWM调光用的,PWM调光,为了保证不让人眼产生闪烁,理论上PWM的频率要大于20Hz,而在实际的测试用,一般PWM要大于25Hz才能保证不闪烁.为了保险起见,我们将PWM的频率设定在30Hz左右,那么,周期就是33.333333ms,假设,我们实现10级调光,那个 每级的时间是3.33333ms
然后设置三个变量和一个计数器,我描述不太清楚,你看一下程序:

sbit P1_0 = P1^0; //---P1.0,P1.1,P1.2是三路PWM输出
unsigned char Set_PWM0 = 0; //--Set_PWM0 Set_PWM1 Set_PWM2
//--分别是低电平占整个脉冲的百分比
//--他们最小取0,最大取9
unsigned char counter = 0;//--用于计数的
void ISR_Timer0(void) interrupt 1 //---我们就用定时器0来做,不用PWM硬件
{ //----3.3333ms中断一次
counter++;

if(counter >= 10) counter = 0;
if(counter >= Set_PWM0) P1_0 = 0; else P1_0 = 1;
if(counter >= Set_PWM1) P1_1 = 0; else P1_1 = 1;
if(counter >= Set_PWM2) P1_2 = 0; else P1_2 = 1;

}

这样,定时器0用于决定PWM的反占空比,你只要设置 Set_PWM0等三个参数就可以了.
怎么会实现不了呢?

3路PWM波,频率100HZ,周期为10ms,这个应该很简单吧,用定时器进行定时0.1ms中断一次,100次为一循环,这样周期为10ms。相位差和为360,最简单的是,第1个方波比第2个差120,第2个比第3个差120,第3个比第1个差120。也就是说在第0ms第1个方波启动,第3.3333...ms第2个方波启动,6.66666ms第3个方波启动,而到10ms第1个方波第二个周期又开始启动。这只是最简单的,其实只要满足a b c三个方波启动时间刚好加起来等于10ms就可以。
回到定时器,程序你设定3个变量,a b c,其中a b c的初值分别用来表示第1 2 3方波的相位差,判断a b c的范围来确认三个方波的占空比。设置0.1ms中断,变量初值a=0 b=33 c=66每次中断a b c 分别++,当a=100 b=100 c =100,a=0 b=0 c=0。
主函数,设置3个IO口,PWM1 PWM2 PWM3,if(0<a<50);(PWM1==1);else;PWM1==0; if(0<b<50);(PWM2==1);else;PWM2==0; if(0<c<50);(PWM3==1);else;PWM3==0;其中a b c的取值范围就是占空比的值(1~99)。
注:1、因为a b c初值不同,所以相位差在初值就体现出来了。2、也可不用中断,判断定时器溢出位也可。3、想要更精确可以定时0.01ms,变量设定1000个。

以上也是我自己凭空想的,没实际实验,你可以试试!

输出PWM有三种方法:1、如果你的单片机里有PWM发生器就可以独立生成。
2、用软件实现:在程序里对要输出PWM波的端口不断取反。例:
#include<reg52.h>
sbit pwm=P0^0;
void delay(char i,char j)
{
for(i=100;i>0;i--)
for(j=200;j>0;j--);
}
void main()
{
while(1)
{
pwm=0;
delay();
pwm=1;
}
}
3、用单片机的定时器中断产生。

AVR单片机能轻易的产生3路或者更多的PWM,不需要软件模拟,只要将定时器配置成PWM方式就可以了。

51单片机三个按钮控制三个小灯的方法
答:这么技术性的东西居然悬赏分也不给。不过还是跟你说一下我的想法吧。我觉得要实现你的功能智能通过定时器中断的方法来,因为3个按钮相互独立的。所以要3个定时器,而51只有两个定时器,所以你得用52才能实现,52有3个定时器。把一次定时设为5ms,中断200次时把控制灯的电平反转,就行了。

单片机中独立键盘和矩阵键盘如何一起使用 请用C语言写个程序说明,谢谢...
答:case 0x44:keyval=3;break;case 0x48:keyval=11;break;case 0x81:keyval=12;break;case 0x82:keyval=13;break;case 0x84:keyval=14;break;case 0x88:keyval=15;break;default:keyval=0xff;break;} //以下处理独立按键 if(skey==0){ if(keyval!=0xff)keyval+=16; //如果独立键按下,...

用c语言编程三个按键对应点亮三个LED灯的程序,AT89S52单片机,最好...
答:三路抢答器提供你编程思路(按键扫描方式)参考,程序还是要根据你的硬件电路自己编写。端口配置:1、选择4个端口作为输入端口连接按键(独立按键,按键一端接单片机端口,另一端接地)。 三路为抢答的按键KEY1、KEY2、KEY3,一路为抢答后复位按键KEY0。2、选择3个端口作为输出端口连接LED灯(高电平...

51单片机输出两路独立的可调占空比pwm,如何变成
答:51单片机输出两路独立的可调占空比pwm,比较困难啊,只有两个定时器,一路就需要2个定时器了。 用52吧,有3个定时器,1个做PWM的时基,另两个做两路占空比定时,这样两路PWM的频率一样,占空可独立调节。(详细程序没有,只能给你个方法或思路参考)要求高用ATmega8吧,带有比较模块能实现3路PWM。

51单片机中两个 SBUF物理上独立,共同占用同一地址,那么一个单片机能不...
答:1、首先,51指令执行属于是依次执行的,读写不会同步,执行读的时候不会是写,执行写的时候不会是读;2、串口双工是指读写都是可以通过该口实现,但是,51的读写串口是要对串口进行定向的,这也决定串口不会是真正意义上的同时。不过,可以通过程序设计,实现一个串口的读写自动化,希望可以帮到你...

单片机为什么能同时输出两个8位数?
答:DAC0832(1)输入寄存器DFFFH DAC0832 (2) 输入寄存器 BFFFH 两片DAC0832(1/2)DAC寄存器地址相同:7FFFH 多个同步输出是因为单片机已经分别把各片DAC0832要转换的内容存到了相应的片内的8位输入缓冲寄存器中了,最后同时选中多片DAC0832的DAC寄存器,一起转换,这样就达到了同步输出的效果。

51单片机通过编程能够同时输出不同的PWM吗?
答:可以的,四个8位端口都可以独立控制的。

...128单片机,自带快速pwm输出,定时器1或3,同时输出A,B,C三路时为什么...
答:我也正在用这个功能,折腾的好几天,总算是输出较好 的波形了。PWM的分类较多,只要根据说明书设置好各个寄存器就没问题了。你可以把源程序贴出来看看啊。

如何用51单片机PWM控制3个步进电机?
答:看您的提问应该是不太熟悉程序编写。这里为你推荐表控PLC,可以在不编程的情况下实现对步进电机的多种操作,最多可以同时控制4个步进电机。表控PLC采用表格设置取代编程,进入中文的表格设置界面,只需鼠标点击就可以完成程序控制、自动控制、手动控制、定时控制、顺序控制、自定顺序控制、同时控制、独立控制...

51单片机:按三个键开始流水灯,为什么单独按不行,必须三个键同时按?
答:k=a&b&c; k为a、b、c三者相与 只有三个按键同时按下(a、b、c同时为1)k才等于1 程序才能进入while(k)中。