久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4442|回復: 21
打印 上一主題 下一主題
收起左側

關于單片機pwm占空比讓LED漸變的問題

  [復制鏈接]
跳轉到指定樓層
樓主
ID:590194 發表于 2020-12-3 11:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
看了論壇,嘗試了自己做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;}
                }
               

不停的漸亮,漸暗,但是發現2個問題,
1.在漸亮的時候,最后會突然很亮.
2.漸變過程中,閃爍比較明顯..
視頻鏈接:http://www.56.com/u74/v_MTY4MDcwMDMx.html
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:311846 發表于 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;}

             }




回復

使用道具 舉報

板凳
ID:687694 發表于 2020-12-3 22:55 | 只看該作者
led是壓敏器件。。在達到閾值電壓時會有自穩壓特性,導致電流變化變小,所以均勻輸出pwm并不會得到均勻光亮度增加。還有多理解pwm的意思,程序寫的不太好。再優化一下吧。
回復

使用道具 舉報

地板
ID:790408 發表于 2020-12-3 23:55 來自手機 | 只看該作者
可以參考一下自動控制原理這本書,
回復

使用道具 舉報

5#
ID:590194 發表于 2020-12-4 03:29 來自手機 | 只看該作者
權威人物 發表于 2020-12-3 15:31
//你這程序爛的很,不用定時器可以這樣
while(1){
               led=0;

你不覺得這程序簡單,上手特容易嗎?你的這個程序沒有多大改變
回復

使用道具 舉報

6#
ID:590194 發表于 2020-12-4 03:34 來自手機 | 只看該作者
lovexulu 發表于 2020-12-3 22:55
led是壓敏器件。。在達到閾值電壓時會有自穩壓特性,導致電流變化變小,所以均勻輸出pwm并不會得到均勻光亮 ...

難怪最后一秒突然很亮,是因為最亮的時候需要電流小 一下達到閾值。謝謝。那我問下, pwm不就是不停的開關,輸出方波嗎?
回復

使用道具 舉報

7#
ID:213173 發表于 2020-12-4 07:48 | 只看該作者
sq8422779 發表于 2020-12-4 03:34
難怪最后一秒突然很亮,是因為最亮的時候需要電流小 一下達到閾值。謝謝。那我問下, pwm不就是不停的開 ...

PWM調光與線性調光是兩回事。給你一個極簡單且不用定時器的呼吸燈示例參考。
  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. }
復制代碼
回復

使用道具 舉報

8#
ID:568565 發表于 2020-12-4 09:13 | 只看該作者
sq8422779 發表于 2020-12-4 03:34
難怪最后一秒突然很亮,是因為最亮的時候需要電流小 一下達到閾值。謝謝。那我問下, pwm不就是不停的開 ...

應該是均勻的改變占空比,理論上是均勻的改變占空比亮度也會變化,如果用MOS管搭一個BUCK電路用普通燈泡就可以看到均勻的變化效果
回復

使用道具 舉報

9#
ID:568565 發表于 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;
  }

}
回復

使用道具 舉報

10#
ID:568565 發表于 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;
                                        }
                                }
                        }
                }
        }
}
回復

使用道具 舉報

11#
ID:748788 發表于 2020-12-4 10:25 | 只看該作者
在led兩端并個電容應該有改善
回復

使用道具 舉報

12#
ID:854274 發表于 2020-12-4 11:09 | 只看該作者
為什么我看不懂..
回復

使用道具 舉報

13#
ID:406879 發表于 2020-12-7 16:40 | 只看該作者
不要那么多while(1)!要不然你以后會死很慘。。。
回復

使用道具 舉報

14#
ID:590194 發表于 2020-12-8 10:04 | 只看該作者
wulin 發表于 2020-12-4 07:48
PWM調光與線性調光是兩回事。給你一個極簡單且不用定時器的呼吸燈示例參考。

代碼簡單易懂,漸變效果也很理想,只是不能停留在一個恒定的漸變狀態,如停留就會出現閃爍..看來是沒辦法通過PWM來調光了..我看看能不能加個電感 二極管 電容來達到.....
回復

使用道具 舉報

15#
ID:280000 發表于 2021-1-4 09:12 | 只看該作者
利用單片機的定時器來實現即可,在一段時間內輸出低電平,然后隨著時間的增加逐漸輸出高電平
回復

使用道具 舉報

16#
ID:390416 發表于 2021-1-4 10:09 | 只看該作者
需要用到定時器或者增強型的PWM模塊,參考這個貼子http://www.zg4o1577.cn/bbs/dpj-200820-1.html
回復

使用道具 舉報

17#
ID:89515 發表于 2021-1-5 12:31 來自手機 | 只看該作者
就小功率led而言,絕對不應該出現你說的問題。好好研究一下你的程序和硬件
回復

使用道具 舉報

18#
ID:590194 發表于 2021-1-28 15:02 | 只看該作者
wulin 發表于 2020-12-4 07:48
PWM調光與線性調光是兩回事。給你一個極簡單且不用定時器的呼吸燈示例參考。

這代碼好厲害,我拆解了2個小時都沒看懂..佩服的!!!繼續努力中..
回復

使用道具 舉報

19#
ID:638887 發表于 2021-2-7 16:41 | 只看該作者
我也用定時器做過可調PWM調節LED燈玩,一鍵加亮,另一鍵加暗,循環,你講的可能是LED電壓與亮度非線性吧,調整一下程序,叁數試試
回復

使用道具 舉報

20#
ID:290576 發表于 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;}
回復

使用道具 舉報

21#
ID:280000 發表于 2021-3-19 23:57 | 只看該作者
單片機的定時中斷判斷就行
回復

使用道具 舉報

22#
ID:420836 發表于 2021-3-20 08:56 | 只看該作者
用于控制LED亮度的pwm方法已被許多人使用,搜索示例并學習如何編寫代碼。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天操夜夜拍 | 中文字幕一区二区三区四区五区 | 日韩在线精品视频 | 日韩字幕 | 99精品在线观看 | 国产h在线| 欧美精品一二区 | 国产精品久久av | 国产91丝袜在线18 | 视频国产一区 | 国产精品久久久久久中文字 | 一区二区三区视频在线免费观看 | 国产精品99免费视频 | 精品一区国产 | 国产日韩精品在线 | 国产三级日本三级 | 日韩一区二区三区在线 | 91电影在线 | 国产成人精品a视频一区www | 日韩欧美中文在线 | 日韩一区在线播放 | 日韩欧美视频免费在线观看 | 91精品国产综合久久婷婷香蕉 | 奇米久久 | 精品国产精品 | 成人精品一区 | 欧美日韩一区二区电影 | 国产999精品久久久 精品三级在线观看 | 97免费视频在线观看 | 欧美性精品 | xxx国产精品视频 | av一区二区三区四区 | 亚洲成人一区二区 | 久久久久久亚洲精品 | 精品日韩一区 | 国产免费自拍 | 黑人精品xxx一区一二区 | 欧美在线观看黄色 | 超碰97在线免费 | 最新国产精品 | 久久久久久久久综合 |