/* -----------------------------------------头文件-----------------------------------------*/
#include "ADXL346.h"
#include "math.h"
/* -----------------------------------------宏定义-----------------------------------------*/
#if BrakeMode_EN
/* -----------------------------------------结构体定义-------------------------------------*/
ADXL346_XYZ xdata XYZ_DATA = {0, 0, 0};
ADXL346_XYZ xdata XYZ_DATA1 = {0, 0, 0};
/******************
笔记:
1、DelayTick = 2
2、ADDR:SD0==0==0xA6 ; SD0==1==0x3A 【写命令0xA6 读命令0xA6|1】
*******************/
code IIC_TYPE ADXL346 = {2, 0xA6};
/* -----------------------------------------全局变量定义-----------------------------------*/
xdata uint8_t GET_DATA[6] = {0, 0, 0, 0, 0, 0}; //用于记录IIC返回的XYZ
xdata uint8_t Brake_Motion = 0; //当空间值大于阈值,即代表运动过
xdata uint8_t Motion_TIME = 0; //用于清除运动标记,计数2S左右,如果没有发生刹车则清零
xdata uint16_t Spatial_value_Cumulative = 0;
/* -----------------------------------------应用程序---------------------------------------*/
/*********************************************
函数名:ADXL346_Configuration
功 能:ADXL346器件初始化配置
形 参:INTI:1--初始化方向 0--不初始化方向
返回值:
备 注:
作 者:薛建强
时 间:2019/06/11
**********************************************/
void ADXL346_Configuration(const uint8_t INIT)
{
IIC_Init(); // I2C初始化
clr_EA;//关闭中断
clr_EX0;
P30_Input_Mode;
ADXL346_Read_DATA(ACT_TAP_STATUS);//中断清零前,应读取ACT_TAP_STATUS寄存器
ADXL346_Read_DATA(INT_SOURCE);//读取ADX346中断标志寄存器,读一次清空一次中断标记
ADXL346_Write_DATA(POWER_CTL, 0x03); //设置时需进入休眠模式 1HZ
ADXL346_Write_DATA(DATA_FORMAT, 0x0A); //+8g,寄存器0x31—DATA_FORMAT(读/写)--中断设为高电平有效--全分辨率模式--右对齐模式
ADXL346_Write_DATA(BW_RATE, 0x0D); //相当于800 Hz的输出数据速率。即1.25ms采集一次
if (INIT)
{
/*竖立*/
ADXL346_Write_DATA(OFSX, Factory_X); //写入X偏移量 -250校正为0
ADXL346_Write_DATA(OFSY, Factory_Y); //写入Y偏移量 无偏移
ADXL346_Write_DATA(OFSZ, Factory_Z); //写入Z偏移量 校正为0
}
ADXL346_Write_DATA(FIFO_CTL, 0xA8); //FIFO流模式 将触发模式下的触发事件链接至INT1
/*中断配置*/
ADXL346_Read_DATA(ACT_TAP_STATUS); //中断清零前,应读取ACT_TAP_STATUS寄存器
ADXL346_Read_DATA(INT_SOURCE); //读取ADX346中断标志寄存器,读一次清空一次中断标记
ADXL346_Write_DATA(INT_ENABLE, 0x00); //禁用 中断
ADXL346_Write_DATA(THRESH_ACT, Activity_threshold); // 活动阈值 变化幅度>6
ADXL346_Write_DATA(DUR, Activity_time); // 活动阈值时间 单位:16ms
ADXL346_Write_DATA(THRESH_INACT, Static_threshold); // 静止阈值 变化幅度<6
ADXL346_Write_DATA(TIME_INACT, Static_time); // 静止时间 单位:5s
ADXL346_Write_DATA(ACT_INACT_CTL, Active_static_any_axis_selection); // 活动静止任意轴选择 Z轴使能
ADXL346_Write_DATA(INT_ENABLE, 0x00); //禁用 中断
if (SystemReg.BrakeMode == 1)
{
ADXL346_Off();
ADXL346_Write_DATA(INT_ENABLE, 0x18); //开启动态、静止等中断模式,19页
ADXL346_Write_DATA(INT_MAP, 0x00); //使能 中断 ININ1
ADXL346_Write_DATA(POWER_CTL, 0x08); //测量模式
}
clr_EA;
}
/*********************************************
函数名:ADXL346_Write_DATA
功 能:写 地址 数据
形 参:addr 地址 dat 数据
返回值:
备 注:
作 者:薛建强
时 间:2019/06/11
**********************************************/
void ADXL346_Write_DATA(const uint8_t addr, const uint8_t DATA)
{
IIC_Start(); // 启动
IIC_WriteByte(ADXL346.ADDR); // 设备地址
IIC_Wait_ACK(); // 等待数据响应
IIC_WriteByte(addr); // 发送寄存器地址
IIC_Wait_ACK(); // 等待数据响应
IIC_WriteByte(DATA); // 发送数据
IIC_Wait_ACK(); // 等待数据响应
IIC_Stop(); // 停止
}
/*********************************************
函数名:ADXL346_Read_DATA
功 能:读地址数据
形 参:addr--寄存器地址
返回值:
备 注:
作 者:薛建强
时 间:2019/06/11
**********************************************/
uint8_t ADXL346_Read_DATA(const uint8_t addr)
{
uint8_t GET_DATA = 0;
IIC_Start(); // 启动
IIC_WriteByte(ADXL346.ADDR); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
IIC_WriteByte(addr); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
IIC_Start(); // 启动
IIC_WriteByte(ADXL346.ADDR | 1); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
GET_DATA = IIC_ReadByte(); // 获取数据
IIC_Wait_ACK(); // 等待数据响应
IIC_Stop(); // 停止
return GET_DATA;
}
/*********************************************
函数名:ADXL346_get_data
功 能:读取一次加速度值
形 参:
返回值:
备 注:
作 者:薛建强
时 间:2019/06/11
**********************************************/
void ADXL346_get_data(void)
{
uint8_t i = 0;
IIC_Start(); // 启动
IIC_WriteByte(ADXL346.ADDR); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
IIC_WriteByte(0x32); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
IIC_Start(); // 启动
IIC_WriteByte(ADXL346.ADDR | 1); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
for (i = 0; i < 6; i++)
{
if (i == 5)
{
GET_DATA[i] = IIC_ReceiveData(0);
}
else
{
GET_DATA[i] = IIC_ReceiveData(1);
}
}
IIC_Stop(); // 停止
if (Brake_Reg.Current_direction == 1 || Brake_Reg.Current_direction == 0)
{
XYZ_DATA1.X = (int)((GET_DATA[5] << 8) | (GET_DATA[4])); //X轴
XYZ_DATA1.Y = (int)((GET_DATA[3] << 8) | (GET_DATA[2])); //Y轴
}
else
{
XYZ_DATA1.X = (int)((GET_DATA[3] << 8) | (GET_DATA[2])); //Y轴
XYZ_DATA1.Y = (int)((GET_DATA[5] << 8) | (GET_DATA[4])); //X轴
}
XYZ_DATA1.Z = (int)((GET_DATA[1] << 8) | (GET_DATA[0])); //Z轴
}
/*********************************************
函数名:ADXL346_Off
功 能:进入暂停模式
形 参:
返回值:
备 注:
作 者:薛建强
时 间:2019/06/11
**********************************************/
void ADXL346_Off(void)
{
IIC_Start(); // 启动
IIC_WriteByte(ADXL346.ADDR); // 设备地址
IIC_Wait_ACK(); // 等待数据响应
IIC_WriteByte(0x2D); // 发送寄存器地址
IIC_Wait_ACK(); // 等待数据响应
IIC_WriteByte(0x04); // 发送数据
IIC_Wait_ACK(); // 等待数据响应
IIC_Stop(); // 停止
}
uint16_t StopState_Time_S = 0;
/*********************************************
函数名:ADXL346_FIFORead
功 能:从缓冲器中读取一次32个值,并求平均值
形 参:pData:存储平均值后的XYZ值
返回值:
备 注:
作 者:薛建强
时 间:2019/08/30
使 用:
**********************************************/
#define ReadNum 7
void ADXL346_FIFORead(ADXL346_XYZ *pData)
{
uint8_t i = 0, Loop = 0;
int X = 0, Y = 0, Z = 0;
uint16_t Spatial_value = 0;
for (Loop = 0; Loop < ReadNum; Loop++)
{
IIC_Start(); // 启动
IIC_WriteByte(ADXL346.ADDR); // 发送地址
IIC_Wait_ACK(); // 等待数据响应
上一篇:[单片机][N76E003][MCP4017][MCP4018][MCP4019] 数字电位器 使用方法 例子 代码
下一篇:[单片机][IIC/I2C][APDS9960] 手势传感器 4种手势
设计资源 培训 开发板 精华推荐
- 51单片机红外报警器的设计与制作
- LTM4632IV QDR4 存储器电源模块稳压器的典型应用电路
- NCP170AXV330GEVB:超低 IQ 150mA CMOS LDO 稳压器评估板
- EVB-USB3750,USB3750 USB 2.0 评估板
- 智能栅极驱动器耦合器 TLP5214 保护功能应用说明
- AD9959/PCBZ,用于评估具有 10 位 DAC 的 AD9959 直接数字合成器的评估板
- 使用 Microchip Technology 的 MIC5313 的参考设计
- LT3502/LT3502A 的典型应用 - 采用 2mm -2mm DFN 和 MS10 封装的 1.1MHz/2.2MHz、500mA 降压型稳压器
- 仪表用反相放大器
- 使用 Diodes Incorporated 的 AP1512 的参考设计