【《單片機酒精檢測儀的軟件設(shè)計案例概述》3400字】_第1頁
【《單片機酒精檢測儀的軟件設(shè)計案例概述》3400字】_第2頁
【《單片機酒精檢測儀的軟件設(shè)計案例概述》3400字】_第3頁
【《單片機酒精檢測儀的軟件設(shè)計案例概述》3400字】_第4頁
【《單片機酒精檢測儀的軟件設(shè)計案例概述》3400字】_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

單片機酒精檢測儀的軟件設(shè)計案例概述目錄TOC\o"1-3"\h\u19269單片機酒精檢測儀的軟件設(shè)計案例概述 1125801.1軟件開發(fā)平臺 1114561.1.1STM32CubeMX 1134201.1.2KeilμVision5 3264591.2系統(tǒng)流程圖 311321.3標(biāo)志位 542431.4數(shù)據(jù)采集與預(yù)處理 6295021.4.1數(shù)據(jù)采集 6251641.4.2PID溫度控制 727231.5藍(lán)牙傳輸 9166441.6OLED顯示 12軟件開發(fā)平臺STM32CubeMX STM32CubeMX是一個圖形化配置工具,它允許我們非常容易地配置STM32微處理器的時鐘、I/O引腳、外設(shè)和中斷等初始化配置,以及為ARMCortex-M內(nèi)核生成相應(yīng)的C初始化代碼。STM32CubeMX的配置如下:首先選擇微處理器類型,選擇主控芯片STM32F103ZE。第二步選擇系統(tǒng)時鐘,在RCC中選擇外部晶振,并在ClockConfiguration中選擇HCLK的頻率為72MHz,接下來CubeMX會為我們自動配置具體的各個部分的頻率,微處理器時鐘樹如圖5.1所示。第三步配置我們需要用到的引腳和外設(shè),按照我們的需求進(jìn)行相應(yīng)的配置即可,具體引腳和外設(shè)的配置如圖5.2所示。同時配置相應(yīng)的中斷、DMA、和中斷優(yōu)先級,具體的中斷優(yōu)先級配置如圖5.3所示。最后設(shè)置系統(tǒng)的堆棧大小和選擇軟件開發(fā)平臺,即可生成相應(yīng)的代碼。圖5.1CubeMX配置時鐘樹圖5.2CubeMX配置引腳及外設(shè)圖5.3CubeMX配置中斷優(yōu)先級KeilμVision5MDK-ARM軟件為基于Cortex-M、Cortex-R4、ARM7和ARM9處理器的設(shè)備提供了完整的開發(fā)環(huán)境。MDK-ARM專為微控制器應(yīng)用而設(shè)計,不僅易于使用,而且功能強大,可以滿足最苛刻的嵌入式應(yīng)用。相較于其他IDE,它的優(yōu)勢明顯:(1)對Cortex-M系列、Cortex-R4系列、ARM7系列和ARM9系列設(shè)備的出色支持。(2)擁有行業(yè)領(lǐng)先的ARMC/C++工具鏈。(3)為具有圖形用戶界面的嵌入式系統(tǒng)提供了完備的GUI庫支持。(4)ULINKpro可以實時分析正在運行的應(yīng)用程序,并記錄每次Cortex-M語句的執(zhí)行情況。(5)擁有大量的項目例程幫助快速了解強大的內(nèi)置MDK-ARM功能。(6)遵守CMSIS(Cortex微控制器軟件標(biāo)準(zhǔn))。系統(tǒng)流程圖具有無線功能的酒精檢測系統(tǒng)流程圖如圖5.4所示。圖5.4系統(tǒng)流程圖系統(tǒng)上電后進(jìn)行系統(tǒng)初始化以及時鐘的配置,之后進(jìn)行I/O口和外設(shè)初始化以及各個中斷的開啟。定時器7設(shè)置了更新中斷,每10ms開啟溫度接收標(biāo)志位,單片機每10ms從DS18B20中獲取溫度;每100ms開啟OLED顯示標(biāo)志位,單片機每100ms更新一次OLED顯示的內(nèi)容;每100ms開啟串口上傳標(biāo)志位,若測試標(biāo)志位為1,單片機每100ms通過藍(lán)牙向手機發(fā)送數(shù)據(jù)包。進(jìn)入while循環(huán),分析串口數(shù)據(jù)接收的數(shù)據(jù)包中數(shù)據(jù),若開關(guān)標(biāo)志位開啟,判斷測試標(biāo)志位是否開啟,若測試標(biāo)志位開啟,單片機向手機發(fā)送數(shù)據(jù)包,持續(xù)5s,數(shù)據(jù)包中包括實時血液酒精濃度和平均血液酒精濃度;若測試標(biāo)志位關(guān)閉,讀取實際溫度,通過PID算法,輸出不同占空比的PWM波給大功率MOS管,以保證溫度穩(wěn)定。標(biāo)志位本系統(tǒng)需要同時處理許多模塊,有些模塊的驅(qū)動需要引腳輸出一定的時序,為了避免出現(xiàn)程序跑飛的情況或模塊讀取數(shù)據(jù)失敗的情況,在設(shè)計軟件時設(shè)置了許多標(biāo)志位,通過判斷標(biāo)志位是否為1,來進(jìn)行相關(guān)操作。下面將詳細(xì)介紹本程序的標(biāo)志位,以便在接下來的程序中更好的說明程序運行情況。首先為了保證程序能幾個ms或幾十個ms采集一次數(shù)據(jù),我們需要開啟一個定時器,具體定時器配置見圖5.5所示:圖5.5定時器配置使用CubeMX配置定時器7為更新中斷,分頻系數(shù)設(shè)為719,自動重裝載值為1000。使定時器7每10ms進(jìn)入一次中斷服務(wù)程序。編寫中斷服務(wù)子程序,在定時器中斷中定義相關(guān)標(biāo)志位。具體中斷服務(wù)子函數(shù)的內(nèi)容見圖5.6所示:圖5.6中斷服務(wù)子程序代碼首先判斷是不是定時器7的更新中斷,接下來配置各個標(biāo)志位。collection_temp_flag標(biāo)志位用來采集DS18B20的溫度,每10ms采集一次,主程序中通過判斷collection_temp_flag標(biāo)志位是否為1來采集溫度并將標(biāo)志位清除,以便下一次采集。同理,Test_On_Flag標(biāo)志位每100ms更新一次,用與采集ADC的電壓值和串口上傳數(shù)據(jù)。OLED_Show_Flag標(biāo)志位每100ms更新一次,用于刷新OLED顯示屏的內(nèi)容。要實現(xiàn)手機控制單片機進(jìn)行相關(guān)操作,手機需要向單片機下發(fā)數(shù)據(jù)包。單片機每次接收數(shù)據(jù)時,會開啟串口接收中斷。我們在接收中斷中定義了2個標(biāo)志位,key_flag_on標(biāo)志位對應(yīng)手機端的開/關(guān),key_flag_start標(biāo)志位對應(yīng)手機端的測試開啟。數(shù)據(jù)采集與預(yù)處理數(shù)據(jù)采集與預(yù)處理需要用到的硬件資源包括MQ-3酒精傳感器、DS18B20、大功率MOS管驅(qū)動電路模塊、聚酰亞胺加熱膜。驅(qū)動MQ-3酒精傳感器需要配置單片機的ADC外設(shè),驅(qū)動DS18B20需要配置引腳為輸出模式,驅(qū)動MOS管需要配置單片機引腳為輸出模式并配置一個定時器以控制輸出PWM的頻率和占空比。數(shù)據(jù)采集單片機配置ADC外設(shè)以采集MQ-3酒精傳感器AO引腳的電壓值,具體ADC初始化配置如圖5.7所示:圖5.7ADC配置ADC寄存器是16位寄存器,而ADC采集的數(shù)據(jù)是12位,選擇對齊方式為右對齊;因為只開啟的ADC1的一個通道,所以關(guān)閉掃描模式;開啟連續(xù)轉(zhuǎn)換模式、關(guān)閉非連續(xù)轉(zhuǎn)換模式,設(shè)置ADC1時鐘為12MHz,設(shè)置采樣時間239.5個周期,這樣ADC1的通道5(對應(yīng)引腳PA5)就會每21us采集一次電壓值。配置觸發(fā)方式為軟件觸發(fā),可以通過軟件配置標(biāo)志位開啟ADC的。ADC初始化后就可以通過PA5引腳采集數(shù)據(jù)了,具體代碼如圖5.8所示:圖5.8采集數(shù)據(jù)代碼上述代碼運行的前提是Test_On_Flag標(biāo)志位為1,所以每100ms運行一次。一次性采集20組數(shù)據(jù)并求平均值,smoke_concentration范圍從0-100。具體操作通過配置SR寄存器里的EOC位,等待EOC為1,得到一次轉(zhuǎn)換數(shù)據(jù),再手動將EOC位清零。上述代碼得到的smoke_concentration用于表示0-3.3V的電壓值,我們需要將smoke_concentration轉(zhuǎn)換為可以表示血液中酒精濃度的參數(shù)。我們可以在不同酒精濃度下用本系統(tǒng)測得的數(shù)據(jù)和標(biāo)準(zhǔn)人體血液內(nèi)酒精濃度傳感器測得的數(shù)據(jù)相比較,分析兩者之間的函數(shù)關(guān)系,從而建立酒精氣體濃度和人體血液內(nèi)酒精濃度的相關(guān)曲線,并進(jìn)行矯正。相關(guān)代碼如圖5.9所示:圖5.9獲取酒精濃度代碼當(dāng)Test_On_Flag標(biāo)志位為1時,串口會以100ms的周期向手機APP發(fā)送數(shù)據(jù),持續(xù)5秒。在最后一秒鐘時間里,求出平均酒精氣體濃度,并通過矯正函數(shù)對平均氣體濃度進(jìn)行矯正,得到人體血液內(nèi)酒精濃度。PID溫度控制MQ-3酒精傳感器的精度和準(zhǔn)度受溫度的影響很大,所以需要設(shè)計溫度控制算法,使傳感器在恒溫下工作。DS18B20溫度傳感器使用one-wire單總線驅(qū)動通過時序圖,配置引腳輸出相應(yīng)的高低電平,在DS18B20.c和DS18B20.h文件中完成傳感器驅(qū)動的相關(guān)代碼,驅(qū)動時序如圖5.10所示。圖5.10DS18B20驅(qū)動時序圖PID算法部分采用了增量式PID算法,增量式PID的原理已經(jīng)在第三章進(jìn)行了說明,具體代碼實現(xiàn)如圖5.11所示:圖5.11PID算法代碼當(dāng)實際溫度與設(shè)定溫度相差較大時,低電平時間pwm_high_time=100全速加熱;當(dāng)實際溫度與設(shè)定溫度相差不大時,進(jìn)行PID溫度控制,使用公式:低電平時間pwm_high_time=temp_contr_pid.uk=ΣΔu[n]。使用定時器6為大功率MOS管驅(qū)動電路模塊提供PWM波,使用CubeMX配置定時器6的相關(guān)寄存器,使定時器6每2ms進(jìn)入一次中斷。TIMER6_ON_FLAG標(biāo)志位在手機發(fā)送開機時置1,發(fā)送關(guān)機時置0;在定時器中pwm_high_time作為閾值,使PA1引腳產(chǎn)生周期為200ms的PWM波。具體代碼如圖5.12所示:圖5.12輸出PWM波代碼藍(lán)牙傳輸使用CubeMX配置串口的相關(guān)信息,配置UART1波特率為115200bps,字長8位,1位停止位,無奇偶校驗位。開啟UART1中斷,配置中斷優(yōu)先級。具體配置過程如圖5.13所示:圖5.13UART1配置手機和單片機通過藍(lán)牙以數(shù)據(jù)包的顯示傳輸數(shù)據(jù),數(shù)據(jù)包內(nèi)容包括包頭(0xA5)、原數(shù)據(jù)(包含邏輯值、字節(jié)值、短整型、整型值、浮點數(shù))、校驗位(數(shù)據(jù)內(nèi)各個字節(jié)之和的低八位)和包尾(0x5A)。手機APP使用藍(lán)牙調(diào)試器制作上位機,與單片機通信。發(fā)送數(shù)據(jù)包共4個字節(jié),原數(shù)據(jù)包括兩個邏輯值(bool型);接收數(shù)據(jù)包共9個字節(jié),原數(shù)據(jù)包括一個短整型(short型)和一個浮點數(shù)(float型);設(shè)置通信模式為僅操作控件時發(fā)送數(shù)據(jù),每100ms接收數(shù)據(jù)。控件編輯部分包括一個開關(guān)、一個按鈕(測試開始)、一個可編輯文本框(顯示平均酒精濃度)、一個Y-T一維波形圖(顯示實時濃度)。手機上位機部分見圖5.14所示。圖5.14(A)編輯控件界面 圖5.14(B)發(fā)送數(shù)據(jù)包結(jié)構(gòu) 圖5.14(C)接收數(shù)據(jù)包結(jié)構(gòu)在串口的接收中斷服務(wù)子程序中,對上位機發(fā)送的數(shù)據(jù)包進(jìn)行處理。首先判斷第一個字節(jié)和第四個字節(jié)是否是包頭和包尾,若是則表示正確接收上位機下發(fā)的數(shù)據(jù)。之后讀取原數(shù)據(jù)的內(nèi)容,并開啟相應(yīng)的標(biāo)志位,具體代碼如圖5.15所示:圖5.15串口中斷服務(wù)子程序同樣的當(dāng)單片機滿足上傳數(shù)據(jù)的條件時,需要編寫程序以數(shù)據(jù)包的形式發(fā)送。在valuepack.c和valuepack.h文件中編寫了相應(yīng)的打包程序,只需調(diào)用相關(guān)函數(shù)即可上傳數(shù)據(jù)包。發(fā)送指令放在判斷語句中,需要滿足開關(guān)開啟且測試開始開啟時才運行相關(guān)代碼。具體代碼如圖5.16所示: 圖5.16上傳數(shù)據(jù)代碼在上位機和單片機可以正常通信后,控制上位機的按鈕就可以控制單片機工作了,圖5.17所示。圖5.17手機操作界面截圖OLED顯示OLED屏幕有多種驅(qū)動方式,如SPI、IIC、8080并口等,本系統(tǒng)使用普通IO口模擬IIC的方式驅(qū)動OLED屏。在GUISlim.c、ssd1306.c、ssd1306_i2c.c文件中編寫了驅(qū)動OLED屏的相關(guān)函數(shù),在F08_ASCII.c文件中包含了ASCII的字庫。下面介紹幾個常見的函數(shù):GUI_Clear(),清屏函數(shù),會熄滅OLED屏上的所有像素點;GUI_DispStringAt(),在屏幕指定的像素點位置開始顯示字

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論