mpu6050姿态解算 i2c需要上拉电阻吗

【求教】mpu-6050测试
连接没有错啊_arduino吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:40,596贴子:
【求教】mpu-6050测试
连接没有错啊收藏
( ⊙ o ⊙ )啊
难道我的板子有什么问题
1、arduino1.01太过时。砸掉换新。2、主程序不知道怎么写的,肯定写错了。砸掉换新。3、主程序里调用的支持库版本太旧。砸掉换新。
波特率选错了,要和程序里的一样
缺了两个上拉电阻
大哥T_T我连0 return都出不来啊,用的就是MPU6050_raw的code#include "I2Cdev.h"#include "MPU6050.h"// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation// is used in I2Cdev.h#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"#endif// class default I2C address is 0x68// specific I2C addresses may be passed as a parameter here// AD0 low = 0x68 (default for InvenSense evaluation board)// AD0 high = 0x69MPU6050//MPU6050 accelgyro(0x69); // &-- use for AD0 highint16_t ax, ay,int16_t gx, gy,// uncomment "OUTPUT_READABLE_ACCELGYRO" if you want to see a tab-separated// list of the accel X/Y/Z and then gyro X/Y/Z values in decimal. Easy to read,// not so easy to parse, and slow(er) over UART.#define OUTPUT_READABLE_ACCELGYRO// uncomment "OUTPUT_BINARY_ACCELGYRO" to send all 6 axes of data as 16-bit// binary, one right after the other. This is very fast (as fast as possible// without compression or data loss), and easy to parse, but impossible to read// for a human.//#define OUTPUT_BINARY_ACCELGYRO#define LED_PIN 13bool blinkState =void setup() {
// join I2C bus (I2Cdev library doesn't do this automatically)
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin();
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
// initialize serial communication
// (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
// it's really up to you depending on your project)
Serial.begin(38400);
// initialize device
Serial.println("Initializing I2C devices...");
accelgyro.initialize();
// verify connection
Serial.println("Testing device connections...");
Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
// use the code below to change accel/gyro offset values
Serial.println("Updating internal sensor offsets...");
Serial.print(accelgyro.getXAccelOffset()); Serial.print("\t"); // -76
Serial.print(accelgyro.getYAccelOffset()); Serial.print("\t"); // -2359
Serial.print(accelgyro.getZAccelOffset()); Serial.print("\t"); // 1688
Serial.print(accelgyro.getXGyroOffset()); Serial.print("\t"); // 0
Serial.print(accelgyro.getYGyroOffset()); Serial.print("\t"); // 0
Serial.print(accelgyro.getZGyroOffset()); Serial.print("\t"); // 0
Serial.print("\n");
accelgyro.setXGyroOffset(220);
accelgyro.setYGyroOffset(76);
accelgyro.setZGyroOffset(-85);
Serial.print(accelgyro.getXAccelOffset()); Serial.print("\t"); // -76
Serial.print(accelgyro.getYAccelOffset()); Serial.print("\t"); // -2359
Serial.print(accelgyro.getZAccelOffset()); Serial.print("\t"); // 1688
Serial.print(accelgyro.getXGyroOffset()); Serial.print("\t"); // 0
Serial.print(accelgyro.getYGyroOffset()); Serial.print("\t"); // 0
Serial.print(accelgyro.getZGyroOffset()); Serial.print("\t"); // 0
Serial.print("\n");
// configure Arduino LED for
pinMode(LED_PIN, OUTPUT);}void loop() {
// read raw accel/gyro measurements from device
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// these methods (and a few others) are also available
//accelgyro.getAcceleration(&ax, &ay, &az);
//accelgyro.getRotation(&gx, &gy, &gz);
#ifdef OUTPUT_READABLE_ACCELGYRO
// display tab-separated accel/gyro x/y/z values
Serial.print("a/g:\t");
Serial.print(ax); Serial.print("\t");
Serial.print(ay); Serial.print("\t");
Serial.print(az); Serial.print("\t");
Serial.print(gx); Serial.print("\t");
Serial.print(gy); Serial.print("\t");
Serial.println(gz);
#ifdef OUTPUT_BINARY_ACCELGYRO
Serial.write((uint8_t)(ax && 8)); Serial.write((uint8_t)(ax & 0xFF));
Serial.write((uint8_t)(ay && 8)); Serial.write((uint8_t)(ay & 0xFF));
Serial.write((uint8_t)(az && 8)); Serial.write((uint8_t)(az & 0xFF));
Serial.write((uint8_t)(gx && 8)); Serial.write((uint8_t)(gx & 0xFF));
Serial.write((uint8_t)(gy && 8)); Serial.write((uint8_t)(gy & 0xFF));
Serial.write((uint8_t)(gz && 8)); Serial.write((uint8_t)(gz & 0xFF));
// blink LED to indicate activity
blinkState = !blinkS
digitalWrite(LED_PIN, blinkState);}都是MPU6050 type的错,应该如何解决呢?
这个是不是还要I2Cdev upload以后才能看到啊,线怎么接呢
试试INT接 pin 2
确认接线,不同板子接线不一样。uno板:SDA是A4 SCL是A52560板:SDA是20 SCL是21
connection failed可能真的是虚焊= =。。。
你的中断没接
用3.3的电,5v容易烧。检查sda 和scl线。这两线不怕错的,不行就双线对调。
没见源码无法知道你的程序是否错。
connect fail 问题很多,有电的问题,也有线的问题,如果程序有校验语句就必须接中断线
楼主,你的arduino显示MPU6050,搞定了么?我现在也遇到同样的问题了,我的程序应该没错。希望能为我指导一下迷津!
uno看背面,有印上的scl.
我刚才试了一下,传回的数据显示乱码,仔细一看才发现IDE的波特率不一致
请问楼主是用什么方式测试6050的?我刚接触6050,怎么测试它有没有通过i2c跟我的单片机传输数据0 0 怎么测试它能测出倾角什么的。。
请问楼主是两轴的代码么?为什么只有两个参数?还有代码能共享么。。我Y轴偏移的快死掉了
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或查看: 3178|回复: 10
一个关于I2C电路布线问题(MPU6050)
主题帖子精华
新手上路, 积分 50, 距离下一级还需 0 积分
在线时间0 小时
5d19eec7ab965f48550a29aedd2ef548_590.jpg (0 Bytes, 下载次数: 0)
22:54 上传
用这个布线去,芯片是MPU6050三轴陀螺仪加速度计,很奇怪!
#define delays delay_ms(2)&&&& //
//初始化IIC
void IIC_Init(void)
{&&&&&&&&&
&&RCC-&APB2ENR|=1&&3;//先使能外设IO PORTB时钟 &&&&&&&
&GPIOB-&CRL&=0X00FFFFFF;//PB6,PB7
&GPIOB-&CRL|=0X;&&&
//产生IIC起始信号
void IIC_Start(void)
&SDA_OUT();&&&& //sda线输出
&IIC_SCL=1;
&IIC_SDA=1;
&&IIC_SDA=0;
就是设置那个delay的延时来控制I2C的读取速度,好奇怪的是,在读芯片存放地址的寄存器: WHO_AM_I的时候,DELAY可以取到2US没问题,但是读到数据寄存器时,这次
测的是X轴加速度,竟然 DELAY要弄到2MS才能读出数据,感觉很悲剧,结果试验了一下,一秒钟才出了5个数据左右(用串口打到PC机上扣去串口通讯目测的)。这个小板子是
玩四轴的,感觉有点小郁闷,不知1S打那么点数据够用不,所以在这里请教一下PCB的布线如上图,有什么需要注意的地方。&
主题帖子精华
在线时间1 小时
1&线长很短,周围又没其他干扰源
2&你的Bottom层应该是铺地了吧&.
通常&stm32这个速度,不需要加延时肯定也没什么问题,&你可以找找其他原因吧&。
主题帖子精华
新手上路, 积分 50, 距离下一级还需 0 积分
在线时间0 小时
回复【2楼】aleda303:
---------------------------------
我用原子哥的板子和自己的板子程序一样。。。。结果还是原子哥的板子跑的频率快,原子哥的板子线长比我长好多,线间距也差不多,但是唯一的区别是原子哥的板子出门都是直线,会不会是我出门的拐弯给弄了.... 都铺地了。。。感觉现在还勉强凑合。。刚才试试了电机开的情况下数据的抖动情况,感觉抖动不是很厉害。
主题帖子精华
在线时间334 小时
是不是这个模块的输出速度问题?
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 50, 距离下一级还需 0 积分
在线时间0 小时
回复【4楼】正点原子:
---------------------------------
三轴MPU6050模块都是用一个模块,拆过来拆过去。。。MPU6050里面说支持达到400KHZ的。估计是我的布线不太行,下次把两个引脚不弄相邻再试试
c593d0b9ff2e1395bfacf638_463.jpg (0 Bytes, 下载次数: 0)
22:54 上传
a394dd79bbba57c943e4a1ef_673.jpg (0 Bytes, 下载次数: 0)
22:54 上传
模块是用排插,然后芯片一往上插这样来做的,因为考虑到用你的板子是用杜邦线接的所以我后来又改用了杜邦线的接法,速度一样提不上去,感觉估计就是板子的问题
所以只能下次注意一点了。
主题帖子精华
新手上路, 积分 50, 距离下一级还需 0 积分
在线时间0 小时
回复【4楼】正点原子:
回复【3楼】aleda303:
---------------------------------
I2C读取那个芯片的时候我读WHO_AM_I寄存器,DELAY可以到2us而读数据寄存器就不行了,我从刚才想到这里越想越不明白啊。。求解-&-
主题帖子精华
在线时间334 小时
回复【6楼】小枫:
---------------------------------
是不是和你的代码有关系了,呵呵.MPU6050论坛有人发过代码,你参考下试试.
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 50, 距离下一级还需 0 积分
在线时间0 小时
回复【7楼】正点原子:
---------------------------------
恩恩我再调调。
主题帖子精华
新手上路, 积分 50, 距离下一级还需 0 积分
在线时间0 小时
终于解决了,是速度太快初始化没完成,所以读不出数据。把初始化调慢一点或者中间弄点间隔就OK了谢谢原子哥啊,看你的回复突然来灵感的说。
主题帖子精华
在线时间334 小时
回复【9楼】小枫:
---------------------------------
恭喜
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
中级会员, 积分 490, 距离下一级还需 10 积分
在线时间0 小时
回复【9楼】小枫:
---------------------------------楼主,你的MPU6050读取的数据准确吗
Powered byI2C器件一定要加上拉电阻吗?最近碰到i2c器件的上拉电阻接错,导致通讯不正常,那么i2c需要上拉电阻么,多大合适
从网上搜集了一些回答:
1).最近看一些关于AT24C02的电路图,发现有些在SDA,SCL这两个脚上接了4.4K或者10K的上拉电阻。有些没有加上拉电阻。
根据AT24C02的数据手册来看,是建议在实际使用中加上拉电阻的。
但一般情况下,在51单片机系统中,不加上拉电阻也是可以用的,也能够正确读写数据。
据我个人经验,我曾经有一次在板子上没有给24C02加上拉电阻,发现会出现数据读写不正确的情况,尤其是对新的芯片第一次读写的时候,可能会出现问题。当时一直很奇怪,不过由于懒惰,没有仔细检查到底是什么原因引起的。也不知道到底是不是因为没加上拉电阻的问题。
以51单片机为例,除了P0口,另外3个口内部都有弱上拉。所以似乎外部不用再加上拉电阻也可以。但是毕竟单片机内部上拉电阻能力有限,只能微弱上拉。
另外对于很多单片机,其内部有上拉电阻,但是无一例外,其上拉电阻的组织是比较大的,也就是说其上拉能力有限
1、根据I2C总线规范,总线空闲时两根线都必须为高;
这是规定,动不了的,不然什么叫标准呢?其实所谓的这个神圣的标准也并不是多么邪乎,你想啊,只有是高的才能拉成低的,难道谁可以把低的拉成高的吗?所以这是之所以规定空闲时必须为高的一个原因,要是保持“低”的话,那是不可能成为“多主”总线的。
这是首先应该理解的。
2、上拉电阻的问题;
其实各个I2C接口工作时只检测高、低电平,管你有没有什么上拉电阻呢!
但问题是,你要是直接接电源的来实现高的话,一旦其他器件拉低时岂不危险?
所以,这个上拉电阻有保护作用。如果你确信直接接电源没问题(比如有短路保护等,呵呵),也可以试一试,问题的关键是主器件要能正确的拉低或置高,从器件要能明确地区分高、低就可以了,这是问题的关键,当然,还有时序问题,不能混乱!
但你设计产品时不能这样,玩玩可以的,哈!
3、电阻大小的问题;
最直接的,牵涉到两方面的问题,首先是功耗的问题,其次是速度的问题,二者是矛盾的!如果你想尽量提高速度,那么就牵涉到总线电容的问题,其实很容易理解,上拉电阻与总线的电容形成了RC,高速时将直接影响通讯!因为总线拉高时有个充电时间以及高电平的阀值,如果还没有充电到足以保证从器件可以识别的高电平的阀值时主器件就以为完成了一个总线动作的话,那么通讯肯定是不能进行的!
如果你想尽可能降低功耗,那么就要尽可能增大电阻以最大可能的减小电路各部分的消耗电流从而实现整体降低功耗!但不可能无限大,否则充电时间你会受不了的!
因为,IIC的工作原理是:1。stop:&SDA=H,SCL=H&,&2&。start&:&SDA=H--&L,SCL=H&
所以,在起始条件下,应该是stop&。那么就必须上拉。
&I2C上拉电阻确定有一个计算公式:
Rmin={Vdd(min)-o.4V}/3mA
Rmax=(T/0.874)&*c,&&&T=1us&100KHz,&T=0.3us&400KHz
C是Bus&capacitance
关于iic的上拉电阻,个人最好的方式就是看参考设计,如果走线长了或好总线上有好几个芯片,就把电阻改小一些。如果参考设计没有就在1.5K~5k左右里面选一个就是了。像19楼说的确实有计算公式可以计算,但实际的时候我们没有去测量总线的电容问题,只能在选件/走线时候给与些许的关注。
如果只有一个设备10K是没关系,设备多了就要考虑驱动能力,用1k,1.5k,2.2K都比较好
低速100khz的I2C上拉一般是10K,高速I2C(400kz)上拉选择1k
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7069次
排名:千里之外
原创:14篇
(1)(4)(6)(2)(1)(4)(3)(1)查看: 510|回复: 5
用mpu6050时I2C读取速度太慢怎么办
滞后速度太大太大
I2C速度是比较慢,但还是可以用的啊,不会很大滞后
求解,i2c很慢
求解,i2c很慢
这个是i2c的特点。
i2c最大波特率为400k,实际上很多时候400k都不稳定的,一般都很慢的。
你好,为题解决了么?最近遇到同样问题,程序也是醉了,能分享一下么?
山外飞思卡尔智能车论坛

我要回帖

更多关于 mpu6050 的文章

 

随机推荐