搜索
bottom↓
回复: 12

有用PWM控制过LED亮度的么?

[复制链接]

出0入0汤圆

发表于 2009-8-24 21:07:48 | 显示全部楼层 |阅读模式
有个朋友说要做一个这东西,用PWM实现LED组亮度的控制,其中LED组的工作电压是12V,电流需求16A(好大,但我估计可以分成好几组并行实现)
而且还要是电脑可以控制的这个过程?
大家有知道的么?或是做过?还是有现成的模块可以买到(有的话哪里可以买到)?

谢谢各位!

当然我各人感觉可以有两种方案实现:
1、用一控制器(下位机)专门负责不同占空比的PWM产生,这个不同占空比是预设的,分别用协议与上位机的控制指令相对应;
   而上位机只需实现类似于不同亮度等级的选择即可!
2、根据不同的需求,直接产生不同占空比的PWM信号,直接影响LED组的亮度;

这只是我的想法,还请知道更多的朋友帮忙!

出0入0汤圆

发表于 2009-8-26 22:11:54 | 显示全部楼层
思路正确,开始吧

出0入0汤圆

发表于 2009-9-4 15:45:14 | 显示全部楼层
给个最最最简单的51单片机的PWM列子:
P1.0接个LED灯,低电平有效;
程序如下:
     CLR P1.0
LOOP:LCALL DELAY100ms
     CPL P1.0
     LJMP LOOP
   这个例子的占空比是50%的,亮度当然不一样,那LZ说要任意调节占空比,我稍微示范一下下:

     CLR P1.0
LOOP:LCALL DELAYams
     CPL P1.0
     LCALL DELAYbms
     CPL P.10
     LJMP LOOP
   由上可见,上面这个例子的占空比是由2个延时控制的,你只要控制延时时间a、b即可,而a、b有延时子程序的某些延时量控制,所以你可以加个按键,按一下对这些延时量操作一次不就可以达到改变占空的目的了么?

   上面只是2个小小的例子,LZ应该能直观的了解PWM控制LED的亮度了吧?更复杂的PWM控制还有很多,像有反馈系统的闭环控制等等!

出0入0汤圆

发表于 2009-10-23 10:16:49 | 显示全部楼层
我的51开发板子里,有个LED渐亮渐来的例子,发给你看看,希望对你有帮助。
/*******************************************************************/
/*                                                                 */
/* ME500单片机开发系统演示程序 - PWM控制LED灯渐亮渐灭              */
/*                                                                 */
/* LED显示                                                         */
/*                                                                 */
/* 版本: V1.0 (2006/11/20)                                        */
/* 作者: gguoqing (Email: gguoqing@willar.com)                    */
/* 网站: www.willar.com(伟纳电子)   www.mcusj.com(伟纳单片机世界) */
/* 邮箱: support@willar.com                                       */
/*                                                                 */
/*【版权】Copyright(C)伟纳电子 www.willar.com  All Rights Reserved */
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!       */
/*                                                                 */
/*******************************************************************/

// PWM 控制 LED 灯渐亮渐灭程序
// 适用 ME500 开发系统
// 晶振为11.0592M
// 利用定时器控制产生占空比可变的 PWM 波
// 按K1,PWM值增加,则占空比减小,LED 灯渐暗。
// 按K2,PWM值减小,则占空比增加,LED 灯渐亮。
// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

/*********************************************************/

#include<reg51.h>
#include<intrins.h>

sbit  K1 =P1^4 ;           //PWM值增加键
sbit  K2 =P1^5 ;           //PWM值减少键
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++) ;
    }
}

/*********************************************************/


此程序仅用于学习与参考,版权归原作者所有!

出0入0汤圆

发表于 2009-10-23 12:13:44 | 显示全部楼层
回去试一下。

出0入0汤圆

发表于 2009-10-23 12:21:20 | 显示全部楼层
楼主 我是搞LED相关的
已经有很多产品可以买来了 不用你去设计了
脱机的 简单的就几十元 好多用51做的

可以联电脑的一般使用DMX协议(舞台灯光使用),这个难点,当然也贵点!
不过你要买人家的软件和接口(控制器是使用它们自己的控制软件界面),便宜的也要2K左右吧

出0入0汤圆

发表于 2009-10-28 09:39:54 | 显示全部楼层
【3楼】 cq2ap9
     把你的程序烧进去,修改了蜂鸣器端口、按键端口(我的板是P2.6接蜂鸣器,P3.6,P3.7是接按键控制端)。P1是流水灯。
但启动后,无反应。

出0入0汤圆

发表于 2009-11-1 16:42:14 | 显示全部楼层
哈哈,这个刚好搞过!

PWM控制三路LED,可以一个火车头带10来个车厢,
输入控制 是 DMX 512 ,没有有输入时自动运行muc的演示程序。

(原文件名:led-3.jpg)

出0入0汤圆

发表于 2009-11-1 18:12:25 | 显示全部楼层
7楼是不是用的S52呢 我最近也在做一个
下面的那个板是什么哦

出0入0汤圆

发表于 2009-11-1 19:56:29 | 显示全部楼层
上面的板用的是FREESCALE的MC9S08GT60,当时考虑的是可以接上一个zigbee的模块,上面的板子对下的那排空就是接模块的。

下面的那块板子就是 RGB三个通道,采用的是34063.

出0入0汤圆

发表于 2009-12-26 15:22:24 | 显示全部楼层
/*
1、学习目的:利用定时器产生PWM,了解原理和使用方法
2、硬件要求:LED灯 定时器
3、试验现象:LED灯由亮到灭,由灭到亮逐步变化,也就是调光现象
*/

#include <reg52.h>

sbit LED = P1^2;    //接灯
unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms
unsigned char PWM_ON ;//定义高电平时间
void delay(unsigned int cnt)
{
while(--cnt);
}

main()
{
bit Flag;

TMOD |=0x01;//定时器设置 0.1ms in 12M crystal
TH0=(65536-100)/256;  
TL0=(65536-100)%256;//定时0.1mS  
IE= 0x82;  //打开中断
TR0=1;

CYCLE = 10;// 时间可以调整 这个是10调整 8位PWM就是256步
while(!Flag)
  {
   delay(20000); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果
   PWM_ON++;     //这个使用较长延时,以便能看清楚变化过程
   if(PWM_ON == CYCLE)
     {           //这个里可以添加其他程序 如到最亮时候控制设备
      Flag=1;
  }
  }

while(Flag)     //亮度递减 同上,是个相反的过程
  {
   delay(20000);
   PWM_ON--;
   if(PWM_ON == 0)
     {
      Flag=0;
  }
  }
}
/********************************/
/*      定时中断                */
/********************************/
void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-100)/256;  
TL0=(65536-100)%256;//定时0.1mS  

if (count==PWM_ON)
    {
     LED = 1; //灯灭  
    }
  count++;
if(count == CYCLE)
    {
    count=0;
if(PWM_ON!=0) //如果左右时间是0 保持原来状态
   LED = 0;//灯亮

    }

}

出0入0汤圆

发表于 2009-12-28 15:52:07 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 11:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表