蓝桥杯嵌入式扩展板学习之LIS302DL

硬件电路
在这里插入图片描述
在这里插入图片描述
IIC通信的读和写地址的确定,类似24C02芯片一样有自己独特的读和写的iic地址,因为三轴加速度计的SD0管脚接地,根据芯片介绍,其Read地址为(0x39) write地址为(0x38)
在这里插入图片描述IIC读写函数
在这里插入图片描述
在这里插入图片描述

void LIS302DL_Write(unsigned char addr,unsigned char data)
{	
	I2CStart(); 
	I2CSendByte(0x38);  
	I2CWaitAck();     
	I2CSendByte(addr);  
	I2CWaitAck(); 
	I2CSendByte(data); 
	I2CWaitAck();
	I2CStop();
}

在这里插入图片描述

uint8_t LIS302DL_Read(uint8_t addr)
{
	unsigned char temp;
	I2CStart(); 
	I2CSendByte(0x38);  
	I2CWaitAck();     
	
	I2CSendByte(addr);  
	I2CWaitAck(); 
	
	I2CStart();
	I2CSendByte(0x39); 
	I2CWaitAck();
	temp = I2CReceiveByte(); 
	I2CSendNotAck();
	I2CStop();
	
	return(temp);
}

芯片初始化配置

#define CTRL_REG1 			    0x20
//#define CTRL_REG2 			0x21
//#define CTRL_REG3 			0x22
//#define FF_WU_THS_1 		    0x32
//#define FF_WU_DURATION_1 	    0x33
//#define FF_WU_CFG_1 		    0x30
//#define STATUS_REG 			0x27

void LIS302DL_Config(void)
{
	LIS302DL_Write(CTRL_REG1,0x47);
	//DR=0,加速度的采集频率为 200Hz;
	//PD=1,LIS302DL工作在普通功耗模式;
	//FS=0,最大测量范围为 2g(2.3g),灵敏度为 18mg/LSB(16.2),受温度影响为 0.01%, 在0加速度时.飘移为 40mg;
	//STP=0,STM=0,表示 LIS302DL 工作在普通模式,即非自检模式;
	//Zen=1,表示使能 Z 轴方向加速度采集; 
	//Yen=1,表示使能 Y 轴方向加速度采集; 
	//Xen=1,表示使能 X 轴方向加速度采集; 

//下面操作是对中断和高通滤波器等配置,我们不使用不用配置,就默认值即可
//	LIS302DL_Write(CTRL_REG2,0x00);
	//SIM=0,表示 SPI 口为 4 总线;(这个要先看cs决定)
	//BOOT=0,表示不要刷新存储器的内容,为普通模式;
	//FDS=0,表示禁用高通滤器;
	//HP_FF_W_U2=0, 禁用自由落体/唤醒高通滤波器 2;
	//HP_FF_W_U1=0, 禁用自由落体/唤醒高通滤波器 1;
	//HP_coeff2=0,HP_coeff1=0,DR=0, 表示自由落体/唤醒高通滤波器的输出截止频率为 2Hz;

//	LIS302DL_Write(CTRL_REG3,0xC1);
	//IHL=1,表示在中断发生时,中断脚(INT1 和 INT2)输出低电平;
	//PP_OD=1,表示中断脚开漏输出;
	//I2CFG2=0,I2CFG1=0,I2CFG0=0,表示 INT2 脚输出低电平;
	//I1CFG2=0,I1CFG1=0,I1CFG0=1,表示 INT1 脚是根据自由落体/唤醒 1 寄存器的输出而发生变化;
	
//	LIS302DL_Write(FF_WU_THS_1,0x28);		
	//DCRM=0,表示在不再有中断发生时,持续时间计数器会被复位到初值;
	//THS0~THS6,用来设置自由落体/唤醒的下限值--720mg;
		
//	LIS302DL_Write(FF_WU_DURATION_1,40);	
	//当 DR=1 时,加速度的采集频率为 ;		
	
//	LIS302DL_Write(FF_WU_CFG_1,0x10);		
	//AOI=1,表示所有中断事件相或后输出;
	//LIR=0,表示将中断请求不锁存;
	//ZHIE=0,表示在 Z 输出寄存器的值大于 Z 轴的设置值时,将不会使能 Z 轴中断;
	//ZLIE=1,表示在 Z 输出寄存器的值小于 Z 轴的设置值时,将不会使能 Z 轴中断;
	//YHIE=0,表示在 Y 输出寄存器的值大于 Y 轴的设置值时,将不会使能 Y 轴中断;
	//YLIE=1,表示在 Y 输出寄存器的值小于 Y 轴的设置值时,将不会使能 Y 轴中断;
	//XHIE=1,表示在 X 输出寄存器的值大于 X 轴的设置值时,将不会使能 X 轴中断;
	//XLIE=0,表示在 X 输出寄存器的值小于 X 轴的设置值时,将不会使能 X 轴中断;
}

在这里插入图片描述
三轴传感器输出数据
在这里插入图片描述
在这里插入图片描述

u8* Lis302DL_Output(void)
{
	if((LIS302DL_Read(0x27) & 0x08) != 0) //判断X, Y ,Z是否有新数据更新
	{
		
		alz[0] = (LIS302DL_Read(0x29));  //x
		alz[1] = (LIS302DL_Read(0x2B));  //y
		alz[2] = (LIS302DL_Read(0x2D));  //z
	}

	return alz;
}

芯片鉴别 :可以不需要这个步骤
在这里插入图片描述
在这里插入图片描述

uint8_t LIS302DL_Check(void)
{
	if(LIS302DL_Read(0x0f))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

主函数

i2c_init();
LIS302DL_Config();	
while(1)
{
	ptr = Lis302DL_Output();				
	snprintf((char *)str, sizeof(str), " X Reg:%d    ", ptr[0] / 18);
	LCD_DisplayStringLine(Line6,str);
	snprintf((char *)str, sizeof(str), " Y Reg:%d    ", ptr[1] / 18);
	LCD_DisplayStringLine(Line7,str);
	snprintf((char *)str, sizeof(str), " Z Reg:%d    ", ptr[2] / 18);
	LCD_DisplayStringLine(Line8,str);	
	Delay_Ms(1000);
}

注意:这里为什么要 / 18,因为我们直接读取的数据是寄存器中的数据,不是我们的加速度,所以我们还要对寄存器中的数据根据自己选择的精度和灵敏度进行计算
在这里插入图片描述

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值