STMSF通過(guò)PWM波實(shí)現(xiàn)三基色呼吸燈_第1頁(yè)
STMSF通過(guò)PWM波實(shí)現(xiàn)三基色呼吸燈_第2頁(yè)
STMSF通過(guò)PWM波實(shí)現(xiàn)三基色呼吸燈_第3頁(yè)
STMSF通過(guò)PWM波實(shí)現(xiàn)三基色呼吸燈_第4頁(yè)
STMSF通過(guò)PWM波實(shí)現(xiàn)三基色呼吸燈_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、STM8S003F3 通過(guò) PWM 波實(shí)現(xiàn)三基色呼吸燈前段時(shí)間使用 STM8S003F3 實(shí)現(xiàn)了一個(gè)三基色燈的各種效果,故寫(xiě)一篇文章作 為一個(gè)記錄1 綜述我們知道,要是的 LED 燈亮直接通電即可。而要改變燈的亮度,我們有兩種方 法:改變電流和 PWM 調(diào)光。我們首先想到的就是改變它的驅(qū)動(dòng)電流,因?yàn)?LED 的亮度是幾乎和它的電流直 接成正比關(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)槟壳鞍坠?LED 都 是用藍(lán)光 LED加黃色熒光粉而產(chǎn)生,當(dāng)正向電流減小時(shí),藍(lán)光 LED 亮度增加而 黃色熒光粉的厚度并沒(méi)有按比例減薄

2、, 從而使其光譜的主波長(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)光至少需要一顆能支持 PW

3、M 的芯片(當(dāng)然還有外圍電路,但是電流調(diào)光也是有電路的。我們也應(yīng)該知 道 PWM 信號(hào)也可以由脈沖發(fā)生器提供) ,另外它需要編寫(xiě)程序。 所以只有在需 要的場(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)樗偸枪ぷ髟?0 或者最大兩種狀態(tài)。 PWM 的占空比很好控制,而且精度高 對(duì)電源沒(méi)有影響,因?yàn)椴粫?huì)改變電源的工作條件,只是給電源開(kāi)或者關(guān)。2 PWM 波調(diào)光的原理脈寬調(diào)制 (PWM) 是利用微處理器的數(shù)字輸出來(lái)對(duì)模擬電路進(jìn)行控制的的技術(shù), 廣泛應(yīng)用在從測(cè)量、通信到功率

4、控制與變換及 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í)刻,滿(mǎn)幅值的直流供電要么完全 有(ON) ,要么完全無(wú) (OFF)。電壓或電流源是以一種通 (ON) 或斷(OFF)的重復(fù)脈 沖序列被加到模擬負(fù)載上去的。 通的時(shí)候即是直流供電被加到負(fù)載上的時(shí)候, 斷

5、的時(shí)候即是供電被斷開(kāi)的時(shí)候。 只要帶寬足夠, 任何模擬值都可以使用 PWM 進(jìn) 行編碼。2.1 占空比( Duty Cycle or Duty Ratio ) 首先我們需要了解占空比,占空比的解釋可以歸納為如下幾種: 在一串理想的脈沖序列中 (如方波),正脈沖的持續(xù)時(shí)間與脈沖總周期的比值。 例如:脈沖寬度 1s,信號(hào)周期 4s的脈沖序列占空比為 0.25 。在一段連續(xù)工作時(shí)間內(nèi)脈沖占用的時(shí)間與總時(shí)間的比值在周期型的現(xiàn)象中,現(xiàn)象發(fā)生的時(shí)間與總時(shí)間的比 通俗一點(diǎn)講就是電路釋放能量的有效時(shí)間與總釋放時(shí)間的比。2.2 調(diào)光比然后我們需要了解調(diào)光比,調(diào)光比則是按下面的方法計(jì)算( Foper :工作頻率;

6、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ī)格書(shū)里會(huì)說(shuō)明的。2.3 PWM 調(diào)光2.3.1 PWM 調(diào)光原理 若一個(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( (

7、這個(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)?10%通電時(shí)間里電流產(chǎn)生的效果和 0.9V 加在周內(nèi)的時(shí) 候是一樣的)。所以我們就可以通過(guò)占

8、空比來(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)將熄滅。要讓燈

9、泡取得 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ò)

10、串口給單片機(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_

11、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)槲矣玫淖疃嗟木褪?TIM2 和 TIM4 , 因此我選用的 TIM2_1(PC5,Red)、TIM2_2(PD3,Green )、TIM2_3(PD2, Blue ),但是發(fā)現(xiàn)除了綠色以外都無(wú)法用 PWM 波控制,但是能用 IO 控制亮暗, 后來(lái)查資

12、料發(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

13、 使用復(fù)用功能就是設(shè)置 AFR( Alternate function remapping bits出于校驗(yàn)考慮),我們從數(shù)據(jù)手冊(cè)中可以知道:應(yīng)用程序可直接向目標(biāo)地候補(bǔ)功能映射位) 我們繼續(xù)看芯片資料其中 OPT2 【選項(xiàng)字節(jié) (Option byte) 編程 】和 NOPT2 需要是相反的(可能是址進(jìn)行寫(xiě)操作。 所以我們直接對(duì)這兩個(gè)地址進(jìn)行寫(xiě)操作, 那么數(shù)值是多少呢?我們繼續(xù)看數(shù)據(jù)手冊(cè),如下圖所示從上圖中我們可以看到, 我們將 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每一次只能操作一個(gè)字節(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是否解鎖標(biāo)志位16.void FLASH_Init()17.18./ 第一步 初始化 EEPROM19.while ( (FLASH-IAPSR & FLASH_DUL) = 0X00 )20.21.FLASH-DUKR = 0XAE;/ 中文資料上 說(shuō)的和 實(shí)際是相反的22.FLASH-DUKR = 0X56;23._asm( NOP );24.25.26./ 第二步 對(duì) OPT進(jìn)行編程,首先需要如下操作:開(kāi)啟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./ 第四步 對(duì) OPT進(jìn)行編程,最后需要如下操作:禁用opt 編程45.FLASH-CR2 &= 0X80;/OPT = 146.FLASH-NCR2 |= 0X80;/NOPT = 047.這樣,我們就完成了復(fù)用功能的 “存儲(chǔ)器地址分布重映射 ”。3.2 初始化定時(shí)器我們使用 TIM2 產(chǎn)生 PWM 波來(lái)控制三基色燈, 所以,我們需要對(duì) TIM2 進(jìn)行初 始化3.2.1 使能設(shè)置首先無(wú)論使用什么,第一步就是使能,在數(shù)據(jù)手冊(cè)的時(shí)鐘控制中我們看到如下信息:我們就可以確定使能 TIM2 的代碼:CLK-PCKENR1 |= CLK_PCKENR1_TIM2;3.2.2 設(shè)置頻率然后,

18、TIM2 的主頻(決定著周期)是和單片機(jī)一樣的 (這個(gè)頻率由時(shí)鐘控制) 我們可以進(jìn)行分頻(分頻越多我們調(diào)節(jié)的就越精細(xì)),我們?cè)跀?shù)據(jù)手冊(cè) “預(yù)分頻器高 8 位”和“預(yù)分頻器低 8 位”中可以看到:我們就可以確定分頻代碼:TIM2- PSCR = 5; 其中上圖所描述的更新事件我們這里就是計(jì)數(shù)器清 03.2.3 選擇 PWM 波我們查看數(shù)據(jù)手冊(cè)的 17.5.7 PWM 模式 可以看到,脈沖寬度調(diào)制 (PWM) 模式可以產(chǎn)生一個(gè)由 TIM1_ARR 寄存器確定頻率、 由 TIM1_CCRi 寄存器確定占 空比的信號(hào)。 PWM 模式是捕獲 /比較模式寄存器 1(TIM1_CCMR1) 來(lái)控制的, 我們

19、選擇 PWM 模式 2、開(kāi)啟 TIM1_CCR1 寄存器的預(yù)裝載功能、 CC1 通道被配 置為輸出(其余不變),我們可以從數(shù)據(jù)手冊(cè)中看到:17.7.9捕獲/比較模式寄存器1(TIM1_CCMR1)地址偏移值:0x08復(fù)位值:0x00通道可用于輸入(捕獲模式)或輸出(比較模式),通道的方向由相應(yīng)的CC1S位: 它位的作用在輸入和輸出模式下不同。OCxx描述了通道在輸出模式下的功能 在輸入模式下的功能。因此必須注意.同一個(gè)位在輸出模式和輸入模式下的功輸出模式t65“_lp:4 1)1(32 10C1CE 1OC1M:2;O1OC1PE1OC1FE |rwrwrvrwrrYVrOC1CE:輸出比較1

20、清零使能該位用于使能使用TIM1_TRIG引逛上的外部事件來(lái)渣通道1的輸出信號(hào)(OC 17.5.9在外部事件發(fā)生奇清除OCREF信號(hào)0: OC1REF不受ETRF輸入(來(lái)自TIM1_TRIG引疸)的影響:1: 一旦檢測(cè)到ETRF輸入高電平,OC1REF=Oe位6:40C1M2:0輸出比較1模式該3位定義了輸出參考信號(hào)0C1REF的動(dòng)作.而0C1REF決定了0C1的值.0C1REF是高 有效,而0C1的有效電平戰(zhàn)決于CC1P位。000:凍結(jié)=輸出比較寄存器TIM1_CCR1與計(jì)數(shù)器TIM1_CNT間的比較對(duì)OC1REF不起f 001:匹配吋設(shè)置通道1的輸出為有效電平.當(dāng)計(jì)數(shù)器TIM1_CNT的值

21、與捕獲/比較奇存器, (TIM1_CCR1)相同時(shí),強(qiáng)制OC1REF為高,010;匹配時(shí)設(shè)置通道1的輸出為無(wú)效電平。當(dāng)計(jì)澈器TIM1_CNT的值與捕獲/比較寄存器 (TIM1_CCR1)相同時(shí),強(qiáng)制OC1REF為低.011:胡轉(zhuǎn).當(dāng)TIM1_CCR1=TIM1_CNT吋,胡轉(zhuǎn)OC1REF的電平.100:強(qiáng)制為無(wú)效電平強(qiáng)制OC1REF為低.101:強(qiáng)制為有效電平。強(qiáng)ftJOCIREF為高。110: PWM模式1 一在向上計(jì)數(shù)時(shí),一旦TIM1_CNTTIM1_CCR1時(shí)通道1為無(wú)效電平(OC1RE: 否則為有效電平(OC1REF=1).111: PWM模式2在向上計(jì)數(shù)吋,一旦TIM1_CNTTIM

22、1_CCRijPt通道1為有效屯平.否則為 電平http:. ,blog csdn. not/注仆一旦LOCK級(jí)別設(shè)為3(TIW_BKR舒存器中的LOCK位併且CC1S二00(該通道配置威 則該位不能被修改。注厶 在PWM模式1或PWM棋式2中.E有當(dāng)比較結(jié)果改變了或在輸出比較棋式中從凍結(jié) 切換到PWM模式時(shí).OC1REF電平才改變.(參考17.5.7PWM模式)注3*在有互補(bǔ)輸岀的通道上 這些位杲預(yù)裝載的。如果TIM1_CR2寄存器的CCPC=1,( 位只有在COM事件發(fā)生吋,才從預(yù)裝載位取新值.OC1PE,輸出比較1預(yù)裝栽使能0:禁止TIM1_CCR1存器的預(yù)裝載功能.可隨吋寫(xiě)入TIM1_

23、CCR1 CCMR1 = 0X68;3.2.4 設(shè)置 PWM 波的頻率在參考手冊(cè)中可以看到,在 PWM 模式(模式1或模式 2)下,TIM1_CNT 和 TIM1_CCRi 始終在進(jìn)行比較:a. (依據(jù)計(jì)數(shù)器的計(jì)數(shù)方向)以確定是否符合 TIM1_CCRi TIM1_CNT或者 TIM1_CNT TIM1_CCR(i 我們?cè)?TIM1_CR1 中設(shè)置為向上計(jì)數(shù)、 邊沿對(duì)齊模式)b. 根據(jù) TIM1_CR1 寄存器中 CMS 位域的狀態(tài),定時(shí)器能夠產(chǎn)生邊沿對(duì)齊的 PWM 信號(hào)或中央對(duì)齊的 PWM 信號(hào)。我們查看數(shù)據(jù)手冊(cè)發(fā)現(xiàn)(可以參見(jiàn)17.3.4 向上計(jì)數(shù)模式 ):我們?yōu)榱苏{(diào)光的均勻,將使得 TIM

24、2_ARR=255 ,根據(jù)上圖,我們可以知道,最 亮為 255 ,最暗為 0.255 就是 PWM 波的頻率(因?yàn)?TIM1 和 TIMX 的 PWM功能是相同資料互用的,因此上圖為 TIM1 的資料)。3.2.5 初始化 PWM 波的亮度根據(jù)上面的內(nèi)容我們知道占空比(也就是亮度)是 TIM2_CCR 決定的,我們初 始化為零: TIM2- CCR1H = 0;TIM2- CCR1L = 0;3.2.6 計(jì)數(shù)器使能、捕獲比較寄存器使能關(guān)于這兩個(gè)使能我們可以自己查詢(xún) 數(shù)據(jù)手冊(cè) ,需要提一點(diǎn)的是 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è)置定時(shí)器的時(shí)鐘(根據(jù)已經(jīng)分頻的主時(shí)鐘來(lái)分頻)3. 分頻系數(shù)越大,周期越大,也就是頻率越低4. 分頻系數(shù) 1 215, 如果為 5就是 32 分頻(原來(lái)為 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. 自動(dòng)裝載寄存器 (分高低位 也就是 16 位寄存器)33. 2. (每次就是上面分頻后的時(shí)間,假設(shè)分頻后是 2us ),每 2us 復(fù)位一次7.定時(shí)器 2, 也就是說(shuō)計(jì)數(shù)器每變化一次耗時(shí) 2us,0 到 255 經(jīng)過(guò) 255 個(gè) 2us 在這個(gè)工程中,我們認(rèn)為 255 就是最亮(也就是在周期內(nèi)都是高), 當(dāng)然我們可以設(shè)置 250 ,設(shè)置多少就看精細(xì)程度了*/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. 計(jì)數(shù)器使能54.2. 捕獲 / 比較使能寄存器 使能55.*/56.TIM2-CR1 |= TIM2_CR1_CEN;/使能計(jì)數(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 實(shí)現(xiàn)調(diào)光初始化完成我們就需要進(jìn)行調(diào)光了,我們調(diào)光的邏輯是這樣的:a. 在 UART 中接收到調(diào)光的數(shù)據(jù)后調(diào)用 “參數(shù)接收函數(shù) ”b. “參數(shù)接收函數(shù) ”接收到數(shù)據(jù)后保存數(shù)據(jù),并打開(kāi)中斷(我們選用 TIM4 )條 件(我們用的是標(biāo)志位來(lái)覺(jué)得是否調(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)說(shuō)明, 我們

30、設(shè)計(jì)的時(shí)候會(huì)接收到 6 個(gè)參數(shù), 在這個(gè)函數(shù)里, 我們需要做4 件事a. 我們?cè)凇皡?shù)接收函數(shù) ”中將這些參數(shù)賦值給全局變量 (為什么我們不實(shí)用傳 參呢?因?yàn)槲覀冇玫街袛鄾](méi)法傳參)b. 如果 R、D、G的值全為 0,我們只需要將占空比全部設(shè)置為 0 即可,無(wú)需其 他操作c. 如果 Value_ChangeOnce 為 0,我們直接將占空比設(shè)置為輸入的 R、G、B 值, 無(wú)需其他操作d. 除去上面兩種情況外, 我們需要更改 TIM4 是否需要調(diào)用 “調(diào)節(jié)函數(shù) ”的標(biāo)志 位 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在最低亮度保持的時(shí)間10.u8 HoldTime_Max在最高亮度保持的時(shí)間11. *OUTPUT: void12.*Return: void13.*DESCRIPTION: 1.接收參數(shù),進(jìn)行情況判斷1

32、4.2.保存接收的數(shù)據(jù)到全局變量中15.3.進(jìn)行 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. 三個(gè)值為 0 的時(shí)候燈直接關(guān)閉2. 當(dāng)改變?yōu)?0 的時(shí)候燈常量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. 我們默認(rèn)是先向上的(當(dāng)然也可以先向下) */ gEnableChangeLED = 0x33;Light_Out_State = LIGHT_STATE_UP_OUT;58. Light_CurLevel_Percentage = 10;59. 3.3.2 調(diào)光函數(shù)這個(gè)函數(shù)是在 TIM4 中引用的, 根據(jù)上面的函數(shù)可以知道, 當(dāng)引用這個(gè)函數(shù)的時(shí) 候,我們已經(jīng)將狀態(tài)( Light_Out_State )設(shè)置為上升,

36、當(dāng)前亮度百分比( Light_CurLevel_Percentage )設(shè)置為 10 。我們將狀態(tài)分為 4 類(lèi),每類(lèi)的邏 輯如下:a.最低亮度顯示狀態(tài)( LIGHT_STATE_MIN_OUT ):最值亮度保持時(shí)間( Light_Min_Max_HoldTime )自增,當(dāng)Light_Min_Max_HoldTime=Set_LightSet_HoldTime_Min 就說(shuō)明最低亮度 保持時(shí)間已經(jīng)到了,然后就可以切換狀態(tài)為下降,并改變亮度值。b.最高亮度顯示狀態(tài)( LIGHT_STATE_MAX_OUT ):最值亮度保持時(shí)間( Light_Min_Max_HoldTime )自增,當(dāng)Light

37、_Min_Max_HoldTime=Set_LightSet_HoldTime_Max 就說(shuō)明最高亮度保持時(shí)間已經(jīng)到了,然后就可以切換狀態(tài)為下降,并改變亮度值。c. 上升狀態(tài)( LIGHT_STATE_UP_OUT ):更改當(dāng)前亮度百分比并更改亮度,當(dāng) 前亮度百分比大于 100% 就進(jìn)入最大亮度狀態(tài)。d. 下降狀態(tài)( LIGHT_STATE_DOWN_OUT ):更改當(dāng)前亮度百分比并更改亮度, 當(dāng)前亮度百分比小于于 10% 就進(jìn)入最低亮度狀態(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 來(lái)調(diào)節(jié)亮 度,當(dāng)達(dá)到亮度最大以后,就進(jìn)入 LIGHT_STATE_MAX_OUT 狀態(tài),此時(shí)為呼 吸效果的上升。如果我們有最大亮度,那么亮度持續(xù)直到滿(mǎn)足Set_LightSet_HoldTime_Max ,然后進(jìn)入 LIGHT_STATE_DOWN_OUT 狀態(tài), 此時(shí)為呼吸的最大亮度保持狀態(tài);如果沒(méi)有最大亮度將直接進(jìn)入LIGHT_STATE_DOWN_OUT 狀態(tài),此時(shí)沒(méi)有持續(xù)的最大亮度。在 LIGHT_STATE_DOWN_OUT 狀態(tài)將根據(jù) Set_LightSet_ChangeOnce 來(lái)調(diào)

39、節(jié)亮度,當(dāng)達(dá)到亮度最小以后,就進(jìn)入 LIGHT_STATE_MIN_OUT 狀態(tài),此時(shí)為 呼吸狀態(tài)的下降。如果我們有最小亮度,那么亮度持續(xù)直到滿(mǎn)足Set_LightSet_HoldTime_Min ,然后進(jìn)入 LIGHT_STATE_UP_OUT 狀態(tài),此時(shí)為呼吸的最小亮度保持狀態(tài);如果沒(méi)有最大亮度將直接進(jìn)入LIGHT_STATE_UP_OUT 狀態(tài),此時(shí)沒(méi)有持續(xù)的最低亮度。隨著 Set_LightSet_ChangeOnce 的編號(hào),變化越來(lái)越快, 當(dāng)超過(guò) 且最大最小保持時(shí)間為 0 的時(shí)候就是閃亮。具體代碼如下: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í)器函數(shù),用來(lái)定時(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論