希望有更好的可以一起分享上來
單片機源程序如下:
- /*********************************
- LEADIY-M3測試程序示例V2.2
- 作者: Colin
- 版權所有: 深圳市軟芯微電子科技有限公司
- 芯片型號: stm32f103CB
- *************************************/
- #include "string.h"
- #include "stm32f10x.h"
- #include "sys.h"
- #include "usart.h"
- #include "delay.h"
- #include "drv_Uart.h"
- int16_t Gyro[3], Acc[3], Angle[3], Mag[3];
- int32_t Altitude, Pressure;
- float Temper, GyroDPS[3], AccG[3], MagGauss[3], AngleDeg[3];
- /*讀兩個字節組成一個16位數*/
- int16_t ReadW(void)
- {
- unsigned char BufC;
- int16_t BufW;
-
- BufC = uartRead();
- BufW = (uint16_t)BufC;
- BufC = uartRead();
- BufW = (int16_t)(((uint16_t)BufC << 8) | BufW);
- return BufW;
- }
- int main(void)
- {
- unsigned char BufC;
- uint16_t BufW;
- /* 系統初始化*/
- systemInit();
- delay_ms(300);
- printf("LEADIY-M3 TEST V2\r\n");
- while (1)
- {
- if(uartAvailable()) //檢測是否收到LEADIY-M3數據
- {
- BufC = uartRead(); //讀一個字節
- if((BufC==0xA7)){ //判斷是否為幀 頭
- BufC = uartRead(); //讀一個字節
- if (BufC==0x7A) { //判斷是否為幀頭
- BufC = uartRead(); //讀一個字節
- switch(BufC) //幀類型判斷
- {
- case 0x70: //標識為角速度幀
- BufC = uartRead(); //幀長度,可不用
- BufC = uartRead(); //效驗位
- Gyro[0] = ReadW(); //X軸
- Gyro[1] = ReadW(); //Y軸
- Gyro[2] = ReadW(); //Z軸
- /*GYRO的量程為2000度每秒*/
- /* 得到以"dps" ("度/秒")為單位的角速度值*/
- GyroDPS[0] = (float)Gyro[0]*4/16.4;
- GyroDPS[1] = (float)Gyro[1]*4/16.4;
- GyroDPS[2] = (float)Gyro[2]*4/16.4;
- printf("GYRO X:%d Y:%d Z:%d\r\n", Gyro[0], Gyro[1], Gyro[2]);
- printf("GyroDPS X: %.2f, Y: %.2f, Z: %.2f\r\n", GyroDPS[0], GyroDPS[1], GyroDPS[2]);
- break;
- case 0x71: //標識為加速度幀
- BufC = uartRead(); //幀長度,可不用
- BufC = uartRead(); //效驗位
- Acc[0] = ReadW(); //X軸
- Acc[1] = ReadW(); //Y軸
- Acc[2] = ReadW(); //Z軸
- /*ACC的量程為8G*/
- /*得到以"g"為單位的加速度*/
- AccG[0] = (float)Acc[0] / 4096;
- AccG[1] = (float)Acc[1] / 4096;
- AccG[2] = (float)Acc[2] / 4096;
- printf("ACC X:%d Y:%d Z:%d\r\n", Acc[0], Acc[1], Acc[2]);
- printf("AccG X:%.2f Y:%.2f Z:%.2f\r\n", AccG[0], AccG[1], AccG[2]);
- break;
- case 0x72: //標識為姿態幀
- BufC = uartRead(); //幀長度,可不用
- BufC = uartRead(); //效驗位
- Angle[0] = ReadW(); //X軸角度(橫滾)
- Angle[1] = ReadW(); //Y軸角度(俯仰)
- Angle[2] = ReadW(); //Z軸角度(偏航)
- AngleDeg[0] = (float)Angle[0] / 100;
- AngleDeg[1] = (float)Angle[1] / 100;
- AngleDeg[2] = (float)Angle[2] / 100;
- if (AngleDeg[2]<0) AngleDeg[2] += 360; //將航向值轉化到0---360度區間
- printf("ANGLE X:%d Y:%d Z:%d \r\n", Angle[0], Angle[1], Angle[2]);
- printf("AngleDeg X:%.2f Y:%.2f Z:%.2f \r\n", AngleDeg[0], AngleDeg[1], AngleDeg[2]);
- break;
- case 0x73: //標識為 地磁幀
- BufC = uartRead(); //幀長度,可不用
- BufC = uartRead(); //效驗位
- Mag[0] = ReadW(); //X軸
- Mag[1] = ReadW(); //Y軸
- Mag[2] = ReadW(); //Z軸
- /*地磁設置為2.5Ga*/
- /*得到以"Gauss"為單位的地磁*/
- MagGauss[0] = (float)Mag[0] / 660;
- MagGauss[1] = (float)Mag[1] / 660;
- MagGauss[2] = (float)Mag[2] / 660;
- printf("Mag X:%d Y:%d Z:%d \r\n", Mag[0], Mag[1], Mag[2]);
- printf("MagGauss X:%.2f Y:%.2f Z:%.2f \r\n", MagGauss[0], MagGauss[1], MagGauss[2]);
- break;
- case 0x74: //標識為溫度、氣壓幀
- BufC = uartRead(); //幀長度,可不用
- BufC = uartRead(); //效驗位
- Temper = ReadW() / 10; //X軸
- BufW = ReadW(); //氣壓低16位
- Pressure = (int32_t)(((uint32_t)(ReadW() << 16))|BufW);
- printf("Temperature(Degree):%.2f Pressure(Pa):%d \r\n", Temper, Pressure);
- break;
- case 0x75: // 標識為高度幀
- BufC = uartRead(); //幀長度,可不用
- BufC = uartRead(); //效驗位
- BufW = ReadW(); //高度低16位
- /*得到以"CM"為單位的海拔高度*/
- Altitude = (int32_t)(((uint32_t)(ReadW() << 16))|BufW);
- printf("Altitude(cm):%d \r\n", Altitude);
- break;
- default: break;
- }
- }
- }
- }
- }
- }
復制代碼
所有資料51hei提供下載:
陀螺儀資料.rar
(1.09 MB, 下載次數: 23)
2018-6-2 03:45 上傳
點擊文件名下載附件
|