劉冠艷
(曲靖市麒麟職業(yè)技術(shù)學(xué)校,云南 曲靖 655000)
在嵌入式應(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)行了初步研究。
有刷直流電機(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]。
下位機(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));
圖1 卡爾曼濾波效果對(duì)比
發(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]。
卡爾曼濾波是一種常見(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。
上位機(jī)串口通訊軟件采用Visual studio2005 C#語(yǔ)言編寫,由于上位機(jī)和下位使用串口進(jìn)行通訊,因此在編寫上位機(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()方法。
由于需要傳遞的數(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ā)送。
綜上所述,在嵌入式應(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ù)。