基于STM32F103ZE+mpu6050+hmc5883L通過卡爾曼濾波串口輸出姿態角,數據經過融合,Z無漂移,絕對指向
單片機源程序如下:
- /* main.c file
- 功能:
- 1.初始化各個傳感器,
- 2.運行姿態解算和高度測量
- 3.將解算的姿態和各個傳感器的輸出上傳到 MiniIMU AHRS 測試軟件
- 4.響應 PC發送的命令
- ------------------------------------
- */
- #include "common.h" //包含所有的驅動 頭文件
- //上傳數據的狀態機
- #define REIMU 0x01 //上傳解算的姿態數據
- #define REMOV 0x02 //上傳傳感器的輸出
- #define REHMC 0x03 //上傳磁力計的標定值
- #define Upload_Speed 15 //數據上傳速度 單位 Hz
- #define upload_time (1000000/Upload_Speed)/2 //計算上傳的時間。單位為us
- int16_t ax, ay, az;
- int16_t gx, gy, gz;
- int16_t hx, hy, hz;
- int32_t Temperature = 0, Pressure = 0, Altitude = 0;
- uint32_t system_micrsecond;
- int16_t hmcvalue[3];
- u8 state= REIMU; //發送特定幀 的狀態機
- /**************************實現函數********************************************
- *函數原型: int main(void)
- *功 能: 主程序
- *******************************************************************************/
- int main(void)
- {
- int16_t Math_hz=0;
- unsigned char PC_comm; //PC 命令關鍵字節
- float ypr[3]; // yaw pitch roll
- /* 配置系統時鐘為72M 使用外部8M晶體+PLL*/
- SystemInit();
- delay_init(72); //延時初始化
- Initial_LED_GPIO(); //初始化STM32-SDK板子上的LED接口
- Initial_PWMLED();
- Initial_UART1(115200L);
- Initial_UART2(115200L);
- IIC_Init(); //初始化I2C接口
- delay_ms(300); //等待器件上電
- //UART1_Put_String("Initialize...\r\n");
- AHRS_init(); //初始化IMU和傳感器
- system_micrsecond=micros();
- while(1){ //主循環
-
- //delay_ms(1); //延時,不要算那么快。
- AHRS_getYawPitchRoll(ypr); //姿態更新
- printf("%f %f %f\r\n",ypr[1],ypr[2],ypr[0]);
- Math_hz++; //解算次數 ++
- BMP180_Routing(); //處理BMP018 事務 開啟轉換和讀取結果將在這個子程序中進行
- //-------------上位機------------------------------
- //是否到了更新 上位機的時間了?
- if((micros()-system_micrsecond)>upload_time){
- switch(state){
- case REIMU:
- BMP180_getTemperat(&Temperature); //讀取最近的溫度值
- BMP180_getPress(&Pressure); //讀取最近的氣壓測量值
- BMP180_getAlt(&Altitude); //讀取相對高度
- //UART1_ReportIMU((int16_t)(ypr[0]*10.0),(int16_t)(ypr[1]*10.0),
- //(int16_t)(ypr[2]*10.0),Altitude/10,Temperature,Pressure/10,Math_hz*16);
- //UART2_ReportIMU((int16_t)(ypr[0]*10.0),(int16_t)(ypr[1]*10.0),
- //(int16_t)(ypr[2]*10.0),Altitude/10,Temperature,Pressure/10,Math_hz*Upload_Speed);
-
- Math_hz=0;
- state = REMOV; //更改狀態。
- break;
- case REMOV:
- MPU6050_getlastMotion6(&ax, &ay, &az, &gx, &gy, &gz);
- HMC58X3_getlastValues(&hx,&hy,&hz);
- //UART1_ReportMotion(ax,ay,az,gx,gy,gz,hx,hy,hz);
- //UART2_ReportMotion(ax,ay,az,gx,gy,gz,hx,hy,hz);
- state = REIMU;
- break;
- default:
- state = REIMU;
- break;
- }//switch(state)
- system_micrsecond=micros(); //取系統時間 單位 us
- LED_Change(); //LED1改變亮度
- }
- //--------------------------------------------------
- //處理PC發送來的命令
- if((PC_comm=UART2_CommandRoute())!=0xff)
- {
- switch(PC_comm){ //檢查命令標識
- case Gyro_init: MPU6050_InitGyro_Offset(); break; //讀取陀螺儀零偏
- case High_init: BMP180_ResetAlt(0); break; //氣壓高度 清零
- }
- }// 處理PC 發送的命令
- }//主循環 while(1) 結束
- } //main
- //------------------End of File----------------------------
復制代碼
所有資料51hei提供下載:
Kalman_AHRS.7z
(308.96 KB, 下載次數: 298)
2019-7-10 19:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|