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