劉冠艷
【摘 要】在嵌入式開(kāi)發(fā)過(guò)程中,對(duì)傳感器采集數(shù)據(jù)時(shí)常常使用浮點(diǎn)數(shù)據(jù)以提高精度,但是浮點(diǎn)數(shù)據(jù)在計(jì)算機(jī)內(nèi)部有別于其他類型的數(shù)據(jù)存儲(chǔ)并且在傳輸?shù)倪^(guò)程中存在丟包的現(xiàn)象,因此需要在上位機(jī)和下位機(jī)之間制定好一定的通訊機(jī)制,以避免使整個(gè)數(shù)據(jù)采集系統(tǒng)處于故障狀態(tài)而無(wú)法運(yùn)行[1]。為了去除傳感器各種噪聲的干擾,使用了卡爾曼濾波的方法對(duì)獲取的數(shù)據(jù)進(jìn)行濾波,整個(gè)傳感器采集系統(tǒng)獲得了較好的效果。
【Abstract】In the process of embedded development, floating-point data is often used to improve the accuracy of the sensor data acquisition, but the floating point data is different from other types of data storage inside the computer and there exists packet loss in the process of transmission. Therefore, a good communication mechanism between the upper monitor and the lower computer is needed, so as to avoid the failure of the entire data acquisition system and can not operate[1]. In order to remove the interference of various noises of the sensor, the method of Kalman filtering is
used to filter the obtained data, and the whole sensor acquisition system has achieved good results.
【關(guān)鍵詞】串口通訊;傳感器;數(shù)據(jù)采集
【Keywords】 serial communication; sensor; data acquisition
【中圖分類號(hào)】TP391 【文獻(xiàn)標(biāo)志碼】A 【文章編號(hào)】1673-1069(2018)09-0123-02
1 引言
在嵌入式應(yīng)用開(kāi)發(fā)中,常常需要對(duì)傳感器的數(shù)據(jù)進(jìn)行采集。為保證傳感器采集數(shù)據(jù)的精度,必須使用單精度或雙精度浮點(diǎn)數(shù)進(jìn)行采集,但是浮點(diǎn)數(shù)據(jù)在計(jì)算機(jī)內(nèi)部存儲(chǔ)的結(jié)構(gòu)有別于其他類型的數(shù)據(jù),同時(shí)由于傳輸?shù)倪^(guò)程中存在丟包和干擾現(xiàn)象,為實(shí)現(xiàn)在上位機(jī)和下位機(jī)之間浮點(diǎn)數(shù)據(jù)的采集,本文使用STM32位處理器作為下位機(jī)主控,對(duì)PC上位機(jī)和下位機(jī)之間的通訊機(jī)制進(jìn)行了初步研究。
2 下位機(jī)設(shè)計(jì)
有刷直流電機(jī)[2]調(diào)速系統(tǒng)由有刷直流電機(jī)、電機(jī)驅(qū)動(dòng)模塊、STM32F103C8T6最小開(kāi)發(fā)板模塊、霍爾編碼器構(gòu)成。在使用開(kāi)發(fā)版板串口時(shí),首先對(duì)相關(guān)寄存器初始化設(shè)置,以使串口發(fā)送接收數(shù)據(jù)。同時(shí)在實(shí)際應(yīng)用時(shí)為了保證一定的精度,傳感器采集的數(shù)據(jù)通常是浮點(diǎn)數(shù)據(jù)[3],串口發(fā)送接收時(shí)需要對(duì)浮點(diǎn)數(shù)據(jù)進(jìn)行處理:發(fā)送時(shí)將浮點(diǎn)數(shù)據(jù)轉(zhuǎn)換成字節(jié)數(shù)據(jù),接收數(shù)據(jù)時(shí)將字節(jié)數(shù)據(jù)轉(zhuǎn)換成浮點(diǎn)數(shù)據(jù)[4]。
2.1下位機(jī)串口硬件初始化
下位機(jī)硬件串口和上位機(jī)串口屬性設(shè)置類似,具體代碼如下:
RCC->APB2ENR|=1<<2; //使能串口1時(shí)鐘
GPIOA->CRH&=0XFFFFFF0F;
GPIOA->CRH|=0X000000B0;//設(shè)置PA口輸入輸出模式
RCC->APB2RSTR|=1<<14; //串口復(fù)位
RCC->APB2RSTR&=~(1<<14);//停止串口復(fù)位
USART1->BRR=mantissa; //設(shè)置串口波特率
USART1->CR1|=0X200C; //一位停止位,無(wú)校驗(yàn)
USART1->CR1|=1<<8; // 串口中斷使能USART1->CR1|=1<<5;// 接收緩沖區(qū)非空中斷使能
MY_NVIC_Init(2,1,USART1_IRQn,2);//設(shè)置串口中斷優(yōu)先級(jí)
由于下位機(jī)串口發(fā)送接收的是字節(jié)數(shù)據(jù),需要將字節(jié)數(shù)據(jù)轉(zhuǎn)換成浮點(diǎn)數(shù)據(jù)[5],通過(guò)下列語(yǔ)句進(jìn)行轉(zhuǎn)換,x為緩沖區(qū)接收到的字節(jié)變量,y為浮點(diǎn)數(shù)據(jù)。
y=(*(float *)&x;));
發(fā)送數(shù)據(jù)時(shí)需要將浮點(diǎn)數(shù)據(jù)轉(zhuǎn)換成字節(jié)收據(jù)進(jìn)行發(fā)送,使用下列語(yǔ)句進(jìn)行轉(zhuǎn)換。x為緩沖區(qū)接收到的字節(jié)變量,y為浮點(diǎn)數(shù)據(jù)[6]。
(*(float *)&x;)=y;
2.2 卡爾曼濾波
卡爾曼濾波是一種常見(jiàn)的時(shí)域?yàn)V波方法,該方法可以根據(jù)系統(tǒng)的輸入輸出觀測(cè)數(shù)據(jù),對(duì)系統(tǒng)狀態(tài)進(jìn)行最優(yōu)估計(jì)[7]。該濾波算法[8]可以有效剔除系統(tǒng)中的隨機(jī)噪聲和干擾的影響,便于計(jì)算機(jī)編程實(shí)現(xiàn),并能夠?qū)ΜF(xiàn)場(chǎng)采集的數(shù)據(jù)進(jìn)行實(shí)時(shí)更新和處理,因此,在許多方面得到了廣泛應(yīng)用。濾波效果見(jiàn)圖1。
3 上位機(jī)設(shè)計(jì)
上位機(jī)串口通訊軟件采用Visual studio2005 C#語(yǔ)言編寫(xiě),由于上位機(jī)和下位使用串口進(jìn)行通訊,因此在編寫(xiě)上位機(jī)軟件時(shí)必須引用System.IO.Ports命名空間,在程序開(kāi)頭部分使用下列語(yǔ)句:using System.IO.Ports。
引用后創(chuàng)建串口變量并對(duì)它的屬性進(jìn)行設(shè)置,并將串口serialPort的波特率設(shè)置為9600kbs,8位數(shù)據(jù)位,一個(gè)停止位,無(wú)奇偶校驗(yàn)。
在程序中使用Read()方法讀取緩沖區(qū)的數(shù)據(jù),發(fā)送數(shù)據(jù)使用serialPort2.Write()方法,為了實(shí)時(shí)觀察傳感變化的情況,上位機(jī)軟件需要須用到chart控件,使用時(shí)應(yīng)在程序開(kāi)頭部分引用下列語(yǔ)句:System.Windows.Forms.DataVisualization.Charting
需對(duì)chart控件的ChartAreas["ChartArea1"].AxisY屬性的MajorTickMark、MinorTickMark進(jìn)行設(shè)置,添加點(diǎn)使用chart1.Series["Series1"].Points的AddXY()方法。
4 通信控制設(shè)計(jì)
由于需要傳遞的數(shù)據(jù)大部分是浮點(diǎn)數(shù)據(jù),而浮點(diǎn)數(shù)據(jù)在內(nèi)存中占用4個(gè)字節(jié),并且在STM32F103C8T6和PC中都是小端存儲(chǔ)模式,所以PC上位機(jī)和下位機(jī)之間通訊封裝了7個(gè)字節(jié)的數(shù)據(jù)包,其格式是:
FF M f1 f2 f3 f4 0A
FF代表數(shù)據(jù)包開(kāi)始,M代表傳送數(shù)據(jù)類型,f1-f4代表4個(gè)字節(jié)浮點(diǎn)數(shù)據(jù),0A表示數(shù)據(jù)結(jié)束。上位機(jī)發(fā)送7個(gè)字節(jié)的數(shù)據(jù)包,下位機(jī)串口接收到數(shù)據(jù)進(jìn)行中斷響應(yīng),在單片機(jī)內(nèi)部中斷響應(yīng)的過(guò)程如下:首先對(duì)接收到的數(shù)據(jù)進(jìn)行解包,如果數(shù)據(jù)封裝完整,單片就把設(shè)置好的數(shù)據(jù)發(fā)送給上位機(jī),如果單片機(jī)中斷響應(yīng)沒(méi)有正確獲得數(shù)據(jù)包,直接進(jìn)行丟包處理。上位機(jī)接收到數(shù)據(jù),產(chǎn)生接收數(shù)據(jù)事件觸發(fā)響應(yīng),上位機(jī)響應(yīng)后檢查設(shè)置的數(shù)據(jù)是否一致,如果一致,就在上位機(jī)上相應(yīng)控件顯示,并且生成日志,以便查看參數(shù)設(shè)置記錄,上位機(jī)檢查如果發(fā)現(xiàn)設(shè)置參數(shù)不一致,再重新發(fā)送。
5 結(jié)論
綜上所述,在嵌入式應(yīng)用開(kāi)發(fā)中,上位機(jī)和下位機(jī)之間通過(guò)串口進(jìn)行通訊時(shí),由于傳感器存在各種干擾因素,需要對(duì)獲取的數(shù)據(jù)進(jìn)行濾波,在本文中使用卡爾曼濾波的方法進(jìn)行濾波,獲得了較好的效果。同時(shí)由于整個(gè)通訊過(guò)程存在數(shù)據(jù)丟失時(shí)或者干擾的可能,需對(duì)數(shù)據(jù)進(jìn)行封裝和丟包處理,以便能夠正確解析通訊數(shù)據(jù)。
【參考文獻(xiàn)】
【1】曾華, 馮浩, 趙浩. 有刷直流電機(jī)振動(dòng)轉(zhuǎn)矩的解析與實(shí)驗(yàn)研究[J]. 輕工機(jī)械, 2014, 32(1):70-74.
【2】王安陽(yáng), 劉歡. 直流有刷電機(jī)傳導(dǎo)發(fā)射特性和外置濾波電路數(shù)值試驗(yàn)研究[J]. 小型內(nèi)燃機(jī)與車輛技術(shù), 2017(6):18-23.
【3】顧萬(wàn)里, 張森, 胡云峰,等. 有刷直流電機(jī)非線性控制系統(tǒng)設(shè)計(jì)[J]. 吉林大學(xué)學(xué)報(bào)(工學(xué)版), 2017, 47(3):900-907.
【4】顧萬(wàn)里, 胡云峰, 張森,等. 有刷直流電機(jī)自適應(yīng)滑模控制器設(shè)計(jì)與實(shí)驗(yàn)[J]. 西安交通大學(xué)學(xué)報(bào), 2017, 51(9):112-117.
【5】李宗俐, 許芳, 梁頔男,等. 有刷直流電機(jī)約束預(yù)測(cè)控制器設(shè)計(jì)及實(shí)現(xiàn)[J]. 吉林大學(xué)學(xué)報(bào)(信息科學(xué)版), 2017, 35(4):363-369.
【6】蘇堅(jiān)堅(jiān), 陳少斌. 基于最小二乘測(cè)速方法的有刷直流電機(jī)調(diào)速[J]. 機(jī)電技術(shù), 2017(6):59-61.
【7】武立, 周云山, 張容川. 基于卡爾曼濾波的光電式扭矩傳感器研究[J]. 計(jì)算機(jī)仿真, 2017(11):275-279.
【8】趙美蓉, 于錦輝, 王進(jìn),等. 基于卡爾曼濾波的光纖壓力信號(hào)解調(diào)方法[J]. 納米技術(shù)與精密工程, 2017(5):353-359.