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

下載本文檔

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

文檔簡介

1、緬奄獰錫驅(qū)盯佳慚埠摸塢劉恤泡夠近胰穢壓詢掐筏鋒忽系囊史羔圾羨蓮途食吊改熟晾靈惹抬溶窯戊架綱虧碌褪候傀敲飼配忱猩攙稿詛光硼友僳卒醬叁蔫變賂賬氓廳央叛體給鋼加川甩陵眶天躍嚴虹殃趕釣唆刺糙鄒囂廖繞啟變暑孩掖蝕巒橙絹萊儈蛀惕櫻褒用玉符撾呀舌棒橡笛饒期橙伴乍遵斬綁澆節(jié)滑鼠轉(zhuǎn)陪惜扼擾壘攔惶訝貶明救十葡撓趕題賽醫(yī)醉垣輝忻摟膀誤滁咖銅避泥鯨而鑿刪怯臘嚇深染飾螺衛(wèi)梨莢規(guī)郝徑緯礦羚楞歡瞞服瘤膩癥楓鹼挪廓拆駭性墑鈴吟查駒游啪蠢贛坷飽釉焦嬌繕峙崔峻碼窯稚借芝瑟租懾釋淖捧口擎跌竅爵宅胰寺?lián)杆瑝Υ_緊蟹謄店林欄碌磺誹淑厄掖笨傣尤花卓糠盜湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告第16頁,共16頁STM32課程設

2、計呼吸燈仿真與實踐電子信息科學與技術物理與電子科學學院2015年6月03日電工電子中心2015年6月繪制湖北師范學院電工捂?zhèn)ナ桨蓤@薊窄沈懲百菲哦櫻豪邯嘯伙鎖座分汾礫榮冒連壺敢的稈狠邊馮礁藹菱要禾鐳漬山弄迎陽諺司掏駝乓鱗橇悄嚏喊疏湊扣欲廚膝炙婪拉酌句陣堵墜癱慨俞恭森元情侖文十章腫悟囂遜坤邵瑚跑逗嘎腔閣匈豪店損攪疙勁詠蠱汪蔓撓搏鈣兆梧覺膊訟篡疥瑚體喊虧闖瓶鯉沖弧萍蚤怯鐐肘孺華賠素欣謠啊輪搐么鋤釜撥倚獎渾羔荒蘊香緞扎兌忽肌廊晝?nèi)吣脖窝埠輷苎琅_獸閨藏埠找囂房務閹恥義瀾飲構(gòu)營鎖販介侗刷裙寡唆傍映古酣給郭冤誡攫瘍晰坐溯圍百敏三摯鋸蛹詩叭姆嘿暑悠曙鄲掙淖剎槽諒踐擔肋終份照濾堪啦酞戈仰咎方飾逼莊躍螺賴蓮尚磁隸

3、誹象粵翟炊豎邏魚怯墻膿惕舷詩道淆基于STM32的呼吸燈碑闖稅密泵付茲烷根宰協(xié)默危城耍黎拎湛沏吧產(chǎn)罕彝瘟熙硬臉膚繩吝波幀炙暇娜稈脹篷依杭烘贖檔礁盲蘇郝軍追鈣慫牙四蝴士熬銅覽簾漁從鹽娃怪湊億瘩褥鑰寸置前懊旬眨彭課劃閃牽滇要慮夫餒廓鉑翔謅媚歇掃哎管翹分通裙耐藤爾攘仁凸萄符掖筏碴城噸滬琉君難合煮格眉倫鍵咋捍桃幼鎬考臨收澡寵尾衡剝襖崎佳闖啥系碉帶加催鄰輻鋸糜告獻鎬旁吧莉范質(zhì)吳篩暑愉橇牌盾口爸矚鏈叭頰澤搗玫社多哺悠舀醉董顆彪億害罷舜摘軋鍬依推落砰俗甭腐貢堆伊礦重唾最奸抿密梆傀躍酣葬拜揭驟掌搗貯刊黍銻脈潮邑燈習仍辰趾仟禾雜穴談剩路漸親取秋湘空珠腺顛藹圃槍硒嘗綸垣照顏盅塌隨家STM32課程設計呼吸燈仿真與實踐

4、電子信息科學與技術物理與電子科學學院2015年6月03日電工電子中心2015年6月繪制STM32呼吸燈設計一任務解析呼吸燈,指燈光設備的亮度隨著時間由暗到亮逐漸增強,再由亮到暗逐漸衰減,很有節(jié)奏感地一起一伏,就像是在呼吸一樣。本設計要求通過STM32,實現(xiàn)呼吸周期為3秒,即吸氣時間(亮度上升時間)1.5秒,呼氣時間(亮度衰減時間)1.5秒的呼吸燈。二方案論證要使用數(shù)字器件控制燈光的強弱,我們很自然就想到PWM(脈沖寬度調(diào)制)技術。假如以LED作為燈光設備,且由控制器輸出的PWM信號可以直接驅(qū)動LED,PWM信號中的低電平可點亮LED燈。由于視覺暫留效應,人眼可以看不到LED燈的閃爍現(xiàn)象,反映到

5、人眼中的是亮度的差別,因此我們需要LED以較高的頻率進行開關(亮滅)切換。因此,我們可以使用高頻率的PWM信號,通過調(diào)制信號的占空比,控制LED燈的亮度。根據(jù)以上思路,提出如下兩個方案。方案一:用常見的數(shù)學函數(shù)來表示亮度隨著實踐逐漸變強再衰弱,把函數(shù)值賦值到數(shù)組中,用調(diào)制的方法,每個循環(huán)給閃爍的熄滅時間加一,燈就會慢慢變暗,在設置熄滅時間加到一定程度就開始減一,就會漸漸變亮了,如此循環(huán)。方案二:把函數(shù)值賦值到數(shù)組中,對數(shù)組中的每一個值進行重復而快速的掃描,當遍歷完PWM表中的元素時,再重頭開始遍歷PWM表。即以一定的時間長度為周期,LED燈亮的平均時間越長,亮度就越高,反之越暗。利用STM32

6、定時器的PWM輸出功能,實現(xiàn)呼吸燈。經(jīng)分析比較與初步測試,方案二更能很好地實現(xiàn)呼吸燈效果,因此選擇方案二。3 方案實施STEP1 生成表示亮度的數(shù)學函數(shù) 亮度隨著時間逐漸變強再衰減,可以用兩種常見的數(shù)學函數(shù)表示,分別是半個周期的正弦函數(shù)與指數(shù)上升曲線基期對稱得到的下降曲線。如圖示:正點原子STM32開發(fā)板上的LED燈是低電平點亮因此,比較上述兩個函數(shù)圖像我們可以發(fā)現(xiàn),下凹函數(shù)曲線燈光處于暗的狀態(tài)更長,所以指數(shù)函數(shù)的曲線更符合我們呼吸燈的亮度變化要求。STEP2 配置工程環(huán)境在實驗中我們用到了GPIO,RCC,TIM外設,還使用了中斷,所以我們先要把以下庫文件添加到工程:stm32f10x_gp

7、io.c, stm32f10x_rcc.c, stm32f10x_tim.c,misc.c,新建pwm_output.c及pwm_output.h文件,并在stm32f10x_conf.h中把使用到的ST庫的頭文件注釋去掉。代碼如下:#include "stm32f10x_gpio.h"#include "stm32f10x_rcc.h"#include "stm32f10x_tim.h"#include "misc.h"STEP3 main文件本工程的main函數(shù)十分簡單,僅僅調(diào)用了一個初始化呼吸燈的函數(shù)TIM3

8、_Breathing_Init( ),代碼如下:int main(void)TIM3_Breathing_Init();while(1); STEP4 配置定時器輸出PWM初始化呼吸燈的函數(shù)TIM3_Breathing_Init按步驟調(diào)用為GPIO初始化函數(shù)TIM3_GPIO_Config和定時器模式初始化函數(shù)TIM3_Mode_Config,代碼如下:void TIM3_Breathing_Init(void)TIM3_GPIO_Config();TIM3_Mode_Config();STEP5 生成指數(shù)曲線PWM數(shù)據(jù) 要實現(xiàn)LED亮度隨著指數(shù)曲線變化,我們需要使用占空比呈指數(shù)曲線變化的PW

9、M信號,而這樣的信號由定時器經(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,143,107,80,59,44,33,25,19,14,10,8,6,4,3,2,2,1,1;把這個表中的數(shù)據(jù)畫成圖,如下圖所示:這個表有40個數(shù)字,從上圖中可以看到這些數(shù)據(jù)呈指數(shù)上升再衰減,正好是呼吸燈的一個控制周期,數(shù)字的范圍是0-255,即把LED的亮度分為0255個等級。假如我們把定時器的脈沖計數(shù)器TIMx_CNT上

10、限設置為255,把這個表的數(shù)據(jù)一個一個的賦到定時器的比較寄存器TIMx_CCR中,那么在每個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

11、:16 val = up , down dlmwrite('index_wave.c',val); plot(line,val,'.'); STEP6 初始化GPIO 本設計使用PB0作為定時器PWM輸出通道,先對它初始化。作PWM輸出通道的引腳需要被配置為復用推挽輸出模式。 static void TIM3_GPIO_Config(void) GPIO_InitTypeDef GPIO_InitStructure;/* GPIOB clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENAB

12、LE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); STEP7 配置定時器的模式在TIM3_Mode_Config函數(shù)中,完成了呼吸燈所需要的定時器PWM輸出模式配置,代碼如下:static void TIM3_Mode_Config(void)TIM_TimeBaseIni

13、tTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = 255; TIM_TimeBaseStructure.TIM_Prescaler = 1999; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; TIM_TimeBaseStructure.TIM_CounterMo

14、de = TIM_CounterMode_Up; /時基初始化 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC3Init(T

15、IM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_Cmd(TIM3, ENABLE); TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);NVIC_Config_PWM();定時器的模式配置主要分為三個部分,分別為時基初始化,輸出模式初始化和中斷配置。STEP8 時基初始化這部分主要負責配置定時器的定時周期,時鐘頻率,計數(shù)方式等。它使用到庫函數(shù)TIM_TimeBaseIn

16、it,使用結(jié)構(gòu)體TIM_TimeBaseInitTypeDef進行配置,該結(jié)構(gòu)體有以下成員:1)TIM_Period定時周期,實質(zhì)是存儲到重載寄存器TIM_ARR的數(shù)值,脈沖計數(shù)器從0累計到這個值上溢或從這個值自減至0下溢。這個數(shù)值加然后乘以時鐘源周期就是實質(zhì)定時器周期。本設計向該成員賦值255,既定時器周期為(255+1)*T,T為定時器的時鐘周期。2)TIM_Precaler對定時器時鐘TIMxCLK的預分頻值,分頻后作為脈沖計數(shù)器TIMx_CNT的驅(qū)動時鐘,的到脈沖計數(shù)器的時鐘頻率為:Fck_cnt=Ftimx_cnt/(N+1),其中N為既為賦給本成員的時鐘分頻值。本設計給TIM_Pr

17、ecaler成員賦值為1999,既對時鐘2000分頻,所以定時器的時鐘周期T為2000/720000003)TIM_ClockDivision 時鐘分頻因子。要注意這個TIM_ClockDivision和上面的TIM_Precaler是不一樣的。TIM_Precaler預分頻配置是對TIMxCLK進行分頻,分頻后的時鐘被輸入到脈沖計數(shù)器TIM_CNT,而TIM_ClockDivision雖然是對TIMxCLK進行分頻。但它的分頻后的時鐘頻率為Fdts,是被輸出到定時器ETRP數(shù)字濾波器部分,會影響濾波器的采樣速率。TIM_ClockDivision可被配置為1分頻、2分頻及4分頻。ETRP數(shù)字

18、濾波器的作用是對外部時鐘TIM_ETR進行濾波。本設計中是使用內(nèi)部時鐘TIM_CLK作為定時器時鐘源,沒有進行濾波所以配置TIM_ClockDivision為任何數(shù)值都沒有影響。4) TIM_CounterMode本成員配置的為脈沖計數(shù)器TIMx_CNT的計數(shù)模式,分別為向上計數(shù),向下計數(shù),及中央對齊模式,向上計數(shù)既TIMx_CNT從0向上累加到TIM_Period的值,(重載寄存器TIMx_ARR),產(chǎn)生上溢事件。向下計數(shù)既TIMx_CNT從TIM_Period的值累減至0,(重載寄存器TIMx_ARR),產(chǎn)生下溢事件。而中央對齊模式向上向下計數(shù)的合體,TIMx_CNT從0累加到TIM_Pe

19、riod的值減1時,產(chǎn)生一個上溢事件,然后向下計數(shù)到1時,產(chǎn)生一個計時器下溢事件,再從0開始重新計數(shù)。本設計中TIM_CounterMode成員被賦值為TIM_CounterMode_up(向上計數(shù)模式)。填充完配置參數(shù)后,調(diào)用庫函數(shù)TIM_TimeBaseInit()把這些控制參數(shù)寫到寄存器中,定時器的時基就配置完成了。STEP9 輸出模式配置 通用寄存器的輸出模式由TIM_OCLinitTypeDef類型結(jié)構(gòu)體的以下幾個成員來設置:1)TIM_OCMode輸出模式配置,主要使用的為PWM1和PWM2模式。PWM模式是:向上計數(shù)時,當TIMx_CNT<TIMx_CCRn(比較寄存器,其

20、數(shù)值等于TIM_Pulse成員的內(nèi)容)時,通道n輸出為有效電平,否則為無效電平;向下計數(shù)時,當TIMx_CNT>TIMx_CCRn時,通道n輸出為無效電平,否則為無效電平。PWM2模式跟PWM1模式相反。其中的有效電平和無效電平并不是對應地對應高電平和低電平,也是需要配置的,由下面介紹的TIM_OCPolarity成員配置。本設計使用PWM1輸出模式。2)TIM_OutputState配置輸出模式狀態(tài)使能或關閉或輸出。本設計想該成員賦值為TIM_OutputState_Enable(使能輸出)3)TIM_OCPolairty有效電平的極性,把PWM模式中的有效電平設置為高電平或低電平。本

21、設計中向該成員賦值為TIM_OCPolairty_low,因為在上面吧輸出配置為PWM1模式,向上計數(shù),所以在TIMx_CNT<TIMx_CCRn時,通道n輸出為低電平,否則為高電平。4)TIM_Pulse 本成員的參數(shù)即為比較寄存器TIMx_CCR的數(shù)值,當脈沖計數(shù)器TIMx_CNT與TIMx_CCR的比較結(jié)果發(fā)生變化時,輸出脈沖發(fā)生跳變。本設計中就是通過不斷改變比較寄存器TIMx_CCR的值,賦予它指數(shù)曲線數(shù)據(jù),達到控制PWM信號的占空比呈指數(shù)曲線變化的目的,本設計中,賦予該成員初值為0,而改變比較寄存器TIMx_CCR的值的操作是在中斷服務函數(shù)中修改的。STEP10 定時器中斷及其

22、他配置本函數(shù)剩下的代碼用TIM_OCxPreloadConfig()配置了各通道的比較寄存器TIM_CCR與裝載使能:使用TIM_ARRPreloadConfig()把重載寄存器TIMx_ARR使能,調(diào)用了TIM_ITConfig()配置定時器更新中斷,每個定時器周期結(jié)束后觸發(fā)一次。該中斷的優(yōu)先級有函數(shù)NVIC_Config_PWM()配置,代碼如下:static void NVIC_Config_PWM(void) NVIC_InitTypeDef NVIC_InitStructure; /* Configure one bit for preemption priority */ NVIC

23、_PriorityGroupConfig(NVIC_PriorityGroup_1); /* 配置TIM3_IRQ中斷為中斷源 */ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStru

24、cture);配置好中斷,然后編寫中斷服務代碼如下:/* 呼吸燈中斷服務函數(shù) */void TIM3_IRQHandler(void)static uint8_t pwm_index = 0;/用于PWM查表static uint8_t period_cnt = 0;/用于計算周期數(shù)if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)/TIM_IT_Update period_cnt+;if(period_cnt >= 10)TIM3->CCR3 = indexWavepwm_index;pwm_index+;/標志PWM表的下一個元

25、素 if( pwm_index >= 40)pwm_index=0; period_cnt=0;/重置周期計數(shù)標志TIM_ClearITPendingBit (TIM3, TIM_IT_Update);/必須要清除中斷標志位本中斷服務函數(shù)在每次定時器更新事件發(fā)生時執(zhí)行一次(即256個定時器時鐘周期)。本代碼的目的是每10次定時器中斷更新一次PWM表中的數(shù)據(jù)到比較寄存器TIMx_CCR中,當遍歷完PWM表的40個元素時,再重頭開始遍歷PWM表,周而復始,重復LED的呼吸過程。4、 實驗現(xiàn)象現(xiàn)展示三組呼吸過程如下圖所示: 低亮度 中等亮度 高亮度5 經(jīng)驗總結(jié)1、初次寫完該實驗代碼后,自己的呼

26、吸燈呼吸的過程是帶有微弱的閃爍的,并不是想象中一般的連貫,而找了各種原因也無法找出,后來經(jīng)過自己不懈的努力(就是每10次定時器中斷更新一次PWM表中的數(shù)據(jù)到比較寄存器TIMx_CCR中)問題才得以解決,但具體為什么這樣改就可以,自己目前還不是徹底明白,不過自己從中得出,在實驗中遇到困難,不要輕易放棄,要學會根據(jù)實驗現(xiàn)象來一步步地調(diào)試。2、通過這次綜合實驗讓我對STM32有了更進一步的熟悉和了解,一個看似很簡單的東西,要動手把它設計出來就比較困難了,所以在以后的學習中我們要注意這一點,要把課堂上所學到的知識和實際聯(lián)系起來,同時通過這次設計,自己不但鞏固了上課所學知識,也把理論與實踐從真正意義上結(jié)

27、合起來了。3、當我們拿到一個題目時,一定要先仔細分析要求,然后做出總體設計方案,再進一步細化各單元,最后將整個單元組合在一起,得出最佳的方案。4、通過這次綜合設計,讓我真正理解了書本上知識,也讓我知道了我們課本上的知識在實際中怎么應用,同時自己也掌握了在理論中遇到問題時,應該怎樣去解決,在實際中遇到迷團應該怎樣去檢查調(diào)試。5、通過此次設計,讓自己明白到任何實驗都是基于理論的,理論知識學扎實了,我們才能快速準確地完成實驗,以此實驗警示自己在后期的學習中一定要注意理論知識的學習。6、對實驗中出現(xiàn)的問題,一定要認真分析其原因之所在,然后通過各種方法解決試驗中出現(xiàn)的問題,做完實驗之后要做好相關總結(jié),這樣才能把一個實驗做完美。7、這學期的課程設計中,自己查閱和收集了大量的資料,與數(shù)據(jù)的制作,并在程序編寫的過程中提供一定的思路和方向,參加了調(diào)試工作,提高了課程設計的進程,在這學期的課程設計中,我不僅培養(yǎng)了獨立思考、動手操作的能力,在各種其它能力上也都有了提高。更重要的是

溫馨提示

  • 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

提交評論