1. 程式人生 > 實用技巧 >基於STM32的傾斜儀設計(三)—— 軟體設計

基於STM32的傾斜儀設計(三)—— 軟體設計

3.1 加速度讀取

在計算具體傾斜角之前,首先要得到各個軸的加速度資訊,即需要對加速度晶片傳來的電壓訊號的處理。

在ADC處理方面,通過微控制器的ADC通道將電壓訊號轉換為數字訊號。STM32微控制器的ADC通道是12位解析度的逐次比較型ADC。微控制器有18個ADC通道,可以對16個外部訊號源以及2個內部訊號源進行測量,其結果可以以左對齊或者右對齊的方式儲存在16位資料暫存器中。[10]

在進行ADC轉換時,我們可以利用u16 Get_ADC_Value(u8 ch,u8 times)函式對指定通道的電壓值進行讀取。在此函式中,ch代表所指定的取樣通道,在本設計中,選用的是PC1,PC2和PC3三個通道來分別對三個軸的加速度值進行讀取。times代表取樣次數,一般來說取樣次數越多,所得結果越精確,但所用時間也會越長,影響系統性能,因此需要權衡兩者的關係,本次設計中選用的是20次取樣,再對其取平均值。

由於ADC通道為12位,因此,滿量程3.3V對應的數字訊號為212=4096,故取樣出的數字訊號與原先的電壓值之間的關係為:

U=ADC4096*3.3 (3-1)

其中,U為調理電路對感測器輸出電壓處理之後的電壓值,ADC為取樣通道對電壓進行模數轉換之後的數字量。通過式(3-1),就可以將取樣所得的數字訊號準確的還原成為電壓值。於是,感測器的輸出電壓值為:

Ua=U2 (3-2)

其中,Ua為感測器輸出電壓值,U為調理電路輸出電壓值。

得到電壓值之後,根據表1所示的加速度與電壓關係,就可以很容易的得到三個軸的加速度值,如式(3-3)所示:

a=Ua-0.7720.229*g (3-3)

其中,a為各個軸的加速度,U

a為感測器輸出電壓值,g為當地重力加速度,通常取9.8m/s2

另外,需要注意的是,此加速度可正可負,取決於晶片各軸正方向與重力加速度方向的關係。所以在計算最終夾角的時候,不僅可以得到被測平面的傾斜角,還可以根據各軸加速度的正負對被測平面的具體形態加以分析。

3.2 傾角計算

3.2.1 單軸傾斜角的計算

本設計中,我們選用的是加速度計作為測量傾斜角的感測器,故理所當然的涉及到如何將各個軸的加速度轉換為傾斜角的問題。關於這種轉換方式,首先有較為簡單的單軸加速度測量方法。[2]其原理圖如圖3-1所示:

圖3-1 單軸傾斜角測量示意圖

在圖19的單軸傾斜角測量示意圖中,我們可以很容易的得出Z軸的傾斜角θ與Z軸加速度之間的關係為:

cosθ=AZg (3-4)

即:

θ=arccosAZg (3-5)

在(3-4)式和(3-5)式中,θ為Z軸與重力加速度方向的夾角,即被測平面與水平面之間的夾角;AZ為Z軸的加速度;g為當地的重力加速度,通常取9.8m/s2

此測量方式看起來簡單明瞭,只需要Z軸一個軸的加速度即可得出平面的傾斜角。但實際上,根據現有的研究經驗和實驗結果來看,由於微控制器ADC的進度限制,此種測量方式只有在平面傾斜角度較小時才能具有較高的精準度。當平面的傾斜角度增大時,用這種方式測量得出的傾斜角度會失去精準度,同時其靈敏度和解析度都會有顯著的下降。當傾斜角接近90度時,此方法測出的傾斜角完全偏離正確值。

基於上述考慮,單軸傾斜角測量的方式並不能勝任本設計的傾角測量方法,我們在本設計中需要拋棄這種看上去較為簡單的測量方式,另尋它法。

3.2.2 三軸傾斜角的計算

由於3.1.1中單軸傾斜角測量方式存在明顯的缺陷,我們在本設計中對其進行了改善:充分利用此次選用的三軸加速度計,結合三個軸的加速度,綜合分析,得出被測平面的加速度。其原理圖如圖3-2所示:

圖3-2 三軸傾斜角測量示意圖

在圖20所示三軸傾斜角測量示意圖中,XYZ三個軸是以被測平面為基準進行建立的座標軸,θ為被測平面與水平面之間的夾角。由加速度與夾角的關係可以很容易得到:

cosθ=AZg (3-6)

sinθ=AXYg (3-7)

在上式中,θ為被測平面與水平面之間的夾角;AZ為Z軸的加速度;AXY為X-Y平面的加速度;g為當地的重力加速度,通常取9.8m/s2

其中AXY可以由下式得到:

AXY=AX2+AY2 (3-8)

聯立(3-6)、(3-7)和(3-8)式可以得到θ與各個軸加速度之間的關係為:

tanθ=AX2+AY2AZ (3-9)

即:

θ=arctanAX2+AY2AZ (3-10)

在本設計中,將式(3-10)作為計算傾斜角的最終公式。應用此演算法進行傾斜角的計算,充分利用了三軸加速度。由於X-Y平面和Z軸相互垂直,AXY與傾斜角的正弦值成正比關係,AZ與傾斜角的餘弦值成正比關係。當傾斜角較小時,AXY的靈敏度和精確度較高,AZ的靈敏度和精確度較低;當傾斜角較大時,AZ的靈敏度和精確度較高,AXY的靈敏度和精確度較低。所以無論是被測平面處於什麼位置,都不會出現精確度很低的情況,即精確度基本恆定。採用此方法進行傾斜角的計算有利於提高本設計的穩定性。

結合3.1和3.2內容,本設計對角度讀取及計算流程圖如圖3-3所示:

圖3-3 角度計算流程圖

得出傾斜角度之後,系統會對傾角加以判斷,如果傾角大於閾值,會進行報警操作。閾值已在程式中初始化,也可以接收上位機的資訊對閾值進行修改。

3.3 通訊程式設計

3.3.1 通訊協議

在本系統通訊過程中,需要一定的通訊協議來進行資料的傳遞,規定產品在接收到固定指令時返回相應的資料,因此在進行通訊程式編寫之前,首先要對通訊協議進行一定的設計。在此次開發中,參照了市面上的傾斜儀通訊協議進行設計,[13]其資料幀格式如表3-1所示;

表3-1 資料幀格式

識別符號

(1位)

資料長度

(1位)

地址碼

(1位)

命令字

(1位)

資料域

(X位)

校驗和

(1位)

77

XX

XX

XX

根據資料而定

XX

其中,所有資料均為16進位制數,識別符號固定為0x77。資料長度定義為從資料長度為到校驗和位的位元組個數。命令字儲存著本協議規定的功能碼,產品接收到不同的命令字會進行對應的操作。資料域儲存著這一幀資料所攜帶的資料資訊,比如返回角度值時會將角度資料儲存在資料域中。校驗和的設計是用來檢驗所接收資料的正確性的,其值為資料長度、地址碼、命令字、和資料域按照十六進位制數的累加和。

根據此資料幀格式,本設計規定的讀取角度的命令幀如表3-2所示:

表3-2 讀取角度的命令幀格式

識別符號

(1位)

資料長度

(1位)

地址碼

(1位)

命令字

(1位)

校驗和

(1位)

77

04

00

04

08

在產品接收到上位機發送的讀取角度值的命令幀之後,返回被測平面的角度值,其返回資料規定格式如表3-3所示:

表3-3 返回角度值資料格式

識別符號

(1位)

資料長度

(1位)

地址碼

(1位)

命令字

(1位)

資料域

(9位)

校驗和

(1位)

77

0D

00

84

X軸角度(3位)

Y軸角度(3位)

被測平面角度

(3位)

XX

其中,每個角度值均由三位資料組成,分別表示:角度的正負,0表示正,1表示負;角度的整數值;角度的小數值。

除讀取被測平面的角度之外,上位機還會通過改變閾值的命令來對產品的角度閾值進行更改,其命令幀格式如表3-4所示:

表3-4 更改閾值的命令幀格式

識別符號

(1位)

資料長度

(1位)

地址碼

(1位)

命令字

(1位)

資料域

(2位)

校驗和

(1位)

77

06

00

20

角度值

XX

其中,角度值為兩位資料,分別為閾值的整數部分和小數部分。在產品正確接收到更改閾值的命令之後,會對此命令進行應答,向上位機確認已經對閾值進行了更改,此時返回的資料如表3-5所示:

表3-5 更改閾值時的應答資料格式

識別符號

(1位)

資料長度

(1位)

地址碼

(1位)

命令字

(1位)

資料域

(1位)

校驗和

(1位)

77

05

00

A0

00

A5

由於在進行資料傳輸時都是將資料轉換為16進位制之後再進行傳輸,如32°的角度值在進行傳輸時的資料為0x20,所以顯示在串列埠助手中的角度值為20,在讀數時需要再將其轉換為10進位制數。同樣的,在進行閾值設定時,也需要將10進位制的閾值轉換為16進位制數再進行輸入。

鑑於上述資料傳輸和讀數方式會引起人機互動極大的不便利,所以本產品的軟體設計中,在資料輸出和接收資料之前,對資料進行特殊處理,使得他們在串列埠助手上顯示時均為10進位制數,極大的增強了使用者體驗。

其中對輸出的角度資料的處理方式如式(3-11)所示:

A2=intA1/10*16+[A1-intA1/10*10] (3-11)

其中,A1為處理前的角度資料,A2為處理之後的資料。例如,若角度值為A1=20,處理之後的角度值為A2=32,在進行資料傳輸時的資料為0x20,即顯示出的角度資料為20,與原角度值相等,顯示方式更為直觀。

對輸入的閾值資料的處理方式如式(3-12)所示:

Y2=intY1/16*10+[Y1-intY1/16*16] (3-12)

同樣的,Y1為處理前的閾值資料,Y2為處理之後的閾值資料。例如,若輸入的閾值為Y1=0x20,處理之後的閾值即為Y2=20,對我們閾值設定的操作過程非常友好。

3.3.2 通訊流程

在本次設計中根據3.3.1中的通訊協議以及本產品的設計需求,將通訊流程設計如圖3-3所示:

圖3-3 產品通訊流程圖

由於本設計採用的SP3485晶片只能實現半雙工通訊,因此在切換接收和傳送模式時需要注意對使能引腳的處理。

在正常工作狀態下,系統處於等待接收上位機命令的模式下,使能引腳PA6置為低電平。如果上位機發送指令,微控制器進入接收中斷,將資料幀接收至快取區中。待接收完畢之後,將使能引腳PA6置為高電平,進入傳送模式,並對此資料幀進行分析,根據資料幀中的命令字做出相應的應答:如果命令字為04,則按照表6的應答資料幀格式向上位機發送角度資料;如果命令字為20,則讀取閾值資料並對預設閾值進行更改,再向上位機發送如表8所示的確認資訊。完成資訊應答之後,結束資訊傳送過程,再將使能引腳PA6置為低電平,進入接收模式,並將接收快取區清空,等待接收下一個命令。

其中,所使用的接收中斷函式為USART2_IRQHandler(),當微控制器檢測到上位機有資訊傳送過來時,就會進入此中斷函式,其函式內容如圖3-4所示:

圖3-4 接收中斷函式

其中,Rx[]為接收快取陣列,用於儲存上位機發送的資料,在一次應答結束之後清空;Rxcounter為陣列提供計數,可以用來表示資料存放的位置。

從接收中斷可以看出,本系統還加入了出錯處理機制,對每一個上位機傳來的命令都會進行檢驗,如果資料幀格式不符合通訊協議,系統將不對命令進行任何應答。這種糾錯機制可以防止系統接收到無意義資訊時進行應答,保持系統的穩定性。其具體檢驗方式為:

  1. 檢查資料的第一位識別符號是否為0x77,如果不是,整個資料將不會被接收。
  2. 判斷接收完成的標誌為接收到的最後一位資料與第二位資料之間的資料位數與資料幀中的資料長度位相等。
  3. 檢查校驗位是否等於從資料長度位到資料位所有資料的累加和,不滿足的話將不對此命令做出任何應答。

與此同時,系統主函式迴圈讀取角度資料,並在OLED顯示出來以供直觀顯示。另外將被測平面的傾斜角與閾值實時比較,如果傾斜角大於閾值則發出報警資訊,將紅色報警LED燈點亮。