找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8295|回复: 1
打印 上一主题 下一主题
收起左侧

一个PWM调光的LED电源-pic单片机控制

[复制链接]
跳转到指定楼层
楼主
本帖最后由 liuz 于 2014-8-13 19:16 编辑

这是这边做的一个设计,供大家参考。
一般PWM调光都是分两级的,一级PFC部分(BOOST PFC或者Flybakc PFC),一级DC/DC调光部分。但明显成本偏高,如果能用一级同时实现PFC和PWM调光就可以节省成本,基于这个想法,设计了一款次级用MCU控制的单级调光方案,经实验效果良好,现与大家分享。此方案可接受0-10V电压控制信号,然后转化为PWM脉冲同时控制初次级通断来实现PWM调光。





效率和PF。




EMI





调光特性,可根据需要软件调整。



                              变压器结构:





10%负载时的输出电流和MOS开关波形

50%负载时的输出电流和MOS开关波形

90%负载时的输出电流和MOS开关波形




程序:
//PWM Dimming main program.
#include "pic.h"


__CONFIG(0x7fc4);

unsigned int g_ADTable[4]={0,0,0,0};    //定义一个四位的数组
char g_Count=0;                         //定义变量  
bit Overflag=0;                         //溢出标志位清零
interrupt ISR (void)                          //中断服务子函数
{
  if (ADIE && ADIF)
    {  ADIF=0;
       g_ADTable[g_Count]=(((unsigned int)ADRESH)<<8) + ADRESL;
       g_Count++;
         if (g_Count==4)
           {
             g_Count=0;
             Overflag=1;
           }
         else
           {
             GODONE=1;
           }
    }  
}   

void initial (void)               // 单片机的初始化
{
  int i=0;
  TRISIO=0b00010000;             //初始化AD转换

  ANSEL=0B00001000;              //GP4为模拟输入
  GPIO=0b00000110;
  ADCON0=0B10001101;
  ADIE=1;                        //a/d中断打开
  ADIF=0;
  PEIE=1;                        //中断使能
  GIE=1;
  PR2=0xff;                //初始化PWM,全高电平输出,使其先工作1s
  CCP1CON=0b00001100;
  CCPR1L=0xff;
  T2CON=0b00000001;        //最后两位由10改为01,开关周期由500HZ变为2K
  TMR2ON=1;
  TMR2IF=0;                //PWM初始化设置完毕
  for (i=0; i<15000;i++)    //让电源先工作起来
  {
  }
  GODONE=1;
}  

void PWM_Output(unsigned char PWM_Width)    //pwm输出宽度
{
  unsigned char i=0,j=0;
  if (CCPR1L == PWM_Width)
    {
    }
  else
  {
     if (CCPR1L > PWM_Width)
       {
         i= CCPR1L - PWM_Width;
         for (j=1; j<i; j++)
           {
            CCPR1L=CCPR1L-1;
            TMR2IF=0;
            while (!TMR2IF)
              {
              }
           }
       }
     else
        {
           i=PWM_Width-CCPR1L;
           for (j=1; j<i; j++)
           {
            CCPR1L=CCPR1L+1;
            TMR2IF=0;
            while (!TMR2IF)
              {
              }
           }
        }
  }  
}

void main(void)
{
  int Tmp=0;
  unsigned char i=0, Adv=0xff;         //定义参变量及初始化
  initial ();                          //系统初始化
  while (1)                           
  {
     if (Overflag==1)
       {
          Tmp=0;
          for (i=0; i<4; i++)
            {
             Tmp=Tmp + g_ADTable[ i];
            }

          Tmp=Tmp>>4; //得到平均值,移2位得到平均值,再移2位得到8位的平均值,即最大255
          if (Tmp<=3)
            {
             Tmp=3;
            }
          Adv=Tmp;
          Overflag=0;
          GODONE=1;
       }

     else
         {
            GP1=1;
         }

     PWM_Output(Adv);   //调整PWM输出
  }
}




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:263750 发表于 2018-4-26 12:37 | 只看该作者
厉害了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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