基于STM32的呼吸燈_第1頁
基于STM32的呼吸燈_第2頁
基于STM32的呼吸燈_第3頁
基于STM32的呼吸燈_第4頁
基于STM32的呼吸燈_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 word格式. 課程名稱 選題名稱 選題性質(zhì) 學號姓名 專業(yè)名稱 所在院系 完成時間 HUBEI NORMAL UNIVERSITY 電工電子實驗報告 STM32課程設(shè)計 呼吸燈 仿真與實踐 35喬智慧 電子信息科學與技術(shù) 物理與電子科學學院 2015年6月03日 電工電子中心2015年6月繪制 word格式. STM32呼吸燈設(shè)計 一 任務(wù)解析 呼吸燈,指燈光設(shè)備的亮度隨著時間由暗到亮逐漸增強,再由亮到暗 逐漸衰減,很有節(jié)奏感地一起一伏,就像是在呼吸一樣。本設(shè)計要求通過 STM32,實現(xiàn)呼吸周期為3秒,即吸氣時間(亮度上升時間)1.5秒,呼氣 時間(亮度衰減時間)1.5秒的呼吸燈。 二方案

2、論證 要使用數(shù)字器件控制燈光的強弱,我們很自然就想到PWM (脈沖寬度 調(diào)制)技術(shù)。假如以LED作為燈光設(shè)備,且由控制器輸出的PWM信號可以直 接驅(qū)動LED,PWM信號中的低電平可點亮LED燈。由于視覺暫留效應(yīng),人眼 可以看不到LED燈的閃爍現(xiàn)象,反映到人眼中的是亮度的差別,因此我們需 要LED以較高的頻率進行開關(guān)(亮滅)切換。因此,我們可以使用高頻率的 PWM信號,通過調(diào)制信號的占空比,控制LED燈的亮度。根據(jù)以上思路,提 出如下兩個方案O 方案一:用常見的數(shù)學函數(shù)來表示亮度隨著實踐逐漸變強再衰弱,把 函數(shù)值賦值到數(shù)組中,用調(diào)制的方法,每個循環(huán)給閃爍的熄滅時間加一,燈 就會慢慢變暗,在設(shè)置熄

3、滅時間加到一定程度就開始減一,就會漸漸變亮了, 如此循環(huán)。 方案二:把函數(shù)值賦值到數(shù)組中,對數(shù)組中的每一個值進行重復而快 速的掃描,當遍歷完P(guān)WM表中的元素時,再重頭開始遍歷PWM表。即以一定 的時間長度為周期,LED燈亮的平均時間越長,亮度就越高,反之越暗。利 word格式. 用STM32定時器的PWM輸出功能,實現(xiàn)呼吸燈。 經(jīng)分析比較與初步測試,方案二更能很好地實現(xiàn)呼吸燈效果,因此選 擇方案二。 三方案實施 STEP1生成表示亮度的數(shù)學函數(shù) 亮度隨著時間逐漸變強再衰減,可以用兩種常見的數(shù)學函數(shù)表示,分別是半個 周期的正弦函數(shù)與指數(shù)上升曲線基期對稱得到的下降曲線。如圖示: 正點原子STM32

4、開發(fā)板上的LED燈是低電平點亮 因此,比較上述兩個函數(shù)圖像我們可以發(fā)現(xiàn),下凹函數(shù)曲線燈光處于暗的狀態(tài) 更長,所以指數(shù)函數(shù)的曲線更符合我們呼吸燈的亮度變化要求。 STEP2配置工程環(huán)境 在實驗中我們用到了 GPIO, RCC,TIM外設(shè),還使用了中斷,所以我們先要把 以下庫文件添加到工程:stm32fl0 x_gpio. c, stm32f 10 x_rcc. c, stm32fl0 x_tim. c, mi sc. c,新建 pwm_output. c 及 pwm_output. h 文件并在 stm32fl0 x_conf.h中把使用到的ST庫的頭文件注釋去掉。代碼如下: #include

5、Mstm32fl0 x_gpio. h #include stm32f1Ox_rcc. h #include stm32fl0 x_tim. h #include Hmisc. h STEP3 main 文件 本工程的main函數(shù)十分簡單,僅僅調(diào)用了 一個初始化呼吸燈的函數(shù) TIM3_Breathing_Init(),代碼如下: int main(void) TIM3_Breath i ng_In i t(); while(l); STEP4 配置定時器輸出PWM 初始化呼吸燈的函數(shù)TIM3_Breathing_Init按步驟調(diào)用為GPIO初始化函數(shù) TIM3_GP10_Config和定時器模

6、式初始化函數(shù)TIM3_Mode_Config,代碼如下: void TIM3_Breathing_Init(void) TIM3_GPI0_Config(); TIM3_Mode_Config(); STEP5生成指數(shù)曲線PWM數(shù)據(jù) 要實現(xiàn)LED亮度隨著指數(shù)曲線變化,我們需要使用占空比呈指數(shù)曲線變化 的PWM信號,而這樣的信號由定時器經(jīng)過查表產(chǎn)生。這個表的數(shù)據(jù)存儲在程序 中的數(shù)組indexWave中,代碼如下: uint8_t indexWave = 1,1,2, 2, 3,4, 6,8,10,14,19, 25, 33,44, 59,80, 107,143,191,255, 255,191,

7、143,107, 80, 59,44, 33, 25,19,14,10, 8, 6, 4, 3, 2, 2,1,1; 把這個表中的數(shù)據(jù)畫成圖,如下圖所示: I II11 250 - 200 150 100 4 50 - 0 2* 1 1 1 1 1*1- 1L 亠一,亠一 ( )24 6810121416 這個表有40個數(shù)字,從上圖中可以看到這些數(shù)據(jù)呈指數(shù)上升再衰減,正好 是呼吸燈的一個控制周期,數(shù)字的圍是0-255,即把LED的亮度分為0255個 等級。 假如我們把定時器的脈沖計數(shù)器TIMx.CNT 限設(shè)置為255,把這個表的數(shù)據(jù) 一個一個的賦到定時器的比較寄存器TIMx.CCR中,那么在每

8、個PWM周期中,當 TIMx.CNT的計數(shù)值小于比較寄存器TIMx.CCR值時,就會在通道中輸出低電平, 點亮LED。而隨著TIMx_CCR的值由LED亮度表得來,所以LED點亮的時間就會 呈圖中的曲線變化,實現(xiàn)呼吸燈的功能。 用于生成LED亮度表的MATLAB函數(shù)如下: clear; x = 0 : 8/19 : 8; up 二 2. x ; up = uint8(up); y = 8: -8/19 :0; down = 2/y ; down = uint8(down); line = 0:8/19:8,8:8/19:16 val = up , down dlmwriteC index_wa

9、ve. c, val); plotdine, val,. STEP6初始化GPIO 本設(shè)計使用PBO作為定時器PWM輸出通道,先對它初始化。作PWM輸出通道的 引腳需要被配置為復用推挽輸出模式。 static void TIM3_GPI0_Config(void) GPI0_lnitTypeDef GPI0_InitStructure; /* GPIOB clock enable */ RCC_APB2PeriphC1ockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPI0_InitStructure. GP10_Pin = GPIO_Pin_0 ; GPI0_In

10、itStructure. GPI0_Mode = GP10_Mode_AF_PP; GP10_InitStructure. GPIO_Speed = GPIO_Speed_50MHz; GPI0_Init(GPI0B, STEP7配置定時器的棋式 在TIM3_Mode_Config函數(shù)中,完成了呼吸燈所需要的定時器PWM輸出模式配 置,代碼如下: static void TIM3_Mode_Config(void) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; / RC

11、C.APB1PeriphC1ockCmd(RCC.APB1Periph_TIM3, ENABLE); TIM_T i meBaseSt rue ture. TIM_Per i od = 255; TIM_TimeBaseStructure. TIM_Presca1er = 1999; TIM_TimeBaseStrueture. TIM_C1ockDivision 二 TIM_CKD_DIV1 ; TIM_TimeBaseStructure. TIM_CounterMode = TIM_CounterMode_Up; /時基初始化 TIM_TimeBaseInit(TIM3, TIM_OCIn

12、itStructure. TIM.OCMode 二 TIM_OCMode_PWMl; TIM_OCIn i tStructure. TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure. TIM_Pulse = 0; TIM_OCIn i tStructure. TIM_OCPo1ar i ty = TIM_OCPo1ar i ty_Low; TIM_OC3Init(TIM3, TIM_OC3Pre1oadConf ig(TIM3, TIM_OCPreload_Enable); TIM.ARRPreloadConfig(TI

13、M3, ENABLE); TIM_Cmd(TIM3, ENABLE); TIM_ITConfig(TIM3,TIMT.Update, ENABLE); NVIC_Config_PW(); 定時器的模式配置主要分為三個部分,分別為時基初始化,輸出模式初始化和 中斷配置。 STEP8時基初始化 這部分主要負責配置定時器的定時周期,時鐘頻率,計數(shù)方式等。它使用 到庫函數(shù) TIM_TimeBaseInit,使用結(jié)構(gòu)體 TIM_TimeBaseInitTypeDef 進行配置 該結(jié)構(gòu)體有以下成員: 1) TIM.Period 定時周期,實質(zhì)是存儲到重載寄存器TIM.ARR的數(shù)值,脈沖計數(shù)器從0累計 到這

14、個值上溢或從這個值自減至0下溢。這個數(shù)值加然后乘以時鐘源周期就是 實質(zhì)定時器周期。 本設(shè)計向該成員賦值255 5既定時器周期為(255+1 ) *T,T為定時器的時鐘 周期。 2) TIM_Precaler 對定時器時鐘TIMxCLK的預分頻值,分頻后作為脈沖計數(shù)器TIMx.CNT的驅(qū) 動時鐘的到脈沖計數(shù)器的時鐘頻率為:Fck_cnt=Ftimx_cnt/(N+l),其中N為 既為賦給本成員的時鐘分頻值。 本設(shè)計給TIM_Preca 1 er成員賦值為1999,既對時鐘2000分頻,所以定時器 的時鐘周期T為2000/72000000 3) TIM_ClockDivision 時鐘分頻因子。要

15、注意這個TlM_ClockDivision和上面的TIM_Precaler是 不一樣的。TIM_Precaler預分頻配置是對TIMxCLK進行分頻,分頻后的時鐘被 輸入到脈沖計數(shù)器TIM.CNTTIM.ClockDivision雖然是對TIMxCLK進行分頻。 但它的分頻后的時鐘頻率為Fdts,是被輸出到定時器ETRP數(shù)字濾波器部分,會 影響濾波器的采樣速率。TIALClockDivision可被配置為1分頻、2分頻及4分 頻。ETRP數(shù)字濾波器的作用是對外部時鐘TIM.ETR進行濾波。 本設(shè)計中是使用部時鐘TIM.CLK作為定時器時鐘源,沒有進行濾波所以配 置TIM.ClockDivisi

16、on為任何數(shù)值都沒有影響。 4) TIM_CounterMode 本成員配置的為脈沖計數(shù)器TIMx_CNT的計數(shù)模式,分別為向上計數(shù),向下 計數(shù),及中央對齊模式,向上計數(shù)既TIMx_CNT從0向上累加到TIM_Period的 值(重載寄存器TIMx_ARR),產(chǎn)生上溢事件。向下計數(shù)既TIMx.CNT從TIM_PeCod 的值累減至0,(重載寄存器TIMx.ARR),產(chǎn)生下溢事件。而中央對齊模式向 上向下計數(shù)的合體*TIMx_CNT從0累加到TIM_Period的值減1時,產(chǎn)生一個上 溢事件,然后向下計數(shù)到1時,產(chǎn)生一個計時器下溢事件,再從0開始重新計 數(shù)。 本設(shè)計中TIM_CounterMod

17、e成員被賦值為TIM_CounterMode_up(向上計數(shù)模 式)。 填充完配置參數(shù)后,調(diào)用庫函數(shù)TIM_TimeBaseInit()把這些控制參數(shù)寫到寄 存器中,定時器的時基就配置完成了。 STEP9輸出棋式配置 通用寄存器的輸出模式由TIM_OCLinitTypeDef類型結(jié)構(gòu)體的以下幾個成員 來設(shè)置: 1)TlM_OCMode 輸出模式配置,主要使用的為PWM1和PWM2模式。 PWM模式是:向上計數(shù)時,當TIMx_CNTTIMx_CCRn時,通道n輸出為無效電平,否則為無效電平。 PWM2模式跟PWM1模式相反。 其中的有效電平和無效電平并不是對應(yīng)地對應(yīng)高電平和低電平,也是需要配 置

18、的,由下面介紹的TIM_OCPolai*ity成員配置。 本設(shè)計使用PWM1輸出模式。 2) TIM_OutputState 配置輸出模式狀態(tài)使能或關(guān)閉或輸出。 本設(shè)計想該成員賦值為TIM_OutputState_Enable (使能輸出) 3) TIM.OCPolairty 有效電平的極性,把PWM模式中的有效電平設(shè)置為高電平或低電平。 本設(shè)計中向該成員賦值為TIM_OCPolairty_ 1 ow 因為在上面吧輸出配置為PWM1 模式,向上計數(shù),所以在TIMx_CNT= 10) TIM3-CCR3 = i ndexWavepwm_ i ndex; pwm_i ndex+;/標志PWM表的下

19、一個元素 if( putd_index = 40) pwm_index=0; period_cnt=0; 重置周期計數(shù)標志 TIM.ClearlTPendingBit (TIM3, TIM_IT_Update);/必須要清 除中斷標志位 本中斷服務(wù)函數(shù)在每次定時器更新事件發(fā)生時執(zhí)行一次(即256個定時器時 鐘周期)。本代碼的目的是每10次定時器中斷更新一次PWM表中的數(shù)據(jù)到比較 寄存器TIMx_CCR中,當遍歷完P(guān)WM表的40個元素時,再重頭開始遍歷PWM表, 周而復始,重復LED的呼吸過程。 四 實驗現(xiàn)象 現(xiàn)展示三組呼吸過程如下圖所示: 低亮度 高亮度 中等亮度 五經(jīng)驗總結(jié) 1、初次寫完該實驗代碼后,自己的呼吸燈呼吸的過程是帶有微弱的閃爍的,并 不是想象中一般的連貫,而找了各種原因也無法找出,后來經(jīng)過自己不懈的努 力(就是每10次定時器中斷更新一次PWM表中的數(shù)據(jù)到比較寄存器TIMx.CCR 中)問題才得以解決,但具體為什么這樣改就可以,自己目前還不是徹底明白, 不過自己從中得出,在實驗中遇到困難,不要

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論