OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5176|回复: 5

求助:关于使用STM32F103采MPU9150数据的问题,陀螺、加速度计都没问题,但磁力计AK8975C的值一直是FFFF?

[复制链接]

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-3-29
在线时间
6 小时
发表于 2018-9-18 14:04:22 | 显示全部楼层 |阅读模式
5金钱
小弟最近花了一块使用STM32F103采集MPU9150数据的小板子,使用@正点原子 IIC的历程改的,现在什么都调试通了,可是采集AK8975C磁力计,三轴的磁力值一直是固定值0xFFFF,不知道叫能否提供一下经验,万分感谢。
网上常见的问题我已经规避了:
1: 开启9150旁路模式:
      MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭
      MPU_Write_Byte(MPU_INTBP_CFG_REG,0X02);//开启passby模式
2:每次采集8975数据之后,配置8975为从测量模式
    H=(Single_ReadI2C(MAGADD,REG_Address));
    Single_WriteI2C(MAGADD,CNTL, 0x01);//此处非常关键,
                            //因为日本公司的数据手册上说,在单次测量模式下,每读取一次,
                            //会自动回归power down mode ,所以这里重新设置为单次测量模式
    L=Single_ReadI2C(MAGADD,REG_Address-1);
    Single_WriteI2C(MAGADD,CNTL, 0x01);
不知道还需要注意哪些问题。
附上源程序
[mw_shl_code=applescript,true]//****************************************
//定义类型及变量
//****************************************
u8 dis[6]; //显示数字(-511至512)的字符数组
int dis_data; //变量
//****************************************
//函数声明
//****************************************
//MPU9150操作函数
void InitMPU6050(); //初始化MPU9150
u8 Single_ReadI2C(u8 Slave_Address,u8 REG_Address); //读取I2C数据
void Single_WriteI2C(u8 Slave_Address,u8 REG_Address,u8 REG_data); //向I2C写入数据
//**************************************
//向I2C设备写入一个字节数据
//**************************************
void Single_WriteI2C(u8 Slave_Address,u8 REG_Address,u8 REG_data)
{
IIC_Start(); //起始信号
IIC_Send_Byte(Slave_Address); //发送设备地址+写信号
if(IIC_Wait_Ack()) //等待应答
{
IIC_Stop();
//return 1;
}
IIC_Send_Byte(REG_Address);//内部寄存器地址,
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(REG_data); //内部寄存器数据,
if(IIC_Wait_Ack()) //等待ACK
{
IIC_Stop();
//return 1;
}
IIC_Stop(); //发送停止信号
}
//**************************************
//从I2C设备读取一个字节数据
//**************************************
u8 Single_ReadI2C(u8 Slave_Address,u8 REG_Address)
{
u8 REG_data;
IIC_Start(); //起始信号
IIC_Send_Byte(Slave_Address); //发送设备地址+写信号
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(REG_Address); //发送存储单元地址,从0开始
IIC_Wait_Ack(); //等待应答
IIC_Start(); //起始信号
IIC_Send_Byte(Slave_Address + 1); //发送设备地址+读信号
IIC_Wait_Ack(); //等待应答
REG_data=IIC_Read_Byte(1); //读出寄存器数据
// IIC_NAck();
IIC_Stop(); //停止信号
return REG_data;
}
//**************************************
//合成数据
//**************************************
short GetData(u8 REG_Address)
{
u8 H,L;
H=(Single_ReadI2C(MAGADD,REG_Address));
Single_WriteI2C(MAGADD,CNTL, 0x01);//此处非常关键,
//因为日本公司的数据手册上说,在单次测量模式下,每读取一次,
//会自动回归power down mode ,所以这里重新设置为单次测量模式
L=Single_ReadI2C(MAGADD,REG_Address-1);
Single_WriteI2C(MAGADD,CNTL, 0x01);
return (H<<8)+L; //合成数据
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
delay_init(); //延时函数初始化
uart_init(115200); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
IIC_Init();//初始化IIC总线
delay_ms(100);
InitMPU6050(); //初始化MPU6050
delay_us(100);
TIM3_Int_Init(20-1,720-1);//72M/720=100000的计数频率,100000/20=5KHz
while(1)
{
if(ServoRegs.Timer_500 == 1)
{
ServoRegs.Timer_500 = 0;
//----2Hz计数----
if(ServoRegs.Timer_2 >= 250)
{
//==2Hz执行程序
ServoRegs.Timer_2 = 0;
H3=!H3;
}
else
{
ServoRegs.Timer_2++;
}
//===2Hz END====
//----100Hz计数----
if(ServoRegs.Timer_100 >= 10)
{
//==100Hz执行程序
ServoRegs.Timer_100 = 0;
ServoRegs.MUP6050.magx = GetData(HXH);
ServoRegs.MUP6050.magy = GetData(HYH);
ServoRegs.MUP6050.magz = GetData(HZH);
MPU_Get_Gyroscope(&ServoRegs.MUP6050.gyrox,&ServoRegs.MUP6050.gyroy,&ServoRegs.MUP6050.gyroz); //得到陀螺仪数据
delay_us(100);
}
else
{
ServoRegs.Timer_100++;
}
//===100Hz END====

}
}
}[/mw_shl_code]
请大神们指点

最佳答案

查看完整内容[请看2#楼]

问题已经解决了,现在的问题是磁力计有数,但是陀螺和加速度只有X轴有数了,剩下的就是慢慢找bug了,等调试通了,如果有时间,分享一下给大家
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-3-29
在线时间
6 小时
 楼主| 发表于 2018-9-18 14:04:23 | 显示全部楼层
问题已经解决了,现在的问题是磁力计有数,但是陀螺和加速度只有X轴有数了,剩下的就是慢慢找bug了,等调试通了,如果有时间,分享一下给大家
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-3-29
在线时间
6 小时
 楼主| 发表于 2018-9-18 14:40:09 | 显示全部楼层
还有就是两次的采样间隔不能小于8ms,我使用的是定时器,主程序为100Hz查询采样
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-3-29
在线时间
6 小时
 楼主| 发表于 2018-9-18 16:37:48 | 显示全部楼层
看理一下原子哥MiniFly主板程序,按照对应的改了一下读取顺序,现在能收到磁力计的数了,就是数明显不对,而且磁力计Z轴为0x0048,一直不变,等我在好好研究一下。
如果有大神已经调出来,还望不吝赐教!!!!!
回复

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2016-3-29
在线时间
6 小时
 楼主| 发表于 2018-9-19 10:39:51 | 显示全部楼层
已经一天了,没人指导一下吗?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-8-8
在线时间
1 小时
发表于 2021-1-24 21:16:09 | 显示全部楼层
调出来了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 01:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表