標(biāo)題: 關(guān)于單片機(jī)pwm占空比讓LED漸變的問題 [打印本頁]

作者: sq8422779    時間: 2020-12-3 11:20
標(biāo)題: 關(guān)于單片機(jī)pwm占空比讓LED漸變的問題
看了論壇,嘗試了自己做led漸變的程序.

        yc=1000;
        led=0;
                while(1){
                  led=0;
                        a=yc-300;
                        if(a<0){a=0;}
                        Delay_us(a);
                        led=1;
                        b=1000-yc;
                        if(b<0){b=0;}
                        Delay_us(b);
                        yc=yc-1;
                        if(yc==0){led=1;break;}
                }
                while(1){
                  led=0;
                        a=yc-300;
                        if(a<0){a=0;}
                        Delay_us(a);
                        led=1;
                        b=1000-yc;
                        if(b<0){b=0;}
                        Delay_us(b);
                        yc=yc+1;
                        if(yc==1000){led=0;break;}
                }
               

不停的漸亮,漸暗,但是發(fā)現(xiàn)2個問題,
1.在漸亮的時候,最后會突然很亮.
2.漸變過程中,閃爍比較明顯..
視頻鏈接:http://www.56.com/u74/v_MTY4MDcwMDMx.html

作者: 權(quán)威人物    時間: 2020-12-3 15:31
//你這程序爛的很,不用定時器可以這樣
while(1){
               led=0;
               Delay_us(a);
               led=1;
               Delay_us(1000-a);
                if(a++>1000)
                {a=0;break;}

             }
while(1){
               led=0;
               Delay_us(1000-a);
               led=1;
               Delay_us(a);
                if(a++>1000)
                {a=0;break;}

             }





作者: lovexulu    時間: 2020-12-3 22:55
led是壓敏器件。。在達(dá)到閾值電壓時會有自穩(wěn)壓特性,導(dǎo)致電流變化變小,所以均勻輸出pwm并不會得到均勻光亮度增加。還有多理解pwm的意思,程序?qū)懙牟惶。再?yōu)化一下吧。
作者: 1922323908    時間: 2020-12-3 23:55
可以參考一下自動控制原理這本書,
作者: sq8422779    時間: 2020-12-4 03:29
權(quán)威人物 發(fā)表于 2020-12-3 15:31
//你這程序爛的很,不用定時器可以這樣
while(1){
               led=0;

你不覺得這程序簡單,上手特容易嗎?你的這個程序沒有多大改變
作者: sq8422779    時間: 2020-12-4 03:34
lovexulu 發(fā)表于 2020-12-3 22:55
led是壓敏器件。。在達(dá)到閾值電壓時會有自穩(wěn)壓特性,導(dǎo)致電流變化變小,所以均勻輸出pwm并不會得到均勻光亮 ...

難怪最后一秒突然很亮,是因為最亮的時候需要電流小 一下達(dá)到閾值。謝謝。那我問下, pwm不就是不停的開關(guān),輸出方波嗎?
作者: wulin    時間: 2020-12-4 07:48
sq8422779 發(fā)表于 2020-12-4 03:34
難怪最后一秒突然很亮,是因為最亮的時候需要電流小 一下達(dá)到閾值。謝謝。那我問下, pwm不就是不停的開 ...

PWM調(diào)光與線性調(diào)光是兩回事。給你一個極簡單且不用定時器的呼吸燈示例參考。
  1. #include<reg52.h>
  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;
  4. sbit led=P1^0;
  5. uint count=0,time0=0,time1=0,DIR=0;

  6. void main( )
  7. {       
  8.         while (1)
  9.         {
  10.                 time0++;
  11.                 count++;
  12.                 if(count>=80)
  13.                 {
  14.                         count=0;
  15.                         if(DIR==0)
  16.                         time1++;
  17.                         else
  18.                         time1--;               
  19.                 }
  20.                 if(time1>=500)
  21.                         DIR=1;
  22.                 if(time1==0)
  23.                         DIR=0;
  24.                 if(time0>=500)
  25.                         time0=0;
  26.                 if(time0<=time1)
  27.                         led=0;
  28.                 else
  29.                         led=1;
  30.         }
  31. }
復(fù)制代碼

作者: chenyinhu    時間: 2020-12-4 09:13
sq8422779 發(fā)表于 2020-12-4 03:34
難怪最后一秒突然很亮,是因為最亮的時候需要電流小 一下達(dá)到閾值。謝謝。那我問下, pwm不就是不停的開 ...

應(yīng)該是均勻的改變占空比,理論上是均勻的改變占空比亮度也會變化,如果用MOS管搭一個BUCK電路用普通燈泡就可以看到均勻的變化效果
作者: chenyinhu    時間: 2020-12-4 09:15
這是我之前寫的采用中斷方式呼吸燈效果:
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit pwm =P2^1;
uint count=0,timer1=0,value=0;
bit DIR=1;
void main()
{
TMOD=1;
    TH0=(65536-1)/256;
TL0=(65536-1)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
   TR0=1;//TR0置位,啟動定時器


while(1)
{
  
  if(timer1>value)
  {
   pwm=0;
  }
  else
  {
  pwm=1;
  }

}
}

void time0() interrupt 1 using 1
{
TH0=(65536-1)/256;
TL0=(65536-1)%256;
timer1++;
count++;
if(timer1>500)
{
timer1=0;
}
if(count>100)
  {
  count=0;
   if(DIR==1)
{
  value++;
}
if(DIR==0)
{
  value--;
}
  }

  if(value==500)
  {
     DIR=0;
  }
  if(value==0)
  {
    DIR=1;
  }

}
作者: chenyinhu    時間: 2020-12-4 09:16
這個是不用中斷呼吸燈的代碼:
#include "reg52.h"

sbit LED = P2^0;

#define TIME 300


int main()
{
        unsigned int set  =10,time = 0;
        while(1)
        {
                for(time = 0;time < TIME;time++)
                {
                        if(time > set)
                        {
                                LED = 0;       
                        }
                        else
                        {
                                LED = 1;
                        }
                }
                set++;       
                if(set == TIME)
                {
                        for(;set>0;set--)
                        {
                                for(time = 0;time < TIME;time++)
                                {
                                        if(time > set)
                                        {
                                                LED = 0;       
                                        }
                                        else
                                        {
                                                LED = 1;
                                        }
                                }
                        }
                }
        }
}
作者: wwh2382    時間: 2020-12-4 10:25
在led兩端并個電容應(yīng)該有改善
作者: 1641989950    時間: 2020-12-4 11:09
為什么我看不懂..
作者: 回憶不堪回首    時間: 2020-12-7 16:40
不要那么多while(1)!要不然你以后會死很慘。。。
作者: sq8422779    時間: 2020-12-8 10:04
wulin 發(fā)表于 2020-12-4 07:48
PWM調(diào)光與線性調(diào)光是兩回事。給你一個極簡單且不用定時器的呼吸燈示例參考。

代碼簡單易懂,漸變效果也很理想,只是不能停留在一個恒定的漸變狀態(tài),如停留就會出現(xiàn)閃爍..看來是沒辦法通過PWM來調(diào)光了..我看看能不能加個電感 二極管 電容來達(dá)到.....
作者: 湖南    時間: 2021-1-4 09:12
利用單片機(jī)的定時器來實現(xiàn)即可,在一段時間內(nèi)輸出低電平,然后隨著時間的增加逐漸輸出高電平
作者: 人人學(xué)會單片機(jī)    時間: 2021-1-4 10:09
需要用到定時器或者增強(qiáng)型的PWM模塊,參考這個貼子http://www.torrancerestoration.com/bbs/dpj-200820-1.html
作者: mengzhixinheng    時間: 2021-1-5 12:31
就小功率led而言,絕對不應(yīng)該出現(xiàn)你說的問題。好好研究一下你的程序和硬件
作者: sq8422779    時間: 2021-1-28 15:02
wulin 發(fā)表于 2020-12-4 07:48
PWM調(diào)光與線性調(diào)光是兩回事。給你一個極簡單且不用定時器的呼吸燈示例參考。

這代碼好厲害,我拆解了2個小時都沒看懂..佩服的!!!繼續(xù)努力中..
作者: 踏雪無痕做什么    時間: 2021-2-7 16:41
我也用定時器做過可調(diào)PWM調(diào)節(jié)LED燈玩,一鍵加亮,另一鍵加暗,循環(huán),你講的可能是LED電壓與亮度非線性吧,調(diào)整一下程序,叁數(shù)試試
作者: wuyuwangluo    時間: 2021-2-7 20:07
        PWM_COUNT++;
        if(255 == lamp1)
        {
           if(PWM_COUNT <= pwm){lamp=1;}      //判斷是否到了點亮LED的時候          
           else{lamp=0;}
           if(PWM_COUNT>=115){PWM_COUNT=0;}
        }
        else{lamp=0;}
作者: 湖南    時間: 2021-3-19 23:57
單片機(jī)的定時中斷判斷就行
作者: TTQ001    時間: 2021-3-20 08:56
用于控制LED亮度的pwm方法已被許多人使用,搜索示例并學(xué)習(xí)如何編寫代碼。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1