久久久国产精品视频袁燕,99re久久精品国产,亚洲欧美日韩国产综合v,天天躁夜夜躁狠狠久久,激情五月婷婷激情五月婷婷

工程師單片機(jī)LED項(xiàng)目

很多初學(xué)者覺得自己學(xué)的東西很基礎(chǔ),擔(dān)心今后實(shí)際工作用不到。有初學(xué)者問了這樣的問題:單片機(jī)真正開發(fā)產(chǎn)品和學(xué)習(xí)的時(shí)候有什么差別,平時(shí)學(xué)的LED、ADC這些東西,在實(shí)際項(xiàng)目中會(huì)用到嗎?雖然技術(shù)更新迭代很快,但有很多基本的技術(shù),仍然在實(shí)際項(xiàng)目中會(huì)用到,今天就拿LED為例來說說吧。

LED有哪些作用?

別小看LED,它在實(shí)際生活中應(yīng)用很廣泛的。

首先就是以LED為光源的項(xiàng)目,比如呼吸燈、廣告燈、LED顯示屏等,這類控制LED亮滅(閃爍),或者亮度漸變。

再次就是LED背光燈,像液晶背光燈、按鍵背光燈等,這種也是需要控制LED變化的。我之前做過有按鍵的項(xiàng)目,按鍵背光燈需要漸變、配合音效控制LED不同頻率閃爍,目的就是為了達(dá)到更好的體驗(yàn)效果。

最后,LED作為指示燈,電源指示燈、狀態(tài)指示燈,這種就和接近初學(xué)者的學(xué)習(xí)時(shí)的LED燈,但這種卻在項(xiàng)目中很常見。

拿狀態(tài)指示燈來說,一個(gè)項(xiàng)目的LED狀態(tài)指示燈可以直觀明了的指示設(shè)備的運(yùn)行狀態(tài),比如:運(yùn)行、故障、待機(jī)、死機(jī)等常見狀態(tài)。通過RGB,或者紅黃綠不同顏色LED組合,可以實(shí)現(xiàn)更多狀態(tài)的指示。

下面針對(duì)LED狀態(tài)燈,說幾點(diǎn)細(xì)節(jié)的內(nèi)容。

LED狀態(tài)燈實(shí)現(xiàn)

這里結(jié)合代碼為大家分享一些項(xiàng)目中常見的LED狀態(tài)燈的實(shí)現(xiàn)方法。

1.單色LED運(yùn)行狀態(tài)指示燈

通過閃爍(一亮一滅)指示設(shè)備運(yùn)行的狀態(tài)的指示燈,一個(gè)關(guān)鍵作用:設(shè)備有沒有死機(jī)

很多產(chǎn)品中都會(huì)用到,你買一個(gè)開發(fā)板,提供的綜合例程也基本都有。

裸機(jī)情況下(一般狀態(tài)機(jī)),在某一個(gè)狀態(tài)實(shí)現(xiàn)LED閃爍:

int main(void)
{
  //系統(tǒng)初始化
  while(1)
  {
    //do something
    switch(State)
    {
      case 狀態(tài)1:
        //do something
      break;

      case 狀態(tài)2:
        //do something
      break;
      ·
      ·
      ·
      case 狀態(tài)燈:
        ED_TOGGLE();  //LED閃爍
      break;
    }
  }
}

RTOS情況下,新建一個(gè)狀態(tài)燈線程,在線程里面直接控制即可:

void StatusLight_Task(void *pvParameters)
{
  static TickType_t xLastWakeTime;
  //初始化
  xLastWakeTime = xTaskGetTickCount();

  for(;;)
  {
    //do something

    LED_TOGGLE();                       //LED閃爍
    vTaskDelayUntil(&xLastWakeTime, 500);
  }
}

2.單色LED漸變

LED漸變?cè)谏钪衅鋵?shí)也有一些場(chǎng)景在用,呼吸燈、鍵盤等,其實(shí)原來也很簡(jiǎn)單,就是控制LED亮度。

控制方法有很多,電壓、PWM都能達(dá)到控制LED亮度的效果。當(dāng)然,現(xiàn)在還有控制LED漸變的專有芯片。

但是,對(duì)于單片機(jī)項(xiàng)目來說,單片機(jī)自身就能實(shí)現(xiàn),如果單獨(dú)用一個(gè)芯片,就顯得有點(diǎn)多余。

使用DAC輸出模擬量可以實(shí)現(xiàn),但如果多路就不現(xiàn)實(shí),因此這種方法不常見。

常見的是PWM控制IO高低電平(從而控制電壓),這種對(duì)于單片機(jī)來說有兩種方法:

  • 定時(shí)器硬件PWM
  • 控制GPIO口高低電平

a.定時(shí)器硬件PWM

一個(gè)定時(shí)器輸出PWM波形的同時(shí),還需要一個(gè)定時(shí)器定時(shí)更新PWM輸出占空比(修改亮度)。

b.控制GPIO口高低電平

這個(gè)方法就比較簡(jiǎn)單,控制IO口高低電平時(shí)間,只是這個(gè)時(shí)間需要結(jié)合整個(gè)項(xiàng)目業(yè)務(wù)邏輯(特別是裸機(jī)情況下),不能出現(xiàn)“卡機(jī)”情況。

當(dāng)然,在RTOS情況下,業(yè)務(wù)邏輯就比較簡(jiǎn)單,單獨(dú)一個(gè)線程:

LED_ON();
vTaskDelay(TimesON);

LED_OFF();
vTaskDelay(TimesOFF);

這里TimesON 和 TimesOFF是需要結(jié)合項(xiàng)目情況修改的變量(比如漸變時(shí)間)。

3.多色LED,多種運(yùn)行狀態(tài)

一個(gè)設(shè)備在沒有顯示屏指示狀態(tài)的時(shí)候,通過LED指示狀態(tài)也是一種方法,比如:紅、黃、綠三色,分別常滅、常亮、閃爍三種狀態(tài)。

這種相對(duì)第一種單色固定狀態(tài)要復(fù)雜一點(diǎn),但實(shí)現(xiàn)起來也不難,方法也有很多。

這里分享一些思路:創(chuàng)建一個(gè)線程,一個(gè)結(jié)構(gòu)體,輪詢各種LED狀態(tài),根據(jù)應(yīng)用修改其各種狀態(tài),以及閃爍時(shí)間等。

LED狀態(tài)結(jié)構(gòu)體:

typedef struct
{
  uint8_t  Mode;                  //模式

  uint8_t  Status;                //當(dāng)前狀態(tài)
  uint16_t OffTimes;              //滅時(shí)間
  uint16_t OnTimes;               //亮?xí)r間(ms)
  uint16_t Counter;               //計(jì)數(shù)(計(jì)時(shí))

  void (*OffFun)(void);           //滅函數(shù)接口
  void (*OnFun)(void);            //亮函數(shù)接口
}SL_TypeDef;
/* 狀態(tài)燈 */

LED狀態(tài)主線程:

void StatusLight_Task(void *pvParameters)
{
  static TickType_t xLastWakeTime;
  xLastWakeTime = xTaskGetTickCount();

  for(;;)
  {
    SL_Scan(&sSLG_Structure);      //紅燈
    SL_Scan(&sSLY_Structure);      //黃燈
    SL_Scan(&sSLR_Structure);      //綠燈

    vTaskDelayUntil(&xLastWakeTime, SL_TASK_PERIOD);
  }
}

這里結(jié)構(gòu)體也是方便統(tǒng)一管理,其中SL_Scan瀏覽(掃描)函數(shù)的參數(shù)通過傳遞結(jié)構(gòu)體指針,是為了方便讀取并修改其中變量。當(dāng)然,SL_Scan瀏覽函數(shù)具體實(shí)現(xiàn),就與你應(yīng)用有關(guān):

static void SL_Scan(SL_TypeDef *SL_Struct)
{
  /* 常滅模式 */
  if(SL_MODE_OFF == SL_Struct->Mode)
  {
    SL_Struct->Status = SL_STATUS_OFF;           //狀態(tài)置為"滅"
    SL_Struct->OffFun();                         //滅燈
  }
  /* 常亮模式 */
  else if(SL_MODE_ON == SL_Struct->Mode)
  {
    SL_Struct->Status = SL_STATUS_ON;            //狀態(tài)置為"亮"
    SL_Struct->OnFun();                          //亮燈
  }
  /* 閃爍模式 */
  else if(SL_MODE_FLICKER == SL_Struct->Mode)
  {
    /* 在滅狀態(tài) */
    if(SL_STATUS_OFF == SL_Struct->Status)
    {
      SL_Struct->Counter++;
      if(SL_Struct->Counter >= SL_Struct->OffTimes)
      {
        SL_Struct->Counter = 0;
        SL_Struct->OnFun();                      //亮燈
        SL_Struct->Status = SL_STATUS_ON;        //狀態(tài)置為"亮"
      }
    }
    /* 在亮狀態(tài) */
    else if(SL_STATUS_ON == SL_Struct->Status)
    {
      SL_Struct->Counter++;
      if(SL_Struct->Counter >= SL_Struct->OnTimes)
      {
        SL_Struct->Counter = 0;
        SL_Struct->OffFun();                     //滅燈
        SL_Struct->Status = SL_STATUS_OFF;       //狀態(tài)置為"滅"
      }
    }
    else
    {
      SL_Struct->Status = SL_STATUS_OFF;         //狀態(tài)置為"滅"
    }
  }
  /* 未知模式 */
  else
  {
    SL_Struct->Status = SL_STATUS_OFF;           //狀態(tài)置為"滅"
    SL_Struct->OffFun();                         //滅燈
  }
}

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 2
收藏 1
關(guān)注 211
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧