傳感器型號:WT931
使用目的:獲取載體的俯仰(Pitch)、滾轉(Roll)和偏航(Yaw)等姿態資訊,
使用說明書下載:維特智能
使用大致步驟(主要根據說明書來):①使用USB-TTL 串口模塊連接傳感器和上位機軟體,在互動界面上設定需要讀取的傳感器采集資料,這里要獲取的是姿態角的變化量和變化率(不需要的就不勾選,這樣更不會浪費計算時間);②進行磁場校準,磁場校準要遠離強磁源(手動校準效果較差);③選好串口通信波特率,呼叫STM32f10x系列單片機的串口通信庫函式,④特別注意USAR T初始化函式的設定:匹配好波特率,引腳號、通道號、USART時鐘和GPIO時鐘,
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能USART時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIO時鐘
注意:九軸模式可以獲得精度更高的姿態,使用九軸模式之前一定要校準,不然Yaw的輸出會有很大的誤差,
使用說明書中,7.2上位機至模塊的這部分通信協議一般是不需要在寫入嵌入式芯片中的,因為這部分是用來做傳感器使用前設定的,這在上位機軟體上就可以實作,除非要實作多種模式在線切換,7.1模塊至上位機的才需要寫進主控芯片中,


需要獲取的是載體的姿態角和角速度,可以根據以下協議來撰寫串口中斷服務程式,


注:
1. 姿態角結算時所使用的坐標系為東北天坐標系,正方向放置模塊,如下圖所示向左為X軸,向前為Y軸,向上為Z軸,歐拉角表示姿態時的坐標系旋轉順序定義為為 Z-Y-X,即先繞Z軸轉,再繞Y軸轉,再繞X軸轉,

以下是串口中斷服務程式:
u16 USART_RX_STA=0; //接收狀態標記
u8 USART_RX_BUF[USART_REC_LEN]; //接識訓沖,最大USART_REC_LEN個位元組
int n=0;
void USART3_IRQHandler(void) //串口3中斷服務程式
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS為真,則需要支持OS
OSIntEnter();
#endif
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //串口接收中斷觸發
{
Res =USART_ReceiveData(USART3); //取當前接收的一個位元組
if(n<=10) //還沒接收到完整的一幀資料
{
if(Res==0x55&&n==0) USART_RX_STA|=0x8000; //檢測幀頭位元組,并在接收狀態暫存器上(最高位置1)做下標記
if(USART_RX_STA&0x8000)
{
if(n==1&&Res==0x53) USART_RX_STA|=0x4000; //檢測是否為角度幀,并在接收狀態暫存器上(高第二位置1)做下標記
if(n==1&&Res==0x52) USART_RX_STA|=0x2000; //檢測是否為角速度幀,并在接收狀態暫存器上(高第三位置1)做下標記
USART_RX_BUF[n]=Res ; //快取當前接收的這個位元組
USART_RX_STA++ ; //接收狀態暫存器記錄此幀資料的接收行程
n=USART_RX_STA&0x1FFF ; //轉接行程記錄
}
if(n==2)
{
if(((USART_RX_STA&0xf000)!=0xc000)&&((USART_RX_STA&0xf000)!=0xa000)) //檢測是否成功接收幀前兩位元組
{
USART_RX_STA=0 ; //接收狀態暫存器清零
n=USART_RX_STA&0x1FFF; //重新開始接收
}
}
}
if(n==11) //成功接收到一幀資料
{
if((USART_RX_STA&0xf000)==0xc000) //檢測是否為角度幀
{
RollL=USART_RX_BUF[2];
RollH=USART_RX_BUF[3];
PitchL=USART_RX_BUF[4];
PitchH=USART_RX_BUF[5];
YawL=USART_RX_BUF[6];
YawH=USART_RX_BUF[7];
TL=USART_RX_BUF[8];
TH=USART_RX_BUF[9];
SUM=USART_RX_BUF[10];
if(SUM==(0x55+0x53+RollH+RollL+PitchH+PitchL+YawH+YawL+TH+TL)%0x100) //和校驗,注意這里去除了高八位上的和
{
Roll=(short)((RollH<<8)|RollL)/32768.0*180;
Pitch=(short)((PitchH<<8)|PitchL)/32768.0*180;
Yaw=(short)((YawH<<8)|YawL)/32768.0 *180;
n=0; //資料處理完成
B=USART_RX_STA;
USART_RX_STA=0; //清零,待重新接收
}
else
{
USART_RX_STA=0 ;
n=0;
}
}
if((USART_RX_STA&0xf000)==0xa000) //檢測是否為角速度幀
{
wxL=USART_RX_BUF[2];
wxH=USART_RX_BUF[3];
wyL=USART_RX_BUF[4];
wyH=USART_RX_BUF[5];
wzL=USART_RX_BUF[6];
wzH=USART_RX_BUF[7];
TL=USART_RX_BUF[8];
TH=USART_RX_BUF[9];
SUM=USART_RX_BUF[10];
if(SUM==(0x55+0x52+wxH+wxL+wyH+wyL+wzH+wzL+TH+TL)%0x100) //和校驗,注意這里去除了高八位上的和
{
wx=(short)((wxH<<8)|wxL)/32768.0*2000;
wy=(short)((wyH<<8)|wyL)/32768.0*2000;
wz=(short)((wzH<<8)|wzL)/32768.0*2000;
n=0; //資料處理完成
A=USART_RX_STA;
USART_RX_STA=0; //清零,待重新接收
}
else //接收錯誤
{
USART_RX_STA=0 ;
n=0;
} //清零,待重新接收
}
}
if(n>=11) //資料處理結束
{
USART_RX_STA=0 ;
n=0;
} //清零,待重新接收
if(A==0xa00b&&B==0xc00b) USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);//本次串口中斷服務順利完成
}
#if SYSTEM_SUPPORT_OS //如果為SYSTEM_SUPPORT_OS真,則需要支持OS
OSIntExit();
#endif
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301353.html
標籤:其他
