完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前移植匿名四轴的代码,但是发现求出的Pitch与Roll一直不断的增加,静止放着也不行。 注:I2C我用的是匿名四轴的。但是要注意,官方的那个编程方式很像Linux,调用一个函数,成功的时候返回的是0,异常时返回的是-1,-2等。这个地方需要注意一下。 ///////////////////////////////////////////////////////////////////////////////// int8_t i2cwrite(uint8_t addr, uint8_t reg, uint8_t len, uint8_t * data) { if(i2cWriteBuffer(addr,reg,len,data)) { return TRUE;//0 } else { return FALSE;//-1 } //return FALSE; } int8_t i2cread(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *buf) { if(i2cRead(addr,reg,len,buf)) { return TRUE;//0 } else { return FALSE;//-1 } //return FALSE; } ////////////////////////////////////////////////////////////////////////////////// const struct hw_s hw = { .addr = 0x68, .max_fifo = 1024, .num_reg = 118, .temp_sens = 340, .temp_offset = -521, .bank_size = 256 #if defined AK89xx_SECONDARY ,.compass_fsr = AK89xx_FSR #endif }; 上面这块是GNU C 的初始化, 在MDK里面是不能用的,要改成下面的 const struct hw_s hw={ 0x68, //addr 1024, //max_fifo 118, //num_reg 340, //temp_sens -521, //temp_offset 256 //bank_size }; 对了陀螺仪的状态初始化 static struct gyro_state_s st={ ®, &hw, {0}, &test }; 这里的一块初始化放到mpu_init函数里面去了,这里可以不管,所以初始化为0 struct gyro_reg_s { unsigned char who_am_i; unsigned char rate_div; unsigned char lpf; unsigned char prod_id; unsigned char user_ctrl; unsigned char fifo_en; unsigned char gyro_cfg; unsigned char accel_cfg; //unsigned char accel_cfg2; //unsigned char lp_accel_odr; unsigned char motion_thr; unsigned char motion_dur; unsigned char fifo_count_h; unsigned char fifo_r_w; unsigned char raw_gyro; unsigned char raw_accel; unsigned char temp; unsigned char int_enable; unsigned char dmp_int_status; unsigned char int_status; //unsigned char accel_intel; ...... }这个结构体里面的那三个必须注释掉,不然你直接把标准GNU C的初始化改成标准C的,那么数据会出现偏移的,上面的三个在库里面没有初始化,你对着源码看看就知道。 #define i2c_write i2cwrite #define i2c_read i2cread #define delay_ms delay_ms #define get_ms get_ms 这个是接口,其实上面的英文说得很清楚,之前我还很纠结这个get_ms到底怎么写,后来发现没用,可以对着源来430的代码看,这个get_ms就用了一次。 读出来的四元数数据是Q30的,就是放大2的30次方,做过定点数FFT的人应该很清楚怎么处理,你把读出来的数据除一下就行了。 还有一点是别忘记了IIC的初始化。。。。。。。。。。。这个错我犯了。。。。。。。。。。。。。。。 本帖最后由 _spetrel 于 2013-6-14 10:23 编辑 之前用匿名四轴的代码称植过来发现求出的Pitch与Roll一直不断的增加,不知道什么原因,静止放着也不行。 看了不少四元数的资料,能看懂,但是结合数据融合又糊了。加上卡尔漫数据也就那样,可能是我处理得有问题。偶然翻帖看到了DMP,于是打算移植过来看看。 花了两三的时间总算成功了。现在把一些移植过程中的问题给大家分享一下,顺带的附上源码。 I2C我用的是匿名四轴的,能用。但是要注意,官方的那个编程方式很像Linux,应该说用的是GNU C。在Linux下,调用一个函数,成功的时候返回的是0,异常时返回的是-1,-2等。但是一般人写的驱动成功都用1表示,失败用0表示。所以这点要注意一下。 ///////////////////////////////////////////////////////////////////////////////// int8_t i2cwrite(uint8_t addr, uint8_t reg,uint8_t len, uint8_t * data) { if(i2cWriteBuffer(addr,reg,len,data)) { return TRUE;//0 } else { return FALSE;//-1 } //return FALSE; } int8_t i2cread(uint8_t addr, uint8_t reg,uint8_t len, uint8_t *buf) { if(i2cRead(addr,reg,len,buf)) { return TRUE;//0 } else { return FALSE;//-1 } //return FALSE; } ////////////////////////////////////////////////////////////////////////////////// const struct hw_s hw = { .addr = 0x68, .max_fifo = 1024, .num_reg = 118, .temp_sens = 340, .temp_offset = -521, .bank_size = 256 #if defined AK89xx_SECONDARY ,.compass_fsr = AK89xx_FSR #endif }; 上面这块是GNU C 的初始化,在MDK里面是不能用的,要改成下面的 const struct hw_s hw={ 0x68, //addr 1024, //max_fifo 118, //num_reg 340, //temp_sens -521, //temp_offset 256 //bank_size }; 对了陀螺仪的状态初始化 static struct gyro_state_s st={ ®, &hw, {0}, &test }; 这里的一块初始化放到mpu_init函数里面去了,这里可以不管,所以初始化为0 struct gyro_reg_s { unsigned char who_am_i; unsigned char rate_div; unsigned char lpf; unsigned char prod_id; unsigned char user_ctrl; unsigned char fifo_en; unsigned char gyro_cfg; unsigned char accel_cfg; //unsigned char accel_cfg2; //unsigned char lp_accel_odr; unsigned char motion_thr; unsigned char motion_dur; unsigned char fifo_count_h; unsigned char fifo_r_w; unsigned char raw_gyro; unsigned char raw_accel; unsigned char temp; unsigned char int_enable; unsigned char dmp_int_status; unsigned char int_status; //unsigned char accel_intel; ...... }这个结构体里面的那三个必须注释掉,不然你直接把标准GNU C的初始化改成标准C的,那么数据会出现偏移的,上面的三个在库里面没有初始化,你对着源码看看就知道。 #define i2c_write i2cwrite #define i2c_read i2cread #define delay_ms delay_ms #define get_ms get_ms 这个是接口,其实上面的英文说得很清楚,之前我还很纠结这个get_ms到底怎么写,后来发现没用,可以对着源来430的代码看,这个get_ms就用了一次。 读出来的四元数数据是Q30的,就是放大2的30次方,做过定点数FFT的人应该很清楚怎么处理,你把读出来的数据除一下就行了。 |
|
相关推荐
|
|
谢谢分享谢谢分享谢谢分享
谢谢分享谢谢分享 谢谢分享 谢谢分享谢谢分享 谢谢分享 谢谢分享 谢谢分享谢谢分享谢谢分享 谢谢分享 谢谢分享 谢 谢 谢谢分享 谢谢分享 谢 谢 谢谢分享 谢谢分享 分 分 谢谢分享 谢谢分享 享 享 谢谢分享 谢谢分享 谢 谢 谢谢分享 谢谢分享 谢 谢 谢 谢谢分享 谢谢分享 分 分 谢谢 谢谢分享 谢谢分享 享 享 谢谢分 谢谢分享 谢谢分享 谢 谢 谢谢分 谢谢分享 谢 谢 谢谢分谢谢分享 谢 谢 谢谢谢谢 分 分 谢谢 享 享 |
|
|
|
|
|
哈哈哈,还好哈哈哈,分享哈哈哈,还好哈哈哈,分享
哈哈哈,还好哈哈哈,分享 哈哈哈,还好哈哈哈,分享 哈哈哈,还好哈哈哈,分享 |
|
|
|
|
|
2183 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2011 浏览 3 评论
4612 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2154 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2687 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 06:43 , Processed in 0.842198 second(s), Total 66, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号