L3G4200D 时钟
#include
***it SCL=P1^0; //IIC时钟引脚定义
***it SDA=P1^1; //IIC数据引脚定义
//******************宏定义*****************
#define uchar unsigned char
#define uint unsigned int
//**********L3G4200D内部寄存器地址*********
#define WHO_AM_I 0x0F
#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define CTRL_REG4 0x23
#define CTRL_REG5 0x24
#define REFERENCE 0x25
#define OUT_TEMP 0x26
#define STATUS_REG 0x27
#define OUT_X_L 0x28
#define OUT_X_H 0x29
#define OUT_Y_L 0x2A
#define OUT_Y_H 0x2B
#define OUT_Z_L 0x2C
#define OUT_Z_H 0x2D
#define FIFO_CTRL_REG 0x2E
#define FIFO_SRC_REG 0x2F
#define INT1_CFG 0x30
#define INT1_SRC 0x31
#define INT1_TSH_XH 0x32
#define INT1_TSH_XL 0x33
#define INT1_TSH_YH 0x34
#define INT1_TSH_YL 0x35
#define INT1_TSH_ZH 0x36
#define INT1_TSH_ZL 0x37
#define INT1_DURAtiON 0x38
//****************************************
#define SlaveAddress 0xD2 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
//****************变量定义****************
typedef unsigned char BYTE;
typedef unsigned short WORD;
BYTE BUF[8]; //接收数据缓存区
int dis_data,d_x,d_y,d_z; //变量
float temp;
/**************************************
延时函数
**************************************/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i
{
for(j=0;j<121;j++);
}
}
//延时5微秒(STC90C52RC@12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用1T的MCU时,请调整此延时函数。
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
/**************************************
起始信号
**************************************/
void L3G4200D_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
}
/**************************************
停止信号
**************************************/
void L3G4200D_Stop()
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 1; //产生上升沿
Delay5us(); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void L3G4200D_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/
bit L3G4200D_RecvACK()
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延时
return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void L3G4200D_SendByte(BYTE dat)
{
BYTE i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
L3G4200D_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE L3G4200D_RecvByte()
{
BYTE i;
BYTE dat = 0;
SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}
//单字节写入*******************************************
void Single_WriteL3G4200D(uchar REG_Address,uchar REG_data)
{
L3G4200D_Start(); //起始信号
L3G4200D_SendByte(SlaveAddress); //发送设备地址+写信号
L3G4200D_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页
L3G4200D_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
L3G4200D_Stop(); //发送停止信号
}
//单字节读取*****************************************
uchar Single_ReadL3G4200D(uchar REG_Address)
{ uchar REG_data;
L3G4200D_Start(); //起始信号
L3G4200D_SendByte(SlaveAddress); //发送设备地址+写信号
L3G4200D_SendByte(REG_Address); //发送存储单元地址,从0开始
L3G4200D_Start(); //起始信号
L3G4200D_SendByte(SlaveAddress+1); //发送设备地址+读信号
REG_data=L3G4200D_RecvByte(); //读出寄存器数据
L3G4200D_SendACK(1);
L3G4200D_Stop(); //停止信号
return REG_data;
}
//初始化L3G4200D,根据需要请参考pdf进行修改************************
void InitL3G4200D()
{
Single_WriteL3G4200D(CTRL_REG1, 0x0f); //
Single_WriteL3G4200D(CTRL_REG2, 0x00); //
Single_WriteL3G4200D(CTRL_REG3, 0x08); //
Single_WriteL3G4200D(CTRL_REG4, 0x30); //+-2000dps
Single_WriteL3G4200D(CTRL_REG5, 0x00);
}
//x轴数据
void data_x()
{
BUF[0]= Single_ReadL3G4200D(OUT_X_L);
BUF[1]= Single_ReadL3G4200D(OUT_X_H); //读取X轴数据
dis_data=(BUF[1]<<8)+BUF[0]; //合成数据
temp=(float)dis_data*0.07; // 数据手册 第9页,2000度/秒量程
d_x=(int)temp;
}
//y轴数据
void data_y()
{
BUF[2]= Single_ReadL3G4200D(OUT_Y_L);
BUF[3]= Single_ReadL3G4200D(OUT_Y_H);//读取Y轴数据
dis_data=(BUF[3]<<8)+BUF[2]; //合成数据
temp=(float)dis_data*0.07; // 数据手册 第9页,2000度/秒量程
d_y=(int)temp;
//if(d_y>50)led2=1;else led2=0;
}
//z轴数据
void data_z()
{
BUF[4]= Single_ReadL3G4200D(OUT_Z_L);
BUF[5]= Single_ReadL3G4200D(OUT_Z_H);//读取Z轴数据
dis_data=(BUF[5]<<8)+BUF[4]; //合成数据
temp=(float)dis_data*0.07; // 数据手册 第9页,2000度/秒量程
d_z=(int)temp;
//if(d_z>50)led3=1;else led3=0;
}
求大神:这样获得的d_x,d_y,d_z是不是角速度呢?怎么才能转换成角度呢?
回帖(2)
2019-10-17 08:55:13
参考下我们战舰V2的ADXL345的历程
参考下我们战舰V2的ADXL345的历程
举报
2019-10-17 09:10:13
哈哈哈哈哈炒冷饭,好像确实是有点问题哎
哈哈哈哈哈炒冷饭,好像确实是有点问题哎
举报
更多回帖