STM8S003F3通過(guò)PWM波實(shí)現(xiàn)三基色呼吸燈
掃描二維碼
隨時(shí)隨地手機(jī)看文章
前段時(shí)間使用STM8S003F3實(shí)現(xiàn)了一個(gè)三基色燈的各種效果,故寫一篇文章作為一個(gè)記錄。
1 綜述我們知道,要是的LED燈亮直接通電即可。而要改變燈的亮度,我們有兩種方法:改變電流和PWM調(diào)光。
我們首先想到的就是改變它的驅(qū)動(dòng)電流,因?yàn)長(zhǎng)ED的亮度是幾乎和它的電流直接成正比關(guān)系。然而用調(diào)正向電流的方法來(lái)調(diào)節(jié)亮度會(huì)產(chǎn)生一個(gè)問(wèn)題:在調(diào)亮度的同時(shí)也會(huì)改變它的光譜和色溫,這樣就會(huì)會(huì)產(chǎn)生色偏。因?yàn)槟壳鞍坠釲ED都是用藍(lán)光LED加黃色熒光粉而產(chǎn)生,當(dāng)正向電流減小時(shí),藍(lán)光LED亮度增加而黃色熒光粉的厚度并沒(méi)有按比例減薄,從而使其光譜的主波長(zhǎng)增長(zhǎng)。這個(gè)問(wèn)題對(duì)于一般的照明是沒(méi)有問(wèn)題的,因?yàn)樯珳氐淖兓慨吘共皇呛艽?。但是?duì)電源來(lái)說(shuō)當(dāng)電流過(guò)小時(shí)會(huì)產(chǎn)生閃爍,除非電源的恒流范圍很寬,完全可以從0到最大。這樣才沒(méi)有問(wèn)題。簡(jiǎn)而言之,電流調(diào)光有色溫變化和電源電流過(guò)小產(chǎn)生閃爍的問(wèn)題。曾經(jīng)做過(guò)一個(gè)項(xiàng)目,用于某設(shè)備上需要非常非常平穩(wěn)的調(diào)光,顯然電流調(diào)光是無(wú)法實(shí)現(xiàn)。同時(shí)像本文介紹的三基色調(diào)光有顏色要求的顯然也不行。因此我們使用PWM調(diào)光。
既然PWM調(diào)光可以避免上面的兩個(gè)問(wèn)題,為什么不直接都用PWM調(diào)光呢?因?yàn)槲覀儺吘故亲霎a(chǎn)品,要考慮成本問(wèn)題。使用PWM調(diào)光至少需要一顆能支持PWM的芯片(當(dāng)然還有外圍電路,但是電流調(diào)光也是有電路的。我們也應(yīng)該知道PWM信號(hào)也可以由脈沖發(fā)生器提供),另外它需要編寫程序。所以只有在需要的場(chǎng)合才使用PWM調(diào)光(使用PWM調(diào)光需要注意的問(wèn)題是頻率不能太低或者太高,推薦150-400Hz之間。)。PWM的優(yōu)點(diǎn)如下:
●PWM調(diào)光就不會(huì)產(chǎn)生色偏,因?yàn)樗偸枪ぷ髟?或者最大兩種狀態(tài)。
●PWM的占空比很好控制,而且精度高
●對(duì)電源沒(méi)有影響,因?yàn)椴粫?huì)改變電源的工作條件,只是給電源開(kāi)或者關(guān)。
脈寬調(diào)制(PWM)是利用微處理器的數(shù)字輸出來(lái)對(duì)模擬電路進(jìn)行控制的的技術(shù),廣泛應(yīng)用在從測(cè)量、通信到功率控制與變換及LED照明等許多領(lǐng)域中。通過(guò)以數(shù)字方式控制模擬電路,可以大幅度降低系統(tǒng)的成本和功耗。此外,許多微控制器和DSP已經(jīng)在芯片上包含了PWM控制器,這使數(shù)字控制的實(shí)現(xiàn)變得更加容易了。簡(jiǎn)言之,PWM是一種對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼的方法。通過(guò)高分辨率計(jì)數(shù)器的使用,方波的占空比被調(diào)制用來(lái)對(duì)一個(gè)具體模擬信號(hào)的電平進(jìn)行編碼。PWM信號(hào)仍然是數(shù)字的,因?yàn)樵诮o定的任何時(shí)刻,滿幅值的直流供電要么完全有(ON),要么完全無(wú)(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復(fù)脈沖序列被加到模擬負(fù)載上去的。通的時(shí)候即是直流供電被加到負(fù)載上的時(shí)候,斷的時(shí)候即是供電被斷開(kāi)的時(shí)候。只要帶寬足夠,任何模擬值都可以使用PWM進(jìn)行編碼。
首先我們需要了解占空比,占空比的解釋可以歸納為如下幾種:
●在一串理想的脈沖序列中(如方波),正脈沖的持續(xù)時(shí)間與脈沖總周期的比值。例如:脈沖寬度1μs,信號(hào)周期4μs的脈沖序列占空比為0.25。
●在一段連續(xù)工作時(shí)間內(nèi)脈沖占用的時(shí)間與總時(shí)間的比值。
●在周期型的現(xiàn)象中,現(xiàn)象發(fā)生的時(shí)間與總時(shí)間的比。
通俗一點(diǎn)講就是電路釋放能量的有效時(shí)間與總釋放時(shí)間的比。
然后我們需要了解調(diào)光比,調(diào)光比則是按下面的方法計(jì)算(Foper:工作頻率;Fpwm:調(diào)光頻率;):
調(diào)光比率 = Foper / Fpwm,(其實(shí)也就是調(diào)光的最低有效占空比)
比如Foper=100KHZ;Fpwm=200Hz,則調(diào)光比為:100K/200=500;這個(gè)指標(biāo)在很多驅(qū)動(dòng)芯片的規(guī)格書里會(huì)說(shuō)明的。
● 若一個(gè)占空比為10%的PWM輸出,即10%的時(shí)間通,90%的時(shí)間斷;
● 若一個(gè)占空比為50%的PWM輸出,即50%的時(shí)間通,50%的時(shí)間斷;
● 若一個(gè)占空比為90%的PWM輸出,即90%的時(shí)間通,10%的時(shí)間斷;
我們知道,人眼是有視覺(jué)暫留的,打個(gè)比方,人眼只能識(shí)別1us((這個(gè)比方?jīng)]有任何科學(xué)依據(jù),僅僅為了便于理解)內(nèi)光子的數(shù)量從而判斷亮暗,如果1us接收了1000個(gè)光子,那么我們就會(huì)認(rèn)為是一個(gè)亮度,至于這1000個(gè)光子是在1us什么時(shí)候收到,是沒(méi)有任何影響的,也就是說(shuō),在0.1us的時(shí)候收到和0.2us的時(shí)候收到是沒(méi)有區(qū)別的,我們需要關(guān)心的只是數(shù)量。這就是為什么我們進(jìn)行PWM調(diào)光的時(shí)候不能太慢(視覺(jué)暫留可以分辨)也不能太快(太快就沒(méi)有區(qū)別了,就一直是最亮的)。這樣就好理解了,占空比是10%,就相當(dāng)于給它加了一個(gè)0.9V的電壓(因?yàn)?0%通電時(shí)間里電流產(chǎn)生的效果和0.9V加在周內(nèi)的時(shí)候是一樣的)。所以我們就可以通過(guò)占空比來(lái)?xiàng)l件亮度。
如果在50ms中,LED在這段時(shí)間中得到9V供電。如果在下一個(gè)50ms中將開(kāi)關(guān)斷開(kāi),燈泡得到的供電將為0V。如果在1秒鐘內(nèi)將此過(guò)程重復(fù)10次,燈泡將會(huì)點(diǎn)亮并象連接到了一個(gè)4.5V電池(9V的50%)上一樣。這種情況下,占空比為50%,調(diào)制頻率為10Hz(T=1/f = 1/10 = 0.1S )。大多數(shù)負(fù)載(無(wú)論是電感性負(fù)載還是電容性負(fù)載)需要的調(diào)制頻率高于10Hz。設(shè)想一下如果燈泡先接通5秒再斷開(kāi)5秒,然后再接通、再斷開(kāi)……。占空比仍然是50%,但燈泡在頭5秒鐘內(nèi)將點(diǎn)亮,在下一個(gè)5秒鐘內(nèi)將熄滅。要讓燈泡取得4.5V電壓的供電效果,通斷循環(huán)周期與負(fù)載對(duì)開(kāi)關(guān)狀態(tài)變化的響應(yīng)時(shí)間相比必須足夠短。要想取得調(diào)光燈(但保持點(diǎn)亮)的效果,必須提高調(diào)制頻率。在其他PWM應(yīng)用場(chǎng)合也有同樣的要求。通常調(diào)制頻率為1kHz到200kHz之間。
通過(guò)上面的介紹,我們就知道了PWM調(diào)光的原理,那么我們來(lái)看看我們這個(gè)項(xiàng)目的原理。
2.3.2 三基色呼吸燈原理需求說(shuō)明:我們需要設(shè)置一個(gè)燈,它具有常亮、長(zhǎng)暗、快閃、慢閃、呼吸5鐘效果,并且要求這幾種狀態(tài)是可以變化的。燈的顏色可以變化。
需求分析:燈的顏色可以變化——確定使用三基色燈。狀態(tài)可以切換,我們使用串口調(diào)節(jié)燈的狀態(tài)和燈的顏色(通過(guò)串口給單片機(jī)發(fā)送數(shù)據(jù),然后將參數(shù)傳給燈控制函數(shù))。我們使用PWM調(diào)節(jié)燈的亮度,通過(guò)改變捕獲/比較寄存器的值來(lái)改變占空比從而改變亮度。
數(shù)學(xué)建模:三個(gè)燈和一個(gè)燈的控制是一樣的,由于我們使用的是PWM波調(diào)光所以燈只有兩種狀態(tài):斷和通。我們分析5種狀態(tài)可以抽象成數(shù)學(xué)模型:暗、上升、亮、下降4鐘狀態(tài)(長(zhǎng)暗就是一直暗,常亮就是一直亮,快閃就是100%占空比而且頻率比較快,慢閃就是100%占空比而且頻率比較慢、呼吸就是占空比最低為10%然后以10%逐漸上升)。然后我們確定需要輸入的變量:Value_LED_Red(紅色燈的亮度)、Value_LED_Green(綠色燈的亮度)、Value_LED_Blue(藍(lán)燈的亮度)、Value_ChangeOnce(上升或下降的速度)、HoldTime_Min(在低電平狀態(tài)的持續(xù)時(shí)間)、HoldTime_Max(在高電平狀態(tài)的持續(xù)時(shí)間)。
3 實(shí)現(xiàn)過(guò)程下面是TSSOP20封裝的管腳圖。
首先,我們要確定硬件管腳,但是事實(shí)上,因?yàn)槲矣玫淖疃嗟木褪荰IM2和TIM4,因此我選用的TIM2_1(PC5,Red)、TIM2_2(PD3,Green)、TIM2_3(PD2,Blue),但是發(fā)現(xiàn)除了綠色以外都無(wú)法用PWM波控制,但是能用IO控制亮暗,后來(lái)查資料發(fā)現(xiàn)TIM2_1和TIM2_3早使用的時(shí)候必須給存儲(chǔ)器地址分布重映射,也就是我們需要使用管腳的復(fù)用功能!我們通過(guò)看《數(shù)據(jù)手冊(cè)》發(fā)現(xiàn),使用TIM2只有一個(gè)管腳是復(fù)用功能,因此選擇TIM2。但是我因?yàn)殡娐废拗?,所以還是用的上面所說(shuō)的管腳(注意,TIM2_3有復(fù)用和不復(fù)用兩種,我用的是復(fù)用)。這也沒(méi)有什么影響,我們可以學(xué)習(xí)一下管腳的復(fù)用功能。
3.1 使用復(fù)用功能我們首先看《數(shù)據(jù)手冊(cè)》中關(guān)于管腳的描述(第一行是TSSOP20封裝的管腳編號(hào),第二行是UFQFPN20封裝的管腳b)
從上面的圖中我們可以看到,需要使用15、19管腳復(fù)用功能就需要設(shè)置AFR0和AFR1——使用復(fù)用功能就是設(shè)置AFR(Alternate function remapping bits,候補(bǔ)功能映射位)——我們繼續(xù)看芯片資料
其中OPT2【選項(xiàng)字節(jié)(Option byte)編程 】和NOPT2需要是相反的(可能是出于校驗(yàn)考慮),我們從《數(shù)據(jù)手冊(cè)》中可以知道: 應(yīng)用程序可直接向目標(biāo)地址進(jìn)行寫操作。所以我們直接對(duì)這兩個(gè)地址進(jìn)行寫操作,那么數(shù)值是多少呢?我們繼續(xù)看《數(shù)據(jù)手冊(cè)》,如下圖所示
從上圖中我們可以看到,我們將AFR1設(shè)置為1,將AFR0設(shè)置成1。代碼如下:
/***************************************************************
*Function:FLASH_Init
*Calls:void
*CalledBy:All_Config.c
*Input:void
*OUTPUT:void
*Return:void
*DESCRIPTION:1.設(shè)置管腳復(fù)用功能(AFR0要設(shè)置為1AFR1要設(shè)置為1)
2.eeprom每一次只能操作一個(gè)字節(jié)
*Others:nothing
***************************************************************/
volatile unsigned char flash_OPT2 @0x4803;