久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6682|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

基于stm32的呼吸燈課程設(shè)計(jì)說(shuō)明書(shū)下載

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:363691 發(fā)表于 2018-7-3 09:45 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

嵌入式系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)

課題名稱(chēng):基于stm32的呼吸燈設(shè)計(jì)說(shuō)明書(shū)

學(xué)    院:     機(jī)械與自動(dòng)控制學(xué)院   

專(zhuān)    業(yè):      機(jī)械電子工程 3

設(shè)計(jì)成員:*

學(xué)    號(hào):201530300139

指導(dǎo)老師:         張*

日    期:     2018年6月20日      




一、 呼吸燈簡(jiǎn)介2

二、 PWM呼吸燈原理3

1.PWM簡(jiǎn)介3

2.PWM程序編寫(xiě)5

三、呼吸燈的設(shè)計(jì)9

1.程序設(shè)計(jì)9

2. 呼吸燈電路圖設(shè)計(jì)14

3.呼吸燈實(shí)驗(yàn)實(shí)物圖 14

四、結(jié)論與心得15

五、參考文獻(xiàn)16



基于stm32的呼吸燈

1、呼吸燈簡(jiǎn)介

呼吸燈是指燈光在微電腦的控制之下完成由亮到暗的逐漸變化,感覺(jué)好像是人在呼吸。其廣泛應(yīng)用于手機(jī)之上,并成為各大品牌新款手機(jī)的賣(mài)點(diǎn)之一,起到一個(gè)通知提醒的作用。當(dāng)你的手機(jī)里面有未處理的通知,比如說(shuō)未接來(lái)電,未查收的短信等等,呼吸燈就會(huì)由暗到亮的變化,像呼吸一樣那么有節(jié)奏,起到一個(gè)通知提醒的作用。

要使用數(shù)字器件控制燈光的強(qiáng)弱,我們很自然就想到PWM(脈沖寬度調(diào)制)技術(shù)。假如以L(fǎng)ED作為燈光設(shè)備,且由控制器輸出的PWM信號(hào)可以直接驅(qū)動(dòng)LED,PWM信號(hào)中的低電平可點(diǎn)亮LED燈。由于視覺(jué)暫留效應(yīng),人眼可以看不到LED燈的閃爍現(xiàn)象,反應(yīng)到人眼中的是亮度的差別,因此我們需要LED以較高的頻率進(jìn)行開(kāi)關(guān)(亮滅)切換。因此我們可以使用高頻率的PWM信號(hào),通過(guò)調(diào)制信號(hào)的占空比,控制LED燈的亮度。根據(jù)以上思路,根據(jù)上課和實(shí)驗(yàn)所學(xué)知識(shí)利用PWM實(shí)現(xiàn)呼吸燈設(shè)計(jì)。

2、PWM呼吸燈原理1.PWM簡(jiǎn)介

Pulse Width Modulation: 脈沖寬度調(diào)制(PWM)

脈沖:頻率 ,方波

脈沖寬度:占空比,  高電平的寬度:在同一個(gè)時(shí)間內(nèi),高電平所占比例

頻率與周期:f = 1/T  f:頻率(主頻)  T:周期

脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation”的縮寫(xiě),簡(jiǎn)稱(chēng)脈寬調(diào)制,是利用微處理器的數(shù)字輸出來(lái)對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù)。簡(jiǎn)單一點(diǎn),就是對(duì)脈沖寬度的控制,PWM原理如圖:
圖中,我們假定定時(shí)器工作在向上計(jì)數(shù)PWM模式,且當(dāng)CNT<CCRx時(shí),輸出0,CNT>=CCRx時(shí)輸出1。那么就可以得到如上的PWM示意圖:當(dāng)CNT值小于CCRx的時(shí)候IO輸出低電平(0),當(dāng)CNT值大于等于CCRx的時(shí)候,IO輸出高電平(1),當(dāng)CNT達(dá)到ARR值的時(shí)候,重新歸零,然后重新向上計(jì)數(shù),依次循環(huán)。改變CCRx的值,就可以改變PWM輸出的占空比,改變ARR的值,就可以改變PWM輸出的頻率,這就是PWM輸出的原理。
控制PWM的三個(gè)寄存器:捕獲/比較模式寄存器(TIMx_CCMR1/2),捕獲/比較使能寄存器(TIMx_CCER),捕獲/比較寄存器(TIMx_CCR1~4)。這三個(gè)寄存器針對(duì)不同的定時(shí)器不同的輸出模式設(shè)置各不相同。
本次實(shí)驗(yàn)主要用到捕獲/比較寄存器( TIMx_CCR1~4),該寄存器總共有 4 個(gè),對(duì)應(yīng) 4 個(gè)輸通道 CH1~4。

TIMX_CCR包括捕獲輸入部分(數(shù)字濾波、多路復(fù)用和預(yù)分頻器)和比較輸出部分(比較器和輸出控制)。

  • 捕獲輸入。在輸入時(shí),捕獲/比較寄存器TIMx_CCR被用于黨捕獲(存儲(chǔ))輸入脈沖在電平發(fā)生翻轉(zhuǎn)時(shí)加載脈沖計(jì)數(shù)器TIMx_CNT的當(dāng)前計(jì)數(shù)值,從而實(shí)現(xiàn)脈沖的頻率測(cè)量。
  • 比較輸出。在輸出時(shí),捕獲/比較寄存器TIMx_CCR用來(lái)存儲(chǔ)一個(gè)脈沖數(shù)值,把這個(gè)數(shù)值與脈沖計(jì)數(shù)器TIMx_CNT的當(dāng)前計(jì)數(shù)值進(jìn)行比較,根據(jù)比較結(jié)果進(jìn)行不同的電平輸出。

在輸出模式下,該寄存器的值與 CNT 的值比較,根據(jù)比較結(jié)果產(chǎn)生相應(yīng)動(dòng)作。通過(guò)修改這個(gè)寄存器的值,就可以控制 PWM 的輸出脈寬了。 在呼吸燈設(shè)計(jì)過(guò)程中使用的是 TIM3的通道 1和2,需要修改 TIM3_CCR2 以實(shí)現(xiàn)脈寬控制 A6和A7的亮度。

2.PWM程序編寫(xiě)1)開(kāi)啟TIM3和GPIO時(shí)鐘,配置PA6、PA7選擇復(fù)用功能AF9(TIM3)輸出。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  //使能定時(shí)器TIM3時(shí)鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //使能引腳PA6和PA7的時(shí)鐘

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  //選擇輸出模式為復(fù)用推挽輸出

2)初始化TIM3,設(shè)置TIM3的ARR和PSC等參數(shù)。

在開(kāi)啟了 TIM3 的時(shí)鐘之后,要設(shè)置 ARR 和 PSC 兩個(gè)寄存器的值來(lái)控制輸出 PWM 的周期。當(dāng) PWM 周期太慢(低于 50Hz)的時(shí)候,就會(huì)明顯感覺(jué)到閃爍了。因此, PWM 周期在這里不宜設(shè)置的太小。 這在庫(kù)函數(shù)是TIM_TimeBaseInit 函數(shù)實(shí)現(xiàn)的,調(diào)用的格式為:

TIM_TimeBaseStructure.TIM_Period=1000-1;   //設(shè)置自動(dòng)重裝載寄存器周期的值。

TIM_TimeBaseStructure.TIM_Prescaler=0;    //設(shè)置用來(lái)作為T(mén)IMx時(shí)鐘頻率除數(shù)的預(yù)分頻數(shù)。

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;  //設(shè)置時(shí)鐘分割。

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;    //選擇計(jì)數(shù)器模式,向上計(jì)數(shù)。

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);  //將設(shè)置好的參數(shù)初始化。

3)設(shè)置TIM3_CHX的PWM模式,使能TIM3的輸出。

要設(shè)置 TIM3_CH2 為 PWM 模式(默認(rèn)是凍結(jié)的),因?yàn)?LED是低電平亮,而當(dāng) CCR2 的值小的時(shí)候,D9 就暗,CCR2 值大的時(shí)候, D9 就亮,所以通過(guò)配置 TIM3_CCMR1 的相關(guān)位來(lái)控制 TIM3_CH2 的模式。在庫(kù)函數(shù)中,PWM 通道設(shè)置是通過(guò)函數(shù)TIM_OC1Init()~TIM_OC4Init()來(lái)設(shè)置的, 不同的通道的設(shè)置函數(shù)不一樣,通道 1時(shí),使用的函數(shù)為T(mén)IM_OC1Init();通道2時(shí),使用的函數(shù)為T(mén)IM_OC2Init()。

結(jié)構(gòu)體TIM_OCInitTypeDef的定義:

typedef struct
{
uint16_t TIM_OCMode;         /  
uint16_t TIM_OutputState;     /
uint16_t TIM_OutputNState;    /
uint16_t TIM_Pulse;          /
uint16_t TIM_OCPolarity;    /
uint16_t TIM_OCNPolarity;    /
uint16_t TIM_OCIdleState;    /
uint16_t TIM_OCNIdleState;   /
} TIM_OCInitTypeDef;
參數(shù) TIM_OCMode 設(shè)置模式是 PWM 還是輸出比較,這里我們是 PWM 模式。
參數(shù) TIM_OutputState 用來(lái)設(shè)置比較輸出使能,也就是使能 PWM 輸出到端口。
參數(shù) TIM_OCPolarity 用來(lái)設(shè)置極性是高還是低。
其他的參數(shù) TIM_OutputNState, TIM_OCNPolarity, TIM_OCIdleState 和 TIM_OCNIdleState 是高級(jí)定時(shí)器 TIM1 和 TIM8 才用到的。
主函數(shù)中設(shè)置如下:
TIM_OCInitTypeDef TIM_OCInitStructure;     //設(shè)置一個(gè)TIM_OCInitStructure結(jié)構(gòu)體來(lái)初始化外設(shè) TIMx。
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;    //設(shè)置TIM輸出模式為PWM1。
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //比較輸出使能。
  TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;; //TIM輸出比較級(jí)極性高。
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);     //將設(shè)定好的參數(shù)初始化給通道1。
TIM_OC2Init(TIM3,&TIM_OCInitStructure);    //初始化通道2。
4)使能TIM3.
TIM_Cmd(TIM3,ENABLE);      //使能 TIM3的外設(shè)。
5)修改TIM14_CCR1來(lái)控制占空比。
通過(guò)修改 TIM3_CCR1和TIM3_CCR2 可以控制通道1和通道2的輸出占空比。繼而控制 PA6和PA7 的亮度。

TIM_OCInitStructure.TIM_Pulse=CCR1_Val;  //設(shè)置了待裝入捕獲比較寄存器的脈沖值。

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的預(yù)裝載寄存器

TIM_OCInitStructure.TIM_Pulse=CCR2_Val;  //設(shè)置了待裝入捕獲比較寄存器的脈沖值。

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的預(yù)裝載寄存器。



呼吸燈電路圖設(shè)計(jì)

圖 部分硬件仿真電路圖

3.呼吸燈實(shí)驗(yàn)實(shí)物圖

四、結(jié)論與心得

1.一開(kāi)始老師布置作業(yè)時(shí)是無(wú)限制的自由發(fā)揮,一頭霧水不知道自己該從哪里下手該干什么,后來(lái)因?yàn)樵跈C(jī)電傳動(dòng)控制實(shí)驗(yàn)中正好學(xué)習(xí)了直流電機(jī)PWM調(diào)速實(shí)驗(yàn),由此得到啟發(fā)覺(jué)得可以通過(guò)PWM控制燈泡的閃爍頻率來(lái)實(shí)現(xiàn)燈光的亮度變化,進(jìn)而實(shí)現(xiàn)呼吸燈的效果。

2.編寫(xiě)程序過(guò)程中還存在許多問(wèn)題,一開(kāi)始是直接在實(shí)驗(yàn)例程PWM輸出實(shí)驗(yàn)中修改,因?yàn)闆](méi)有硬件設(shè)備,只能通過(guò)仿真,仿真一直不成功,后經(jīng)過(guò)在網(wǎng)上搜集資料、查看相關(guān)書(shū)籍和詢(xún)問(wèn)同學(xué)完成本次實(shí)驗(yàn)的程序,實(shí)驗(yàn)程序中沒(méi)有LED程序,而是直接在輸出引腳輸出高低電平從而實(shí)現(xiàn)燈泡的閃爍。對(duì)實(shí)驗(yàn)中出現(xiàn)的諸多問(wèn)題,一定要認(rèn)真分析其原因之所在,然后查閱資料通過(guò)各種方法解決實(shí)驗(yàn)中出現(xiàn)的這些問(wèn)題,做完實(shí)驗(yàn)之后要做好相關(guān)總結(jié),這樣才能把一個(gè)實(shí)驗(yàn)做完美,對(duì)以后的實(shí)驗(yàn)也有著一定的幫助作用。

  • 在本次實(shí)驗(yàn)中當(dāng)決定好做什么內(nèi)容時(shí),一定要先仔細(xì)分析整個(gè)實(shí)驗(yàn)要達(dá)到的目標(biāo)要求,然后做出總體設(shè)計(jì)方案將程序編寫(xiě)細(xì)化到每一部分,這樣就不容易出錯(cuò),而且在檢查錯(cuò)誤問(wèn)題時(shí)也會(huì)稍微容易一點(diǎn)。
  • 通過(guò)這次綜合實(shí)驗(yàn)讓我對(duì)stm32有了更進(jìn)一步的熟悉和了解,一個(gè)看似很簡(jiǎn)單的東西,到動(dòng)手把它設(shè)計(jì)出來(lái)就比較困難了,所以在今后的學(xué)習(xí)中我們要注意這一點(diǎn),要把課堂上所學(xué)到的知識(shí)和實(shí)際聯(lián)系起來(lái),同時(shí)通過(guò)本次實(shí)驗(yàn)讓我對(duì)課本理論知識(shí)有了深入實(shí)際的理解,也會(huì)在調(diào)試中出現(xiàn)的錯(cuò)誤結(jié)合理論知識(shí)尋找問(wèn)題所在的原因,一步步檢查調(diào)試,直到完成實(shí)驗(yàn)最終目的。
  • 通過(guò)設(shè)計(jì)大作業(yè),讓我明白任何實(shí)驗(yàn)都是基于理論的,理論知識(shí)學(xué)扎實(shí)了,才能在程序編寫(xiě)上和調(diào)試上快速準(zhǔn)確的完成實(shí)驗(yàn),以此警示自己在后期的學(xué)習(xí)中一定要注意理論知識(shí)的學(xué)習(xí)。

三、呼吸燈的設(shè)計(jì)
1.程序設(shè)計(jì)
  1. /*延時(shí)函數(shù)*/
  2. void Delay(__IO u32 nCount)
  3. {
  4.   while(nCount--);
  5. }

  6. u16 CCR1_Val=1000;
  7. u16 CCR2_Val=0;
  8. u8 a=0;
  9. /*主函數(shù)*/
  10. int main(void)

  11. {
  12. RCC_Config();
  13. TIM3_GPIO_Config();
  14. TIM3_Mode_Config();
  15. while(1)
  16. {

  17.      if(CCR1_Val>0&&a<40&&CCR2_Val<1000)

  18.      {
  19.        CCR1_Val-=25;       //通過(guò)改變脈沖值,實(shí)現(xiàn)燈泡的亮度
  20.        CCR2_Val+=25;
  21.        TIM3_Mode_Config();
  22.        a++;
  23.             Delay(0XFFFF);
  24.                                           Delay(0XFFFF);
  25.             Delay(0XFFFF);
  26.                                             Delay(0XFFFF);
  27.      }
  28.     else

  29.     {
  30.        CCR1_Val+=25;
  31.        CCR2_Val-=25;
  32.        TIM3_Mode_Config();
  33.        Delay(0XFFFF);
  34.                                           Delay(0XFFFF);
  35.        a++;
  36.     if(a==80)a=0;
  37.      }
  38. }
  39. }

  40. /*使能時(shí)鐘*/
  41. void RCC_Config(void)
  42. {
  43.    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);   //使能定時(shí)器TIM3時(shí)鐘。
  44.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //使能引腳PA的時(shí)鐘。
  45. }
  46. /*配置 GPIO 的模式和 IO 口*/
  47. void TIM3_GPIO_Config(void)
  48. {
  49.   GPIO_InitTypeDef GPIO_InitStructure;  //設(shè)置一個(gè)GPIO_InitStructure結(jié)構(gòu)體。
  50.   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;  //選擇引腳PA6和PA7。
  51.   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  //選擇輸出模式為復(fù)用推挽模式。
  52.   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  //設(shè)置引腳最高輸出速率為50MHZ。
  53.   GPIO_Init(GPIOA,&GPIO_InitStructure);  //將設(shè)定好的參數(shù)初始化。
  54. }
  55. /*  設(shè)置TIM3  */
  56. void TIM3_Mode_Config(void)
  57. {
  58.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;         //設(shè)置一個(gè)TIM_TimeBaseStructure結(jié)構(gòu)體。

  59.   TIM_OCInitTypeDef TIM_OCInitStructure;       //設(shè)置一個(gè)TIM_OCInitStructure結(jié)構(gòu)體 。    TIM_TimeBaseStructure.TIM_Period=1000-1;  //設(shè)置自動(dòng)重裝載寄存器周期的值。

  60.    TIM_TimeBaseStructure.TIM_Prescaler=0;     //設(shè)置用來(lái)作為T(mén)IMx時(shí)鐘頻率除數(shù)的預(yù)分頻值。    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;  //設(shè)置時(shí)鐘分割 。 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;  //選擇了計(jì)數(shù)器模式,向上計(jì)數(shù)。
  61.   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);  //將設(shè)置好的參數(shù)初始化 。
  62. TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;  //設(shè)置TIM輸出模式為PWM1。
  63. TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;  //使能輸出比較
  64.   TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;  /TIM輸出比較劑型高
  65.   TIM_OCInitStructure.TIM_Pulse=CCR1_Val;  //設(shè)置了待裝入捕獲比較寄存器的脈沖值
  66.   TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //將設(shè)定好的參數(shù)初始化給通道1
  67.   TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的預(yù)裝載寄存器
  68.   TIM_OCInitStructure.TIM_Pulse=CCR2_Val;
  69.   TIM_OC2Init(TIM3,&TIM_OCInitStructure);  //通道2
  70.   TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
  71.   TIM_ARRPreloadConfig(TIM3,ENABLE);  //使能TIM3在ARR上的預(yù)裝載寄存器
  72.   TIM_Cmd(TIM3,ENABLE);  //使能TIM3的外設(shè)
  73. }
復(fù)制代碼

完整的Word格式文檔51黑下載地址:
教學(xué)模板-庫(kù)函數(shù)操作.rar (460.43 KB, 下載次數(shù): 53)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:539103 發(fā)表于 2019-5-15 17:37 | 只看該作者
很有幫助,謝謝
回復(fù)

使用道具 舉報(bào)

板凳
ID:800070 發(fā)表于 2020-7-8 23:20 | 只看該作者
您好,請(qǐng)問(wèn)您能不能教一下電路圖完整該怎么畫(huà)嗎,我們學(xué)校沒(méi)要求板子上做出來(lái),但是要在proteus中仿真出來(lái),拜托&#128591;&#127995;了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: av免费网站| 999国产视频| 久草网在线 | 天天躁日日躁狠狠躁av麻豆男男 | 91插插插插插| 日本一区二区不卡视频 | 69精品视频| 黄色三级视频网站 | 日本黄色a级片 | 亚洲精品日韩丝袜精品 | 国产黄色片在线观看 | 福利片在线观看 | 成人国产精品久久久网站 | 99热在线免费观看 | 免费三级黄色片 | 国产视频一区二区在线 | 天天舔天天操 | 日韩精品视频免费 | 91成人精品一区在线播放 | 欧美日本在线观看 | 国产逼逼| 久久合| 97精品国产 | 精品九九九 | 香蕉福利视频 | 黄色成人在线 | 日韩精品免费一区二区夜夜嗨 | 九九视频在线 | 五月天久久久 | 成人伊人网 | 黄色片网站视频 | 人人草在线视频 | 日韩在线中文 | 在线观看小视频 | 刘玥大战28公分黑人 | 国产福利视频 | 久久精品国产亚洲 | 久久久综合 | 亚洲在线视频观看 | av片在线观看 | 九九色 |