實驗(五)RGB LED控制

History Key

  • New content
  • Removed content

Recent Versions

Choose two versions to compare, or click the link to view it.

  1. 7. over 3 years by fellong
  2. 6. over 3 years by fellong
  3. 5. over 3 years by fellong
  4. 4. over 3 years by fellong
  5. 3. over 3 years by fellong
  6. 2. over 3 years by fellong
  7. 1. over 3 years by fellong
 

(教學教材內容保留所有版權~欲轉載請註明出處~謝謝)

實驗(五) RGB LED控制單元

實驗目的:

本節在實現RGB LED控制單元模組。

實驗0:

PWM控制一顆RGB LED 藍、紅、綠變色。

實驗一:

PWM控制分別控制藍1、紅2、綠3的亮度,3顆LED亮度自動漸暗、漸亮。

實驗二:

按下飛梭編碼器開關,RGB LED ON,再按一下則OFF,編碼器每動作一次,LED則變色一次,順序為RGB、R、G、B、 RG、RB、GB

實驗三:

三顆RGB LED同時進行自動漸層混色

I/O腳位定義:

///                                         LED_R            equ  pd.4;
///                                         LED_G            equ  pd.5;
///                                         LED_B            equ  pd.3;

模組函式規畫:

/// ======== START Public 函式 ========
                                                /// RGB duty = 0 (全關) ~ 255 (全開)
void Initial_RGB( void );         /// 初始化 IO
void RGB_Control( void );      /// PWM Duty Loop 255 steps,每叫用一次代表一個step
void RGB_SetR( void );           /// 傳入參數 a, 將 RGB R duty 設成 a
void RGB_SetG( void );          /// 傳入參數 a, 將 RGB G duty 設成 a
void RGB_SetB( void );           /// 傳入參數 a, 將 RGB B duty 設成 a
/// ======== END Public 函式 ========

模組函式設計:

操作函式設計:

上列的函式規畫是一顆RGB LED的控制,至於三顆LED的控制,底下講解完便會暸解它是非常容易擴充的。

RGB LED的控制方式其實就是PWM訊號的基本控制方式,在其它MCU如PIC都有現成的PWM模組可供使用,但是拿來作RGB LED控制卻又不是那麼適用,因為他需要三個PWM輸出,實驗平台上更高達九個PWM輸出才能同時控制三顆RGB LED燈,因此,使用軟體的方式來產生PWM訊號是比較可行的方式,當然,這樣的PWM訊號頻率一定會比較慢(因為要同時處理多組訊號),所以本範例也是使用軟體的方式來實現。

當然,若是使用FPPA,在核心數量許可的情況之下,你也可以使用3+1個核心來達到更高速的PWM訊號控制,更簡易的DUTY控制方式。

回歸主題,控制函式要如何實現?

控制函式的實作:

void RGB_Control( void )                             /// PWM Duty Loop

{

           if( rgb_duty_count == 0 )

           {

                     if( pwmR > 0 )

                                LED_R = 1;

                     if( pwmG > 0 )

                                LED_G = 1;

                     if( pwmB > 0 )

                                LED_B = 1;

           } else

           {

                     if( pwmR <= rgb_duty_count )

                                LED_R = 0;

                      if( pwmG <= rgb_duty_count )

                                LED_G = 0;

                     if( pwmB <= rgb_duty_count )

                                LED_B = 0;

           }

           rgb_duty_count++;

           if( rgb_duty_count == 255 )

                     rgb_duty_count = 0;

}

正如同七字節的掃描原理一樣,我們使用一個計數器來作DUTY的計算,控制函式只要負責判斷LED何時應該打開(當DUTY大於0時)、何時應該關閉(當DUTY小於計數時)即可,就是這麼簡單,而且可以無限擴充你要控制的腳位數(當然,這會影響到整個掃描頻率),三顆RGB LED甚至更多。

實驗實作:

實驗0:

PWM控制一顆RGB LED 藍、紅、綠變色。

如同以往一樣,我們用一個核心作RGB LED的PWM輸出控制,也就是負責調用RGB_Control()函式,用另一個核心來作R、G、B三個PWM訊號的DUTY控制,至此應該很習慣用這種模式來善用FPPA多核的特性了。

void   FPPA0 (void)

{

           /// 初使化...略

           while (1)

           {         /// RGB PWM 控制 LOOP

                     RGB_Control();

           }

}..................略。

 

void   FPPA1 (void)

{

           while(1)

           {         /// RGB DUTY 控制 LOOP

                     while( bright < 255 )

                     {

                                a = bright;

                                RGB_SetR();

                                a = 10;

                                DelayMS();

                                bright++;

                     }

                     while( bright > 0 )

                     {

                                a = bright;

                                RGB_SetR();

                                a = 10;

                                DelayMS();

                                bright--;

                     }

                     /// 控制其它顏色...略

           }

}

實驗一:

PWM控制分別控制藍1、紅2、綠3的亮度,3顆LED亮度自動漸暗、漸亮。

將原單顆RGB LED模組擴充成三顆,略。

實驗二:

按下飛梭編碼器開關,RGB LED ON,再按一下則OFF,編碼器每動作一次,LED則變色一次,順序為RGB、R、G、B、 RG、RB、GB

再整合進不同的輸入模組,略。

實驗三:

三顆RGB LED同時進行自動漸層混色。

這個實驗我們強化了原來的RGB模組,加入了漸層變色的功能,原來模組在設定好DUTY後,控制函式在下一個週期變會反應出來(也就是會馬上變色),在這邊我們加入了軟性控制DUTY變化的功能,操作者可以設定一個TARGET DUTY,模組也多了另一個RGB_SoftControl()的控制函式可供系統調用,每次的調用都會讓目前的DUTY(顏色)更趨進於操作者所設定的TARGET DUTY而達到光線柔和變化的功能。

程式如下(三顆同時控制):

void RGB_SoftControl( void )                      /// PWM Soft Control Loop

{

           if( pwmR1 < targetR1 )

                     pwmR1++;

           else if( pwmR1 > targetR1 )

                     pwmR1--;

           if( pwmG1 < targetG1 )

                     pwmG1++;

           else if( pwmG1 > targetG1 )

                     pwmG1--;

           if( pwmB1 < targetB1 )

                     pwmB1++;

           else if( pwmB1 > targetB1 )

                     pwmB1--;

           /// 其它LED燈的漸變控制...略

           if( pwmR1 == targetR1 && pwmG1 == targetG1 && pwmB1 == targetB1

            && pwmR2 == targetR2 && pwmG2 == targetG2 && pwmB2 == targetB2

            && pwmR3 == targetR3 && pwmG3 == targetG3 && pwmB3 == targetB3 )

                     a = 1;            /// 判斷DUTY均己到達指定的顏色

           else

                     a = 0;

}