新手上路
积分 25
金钱 25
注册时间 2017-10-23
在线时间 2 小时
1 金钱
这里面的程序我是在电子罗盘的基础上该的,所以许多函数的名字用的是HMC,不是MPU6050.程序在附件里
#include "HMC5983.h"
#include "math.h"
// ??MPU6050????
//****************************************
#define SMPLRT_DIV 0x19 //??????,???:0x07(125Hz)
#define CONFIG 0x1A //??????,???:0x06(5Hz)
#define GYRO_CONFIG 0x1B //??????????,???:0x18(???,2000deg/s)
#define ACCEL_CONFIG 0x1C //?????????????????,???:0x01(???,2G,5Hz)
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48
#define PWR_MGMT_1 0x6B //????,???:0x00(????)
#define WHO_AM_I 0x75 //IIC?????(????0x68,??)
#define SlaveAddress 0xD0 //IIC??????????,+1???
//****************************************
void Init_HMC5983(void)
{
delay_ms(100);
IIC_Init();
Write_HMC5983(PWR_MGMT_1, 0x00);
Write_HMC5983(SMPLRT_DIV, 0x07);
Write_HMC5983(CONFIG, 0x06); //á¬Dø2aá¿Ä£ê½
Write_HMC5983(GYRO_CONFIG, 0x18);
Write_HMC5983(ACCEL_CONFIG, 0x01);
}
void Write_HMC5983(u8 add, u8 da)
{
IIC_Start(); //Æeê¼DÅoÅ
IIC_Send_Byte(SlaveAddress); //·¢Ëíé豸μØÖ·+D′DÅoÅ
IIC_Wait_Ack();
IIC_Send_Byte(add); //Äú2¿¼Ä′æÆ÷μØÖ·£¬Çë2ο¼ÖDÎÄpdf
IIC_Wait_Ack();
IIC_Send_Byte(da); //Äú2¿¼Ä′æÆ÷êy¾Y£¬Çë2ο¼ÖDÎÄpdf
IIC_Wait_Ack();
IIC_Stop(); //·¢Ëíí£Ö1DÅoÅ
}
u8 Read_HMC5983(u8 REG_Address)
{
u8 REG_data;
IIC_Start(); //Æeê¼DÅoÅ
IIC_Send_Byte(SlaveAddress); //·¢Ëíé豸μØÖ·+D′DÅoÅ
IIC_Wait_Ack();
IIC_Send_Byte(REG_Address); //·¢Ëí′æ′¢μ¥ÔaμØÖ·£¬′ó0¿aê¼
IIC_Wait_Ack();
IIC_Start(); //Æeê¼DÅoÅ
IIC_Send_Byte(SlaveAddress+1); //·¢Ëíé豸μØÖ·+¶áDÅoÅ
IIC_Wait_Ack();
REG_data=IIC_Read_Byte(0); //¶á3ö¼Ä′æÆ÷êy¾Y
IIC_Stop(); //í£Ö1DÅoÅ
return REG_data;
}
//******************************************************
//
//á¬Dø¶á3öHMC5983Äú2¿½Ç¶èêy¾Y£¬μØÖ··¶Î§0x3~0x5
//
//******************************************************
void Multiple_read_HMC5983(u8*BUF)
{ u8 i;
IIC_Start(); //Æeê¼DÅoÅ
IIC_Send_Byte(SlaveAddress); //·¢Ëíé豸μØÖ·+D′DÅoÅ
IIC_Wait_Ack();
IIC_Send_Byte(0x03); //·¢Ëí′æ′¢μ¥ÔaμØÖ·£¬′ó0x3¿aê¼
IIC_Wait_Ack();
IIC_Start(); //Æeê¼DÅoÅ
IIC_Send_Byte(SlaveAddress+1); //·¢Ëíé豸μØÖ·+¶áDÅoÅ
IIC_Wait_Ack();
for (i=0; i<6; i++) //á¬Dø¶áè¡6¸öμØÖ·êy¾Y£¬′æ′¢ÖDBUF
{
if (i == 5)
{
BUF[i] = IIC_Read_Byte(0); //×îoóò»¸öêy¾YDèòa»ØNOACK
}
else
{
BUF[i] = IIC_Read_Byte(1); //·μ»ØACK
}
}
IIC_Stop(); //í£Ö1DÅoÅ
}
//????
//**************************************
short GetData(unsigned char REG_Address)
{
unsigned char H,L;
short data;
H=Read_HMC5983( REG_Address);
L=Read_HMC5983( REG_Address+1);
data=(short)((H<<8)|L);
return data; //????
}
//**************************************
/**************
»ñè¡μç×óÂTÅìêy¾Y£¬ÅD¶Ï2¢òÆè¥′íÎó¶áêy
**************/
void HMC_Get_Data(short*MPU6050_buf)
{
MPU6050_buf[0]=GetData(ACCEL_XOUT_H);
MPU6050_buf[1]=GetData(ACCEL_YOUT_H);
MPU6050_buf[2]=GetData(ACCEL_ZOUT_H);
MPU6050_buf[3]=GetData(GYRO_XOUT_H);
MPU6050_buf[4]=GetData(GYRO_YOUT_H);
MPU6050_buf[5]=GetData(GYRO_ZOUT_H);
MPU6050_buf[6]=GetData(GYRO_ZOUT_H);
}
Ä£ÄaIICÇy¶ˉ
2014-10-29
Leven
***********************/
#include"IIC.h"
void IIC_Init(void)
{
RCC->APB2ENR |= RCC_IIC;//1 << 4;
SCL_OUT();//GPIOC->CRH &= 0xfff00fff; //PC11 PC12íÆíìêä3ö
SDA_OUT();//GPIOC->CRH |= 0x00033000;
IIC_SCL=1;//GPIOC->ODR |= 3 << 11; //PC11 PC12êä3ö¸ß
IIC_SDA=1;
}
void IIC_Start(void)
{
SDA_OUT(); //sdaÏßêä3ö
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL=0;//ÇˉסI2C×üÏߣ¬×¼±¸·¢Ëí»ò½óêÕêy¾Y
}
void IIC_Stop(void)
{
SDA_OUT();
IIC_SDA = 0;
IIC_SCL = 1;
delay_us(4);
IIC_SDA = 1;
delay_us(4);
}
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime = 0;
SDA_IN();
IIC_SDA = 1;
delay_us(1);
IIC_SCL = 1;
delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if (ucErrTime > 250)
{
IIC_Stop();
return 1; //ó|′eê§°ü
}
}
IIC_SCL = 0;
return 0; //ó|′e3é1|
}
void IIC_Ack(void)
{
IIC_SCL = 0;
SDA_OUT();
IIC_SDA = 0;
delay_us(2);
IIC_SCL = 1;
delay_us(2);
IIC_SCL = 0;
}
void IIC_NAck(void)
{
IIC_SCL = 0;
SDA_OUT();
IIC_SDA = 1;
delay_us(2);
IIC_SCL = 1;
delay_us(2);
IIC_SCL = 0;
}
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL = 0;
for (t = 0; t < 8; t++)
{
IIC_SDA = (txd&0x80) >> 7;
txd <<= 1;
delay_us(2);
IIC_SCL = 1;
delay_us(2);
IIC_SCL = 0;
}
//IIC_Wait_Ack();
}
//¶áò»¸ö×Ö½ú£¬ack = 1ê±£¬ ·¢ËíACK£¬ ack = 0£¬·¢ËínACK
u8 IIC_Read_Byte(u8 ack)
{
u8 i, receive = 0;
SDA_IN();
for (i = 0; i < 8; i++)
{
IIC_SCL = 0;
delay_us(2);
IIC_SCL = 1;
receive <<= 1;
if(READ_SDA) receive++;
delay_us(1);
}
if (!ack) IIC_NAck();
else IIC_Ack();
return receive;
}
我来回答