金牌会员
- 积分
- 2311
- 威望
- 1210
- 贡献
- 743
- 兑换币
- 775
- 注册时间
- 2013-8-11
- 在线时间
- 179 小时
|
qiangkai311 发表于 2013-9-1 10:32
用的是IIC,S12模拟的,检测过了没有问题,用同样的时序获取了HMC5883的正常数据。。。。。。。
hellow,我也用S12 模拟的iic mpu6050 的数据可也采出,5883的怎么也猜不出来,地址也分开了,这是程序你怎么看??
#include "define.h"
void GetDataS(uchar SlaveAddress,uchar REG_Address);
int16 x,y,z;
int16 tx,ty,tz;
float ax,ay,az;
float wx,wy,wz;
float atx,aty,atz;
int data_gauss[3]={0};
uchar data_t[6];
void Delay5us()
{
_asm(nop);_asm(nop);_asm(nop);_asm(nop);
_asm(nop);_asm(nop);_asm(nop);_asm(nop);
_asm(nop);_asm(nop);_asm(nop);_asm(nop);
}
void main(void)
{
float wave[4];
SetBusCLK_80M();
//EnableInterrupts;
uart0_init();
InitMPU6050();
InitHMC5883L();
for(;;)
{
x=GetData(SlaveAddress_6050,ACCEL_XOUT_H);
y=GetData(SlaveAddress_6050,ACCEL_YOUT_H);
z=GetData(SlaveAddress_6050,ACCEL_ZOUT_H);
ax=MPU6050_Get_Angle(x,y,z,1);
ay=MPU6050_Get_Angle(x,y,z,2);
az=MPU6050_Get_Angle(x,y,z,0);
wx=GetData(SlaveAddress_6050,GYRO_XOUT_H);
wy=GetData(SlaveAddress_6050,GYRO_YOUT_H);
wz=GetData(SlaveAddress_6050,GYRO_ZOUT_H);
/*uart0_printf("ax:",ax);uart0_printf("ay:",ay);uart0_printf("az:",az);
uart0_printf("wx:",wx);uart0_printf("wy:",wy);uart0_printf("wz:",wz);
uart0_putchar(0x0d);uart0_putchar(0x0a); */
// wave[0]=ax*10;wave[1]=ay*10; wave[2]=az*10;
// wave[0]=wx*10;wave[1]=wy*10; wave[2]=wz*10;
//wave[0]=tx*10;wave[1]=ty*10; wave[2]=tz*10;
GetDataS(0x3C,0x3);
//wave[0]=data_gauss[0];wave[1]=data_gauss[1]; wave[2]=data_gauss[2];
//wave[0]=BUF[0];wave[1]=BUF[2]; wave[2]=BUF[4];
OutPutData_DS(wave);
delay(400);
}
}
float MPU6050_Get_Angle(float x,float y,float z,uchar dir)
{
float temp;
float res=0;
switch(dir)
{
case 0://与自然Z轴的角度
temp=z/sqrt((x*x+y*y));
res=atan(temp);
break;
case 1://与自然X轴的角度
temp=x/sqrt((y*y+z*z));
res=atan(temp);
break;
case 2://与自然Y轴的角度
temp=y/sqrt((x*x+z*z));
res=atan(temp);
break;
}
return res*180.0/3.1415926;//把弧度转换成角度
}
void GetDataS(uchar SlaveAddress,uchar REG_Address)
{
uint8 i=0;
I2C_Start(); //起始信号
I2C_SendByte(0x3c); //发送设备地址+写信号
I2C_SendByte(0x3); //发送存储单元地址,从0开始
I2C_Start(); //起始信号
I2C_SendByte(0x3d); //发送设备地址+读信号
for(i=0;i<6;i=i+1)
{
data_t=I2C_RecvByte();
if(i<=4)I2C_SendACK(0);
else I2C_SendACK(1);
}
I2C_Stop(); //停止信号
data_gauss[0]=data_t[0];//<<8|data_t[1];
data_gauss[1]=data_t[2];//<<8|data_t[3];
data_gauss[2]=data_t[4];//<<8|data_t[5];
}
|
|