基於Apollo3 Blue MCU晶片的可穿戴產品解決方案開發之六軸加速度感測器適配
阿新 • • 發佈:2022-04-07
一 前記
MPU-60X0 是全球首例9 軸運動處理感測器。它集成了3 軸MEMS 陀螺儀,3 軸MEMS加速度計,以及一個可擴充套件的數字運動處理器DMP(Digital Motion Processor),可用I2C介面連線一個第三方的數字感測器,比如磁力計。擴充套件之後就可以通過其I2C 或SPI 介面輸出一個9 軸的訊號(SPI 介面僅在MPU-6000 可用)。MPU-60X0 也可以通過其I2C 介面連線非慣性的數字感測器,比如壓力感測器。該感測器在可穿戴市場應用十分廣泛。把該感測器和超低功耗的mcu晶片結合,可以實現穿戴式裝置的小尺寸,超長待機等特點。
二 原始碼解析
筆者用的是該mcu晶片的I2C介面和該感測器做通訊介面,具體初始化程式碼如下:
uint32_t app_mpu6050_init(void) { int ret = 0; //reset mpu6050 sensor_write(MPU_PWR_MGMT1_REG,0x80); am_util_delay_ms(100); //wake up mpu6050 sensor_write(MPU_PWR_MGMT1_REG,0x00); MPU_Set_Gyro_Fsr(3); MPU_Set_Accel_Fsr(0); MPU_Set_Rate(50); sensor_write(MPU_INT_EN_REG,處理函式:0x00); // close all irq sensor_write(MPU_USER_CTRL_REG,0x00); // i2c master closed sensor_write(MPU_FIFO_EN_REG,0x00); // close fifo mode sensor_write(MPU_INTBP_CFG_REG,0x80); //init low en uint8_t rx_addr = 0; rx_addr = sensor_read(MPU_DEVICE_ID_REG); am_util_stdio_printf("i2c rx addr is:0x%x \n\r",rx_addr); if(rx_addr == MPU_ADDR) { sensor_write(MPU_PWR_MGMT1_REG,0x01); sensor_write(MPU_PWR_MGMT2_REG,0x00); //acceleration and gyros MPU_Set_Rate(50); //設定取樣率為50Hz } else { am_util_stdio_printf("app_mpu6050_init failed:0x%x \n",ret); return 1; } am_util_stdio_printf("app_mpu6050_init success:0x%x \n",ret); return 0; }
void app_mpu6050_process(void) { short aacx,aacy,aacz; short gyrox,gyroy,gyroz; uint32_t i2c_cnt = 0; while(1) { short temp_per = MPU_Get_Temperature(); MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); MPU_Get_Accelerometer(&aacx,&aacy,&aacz); am_util_stdio_printf("get_temp:%d \n",temp_per); am_util_stdio_printf("get_gyroscope is x:%d y:%d z:%d \n",gyrox,gyroy,gyroz); am_util_stdio_printf("get_acceleromoeter is x:%d y:%d z:%d \n",aacx,aacy,aacz); am_util_delay_ms(1000); am_util_stdio_printf("i2c_cnt:%d \n",i2c_cnt++); }; }這裡I2C的介面協議屬於標準協議,只需要自己完成函式封裝即可,這裡不做贅述了。 三 效果展示: 從列印資訊來看,資料能完整讀取展現出來,如下圖所示:
這裡接下來就是根據實際的應用,來做不同的演算法處理了。