1. 51单片机怎么输出6路PWM正弦波
先用软件使其输出6路PWM方波,每路上再用LC滤波网络滤除高频部分,保留基波,就是正弦波输出了!
手打不易,如有帮助请采纳,谢谢!!
2. 如何用51单片机的定时器产生2路pwm
用定时器啊,用定时器定一段时间,便是pwm的周期,然后你可以设计任意数量的变量,如N1,N2等等,每一个变量都可以产生一个方波~给你简单写个程序吧
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uintunsigned int
uchar N1,N2;
sbit pwm_out1=P0^0;
sbit pwm_out2=P0^1;
void InitTimer0()
{
TMOD = 0x01;
TH0 = 0xff;
TL0 = 0xa3;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void pwm()
{
if(N1<180)pwm_out1=1;
else pwm_out1=0;
if(N2<135)pwm_out2=1;
else pwm_out2=0;
}
void main()
{
InitTimer0();
while(1)
{
pwm();
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xff;
TL0 = 0xf6;//0.01ms
N1++;
N2++;
if(N1==2000)N1=0;
if(N2==2000)N2=0;
}
3. 51单片机如何产生8路PWM波
用两个定时器的方法是用定时器t0来控制频率,定时器t1来控制占空比。大致的的编程思路是这样的:t0定时器中断让一个i0口输出高电平,在这个定时器t0的中断当中起动定时器t1,而这个t1是让io口输出低电平,这样改变定时器t0的初值就可以改变频率,改变定时器t1的初值就可以改变占空比。
用一个定时器时(如定时器t0),首先你要确定pwm的周期t和占空比d,确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是pwm的高电平的时间,则d*t=n*t,类似的可以求出pwm低电平时间需要多少个时间基准n'。
因为这里我们是产生周期为1ms(1000hz)的pwm,所以可设置中断的时间基准为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:1、当time>=100时,time清零(此语句保证频率为1000hz),2、当time>n时(n应该在0-100之间变化开),让单片相应的i/o口输出高电平,当time
评论
0
0
0
加载更多
4. 求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等三个参数就可以了.
怎么会实现不了呢?
5. 51单片机一个io口输出不同的4个不同的pwm
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功能的单片机来满足设计要求了。
6. 51单片机可以输出几路PWM
现在好多51单片机有自带的PWM,没有的话可用定时器做啊
比如STC的好多都有,最多的有四路PWM
7. 用51单片机同时实现四路PWM波,(C语言)
定个时间20ms周期的定时器,然后在定时器到达那些点的时候,让自己设的那些变量依次变化。 再根据自己的变量,付给输出端口就可以了。 看着像舵机的
看了你追问的,原来是四路每一路都产生变化的波形。那个也好办。可以通过计算,把这几个波形统一起来成一个周期,比如开始0.5ms到了,让定的值取反,再加19.5再取反,再加1.3Ms再取反,再加18.7ms再取反...然后一直这样把几个都写完。
还有种方法,来改变第一个pwm的设定值。比如放数组里一共5个设定值,分别代表你设定的高电平时间,依次替换第一个定时器里面的中端时间即可。
当然,前两种都差不多,还有一种方法供你扩展:就是用两个定时器,然后按照时间去匹配修改。当然,51单片机那精度就不说了,不太确信可以达标,一个定时器进中断了,另一个就要停一下。。
BTW,个人感觉51的单片机没有很好的pwm模块,这样写了Pwm程序,别的就干不了了。建议用用带epwm模块的mcu,直接调用epwm和epwm中断,节省cpu资源,可以多写很多程序。
8. 如何用51单片机产生4路PWM信号
可以用定时器做啊,我用吴 鉴 鹰单片机开发板做过的,用定时器加标志位做,可以产生很多路PWM波。