劉冠艷
(曲靖市麒麟職業(yè)技術學校,云南 曲靖 655000)
在嵌入式應用開發(fā)中,常常需要對傳感器的數據進行采集。為保證傳感器采集數據的精度,必須使用單精度或雙精度浮點數進行采集,但是浮點數據在計算機內部存儲的結構有別于其他類型的數據,同時由于傳輸的過程中存在丟包和干擾現象,為實現在上位機和下位機之間浮點數據的采集,本文使用STM32位處理器作為下位機主控,對PC上位機和下位機之間的通訊機制進行了初步研究。
有刷直流電機[2]調速系統(tǒng)由有刷直流電機、電機驅動模塊、STM32F103C8T6最小開發(fā)板模塊、霍爾編碼器構成。在使用開發(fā)版板串口時,首先對相關寄存器初始化設置,以使串口發(fā)送接收數據。同時在實際應用時為了保證一定的精度,傳感器采集的數據通常是浮點數據[3],串口發(fā)送接收時需要對浮點數據進行處理:發(fā)送時將浮點數據轉換成字節(jié)數據,接收數據時將字節(jié)數據轉換成浮點數據[4]。
下位機硬件串口和上位機串口屬性設置類似,具體代碼如下:
RCC->APB2ENR|=1<<2;//使能串口 1 時鐘
GPIOA->CRH&=0XFFFFFF0F;
GPIOA->CRH|=0X000000B0;//設置PA口輸入輸出模式
RCC->APB2RSTR|=1<<14;//串口復位
RCC->APB2RSTR&=~(1<<14);//停止串口復位
USART1->BRR=mantissa;//設置串口波特率
USART1->CR1|=0X200C;//一位停止位,無校驗
USART1->CR1|=1<<8;//串口中斷使能 USART1->CR1|=1<<5;//接收緩沖區(qū)非空中斷使能
MY_NVIC_Init(2,1,USART1_IRQn,2);//設置串口中斷優(yōu)先級
由于下位機串口發(fā)送接收的是字節(jié)數據,需要將字節(jié)數據轉換成浮點數據[5],通過下列語句進行轉換,x為緩沖區(qū)接收到的字節(jié)變量,y為浮點數據。
y=(*(float*)&x));
圖1 卡爾曼濾波效果對比
發(fā)送數據時需要將浮點數據轉換成字節(jié)收據進行發(fā)送,使用下列語句進行轉換。x為緩沖區(qū)接收到的字節(jié)變量,y為浮點數據[6]。
卡爾曼濾波是一種常見的時域濾波方法,該方法可以根據系統(tǒng)的輸入輸出觀測數據,對系統(tǒng)狀態(tài)進行最優(yōu)估計[7]。該濾波算法[8]可以有效剔除系統(tǒng)中的隨機噪聲和干擾的影響,便于計算機編程實現,并能夠對現場采集的數據進行實時更新和處理,因此,在許多方面得到了廣泛應用。濾波效果見圖1。
上位機串口通訊軟件采用Visual studio2005 C#語言編寫,由于上位機和下位使用串口進行通訊,因此在編寫上位機軟件時必須引用System.IO.Ports命名空間,在程序開頭部分使用下列語句:using System.IO.Ports。
引用后創(chuàng)建串口變量并對它的屬性進行設置,并將串口serialPort的波特率設置為9600kbs,8位數據位,一個停止位,無奇偶校驗。
在程序中使用Read()方法讀取緩沖區(qū)的數據,發(fā)送數據使用serialPort2.Write()方法,為了實時觀察傳感變化的情況,上位機軟件需要須用到chart控件,使用時應在程序開頭部分引用下列語句:System.Windows.Forms.DataVisualization.Charting
需對chart控件的ChartAreas["ChartArea1"].AxisY屬性的MajorTickMark、MinorTickMark進行設置,添加點使用chart1.Series["Series1"].Points的AddXY()方法。
由于需要傳遞的數據大部分是浮點數據,而浮點數據在內存中占用4個字節(jié),并且在STM32F103C8T6和PC中都是小端存儲模式,所以PC上位機和下位機之間通訊封裝了7個字節(jié)的數據包,其格式是:
FF M f1 f2 f3 f4 0A
FF代表數據包開始,M代表傳送數據類型,f1-f4代表4個字節(jié)浮點數據,0A表示數據結束。上位機發(fā)送7個字節(jié)的數據包,下位機串口接收到數據進行中斷響應,在單片機內部中斷響應的過程如下:首先對接收到的數據進行解包,如果數據封裝完整,單片就把設置好的數據發(fā)送給上位機,如果單片機中斷響應沒有正確獲得數據包,直接進行丟包處理。上位機接收到數據,產生接收數據事件觸發(fā)響應,上位機響應后檢查設置的數據是否一致,如果一致,就在上位機上相應控件顯示,并且生成日志,以便查看參數設置記錄,上位機檢查如果發(fā)現設置參數不一致,再重新發(fā)送。
綜上所述,在嵌入式應用開發(fā)中,上位機和下位機之間通過串口進行通訊時,由于傳感器存在各種干擾因素,需要對獲取的數據進行濾波,在本文中使用卡爾曼濾波的方法進行濾波,獲得了較好的效果。同時由于整個通訊過程存在數據丟失時或者干擾的可能,需對數據進行封裝和丟包處理,以便能夠正確解析通訊數據。