打印
[MCU]

问个pwm调LED亮度的问题

[复制链接]
2247|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
请问一下各位,,在使用pwm调节led亮度的时候,,有没有遇到过亮度调低结束的时候灯会暗一下然后恢复正常的亮度的情况,,,我用逻辑分析仪看了pwm输出,,,占空比有0.1%以内的波动,但是这个波动是整个过程都存在的,,,pwm频率大概是7.8k,,,led的电流比较大6个加起来全功率的时候得有大概800ma,,,mos管用si2302,允许的电流有2A多。

QQ图片20151009111405.png (13.9 KB )

QQ图片20151009111405.png

相关帖子

沙发
寂静的火|  楼主 | 2015-10-9 11:17 | 只看该作者
哦,,led上串的电阻被我拿掉了,,,忘了说了,,,限流靠pwm,,,pwm最大值没有100%,,,最大的话整体电流会超过1A

使用特权

评论回复
板凳
dirtwillfly| | 2015-10-9 14:59 | 只看该作者
你的程序哪?方便的话发上来看看

使用特权

评论回复
地板
dragon_hn| | 2015-10-9 15:23 | 只看该作者
LED上的限流电阻取掉LED会短命吧?

使用特权

评论回复
5
寂静的火|  楼主 | 2015-10-9 15:52 | 只看该作者
dragon_hn 发表于 2015-10-9 15:23
LED上的限流电阻取掉LED会短命吧?

我用pwm限制了led的电流,,,把电流限制在额定电流之内,,,这样应该不会对led造成多大损害吧,,,当然如果mos管坏了灯就确实点久一点就会坏。。。其实拿掉那几个电阻主要是电流太大,,,常用的贴片电阻承受不了那个功率,,,插件的话有不好看,,,大封装的贴片电阻手头上没有

使用特权

评论回复
6
寂静的火|  楼主 | 2015-10-9 16:06 | 只看该作者
dirtwillfly 发表于 2015-10-9 14:59
你的程序哪?方便的话发上来看看

等会,,我的程序写的有点乱,,,我整理一下

使用特权

评论回复
7
寂静的火|  楼主 | 2015-10-9 16:33 | 只看该作者
设置函数按键扫描什么的这些不相关有没什么好看的我就不发了
大概讲一下:开机控制led渐亮,按键短按切换亮度(渐变),3阶循环,按键长按关机,关机状态下按键开机
我用的不是51,stm等常用的单片机,自带有pwm模块,,T1TATA0就是pwm比较寄存器,值越大占空比越大
@dirtwillfly
void int_isr(void) __interrupt //中断服务函数
{
__asm
    movra   _ABuf
    swapar  _STATUS
    movra   _StatusBuf
__endasm;
    T0IF           = 0;     //清定时中断标志
    bit_time_flag  = 1;     //一个定时器循环标志   
    cnt_pd++;
    if(bit_long_delay)
    {
        cnt_long++;
        if(cnt_long>=DEF_long_press)
        {
            bit_power_down=1;
            bit_long_delay=0;
        }
           }
    led_shade++;
    if((bit_switch)&&(led_shade==tmp_shade))
    {
        led_shade=0;
        if(PWM_level==0)//1-2阶
        {
            T1DATA0++;
            if(T1DATA0>=DEF_PWM_level1)
            {
                           bit_switch=0;
                 PWM_level=1;
                 tmp_shade=DEF_shade;//2到3阶
            }
        }else if(PWM_level==1)//2到3阶
        {
            T1DATA0++;
            if(T1DATA0>=DEF_PWM_level2)
            {
                 bit_switch=0;
                 PWM_level=2;
                 tmp_shade=DEF_shade_down;//3到1阶
            }
        }else if(PWM_level==2)//3到1阶
        {
            T1DATA0=LED_tab[cnt_tab++];//这里就是渐灭,采用查表的方式,本来想这样变化可以做到比较平滑,不过和直接递减效果没多大差别
            if(T1DATA0==DEF_PWM_level0)
            {
                 bit_switch=0;
                 PWM_level=0;
                 cnt_tab=0;
                 tmp_shade=DEF_shade;//1到2阶
            }
        }else if(PWM_level==3)//关闭到1阶
        {
            T1DATA0++;
            if(T1DATA0>=DEF_PWM_level0)
            {
                 bit_switch=0;
                 PWM_level=0;
                 tmp_shade=DEF_shade;//1到2阶
            }        
        }
        else if(PWM_level==4)//关闭到2阶
        {
            if(T1DATA0>=0x4a)
                T1DATA0++;
            else
                T1DATA0+=2;
            if(T1DATA0>=DEF_PWM_level1)
            {
                 bit_switch=0;
                 PWM_level=1;
                 tmp_shade=DEF_shade;//2到3阶
            }        
        }else if(PWM_level==5)//关闭到3阶
        {
            if(T1DATA0>180)
                T1DATA0+=5;
            else
                T1DATA0+=2;
            if(T1DATA0>=DEF_PWM_level2)
            {
                 bit_switch=0;
                 PWM_level=2;
                 tmp_shade=DEF_shade_down;//3到1阶
            }        
        }
    }
__asm
    swapar  _StatusBuf
    movra   _STATUS
    swapr   _ABuf
    swapar  _ABuf
__endasm;
}

void key_work(void)     //按键功能,短按切换亮度,长按关机,关机状态下短按开机
{
    if(key_new==0x01)
    {      
        key_new   = 0;
        if(bit_sleep)
        {
            bit_sleep=0;
            bit_poweron=1;
            bit_switch=1;
            if(PWM_level==0)
                tmp_shade=DEF_shade_poweron;
            else if(PWM_level==1)
                tmp_shade=8;
            else if(PWM_level==2)
                tmp_shade=5;
            PWM_level+=3;
                          tmp_shade=DEF_shade_poweron;
                          T1CR  = DEF_T1_IO | DEF_T1PR | DEF_T1PTS;
                          PWMCR = DEF_PWM0EN | DEF_PWM_DBLCK;            
        }
        else
        {
            bit_long_delay=1;
            cnt_long=0;
        }
    }
    if(key_release)
    {
        key_release = 0;
        if(!bit_power_down)
        {
            if((!bit_sleep)&&(!bit_poweron))
            {
                bit_long_delay=0;
                bit_switch=1;
            }
            bit_poweron=0;
               }
    }
}

void power_down_led_close(void)  //关机按键灯渐灭
{
        cnt_pd=0;
        if(T1DATA0>150)
                T1DATA0-=7;
        else if(T1DATA0>70)
                T1DATA0-=5;
        else if(T1DATA0>30)
                T1DATA0-=3;
        else if(T1DATA0>15)
                T1DATA0-=2;
        else
                T1DATA0--;
        if(!T1DATA0)
        {
                bit_goto_sleep=1;
                bit_power_down=0;
        }        
}

void main(void)
{
    clr_ram();                //清ram
    init_system();        //设置各个寄存器
    bit_switch=1;        //开启亮度渐变,开机渐渐变亮
    PWM_level=3;
    T1DATA0=0;
    tmp_shade=DEF_shade_poweron;
    while(1)
    {
        ClrWdt();
        read_key_value();
        key_work();
        if((bit_power_down)&&(cnt_pd>=DEF_powerdown))
                power_down_led_close();                //关机灯渐灭
        if((bit_wake_sleep)||(bit_goto_sleep))
            goto_sleep();//睡眠设置
    }
}


使用特权

评论回复
8
专注于嵌入式| | 2015-10-9 18:25 | 只看该作者
建议你还是加电阻。哪天PWM出问题了。搞不好哪天,你的LED会挂掉

使用特权

评论回复
9
lirunze| | 2015-10-9 18:47 | 只看该作者
同意楼上说法

使用特权

评论回复
10
皈依| | 2015-10-10 08:33 | 只看该作者
LED不加限流对LED损伤很大,因为LED要恒流驱动的
做这种PWM的时候最忌讳的就是让LED的电压降到开启电压以下,这是会让通过LED的电流飙升的

使用特权

评论回复
11
forthlab| | 2015-10-10 09:53 | 只看该作者
电阻取消了,LED的最大电流会瞬时超限的吧,虽然平均电流不大。

使用特权

评论回复
12
jtboy105| | 2015-10-10 10:17 | 只看该作者
亮度调低结束的时候灯会暗一下然后恢复正常的亮度。
有一个地方注意下。如果是在调整的时候出现。要注意下相邻的两个PWM。是否会有问题。比如。你的Duty是10%亮。再调整的时候,如果当时是在90%的暗时,此时调整Duty。如果变成20%暗,但由于你的数据清掉了,就会出现90%+80%的暗。

使用特权

评论回复
13
寂静的火|  楼主 | 2015-10-10 17:21 | 只看该作者
专注于嵌入式 发表于 2015-10-9 18:25
建议你还是加电阻。哪天PWM出问题了。搞不好哪天,你的LED会挂掉

嗯,,,这个会注意的

使用特权

评论回复
14
寂静的火|  楼主 | 2015-10-10 17:22 | 只看该作者

本帖最后由 寂静的火 于 2015-10-10 17:25 编辑
jtboy105 发表于 2015-10-10 10:17
亮度调低结束的时候灯会暗一下然后恢复正常的亮度。
有一个地方注意下。如果是在调整的时候出现。要注意下 ...

我有试过在pwm周期中断里面做,,,一样的效果,,,也观察过pwm输出,,没见有大的波动,,都是在0.1%左右的误差,,而且是整个过程都会的另外你说的这种情况应该只是有几率出现,而不是每次都会出现的吧,,我的情况是一只都会,,,

使用特权

评论回复
15
寂静的火|  楼主 | 2015-10-10 17:26 | 只看该作者
forthlab 发表于 2015-10-10 09:53
电阻取消了,LED的最大电流会瞬时超限的吧,虽然平均电流不大。

额,,,这个倒是没有考虑,,,多谢提醒

使用特权

评论回复
16
寂静的火|  楼主 | 2015-10-10 17:27 | 只看该作者
皈依 发表于 2015-10-10 08:33
LED不加限流对LED损伤很大,因为LED要恒流驱动的
做这种PWM的时候最忌讳的就是让LED的电压降到开启电压以下 ...

嗯,,,多谢提醒

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

110

帖子

0

粉丝