LIS302DL加速度传感器程序设计

本程序对应的开发板为蓝桥杯嵌入式开发板stm32f103rbt6,为中型mcu。LIS302DL是三轴±2g/±8g智能数字输出加速度传感器,提供I2C/SPI接口,扩展板使用的是I2C接口器件地址是0x38。

主要寄存器及其地址

硬件连接如下

P2.1(PA4)-P2.2(SCL)

P2.3(PA5)-P2.4(SDA)

同时断开下列连接

P4.4(PA4)-P3.4(AO1)或P5.4(TRAO)

P4.5(PA5)-P3.5(AO2)或P5.5(AKEY)

由于引脚冲突,加速度传感器不能和AO1/AO2或TRAO/AKEY同时使用。

由于需要I2C通信这里基于i2c.c进行修改如下

mems.c

#include "stm32f10x.h"
#include "i2c.h"
#include "mems.h"
#include "main.h"

u8 alz[3] ;

//
void LIS302DL_Write(unsigned char reg,unsigned char info)
{	
	I2CStart(); 
	I2CSendByte(0x38);  
	I2CWaitAck();     
	I2CSendByte(reg);  
	I2CWaitAck(); 
	I2CSendByte(info); 
	I2CWaitAck();
	I2CStop();
}

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

//
u8* Lis302DL_Output(void)
{
	if((LIS302DL_Read(0x27) & 0x08) != 0){
		
		alz[0] = (LIS302DL_Read(0x29));  //x
		alz[1] = (LIS302DL_Read(0x2B));  //y
		alz[2] = (LIS302DL_Read(0x2D));  //z
	}

	return alz;
}

//
void LIS302DL_Config(void)
{
	LIS302DL_Write(CTRL_REG1,0x47);
	LIS302DL_Write(CTRL_REG2,0x00);
	LIS302DL_Write(CTRL_REG3,0xC1);
	LIS302DL_Write(FF_WU_THS_1,0x28);		
	LIS302DL_Write(FF_WU_DURATION_1,40);		
	LIS302DL_Write(FF_WU_CFG_1,0x10);		
}

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

mems.h

#ifndef __MEMS_H
#define __MEMS_H

#include "stm32f10x.h"

#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


uint8_t LIS302DL_Check(void);
void LIS302DL_Config(void);
u8*  Lis302DL_Output(void);

#endif

主程序

#include "stm32f10x.h"
#include "lcd.h"
#include "stdio.h"
#include "main.h"
#include "mems.h"
#include "i2c.h"
#include "math.h"
u32 DelayTiming = 0;

int main(void)
{
	u8 str[20];
	
	u8 *ptr;
		
	SysTick_Config(SystemCoreClock/1000);
	
	STM3210B_LCD_Init();
	LCD_Clear(White);

	i2c_init();
	LIS302DL_Config();
	
	LCD_SetTextColor(White);
	LCD_SetBackColor(Blue);

	LCD_ClearLine(Line0);
	LCD_ClearLine(Line1);
	LCD_ClearLine(Line2);
	LCD_ClearLine(Line3);
	LCD_ClearLine(Line4);

	LCD_DisplayStringLine(Line1,(u8*)"     MEMS DEMO      ");
	//
	if(LIS302DL_Check() == 1){
		LCD_DisplayStringLine(Line3, (u8 *)" MEMS STATUS: OK");
	}else{
		LCD_DisplayStringLine(Line3, (u8 *)" MEMS STATUS: ERROR");				
	}

	LCD_SetTextColor(Blue);
	LCD_SetBackColor(White);
	   
	
	while(1){
		
		ptr = Lis302DL_Output();
				
		snprintf((char *)str, sizeof(str), " X Reg:%d    ", ptr[0]);
		LCD_DisplayStringLine(Line6,str);
		snprintf((char *)str, sizeof(str), " Y Reg:%d    ", ptr[1]);
		LCD_DisplayStringLine(Line7,str);
		snprintf((char *)str, sizeof(str), " Z Reg:%d    ", ptr[2]);
		LCD_DisplayStringLine(Line8,str);
				
		Delay_Ms(200);
	}
}

//
void Delay_Ms(u32 nTime)
{
	DelayTiming = nTime;

	while(DelayTiming != 0);
}


extern  u32 DelayTiming;
void SysTick_Handler(void)
{
	if(DelayTiming != 0){
		DelayTiming--;
	}
}
发布了61 篇原创文章 · 获赞 145 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qqGHJ/article/details/105304931