




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、STM8S003F3 通過 PWM 波實現(xiàn)三基色呼吸燈前段時間使用 STM8S003F3 實現(xiàn)了一個三基色燈的各種效果,故寫一篇文章作 為一個記錄1 綜述我們知道,要是的 LED 燈亮直接通電即可。而要改變燈的亮度,我們有兩種方 法:改變電流和 PWM 調(diào)光。我們首先想到的就是改變它的驅(qū)動電流,因為 LED 的亮度是幾乎和它的電流直 接成正比關(guān)系。 然而用調(diào)正向電流的方法來調(diào)節(jié)亮度會產(chǎn)生一個問題: 在調(diào)亮度 的同時也會改變它的光譜和色溫,這樣就會會產(chǎn)生色偏。因為目前白光 LED 都 是用藍光 LED加黃色熒光粉而產(chǎn)生,當正向電流減小時,藍光 LED 亮度增加而 黃色熒光粉的厚度并沒有按比例減薄
2、, 從而使其光譜的主波長增長。 這個問題對 于一般的照明是沒有問題的, 因為色溫的變化量畢竟不是很大。 但是對電源來說 當電流過小時會產(chǎn)生閃爍, 除非電源的恒流范圍很寬, 完全可以從 0 到最大。這 樣才沒有問題。簡而言之,電流調(diào)光有色溫變化和電源電流過小產(chǎn)生閃爍的問題。 曾經(jīng)做過一個項目, 用于某設(shè)備上需要非常非常平穩(wěn)的調(diào)光, 顯然電流調(diào)光是無 法實現(xiàn)。同時像本文介紹的三基色調(diào)光有顏色要求的顯然也不行。 因此我們使用 PWM 調(diào)光。既然 PWM 調(diào)光可以避免上面的兩個問題,為什么不直接都用 PWM 調(diào)光呢? 因為我們畢竟是做產(chǎn)品, 要考慮成本問題。 使用 PWM 調(diào)光至少需要一顆能支持 PW
3、M 的芯片(當然還有外圍電路,但是電流調(diào)光也是有電路的。我們也應(yīng)該知 道 PWM 信號也可以由脈沖發(fā)生器提供) ,另外它需要編寫程序。 所以只有在需 要的場合才使用 PWM 調(diào)光(使用 PWM 調(diào)光需要注意的問題是頻率不能太低 或者太高,推薦 150-400Hz 之間。)。 PWM 的優(yōu)點如下: PWM 調(diào)光就不會產(chǎn)生色偏,因為它總是工作在 0 或者最大兩種狀態(tài)。 PWM 的占空比很好控制,而且精度高 對電源沒有影響,因為不會改變電源的工作條件,只是給電源開或者關(guān)。2 PWM 波調(diào)光的原理脈寬調(diào)制 (PWM) 是利用微處理器的數(shù)字輸出來對模擬電路進行控制的的技術(shù), 廣泛應(yīng)用在從測量、通信到功率
4、控制與變換及 LED 照明等許多領(lǐng)域中。通過以 數(shù)字方式控制模擬電路, 可以大幅度降低系統(tǒng)的成本和功耗。 此外,許多微控制 器和 DSP 已經(jīng)在芯片上包含了 PWM 控制器,這使數(shù)字控制的實現(xiàn)變得更加容 易了。簡言之, PWM 是一種對模擬信號電平進行數(shù)字編碼的方法。通過高分辨 率計數(shù)器的使用,方波的占空比被調(diào)制用來對一個具體模擬信號的電平進行編碼。 PWM 信號仍然是數(shù)字的,因為在給定的任何時刻,滿幅值的直流供電要么完全 有(ON) ,要么完全無 (OFF)。電壓或電流源是以一種通 (ON) 或斷(OFF)的重復(fù)脈 沖序列被加到模擬負載上去的。 通的時候即是直流供電被加到負載上的時候, 斷
5、的時候即是供電被斷開的時候。 只要帶寬足夠, 任何模擬值都可以使用 PWM 進 行編碼。2.1 占空比( Duty Cycle or Duty Ratio ) 首先我們需要了解占空比,占空比的解釋可以歸納為如下幾種: 在一串理想的脈沖序列中 (如方波),正脈沖的持續(xù)時間與脈沖總周期的比值。 例如:脈沖寬度 1s,信號周期 4s的脈沖序列占空比為 0.25 。在一段連續(xù)工作時間內(nèi)脈沖占用的時間與總時間的比值在周期型的現(xiàn)象中,現(xiàn)象發(fā)生的時間與總時間的比 通俗一點講就是電路釋放能量的有效時間與總釋放時間的比。2.2 調(diào)光比然后我們需要了解調(diào)光比,調(diào)光比則是按下面的方法計算( Foper :工作頻率;
6、Fpwm :調(diào)光頻率;):調(diào)光比率 = Foper / Fpwm ,(其實也就是調(diào)光的最低有效占空比)比如 Foper=100KHZ ;Fpwm=200Hz, 則調(diào)光比為: 100K/200=500 ;這個指 標在很多驅(qū)動芯片的規(guī)格書里會說明的。2.3 PWM 調(diào)光2.3.1 PWM 調(diào)光原理 若一個占空比為 10%的 PWM 輸出,即 10%的時間通, 90%的時間斷; 若一個占空比為 50%的 PWM 輸出,即 50%的時間通, 50%的時間斷; 若一個占空比為 90%的 PWM 輸出,即 90%的時間通, 10%的時間斷; 我們知道,人眼是有視覺暫留的,打個比方,人眼只能識別1us( (
7、這個比方?jīng)]有任何科學(xué)依據(jù),僅僅為了便于理解)內(nèi)光子的數(shù)量從而判斷亮暗,如果 1us 接收了 1000 個光子,那么我們就會認為是一個亮度,至于這 1000 個光子是在 1us 什么時候收到,是沒有任何影響的,也就是說,在 0.1us 的時候收到和 0.2us的時候收到是沒有區(qū)別的,我們需要關(guān)心的只是數(shù)量。這就是為什么我們進行 PWM 調(diào)光的時候不能太慢(視覺暫留可以分辨)也不能太快(太快就沒有區(qū)別 了,就一直是最亮的)。這樣就好理解了,占空比是 10% ,就相當于給它加了 一個 0.9V 的電壓(因為 10%通電時間里電流產(chǎn)生的效果和 0.9V 加在周內(nèi)的時 候是一樣的)。所以我們就可以通過占
8、空比來條件亮度如果在 50ms 中,LED 在這段時間中得到 9V 供電。如果在下一個 50ms 中將開 關(guān)斷開,燈泡得到的供電將為 0V 。如果在 1 秒鐘內(nèi)將此過程重復(fù) 10 次,燈泡 將會點亮并象連接到了一個 4.5V 電池(9V 的 50%)上一樣。這種情況下,占空比 為 50% ,調(diào)制頻率為 10Hz ( T=1/f = 1/10 = 0.1S )。大多數(shù)負載 (無論是電 感性負載還是電容性負載 )需要的調(diào)制頻率高于 10Hz 。設(shè)想一下如果燈泡先接通 5 秒再斷開 5 秒,然后再接通、再斷開 。占空比仍然是 50% ,但燈泡在頭 5 秒鐘內(nèi)將點亮,在下一個 5 秒鐘內(nèi)將熄滅。要讓燈
9、泡取得 4.5V 電壓的供電效果, 通斷循環(huán)周期與負載對開關(guān)狀態(tài)變化的響應(yīng)時間相比必須足夠短。 要想取得調(diào)光 燈 (但保持點亮 )的效果,必須提高調(diào)制頻率。在其他 PWM 應(yīng)用場合也有同樣的 要求。通常調(diào)制頻率為 1kHz 到 200kHz 之間。通過上面的介紹, 我們就知道了 PWM 調(diào)光的原理,那么我們來看看我們這個項 目的原理。2.3.2 三基色呼吸燈原理 需求說明:我們需要設(shè)置一個燈,它具有常亮、長暗、快閃、慢閃、呼吸 5 鐘效 果,并且要求這幾種狀態(tài)是可以變化的。燈的顏色可以變化。需求分析:燈的顏色可以變化 確定使用三基色燈。狀態(tài)可以切換,我們使 用串口調(diào)節(jié)燈的狀態(tài)和燈的顏色 (通過
10、串口給單片機發(fā)送數(shù)據(jù), 然后將參數(shù)傳給 燈控制函數(shù))。我們使用 PWM 調(diào)節(jié)燈的亮度,通過改變捕獲 / 比較寄存器的值 來改變占空比從而改變亮度。數(shù)學(xué)建模: 三個燈和一個燈的控制是一樣的, 由于我們使用的是 PWM 波調(diào)光所 以燈只有兩種狀態(tài):斷和通。我們分析 5 種狀態(tài)可以抽象成數(shù)學(xué)模型: 暗、上升、 亮、下降 4 鐘狀態(tài)(長暗就是一直暗,常亮就是一直亮,快閃就是 100% 占空比 而且頻率比較快, 慢閃就是 100% 占空比而且頻率比較慢、 呼吸就是占空比最低 為 10% 然后以 10% 逐漸上升)。然后我們確定需要輸入的變量: Value_LED_Red (紅色燈的亮度) 、Value_
11、LED_Green (綠色燈的亮度) 、Value_LED_Blue (藍 燈的亮度)、 Value_ChangeOnce (上升或下降的速度)、 HoldTime_Min (在 低電平狀態(tài)的持續(xù)時間)、 HoldTime_Max (在高電平狀態(tài)的持續(xù)時間)。3 實現(xiàn)過程下面是 TSSOP20 封裝的管腳圖首先,我們要確定硬件管腳,但是事實上,因為我用的最多的就是 TIM2 和 TIM4 , 因此我選用的 TIM2_1(PC5,Red)、TIM2_2(PD3,Green )、TIM2_3(PD2, Blue ),但是發(fā)現(xiàn)除了綠色以外都無法用 PWM 波控制,但是能用 IO 控制亮暗, 后來查資
12、料發(fā)現(xiàn) TIM2_1 和 TIM2_3 早使用的時候必須給存儲器地址分布重映射, 也就是我們需要使用管腳的復(fù)用功能! 我們通過看數(shù)據(jù)手冊 發(fā)現(xiàn),使用 TIM2只有一個管腳是復(fù)用功能,因此選擇 TIM2 。但是我因為電路限制,所以還是用的上面所說的管腳(注意, TIM2_3 有復(fù)用和不復(fù)用兩種,我用的是復(fù)用)。這 也沒有什么影響,我們可以學(xué)習(xí)一下管腳的復(fù)用功能。3.1 使用復(fù)用功能我們首先看數(shù)據(jù)手冊中關(guān)于管腳的描述(第一行是 TSSOP20 封裝的管腳編號,第二行是 UFQFPN20 封裝的管腳 b )從上面的圖中我們可以看到,需要使用 15、 19 管腳復(fù)用功能就需要設(shè)置 AFR0和 AFR1
13、 使用復(fù)用功能就是設(shè)置 AFR( Alternate function remapping bits出于校驗考慮),我們從數(shù)據(jù)手冊中可以知道:應(yīng)用程序可直接向目標地候補功能映射位) 我們繼續(xù)看芯片資料其中 OPT2 【選項字節(jié) (Option byte) 編程 】和 NOPT2 需要是相反的(可能是址進行寫操作。 所以我們直接對這兩個地址進行寫操作, 那么數(shù)值是多少呢?我們繼續(xù)看數(shù)據(jù)手冊,如下圖所示從上圖中我們可以看到, 我們將 AFR1 設(shè)置為 1,將 AFR0 設(shè)置成 1 。代碼如下:cpp view plain copy1./*2.*Function: FLASH_Init3.*Call
14、s: void4.*Called By: All_Config.c5.*Input: void6.*OUTPUT: void7.*Return: void8.*DESCRIPTION: 1.設(shè)置管腳復(fù)用功能( AFR0 要設(shè)置為 1 AFR1 要設(shè)置為 1)9.2.eeprom每一次只能操作一個字節(jié)10.*Others: nothing11.*/12.volatile unsignedchar flash_OPT2 0x4803;13.volatile unsignedchar flash_NOPT2 0x4804;14.#define FLASH_EOP0X04 /FLASH_IAPSR 中
15、位,編程是否結(jié)束15.#define FLASH_DUL0X08 /flash data eeprom是否解鎖標志位16.void FLASH_Init()17.18./ 第一步 初始化 EEPROM19.while ( (FLASH-IAPSR & FLASH_DUL) = 0X00 )20.21.FLASH-DUKR = 0XAE;/ 中文資料上 說的和 實際是相反的22.FLASH-DUKR = 0X56;23._asm( NOP );24.25.26./ 第二步 對 OPT進行編程,首先需要如下操作:開啟opt 編程27.FLASH-CR2 |= 0X80;/OPT = 128.FLA
16、SH-NCR2 &= 0X7F;/NOPT = 029.30./ 第三步 修改內(nèi)存31./*32.1. 修改參數(shù),啟用復(fù)用功能33.2.OPT2和 NOPT2 要相反34.*/35./ 修改 OPT236.flash_OPT2 = 0X03;/ 0000 001137._asm( NOP);38.while ( (FLASH-IAPSR & FLASH_EOP) = 0 );/等待操作完成39./ 修改 NOPT240.flash_NOPT2 = flash_OPT2;41._asm( NOP);42.while ( (FLASH-IAPSR & FLASH_EOP) = 0 );/等待操作完
17、成43.44./ 第四步 對 OPT進行編程,最后需要如下操作:禁用opt 編程45.FLASH-CR2 &= 0X80;/OPT = 146.FLASH-NCR2 |= 0X80;/NOPT = 047.這樣,我們就完成了復(fù)用功能的 “存儲器地址分布重映射 ”。3.2 初始化定時器我們使用 TIM2 產(chǎn)生 PWM 波來控制三基色燈, 所以,我們需要對 TIM2 進行初 始化3.2.1 使能設(shè)置首先無論使用什么,第一步就是使能,在數(shù)據(jù)手冊的時鐘控制中我們看到如下信息:我們就可以確定使能 TIM2 的代碼:CLK-PCKENR1 |= CLK_PCKENR1_TIM2;3.2.2 設(shè)置頻率然后,
18、TIM2 的主頻(決定著周期)是和單片機一樣的 (這個頻率由時鐘控制) 我們可以進行分頻(分頻越多我們調(diào)節(jié)的就越精細),我們在數(shù)據(jù)手冊 “預(yù)分頻器高 8 位”和“預(yù)分頻器低 8 位”中可以看到:我們就可以確定分頻代碼:TIM2- PSCR = 5; 其中上圖所描述的更新事件我們這里就是計數(shù)器清 03.2.3 選擇 PWM 波我們查看數(shù)據(jù)手冊的 17.5.7 PWM 模式 可以看到,脈沖寬度調(diào)制 (PWM) 模式可以產(chǎn)生一個由 TIM1_ARR 寄存器確定頻率、 由 TIM1_CCRi 寄存器確定占 空比的信號。 PWM 模式是捕獲 /比較模式寄存器 1(TIM1_CCMR1) 來控制的, 我們
19、選擇 PWM 模式 2、開啟 TIM1_CCR1 寄存器的預(yù)裝載功能、 CC1 通道被配 置為輸出(其余不變),我們可以從數(shù)據(jù)手冊中看到:17.7.9捕獲/比較模式寄存器1(TIM1_CCMR1)地址偏移值:0x08復(fù)位值:0x00通道可用于輸入(捕獲模式)或輸出(比較模式),通道的方向由相應(yīng)的CC1S位: 它位的作用在輸入和輸出模式下不同。OCxx描述了通道在輸出模式下的功能 在輸入模式下的功能。因此必須注意.同一個位在輸出模式和輸入模式下的功輸出模式t65“_lp:4 1)1(32 10C1CE 1OC1M:2;O1OC1PE1OC1FE |rwrwrvrwrrYVrOC1CE:輸出比較1
20、清零使能該位用于使能使用TIM1_TRIG引逛上的外部事件來渣通道1的輸出信號(OC 17.5.9在外部事件發(fā)生奇清除OCREF信號0: OC1REF不受ETRF輸入(來自TIM1_TRIG引疸)的影響:1: 一旦檢測到ETRF輸入高電平,OC1REF=Oe位6:40C1M2:0輸出比較1模式該3位定義了輸出參考信號0C1REF的動作.而0C1REF決定了0C1的值.0C1REF是高 有效,而0C1的有效電平戰(zhàn)決于CC1P位。000:凍結(jié)=輸出比較寄存器TIM1_CCR1與計數(shù)器TIM1_CNT間的比較對OC1REF不起f 001:匹配吋設(shè)置通道1的輸出為有效電平.當計數(shù)器TIM1_CNT的值
21、與捕獲/比較奇存器, (TIM1_CCR1)相同時,強制OC1REF為高,010;匹配時設(shè)置通道1的輸出為無效電平。當計澈器TIM1_CNT的值與捕獲/比較寄存器 (TIM1_CCR1)相同時,強制OC1REF為低.011:胡轉(zhuǎn).當TIM1_CCR1=TIM1_CNT吋,胡轉(zhuǎn)OC1REF的電平.100:強制為無效電平強制OC1REF為低.101:強制為有效電平。強ftJOCIREF為高。110: PWM模式1 一在向上計數(shù)時,一旦TIM1_CNTTIM1_CCR1時通道1為無效電平(OC1RE: 否則為有效電平(OC1REF=1).111: PWM模式2在向上計數(shù)吋,一旦TIM1_CNTTIM
22、1_CCRijPt通道1為有效屯平.否則為 電平http:. ,blog csdn. not/注仆一旦LOCK級別設(shè)為3(TIW_BKR舒存器中的LOCK位併且CC1S二00(該通道配置威 則該位不能被修改。注厶 在PWM模式1或PWM棋式2中.E有當比較結(jié)果改變了或在輸出比較棋式中從凍結(jié) 切換到PWM模式時.OC1REF電平才改變.(參考17.5.7PWM模式)注3*在有互補輸岀的通道上 這些位杲預(yù)裝載的。如果TIM1_CR2寄存器的CCPC=1,( 位只有在COM事件發(fā)生吋,才從預(yù)裝載位取新值.OC1PE,輸出比較1預(yù)裝栽使能0:禁止TIM1_CCR1存器的預(yù)裝載功能.可隨吋寫入TIM1_
23、CCR1 CCMR1 = 0X68;3.2.4 設(shè)置 PWM 波的頻率在參考手冊中可以看到,在 PWM 模式(模式1或模式 2)下,TIM1_CNT 和 TIM1_CCRi 始終在進行比較:a. (依據(jù)計數(shù)器的計數(shù)方向)以確定是否符合 TIM1_CCRi TIM1_CNT或者 TIM1_CNT TIM1_CCR(i 我們在 TIM1_CR1 中設(shè)置為向上計數(shù)、 邊沿對齊模式)b. 根據(jù) TIM1_CR1 寄存器中 CMS 位域的狀態(tài),定時器能夠產(chǎn)生邊沿對齊的 PWM 信號或中央對齊的 PWM 信號。我們查看數(shù)據(jù)手冊發(fā)現(xiàn)(可以參見17.3.4 向上計數(shù)模式 ):我們?yōu)榱苏{(diào)光的均勻,將使得 TIM
24、2_ARR=255 ,根據(jù)上圖,我們可以知道,最 亮為 255 ,最暗為 0.255 就是 PWM 波的頻率(因為 TIM1 和 TIMX 的 PWM功能是相同資料互用的,因此上圖為 TIM1 的資料)。3.2.5 初始化 PWM 波的亮度根據(jù)上面的內(nèi)容我們知道占空比(也就是亮度)是 TIM2_CCR 決定的,我們初 始化為零: TIM2- CCR1H = 0;TIM2- CCR1L = 0;3.2.6 計數(shù)器使能、捕獲比較寄存器使能關(guān)于這兩個使能我們可以自己查詢 數(shù)據(jù)手冊 ,需要提一點的是 TIMx_CCER1控制 比較/捕獲寄存器 1和比較/捕獲寄存器 2。TIMx_CCER2 控制 比較
25、/捕獲 寄存器 3 。3.2.7 TIM2 產(chǎn)生 PWM 波的初始化程序具體代碼如下:cpp view plain copy1.2. *Function: TIM2_InitPwmCtrl3. *Calls: void4. *Called By: All_Config.c5. *Input: void6. *OUTPUT: void7. *Return: void8. *DESCRIPTION: 1. 初始化與 PWM相關(guān)的 TIM29. 2.TIMx_CCER1控制 比較/ 捕獲寄存器 1 和10. 比較/ 捕獲寄存器 211. 3.TIMx_CCER1控制 比較/ 捕獲寄存器 312. *
26、Others: nothing14. void TIM2_InitPwmCtrl()15. 16. CLK-PCKENR1 |= CLK_PCKENR1_TIM2; /TIM2 使能3./*1. 預(yù)分頻器2. 設(shè)置定時器的時鐘(根據(jù)已經(jīng)分頻的主時鐘來分頻)3. 分頻系數(shù)越大,周期越大,也就是頻率越低4. 分頻系數(shù) 1 215, 如果為 5就是 32 分頻(原來為 16MHZ)24. TIM2- PSCR = 5;25.26. / 選擇 TIM2 通道 1 的工作模式( PWM2波的模式)27. TIM2- CCMR1 = 0X68; /0110 10002
27、8. TIM2- CCMR2 = 0X68;29. TIM2- CCMR3 = 0X68;30.31. /* *32. 1. 自動裝載寄存器 (分高低位 也就是 16 位寄存器)33. 2. (每次就是上面分頻后的時間,假設(shè)分頻后是 2us ),每 2us 復(fù)位一次7.定時器 2, 也就是說計數(shù)器每變化一次耗時 2us,0 到 255 經(jīng)過 255 個 2us 在這個工程中,我們認為 255 就是最亮(也就是在周期內(nèi)都是高), 當然我們可以設(shè)置 250 ,設(shè)置多少就看精細程度了*/3.38.TIM2- ARRH = 0;39.TIM2- ARRL = 255 & 0X0FF
28、;40.41.42./*1. 捕獲/ 比較寄存器43.2. 設(shè)置亮度,這一位控制占空比44.*/45.TIM2- CCR1H = 0;46.TIM2- CCR1L = 0;47.TIM2- CCR2H = 0;48.49.TIM2- CCR2L = 0;TIM2- CCR3H = 0;50.TIM2- CCR3L = 0;51.53.1. 計數(shù)器使能54.2. 捕獲 / 比較使能寄存器 使能55.*/56.TIM2-CR1 |= TIM2_CR1_CEN;/使能計數(shù)器57.TIM2-CCER1 |= TIM2_CCER1_CC1E;/使能捕獲/ 比較寄存器58.TIM2-CCER1 |= TI
29、M2_CCER1_CC2E;/使能捕獲/ 比較寄存器59.TIM2-CCER2 |= TIM2_CCER2_CC3E;/使能捕獲/ 比較寄存器52.12360./*3.3 實現(xiàn)調(diào)光初始化完成我們就需要進行調(diào)光了,我們調(diào)光的邏輯是這樣的:a. 在 UART 中接收到調(diào)光的數(shù)據(jù)后調(diào)用 “參數(shù)接收函數(shù) ”b. “參數(shù)接收函數(shù) ”接收到數(shù)據(jù)后保存數(shù)據(jù),并打開中斷(我們選用 TIM4 )條 件(我們用的是標志位來覺得是否調(diào)用 “調(diào)光函數(shù) ”)c. TIM4 調(diào)用“調(diào)光函數(shù) ”為什么我們不直接在 UART 中接收到參數(shù)后直接調(diào)用調(diào)光函數(shù)而非得讓 TIM4調(diào)用呢?3.3.1 參數(shù)接收函數(shù)上面已經(jīng)說明, 我們
30、設(shè)計的時候會接收到 6 個參數(shù), 在這個函數(shù)里, 我們需要做4 件事a. 我們在“參數(shù)接收函數(shù) ”中將這些參數(shù)賦值給全局變量 (為什么我們不實用傳 參呢?因為我們用到中斷沒法傳參)b. 如果 R、D、G的值全為 0,我們只需要將占空比全部設(shè)置為 0 即可,無需其 他操作c. 如果 Value_ChangeOnce 為 0,我們直接將占空比設(shè)置為輸入的 R、G、B 值, 無需其他操作d. 除去上面兩種情況外, 我們需要更改 TIM4 是否需要調(diào)用 “調(diào)節(jié)函數(shù) ”的標志 位 gEnableChangeLED具體代碼如下:cpp view plain copy1./*2.*Function: Set
31、CurLightShow3.*Calls:void4.*CalledBy: void5.*Input:u8 Value_LED_Red接收到的 Red 的亮度值6.u8 Value_LED_Green接收到的 Green 的亮度值7.u8 Value_LED_Blue接收到的 Blue 的亮度值8.u8 Value_ChangeOnce上升 / 下降一次的程度9.u8 HoldTime_Min在最低亮度保持的時間10.u8 HoldTime_Max在最高亮度保持的時間11. *OUTPUT: void12.*Return: void13.*DESCRIPTION: 1.接收參數(shù),進行情況判斷1
32、4.2.保存接收的數(shù)據(jù)到全局變量中15.3.進行 2 種特殊情況的處理16. *Others: nothing6.57.void SetCurLightShow( u8 Value_LED_Red, u8 Value_LED_Green, u8 Value_L ED_Blue,u8 Value_ChangeOnce, u8 HoldTime_Min, u8 Ho
33、ldTime_Max)/ 獲得各值,以備其他函數(shù)使用 Set_LightSet_Red = Value_LED_Red; Set_LightSet_Green= Value_LED_Green; Set_LightSet_Blue = Value_LED_Blue; Set_LightSet_ChangeOnce = Value_ChangeOnce; Set_LightSet_HoldTime_Min = HoldTime_Min; Set_LightSet_HoldTime_Max = HoldTime_Max;/*1. 三個值為 0 的時候燈直接關(guān)閉2. 當改變?yōu)?0 的時候燈常量3.
34、除了這兩種情況就是需要變化的了 */if ( (0 = Value_LED_Red) & (0 = Value_LED_Green) & (0 = Value_LE D_Blue) )TIM2- Red_CCRxL = 0;TIM2- Green_CCRxL = 0;TIM2- Blue_CCRxL = 0; gEnableChangeLED = 0;return ;if ( 0 = Value_ChangeOnce )TIM2- Red_CCRxL = Value_LED_Red;TIM2- Green_CCRxL = Value_LED_Green;TIM2- Blue_CCRxL = V
35、alue_LED_Blue; gEnableChangeLED = 0;return ;/*1. 需要改變 LED燈(用0x33是為了防止數(shù)值自己變?yōu)?1或不為 0的極 端情況)2. 我們默認是先向上的(當然也可以先向下) */ gEnableChangeLED = 0x33;Light_Out_State = LIGHT_STATE_UP_OUT;58. Light_CurLevel_Percentage = 10;59. 3.3.2 調(diào)光函數(shù)這個函數(shù)是在 TIM4 中引用的, 根據(jù)上面的函數(shù)可以知道, 當引用這個函數(shù)的時 候,我們已經(jīng)將狀態(tài)( Light_Out_State )設(shè)置為上升,
36、當前亮度百分比( Light_CurLevel_Percentage )設(shè)置為 10 。我們將狀態(tài)分為 4 類,每類的邏 輯如下:a.最低亮度顯示狀態(tài)( LIGHT_STATE_MIN_OUT ):最值亮度保持時間( Light_Min_Max_HoldTime )自增,當Light_Min_Max_HoldTime=Set_LightSet_HoldTime_Min 就說明最低亮度 保持時間已經(jīng)到了,然后就可以切換狀態(tài)為下降,并改變亮度值。b.最高亮度顯示狀態(tài)( LIGHT_STATE_MAX_OUT ):最值亮度保持時間( Light_Min_Max_HoldTime )自增,當Light
37、_Min_Max_HoldTime=Set_LightSet_HoldTime_Max 就說明最高亮度保持時間已經(jīng)到了,然后就可以切換狀態(tài)為下降,并改變亮度值。c. 上升狀態(tài)( LIGHT_STATE_UP_OUT ):更改當前亮度百分比并更改亮度,當 前亮度百分比大于 100% 就進入最大亮度狀態(tài)。d. 下降狀態(tài)( LIGHT_STATE_DOWN_OUT ):更改當前亮度百分比并更改亮度, 當前亮度百分比小于于 10% 就進入最低亮度狀態(tài)。除了 3.3.1 參數(shù)接收函數(shù) 中的兩種直接調(diào)節(jié)的狀態(tài)以外, 其余的,只要是需要調(diào) 光的都首先處于 LIGHT_STATE_UP_OUT 狀態(tài)。在 LI
38、GHT_STATE_UP_OUT 狀態(tài)將根據(jù) Set_LightSet_ChangeOnce 來調(diào)節(jié)亮 度,當達到亮度最大以后,就進入 LIGHT_STATE_MAX_OUT 狀態(tài),此時為呼 吸效果的上升。如果我們有最大亮度,那么亮度持續(xù)直到滿足Set_LightSet_HoldTime_Max ,然后進入 LIGHT_STATE_DOWN_OUT 狀態(tài), 此時為呼吸的最大亮度保持狀態(tài);如果沒有最大亮度將直接進入LIGHT_STATE_DOWN_OUT 狀態(tài),此時沒有持續(xù)的最大亮度。在 LIGHT_STATE_DOWN_OUT 狀態(tài)將根據(jù) Set_LightSet_ChangeOnce 來調(diào)
39、節(jié)亮度,當達到亮度最小以后,就進入 LIGHT_STATE_MIN_OUT 狀態(tài),此時為 呼吸狀態(tài)的下降。如果我們有最小亮度,那么亮度持續(xù)直到滿足Set_LightSet_HoldTime_Min ,然后進入 LIGHT_STATE_UP_OUT 狀態(tài),此時為呼吸的最小亮度保持狀態(tài);如果沒有最大亮度將直接進入LIGHT_STATE_UP_OUT 狀態(tài),此時沒有持續(xù)的最低亮度。隨著 Set_LightSet_ChangeOnce 的編號,變化越來越快, 當超過 且最大最小保持時間為 0 的時候就是閃亮。具體代碼如下:cpp view plain copy1. /*2. *Function: TI
40、M4_Updata_IRQHandler3. *Calls: void4. *Called By: 中斷函數(shù)5. *Input: void6. *OUTPUT: void7. *Return: void8. *DESCRIPTION: 1. 定時器函數(shù),用來定時的調(diào)用呼吸燈的函數(shù)9. *Others: nothing*/10.11. void Pwm_BreatheCtrl()12. / 最低 亮度 顯示13. if ( LIGHT_STATE_MIN_OUT = Light_Out_State ) 狀態(tài)14. 9.40.4
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025租賃合同及合同條款
- 2025合同法條款:租賃合同的違約金責(zé)任解析
- 2025版企業(yè)員工勞動合同模板
- 2025深圳清華大學(xué)研究生院合作培養(yǎng)碩士研究生合同書
- 2025合同權(quán)益調(diào)整申請書
- 2025年全國電力行業(yè)風(fēng)力發(fā)電運行檢修職業(yè)技能競賽考試題庫及答案
- 2025留意合同中的無形陷阱:試用期的秘密
- 2025合作協(xié)議合同書
- 2025簡易土地買賣合同模板
- 2025企業(yè)外匯設(shè)備貸款合同范本
- 初中八年級英語課件the Leaning Tower of Pisa
- 跨境數(shù)據(jù)流動與治理
- 《水工建筑物介紹》課件
- 300t汽車吊起重性能表
- 輸血治療知情同意書
- 幼兒園副園長聘任園長合同(36篇)
- 30道中國石油天然氣地球物理勘探工程師崗位常見面試問題含HR常問問題考察點及參考回答
- 高級焊工實操
- 臨床營養(yǎng)學(xué)基礎(chǔ)知識課件
- 《在〈人民報〉創(chuàng)刊紀念會上的演說》《在馬克思墓前的講話》聯(lián)讀 統(tǒng)編版高中語文必修下冊
- 銀行內(nèi)部賬戶風(fēng)險分析和管控建議
評論
0/150
提交評論