微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > PWM波产生的方法及原理

PWM波产生的方法及原理

时间:10-02 整理:3721RD 点击:
如休利用51单片机的来产生PWM波,用以控制led的亮度变化,在网上看过一些程序,有些地方不大明白,程序是这样的:
#include<reg52.h>
unsigned char cycle,pwm;
sbit led=P1^0;
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
bit flag;
TMOD=1;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
IE=0x82;
TR0=1;
cycle=10;
while(!flag)
  {
   delay(200000);
   pwm++;
   if(pwm==10)
    flag=1;
  }
while(flag)
  {
   delay(200000);
   pwm--;
   if(pwm==0)
    flag=0;
  }
}
void tim()interrupt 1
{
unsigned char count;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
count++;
if(count==pwm)////此处是什么意思呢?
  {
   led=1;
  }
  
if(count==10)
  {
   count=0;
   if(pwm!=0)///此处又是什么意思呢?
    led=0;
  }
}
感觉这个程序不是太好,因为烧到单片机观察到led虽然有亮度的变化,不过在由暗变的过程中有一个突然的跳跃,就是亮度一下子就上来了,请教高手指点迷津

thanks

上面两所提问的意思就是保持高低电平的时间,显然这个PWM代码写的不够精炼,增加调节的复杂度。在PWM这个周期保持不变的情况下,调节高低电平的时间(时间的增加稍微趋缓一点效果更明显),这样就能达到你的要求,就跟呼吸灯一样了!

建议小编先学习C语言。这个程序很基础啊。

是保持高低电平的时间,不过为什么要 用这样的语句呢?count与PWM之间有什么关系吗?如果没有的话如何实现二极管的明暗的渐变过程呢?

来 围观学习一下

我也不懂那个

很基础的呀

if(count==pwm)////此处是什么意思呢?这个循环中低电平时长从1累加到count(周期),下面一个也是。
突然的跳跃是因为时间调的不准,试试我改的吧。
#include<reg52.h>
unsigned char count,i;
sbit led=P1^0;
void delay(unsigned int i)
{
while(--i);
}
void main()
{
bit flag;
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
IE=0x82;
TR0=1;
count=100;
while(!flag)
{
delay(200000);
i++;
if(i==100)
flag=1;
}
while(flag)
{
delay(200000);
i--;
if(i==0)
flag=0;
}
}
void tim()interrupt 1
{
unsigned char count;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
count++;
if(count==i)////此处是什么意思呢?
{
led=1;
}
if(count==100)
{
count=0;
if(i!=0)///此处又是什么意思呢?
led=0;
}
}

鄙人认为你可以把CYCLE的值给DELAY(),PWM无非就是高电平和低电平的时间比例逐渐在变化,那么比如P1.0=1,DALAY(CYCLE),然后把CYCLE放到循环里面,每一次减一,初值6000,感觉效果不错的

学习了学习了学习了

写的太乱,没看懂

学习了,尽管不是很懂

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top