占空比是怎么控制LED亮度的,举个例子说说。

占空比是怎么控制LED亮度的,举个例子说说。,第1张

占空比就是调整led通过电流和不通过电流的时间比来控制的,由于人眼有视觉暂留特性,所以只要频率比较高是看不出来闪烁的,当然通过电流比不通过电流的时间比例越大,led做的功就越多,这样也就越亮,需要注意的是led芯片的温升和最大电流值不要超标,不然会影响其寿命

/

模拟PWM输出控制灯的10个亮度级别

定时器2溢出定为1/1200秒。每10次脉冲输出一个120HZ频率。

这每10次脉冲再用来控制高低电平的10个比值。

这样,在每个1/120秒的方波周期中,我们都可以改变方波的输出占空比,从而控制LED灯的10个级别的亮度。

/

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

#include <reg52h> //包括一个52标准内核的头文件

sbit P10 = P1^0; //要控制的LED灯

sbit K1= P3^2; //按键K1

uchar scale;//用于保存占空比的输出0的时间份额,总共10份

char code dx516[3] _at_ 0x003b;//这是为了仿真设置的

//模拟PWM输出控制灯的10个亮度级别

void main(void) // 主程序

{

uint n;

RCAP2H =0xF3; //赋T2的预置值,溢出1次是1/1200秒钟

RCAP2L =0x98;

TR2=1; //启动定时器

ET2=1; //打开定时器2中断

EA=1; //打开总中断

while(1) //程序循环

{ ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作

for(n=0;n<50000;n++); //每过一会儿就自动加一个档次的亮度

scale++;

if(scale==10)scale=0;

}

}

//1/1200秒定时器2中断

timer2() interrupt 5

{

static uchar tt; //tt用来保存当前时间在一秒中的比例位置

TF2=0;

tt++;

if(tt==10) //每1/120秒整开始输出低电平

{

tt=0;

if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影

P10=0;

}

if(scale==tt) //按照当前占空比切换输出高电平

P10=1;

}

――――――――――――――――――

在主程序中,每延时一段时间,就自动换一个占空比,以使亮度自动变化,方便观察。

编译,运行,看结果。

可以看到,LED的亮度以每种亮度1秒左右不断变化,共有10个级别。

所加PWM信号的占空比。通过改变所加信号的占空比去控制IC的输出脉冲。再由IC去控制开关管。实现PWM调光。

PWM控制信号去控制IC然后IC再控制开关管就是这么个原理。改变导通与关断的时间比也就是你说的开一会关一会。来改变LED的明暗度。开与关的过程是很短暂的。人眼是感觉不出来的。调试这种电路的时候用示波器可以很明显的看出占空比的改变。

// PWM 控制 LED 灯渐亮渐灭程序

// 适用 ME300B 开发系统

// 晶振为110592M

// 利用定时器控制产生占空比可变的 PWM 波

// 按K1,PWM值增加,则占空比减小,LED 灯渐暗。

// 按K2,PWM值减小,则占空比增加,LED 灯渐亮。

// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。//#include < reg51h >

#include < intrinsh >sbit K1 =P1^4 ; //增加键

sbit K2 =P1^5 ; //减少键

sbit BEEP =P3^7 ; //蜂鸣器

unsigned char PWM=0x7f ; //赋初值void Beep();

void delayms(unsigned char ms);

void delay(unsigned char t);//

void main()

{ P1=0xff;

TMOD=0x21 ;

TH0=0xfc ; //1ms延时常数

TL0=0x66 ; //频率调节 TH1=PWM ; //脉宽调节

TL1=0 ; EA=1;

ET0=1;

ET1=1;

TR0=1 ; while(1)

{

do{

if(PWM!=0xff)

{PWM++ ;delayms(10);}

else Beep() ;

}

while(K1==0); do{

if(PWM!=0x02)

{PWM-- ;delayms(10);}

else Beep() ;

}

while(K2==0);

}

}//

// 定时器0中断服务程序

//

void timer0() interrupt 1

{

TR1=0 ;

TH0=0xfc ;

TL0=0x66 ;

TH1=PWM ;

TR1=1 ;

P0=0x00 ; //启动输出

}//

// 定时器1中断服务程序

//

void timer1() interrupt 3

{

TR1=0 ;

P0=0xff ; //结束输出

}//

//蜂鸣器子程序

//void Beep()

{

unsigned char i ;

for (i=0 ;i<100 ;i++)

{

delay(100) ;

BEEP=!BEEP ; //Beep取反

}

BEEP=1 ; //关闭蜂鸣器

delayms(100);

} //

// 延时子程序

//

void delay(unsigned char t)

{

while(t--) ;

}//

// 延时子程序

//

void delayms(unsigned char ms) {

unsigned char i ;

while(ms--)

{

for(i = 0 ; i < 120 ; i++) ;

}

}

首先要确定PWM的周期T和占空比D,确定了这些以后,可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则DT=nt,类似的可以求出PWM低电平时间需要多少个时间基准n‘。

那么就可以编写程序,根据定的时间基准t给定时器赋值初始化,然后开启定时器,定义一个标志位flag,根据flag的状态决定输出高平还是低电平,假设定义flag=1的时候输出高电平,用一个变量去记录定时器中断的次数,每次中断就让记录中断次数的变量+1,在中断程序里面判断这个变量的值是否到了 n,如果到了说明高电平的时间够了,那么就改变flag为0,输出低电平,同时记录中断变量的值清零,每次中断的时候依旧+1,根据flag=0的情况跳去判断记录变量的值是否到了n’ 如果到了,说明PWM的低电平时间够了,那么就改flag=1,输出改高电平,同时记录次数变量清零,重新开始,如此循环便可得到想要的PWM波形。

以上就是关于占空比是怎么控制LED亮度的,举个例子说说。全部的内容,包括:占空比是怎么控制LED亮度的,举个例子说说。、请问:单片机使用C语言编程,怎样控制led灯的完成亮度强弱变换、LED的PWM调光原理 占空比与输出电流关系等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9680165.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存