MPU6050陀螺仪读出的数据不改变
小弟最近在用lpc1768和MPU6050做2轮的平衡小车 在读MPU6050的原始数据时遇到了问题 加速度计的数据能够正确的读出来且数据一直在更新 但当读陀螺仪的数据时无论我怎么晃动传感器 只能读出1次数据或2次数据 接下来数据就一直不动了 传感器就好像不工作了一样 有没有大神啊 难道真的没人遇到过这个问题吗 还是我发错地方了 检查硬件电路看看,做技术,别毛躁,慢慢悠着来~~ 承諾依舊 发表于 2014-12-6 12:02 static/image/common/back.gif检查硬件电路看看,做技术,别毛躁,慢慢悠着来~~
能正确读出加速度计的数据 应该不是硬件的关系 软件IIC的时序也应该是对的 可能是手册哪个地方看漏了 但是那个英文手册真的看的蛋疼 这是我第一次发帖 你也是第一个回的 3Q 我换了一款单片机试了一下可以正确的读出加速度计和陀螺仪的数据 但是换到lpc1768时 读出来的数据不对了 而且数据更新了几次后 最后都变成oxff不变了 这个我的代码 :
void Start()
{
SetSCL;
SetSDA;
DelayuS(5);
ClrSDA;
DelayuS(5);
ClrSCL;
}
void Stop()
{
ClrSDA;
SetSCL;
DelayuS(5);
SetSDA;
DelayuS(5);
ClrSDA;
}
//写单字节数据
void Write(uint8_t sdate)
{
uint8_t i;
for(i=0;i<8;i++)
{
DelayuS(5);
if( (sdate&BIT7) == BIT7 )
SetSDA;
else
ClrSDA;
SetSCL;
DelayuS(5);
ClrSCL;
sdate = sdate<<1;
}
}
//等待应答 返回0则表示接受到非应答 有错误
uint8_t ACK()
{
SetSDA;
LPC_GPIO0->FIODIR &= (~BIT23);
SetSCL;
DelayuS(5);
if( (LPC_GPIO0->FIOPIN & BIT23) == BIT23 )
return 0;
ClrSCL;
LPC_GPIO0->FIODIR |= BIT23;
return 1;
}
//接受数据后发送应答
void send_ACK()
{
LPC_GPIO0->FIODIR |= BIT23;
ClrSDA;
SetSCL;
DelayuS(5);
ClrSCL;
}
//接收单字节数据
uint8_t receive()
{
uint8_t i,j,rdate;
j=0x80;
rdate = 0;
LPC_GPIO0->FIODIR &= (~BIT23);
for(i=0;i<8;i++)
{
SetSCL;
if( (LPC_GPIO0->FIOPIN & BIT23) == BIT23)
rdate |= j;
else
rdate &= ~j;
j = j>>1;
DelayuS(5);
ClrSCL;
DelayuS(5);
}
return rdate;
}
void SentData(uint8_t Slave_Address,uint8_t REG_Address,uint8_t REG_Data)
{
Start();
Write(Slave_Address);
ACK();
Write(REG_Address);
ACK();
Write(REG_Data);
ACK();
Stop();
DelaymS(2);
}
uint8_t Read_Gyro(uint8_t Slave_Address,uint8_t REG_Address)
{
Start();
Write(Slave_Address);
ACK();
Write(REG_Address);
ACK();
Start();
Write(Slave_Address+1);
ACK();
gxH = receive();
send_ACK();
gxL = receive();
send_ACK();
gyH = receive();
send_ACK();
gyL = receive();
send_ACK();
gzH = receive();
send_ACK();
gzL = receive();
Stop();
return 1;
}
uint8_t Read_Accel(uint8_t Slave_Address,uint8_t REG_Address)
{
Start();
Write(Slave_Address);
ACK();
Write(REG_Address);
ACK();
Start();
Write(Slave_Address+1);
ACK();
gxH = receive();
send_ACK();
gxL = receive();
send_ACK();
gyH = receive();
send_ACK();
gyL = receive();
send_ACK();
gzH = receive();
send_ACK();
gzL = receive();
Stop();
return 1;
}
int main(void)
{
SystemInit(); // 主要完成系统时钟初始化等功能
LPC_GPIO0->FIODIR |= (BIT23|BIT25);
SentData(MPU6050_Addr,PWR_MGMT_1,0x80); //复位
DelaymS(50);
SentData(MPU6050_Addr,PWR_MGMT_1,0x00);
SentData(MPU6050_Addr,SMPLRT_DIV,0x07);
SentData(MPU6050_Addr,CONFIG,0x06);
SentData(MPU6050_Addr,GYRO_CONFIG,0x18); //量程2000deg/s
SentData(MPU6050_Addr,ACCEL_CONFIG,0x01);//量程2g
while(1)
{
Read_Accel(MPU6050_Addr,ACCEL_XOUT_H);
//Read_Gyro(MPU6050_Addr,GYRO_XOUT_H);
DelaymS(100);
}
} 我发现一个错误了 在接受完最后一个数据后 忘记将数据线设为输出模式了 我明天去实验室试一下 希望能调对 希望大家再帮我看一下还有其他错误没 谢谢了
改了之后 数据一直为0 无语了 数据显示出来了 好像板子供电有点问题 一直都是我唱独角戏 能不能来个人赞一个 估计还是时序的问题,你用示波器观察观察,我用mpu6050也遇到过数据读了一次,第二次再读就读不出来了 这个我是用了DMP的,没出什么问题,调试这东西,相当费神啊,楼主加油 我也遇到了,楼主解决问题了没有 我也遇到你的问题了 个人觉得,还是你的i2c程序有问题,这种量产的片子,有问题,还怎么卖啊......
从头到尾,细细地看一下代码,说不定就发现问题了......
只想看见你微笑 发表于 2014-12-17 08:21
我发现一个错误了 在接受完最后一个数据后 忘记将数据线设为输出模式了 我明天去实验室试一下 希望能调对...
楼主请问你找到问题没有,我现在也遇到问题了,6050输出的数据没有变化 我奔跑着 发表于 2015-10-2 10:59
楼主请问你找到问题没有,我现在也遇到问题了,6050输出的数据没有变化
你好,我这边的板子也是这样,可以读出来器件号,但是读出来的加速度和陀螺仪都不会变化~请问你们是怎么解决的
您好,请问你的问题解决了没有???我也遇到类似的问题,可以读写寄存器,但是读加表陀螺数据一直为0 我也是遇到同样的问题 我把IIC地址写0X69再写回0X68就可以正常读了。。。。不知道为啥
页:
[1]
2