天天看點

移植MotionDriver到RTT

這個移植花費了我好多時間…

本來是想使用mpu6xxx的軟體包的,但是得到的資料抖動太厲害了

在網上找到了兩種得到穩定的資料的方法

  • DMP
  • Kalman濾波

看到DMP的效果更好,就選擇DMP的方案

了解到 InvenSense 公司提供的 MotionDriver 可以用DMP的方式讀取mpu,就開始移植 MotionDriver 這個庫

本項目的位址 https://github.com/greedyhao/MotionDriver2RTT

移植步驟

簡單的說,就是把 core/driver/eMPL/inv_mpu.c 這個檔案中需要使用到的函數實作就行了

這個檔案中也有相關說明

/* The following functions must be defined for this platform:
 * i2c_write(unsigned char slave_addr, unsigned char reg_addr,
 *      unsigned char length, unsigned char const *data)
 * i2c_read(unsigned char slave_addr, unsigned char reg_addr,
 *      unsigned char length, unsigned char *data)
 * delay_ms(unsigned long num_ms)
 * get_ms(unsigned long *count)
 * reg_int_cb(void (*cb)(void), unsigned char port, unsigned char pin)
 * labs(long x)
 * fabsf(float x)
 * min(int a, int b)
 */
           

不過實際需要實作的隻有 i2c_write i2c_read delay_ms get_ms,以及 core/driver/stm32L/log_stm32.c 下的 log_i 與 log_e 的底層函數

#define i2c_write   imu_i2c_write_regs
#define i2c_read    imu_i2c_read_regs 
#define delay_ms    thread_mdelay
#define get_ms      get_tick_count
#define log_i       MPL_LOGI
#define log_e       MPL_LOGE
#define min(a,b)    ((a<b)?a:b)
#define labs(n)     (((n) < 0) ? (-(n)) : (n))
           

i2c的實作

struct rt_mpu_device *mpu_dev;      

通過 mpu_dev 這個全局指針來儲存mpu裝置的相關資訊

不過全局指針的方式進行i2c通信不知道會不會不太好,暫時沒有其他方式實作

rt_err_t imu_i2c_write_regs(unsigned char slave_addr, unsigned char reg_addr, unsigned short length, const unsigned char *data_ptr)
{
    ...
    if (!rt_mpu_write_reg(mpu_dev, reg_addr, length, data_ptr))
    {
        res = RT_EOK;
    }
    ...
}

rt_err_t imu_i2c_read_regs(unsigned char slave_addr, unsigned char reg_addr, unsigned char length, unsigned char *data)
{
    ...    
    if (!rt_mpu_read_regs(mpu_dev, reg_addr, length, data))
    {
        res = RT_EOK;
    }
    ...
}
           

因為 rt-thread 的i2c接口和 MotionDriver 中需要的i2c接口不一緻,就寫了個中間層适配,從 MotionDriver 的i2c接口傳入的 slave_addr 直接使用 mpu_dev 中的位址,這樣就可以使用 rt-thread 的 i2c裝置架構了

i2c驅動的實作很重要,不然這個庫沒辦法用的,遇到問題先檢查i2c驅動的實作

其他函數

其他的函數都可以使用 rt-thread 系統中自帶函數

遇到問題

fifo overflow

卡在這個問題好久,偶然間從網上了解到,DMP程式要考慮到DMP資料的輸出速率

本項目中設定的是100Hz,讀取的速度也要相對應,不然就會overflow

為了防止溢出,我直接加大了fifo的大小,并加快了讀取速度

效果圖

現在資料穩得一批

移植MotionDriver到RTT

個人部落格

公衆号:greedyhao

繼續閱讀