實驗(五)RGB LED控制
History Key
- New content
Removed content
Recent Versions
Choose two versions to compare, or click the link to view it.
(教學教材內容保留所有版權~欲轉載請註明出處~謝謝)
實驗(五) 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;
}