此次設計是利用stm32開發板設計的。數據采集系統是模擬域與數字域之間必不可少的紐帶,它的存在具有著非常重要的作用。本文介紹的重點是數據采集系統,而該系統硬件部分的重心在于單片機芯片。數據采集與通信控制采用了模塊化的設計,數據采集與通信控制采用了單片機STM32來實現,硬件部分是以單片機為核心,還包括A/D模數轉換模塊,顯示模塊。該系統從機負責數據采集并應答主機的命令。輸入數據是由模擬信號產生器產生,實現對采集到的數據進行模擬量到數字量的轉換,并用TFTLCD來顯示所采集的結果。軟件部分應用C語言編寫控制軟件,對數據采集系統、模數轉換系統、數據顯示、數據通信等程序進行了設計。 2 總體方案設計 多路巡回數據采集儀設計需要將模擬量轉換為數字量,而 A/D是將模擬量轉換為數字量的器件,STM32單片機是該系統的基本的微處理系統,它完成數據讀取、處理及邏輯控制、數據傳輸、數據轉換等一系列的任務,然后通過控制液晶屏顯示。 數據采集系統不僅需要硬件設置,還需要軟件的相應配置才能調試好硬件,使系統正常工作。硬件電路的調試與硬件設計和軟件配置息息相關。系統的硬件包括STM32核心板、液晶屏顯示、數據采集電路等。

圖1 系統框圖
此多路巡回數據采集儀的設計采用的是紅外傳感器,煙霧傳感器,利用二個模塊分別檢測外圍環境的變化,通過最后采集的數據來反映不同環境下的數據的不同。 3 硬件設計 3.1 各個模塊的實現 3.1.1 紅外對管傳感器 TCRT5000傳感器的紅外發射二極管不斷發射紅外線,當發射出的紅外線沒有被反射回來或被反射回來但強度不夠大時,紅外接收管一直處于關斷狀態,此時模塊的輸出端為高電平,指示二極管一直處于熄滅狀態;被檢測物體出現在檢測范圍內時,紅外線被反射回來且強度足夠大,紅外接收管飽和,此時模塊的輸出端為低電平,指示二極管被點亮。模擬輸出AO當發射管的紅外信號經反射被接收管接收后,接收管的電阻會發生變化,在電路上一般以電壓的變化形式體現出來,而經過ADC轉換或LM324等電路整形后得到處理后的輸出結果。電阻的變化起取于接收管所接收的紅外信號強度,常表現在反射面的顏色(反射率)、形狀和反射面接收管的距離等方面。 
圖3.1.1 紅外對管傳感器原理圖 3.1.2 煙霧傳感器 MQ-2型煙霧傳感器屬于二氧化錫半導體氣敏材料,屬于表面離子式N型半導體。處于200~300攝氏度時,二氧化錫吸附空氣中的氧,形成氧的負離子吸附,使半導體中的電子密度減少,從而使其電阻值增加。當與煙霧接觸時,如果晶粒間界處的勢壘收到煙霧的調至而變化,就會引起表面導電率的變化。利用這一點就可以獲得這種煙霧存在的信息,煙霧的濃度越大,導電率越大,輸出電阻越低,則輸出的模擬信號就越大。  圖3.1.2 煙霧傳感器原理圖
 3.2 顯示部分 本次設計采用的為TFT型液晶屏,TFT型的液晶顯示器較為復雜,主要的構成包括了熒光管、導光板、偏光板、濾光板、玻璃基板、配向膜、液晶材料、薄模式晶體管等等。首先液晶顯示器必須先利用背光源,也就是熒光燈管投射出光源,這些光源會先經過一個偏光板然后再經過液晶,這時液晶分子的排列方式進而改變穿透液晶的光線角度。然后這些光線接下來還必須經過前方的彩色的濾光膜與另一塊偏光板。因此我們只要改變刺激液晶的電壓值就可以控制最后出現的光線強度與色彩,并進而能在液晶面板上變化出有不同深淺的顏色組合了。 本次設計還有一個就是設置屏幕的背景圖,采用的是320*240的分辨率進行圖片采樣,利用圖片轉化軟件對選中的圖片進行采點,然后轉化成16進制的數字,然后放到庫里面,需要用的時候直接調用就可以了。
圖3.2 利用Img2Lcd軟件進行代碼生成 4 軟件設計 4.1 整體設計框圖 本軟件系統是基于STM32的庫函數下進行的編程。需要對庫函數進行調用并對相應的函數進行初始化。然后對采集的模擬信號進行轉換,通過對波特率的調整,對信號進行實時檢測,然后通過均值濾波,控制液晶顯示屏顯示最終得到的結果。 其具體架構如圖:
(a)主程序流程圖
4.2 ADC采樣 4.2.1 ADC原理 由于STM32自帶ADC模塊,所以只需要對其進行配置就可使用。12位ADC是一種逐次逼近型模擬數字轉換器。它有多達18個通道,可測量16個外部和2個內部信號源。各通道的A/D轉換可以單次、連續、掃描或間斷模式執行。ADC的結果可以左對齊或右對齊方式存儲在16位數據寄存器中。 模擬看門狗特性允許應用程序檢測輸入電壓是否超出用戶定義的高/低閥值。 ADC的輸入時鐘不得超過14MHz,它是由PCLK2經分頻產生。 本次設計采用了四路AD采樣ADC1-GPIOA1,ADC2-GPIOA2,ADC3-GPIOA3,ADC4-GPIOA4;利用四組不同的傳感器對環境的檢測,當達到對應的閾值時,控制相對應的器件。 
圖4.2.5 ADC的時序圖 5系統調試 首先,將電路連接好如圖正常工作,adc1為4095, 然后將紅外傳感器遮住,adc1變小為177
圖5.2調試 調試完成,正常工作。 6總結 STM32芯片具有非常強大的功能,還有非常全面的庫函數,應用起來非常方便。此次設計在最開始的時候我們遇到了很多的問題,不知道如何使用ADC采集但是后來通過小組的努力共同查閱資料和向實驗室的同學請教對ADC有了一定的了解,順利的完成了課設。在過程中也遇到了許多的問題,比如在使用開發板時接線的時候要細心,不能夠接錯線,在程序編寫的時候要查閱很多資料和借鑒資料,遇到問題要善于查閱資料找解決辦法等等。不過最終一一克服困難順利完成設計,實現了多路巡回數據采集設計。通過本次的設計對32有了更深刻的理解,提高了我們同學之間的團隊合作能力與實踐能力。
單片機源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "lcd.h"
- #include "ds18b20.h"
- #include "image2lcd.h"
- #include "adc.h"
-
- extern const u8 gImage_image1[];//圖片數據(包含信息頭),存儲在image1.c里面.
- int main(void)
- {
- u8 t=0;
-
- u16 adcx1,adcx2;
- float temp;
-
- HEADCOLOR *imginfo;
- short temperature;
- delay_init(); //延時函數初始化
- uart_init(9600); //串口初始化為9600
- LED_Init(); //初始化與LED連接的硬件接口
- LCD_Init();
- Adc_Init(); //ADC初始化
- LCD_Fill(0,0,470,350,WHITE);
- srand(imginfo->h*imginfo->w);
- image_display(0,0,(u8*)gImage_image1);//在指定地址顯示圖片
-
-
- while(DS18B20_Init()) //DS18B20初始化
- {
- LCD_ShowString(60,190,200,16,16,"DS18B20 Error");
- delay_ms(200);
- LCD_ShowString(60,210,200,16,16,"Temp: . C");
- }
-
- POINT_COLOR=BLUE;//設置字體為藍色
- LCD_ShowString(60,190,200,16,16,"DS18B20 OK");
- LCD_ShowString(60,210,200,16,16,"Temp: . C");
-
- POINT_COLOR=BLUE;//設置字體為藍色
- LCD_ShowString(60,230,200,16,16,"ADC1:");//傾倒
- LCD_ShowString(60,270,200,16,16,"ADC2:");//紅外
-
- POINT_COLOR=RED;//設置字體為紅色
- LCD_ShowString(120,250,48,16,16,"0.000V");
- LCD_ShowString(120,290,48,16,16,"0.000V");
-
- while(1)
- {
-
- adcx1=Get_Adc_Average(ADC_Channel_1,10);//ADC1煙霧傳感器 adcx2=Get_Adc_Average(ADC_Channel_2,10);//ADC2紅外傳感器
-
- POINT_COLOR=RED;//設置字體為紅色
- LCD_ShowxNum(120,230,adcx1,4,16,0);//顯示ADC的值
- LCD_ShowxNum(120,270,adcx2,4,16,0);//顯示ADC的值
-
- //第一個ADC轉換為電壓值
- temp=(float)adcx1*(3.3/4096);
- adcx1=temp;
- LCD_ShowxNum(120,250,adcx1,1,16,0);//顯示電壓值
-
- //第二個ADC轉換為電壓值
- temp=(float)adcx2*(3.3/4096);
- adcx2=temp;
- LCD_ShowxNum(120,290,adcx2,1,16,0);//顯示電壓值
-
-
-
- if(t%10==0)//每100ms讀取一次
- {
- temperature=DS18B20_Get_Temp();
- if(temperature<0)
- {
- LCD_ShowChar(60+40,210,'-',16,0); //顯示負號
- temperature=-temperature; //轉為正數
- }
- else
- LCD_ShowChar(60+40,210,' ',16,0); //去掉負號
- LCD_ShowNum(60+40+8,210,temperature/10,2,16); //顯示正數部分
- LCD_ShowNum(60+40+32,210,temperature%10,1,16); //顯示小數部分
- }
- delay_ms(10);
- t++;
- }
- }
復制代碼
全部資料51hei下載地址:
源程序.7z
(280.16 KB, 下載次數: 31)
2020-2-24 14:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
文檔.doc
(286.5 KB, 下載次數: 25)
2020-2-24 14:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|