logo资料库

adxl345三轴驱动代码.doc

第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
资料共14页,剩余部分请下载后查看
/* 文件名称:adxl.c 文件功能:adxl345 驱动程序 */ #include "main.h" /* 函数名称:IIC_Init 函数功能:初始化 IIC 芯片信号引脚 函数出口:无 函数入口:无 */ void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11); //推挽输出 //PB10,PB11 输出高 } /* 函数名称:IIC_Start 函数功能:产生 IIC 起始信号 函数入口:无 函数出口:无 */ void IIC_Start(void) { //sda 线输出 SDA_OUT(); 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 总线,准备发送或接收数据 } /* 函数名称:IIC_Stop 函数功能:产生 IIC 停止信号 函数入口:无 函数出口:无 */ void IIC_Stop(void)
{ SDA_OUT();//sda 线输出 IIC_SCL=0; IIC_SDA=0;//STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SCL=1; IIC_SDA=1;//发送 I2C 总线结束信号 delay_us(4); } /* 函数名称:IIC_Wait_Ack 函数功能:等待应答信号到来 函数入口:无 函数出口:1,接收应答失败 0,接收应答成功 */ u8 IIC_Wait_Ack(void) { //SDA 设置为输入 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; } } IIC_SCL=0;//时钟输出 0 return 0; } /* 函数名称:IIC_Ack 函数功能:产生 ACK 应答 函数入口:无 函数出口:无 */ void IIC_Ack(void) { IIC_SCL=0; SDA_OUT();
IIC_SDA=0;//ack 信号 delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; } /* 函数名称:IIC_NAck 函数功能:不产生 ACK 应答 函数入口:无 函数出口:无 */ void IIC_NAck(void) { IIC_SCL=0; SDA_OUT(); IIC_SDA=1;//nack 信号 delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; } /* 函数名称:IIC_Send_Byte 函数功能:IIC 发送一个字节 函数入口:txd:要写入的字节 函数出口:从机有无应答 1,有应答 0,无应答 */ void IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); IIC_SCL=0;//拉低时钟开始数据传输 for(t=0;t<8;t++) { //对 TEA5767 这三个延时都是必须的 IIC_SDA=(txd&0x80)>>7; txd<<=1; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; delay_us(2);
} } /* 函数名称:IIC_Read_Byte 函数功能://读 1 个字节 函数入口:ack: ack=1 时,发送 ACK,ack=0,发送 nACK 函数出口: receive :读到的数据 */ u8 IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; SDA_IN();//SDA 设置为输入 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();//发送 nACK else IIC_Ack(); //发送 ACK return receive; } /* 函数名称:AD_Wtite_One_Byte 函数功能:向 ad 中写入一个数据 函数入口:reg: 要写入的寄存器地址 data:要写入的数据 函数出口:无 */ void AD_Wtite_One_Byte(uint8 reg,uint8 data) { IIC_Start(); IIC_Send_Byte(WRITE_CMD);//发送写命令 IIC_Wait_Ack(); IIC_Send_Byte(reg); IIC_Wait_Ack(); IIC_Send_Byte(data); IIC_Wait_Ack(); IIC_Stop();//产生一个停止条件 //写入寄存器名 //发送字节
} /* 函数名称: AD_Write_Multi_Byte 函数功能:向 ad 一次写入多个字节 函数入口:reg:要写入的寄存器地址 *data:要写入的字符串 len:要写入字符串的长度 函数出口:无 */ void AD_Write_Multi_Byte(uint8 reg, uint8 *data,uint8 len) { uint8 i; IIC_Start(); IIC_Send_Byte(WRITE_CMD);//发送写命令 IIC_Wait_Ack(); IIC_Send_Byte(reg); IIC_Wait_Ack(); for(i=0;i
return data; } /* 函数名称:AD_Read_Multi_Byte 函数功能:一次读取多个字节 函数入口:reg :要读取的寄存器的起始地址 * buf:存放数据缓存 len:要读取的数据长度 函数出口: */ void AD_Read_Multi_Byte(uint8 reg, uint8 *buf,uint8 len) { uint8 i; IIC_Start(); IIC_Send_Byte(WRITE_CMD);//发送写命令 IIC_Wait_Ack(); IIC_Send_Byte(reg); IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(READ_CMD);//发送读命令 IIC_Wait_Ack(); for(i=0;i
if(AD_Read_One_Byte(0)==0xe5) { AD_Wtite_One_Byte(DATA_FORMAT,0x69); AD_Wtite_One_Byte(BW_RATE,0x09); AD_Wtite_One_Byte(POWER_CTL,0x28); AD_Wtite_One_Byte(INT_ENABLE,0x80); AD_Wtite_One_Byte(INT_MAP,0x80); AD_Wtite_One_Byte(OFSX,0x00); //测量范围,正负 4g,全分辨率 11 位模式 //速率设定为 50HZ 参考 pdf13 页 //选择电源模式 参考 pdf24 页 //关掉中断 //关掉中断 //X 偏移量 根据测试传感器的状态写入 pdf29 页 AD_Wtite_One_Byte(OFSY,0x00); //Y 偏 移 量 根 据 测 试 传 感 器 的 状 态 写 入 pdf29 页 AD_Wtite_One_Byte(OFSZ,0x00); //Z 偏 移量 根 据测 试 传感 器 的状 态 写入 pdf29 页 return 0; } return 1; } /* 函数名称 :Read_Axis 函数功能:读取 xyz 轴的加速度 函数入口:*x:x 轴数据 *y:y 轴数据 *z:z 轴数据 函数出口:无 */ void Read_Axis(int16 *data) { uint8 buf[6]={0}; AD_Read_Multi_Byte(DATAX0, buf,6); *data=(int16)(((u16)buf[1]<<8)+buf[0]); *(data+1)=(int16)(((u16)buf[3]<<8)+buf[2]); *(data+2)=(int16)(((u16)buf[5]<<8)+buf[4]); printf("%d,%d,%d\n",*data,*(data+1),*(data+2)); // } void Filter_AD_Data_1(void) { uint8 i; int16 abs[2][3]; Axis_Flag=Select_Axis(Axis_ResultA); if(Sample_Timer<99) { Sample_Timer++;
} //有效计步间隔时间 if(Sum_Time<149) { Sum_Time++; } else { Sum_Step=0; //进入搜索模式 Sum_Flag=0; Sum_Time=0; } if(Decide_Sample_No<49) { //更新最值 Judge_Extreme_Ad(); Decide_Sample_No++; } else { Cal_Threhold_Precision(Axis_Threhold,Axis_Precision); //交换最值以便下个周期更换最值 Exchage_Extrem_Reg(); Decide_Sample_No=0; } for(i=0;i<3;i++) { //寻找波峰 if(Step_P_Flag[i]==0)//找波峰的起点 { if(Axis_ResultA[i]<=Step_Startmin[i]) { } else { Step_Startmin[i]=Axis_ResultA[i]; //跳入寻找最大值 Step_Max[i]=Axis_ResultA[i]; Step_P_Flag[i]=1; } // { // if(i==Axis_Flag) //printf("%d:%d,%d,%d\n",Step_P_Flag[i],Axis_ResultA[0],Axis_ResultA[1],Axis_ResultA[2]);
分享到:
收藏