|
最近在做加速度相关的东东,一致过来让大家看看。
首先是关于ADXL345的代码,有两个文件,adxl345.c和adxl345.h,这里使用了IIC模拟IIC通信的方式,使用引出脚A0到A5中的任意引脚。
首先是选择模拟IIC通信的引脚,这里选择了A0和A1左右通信引脚,其中A1引脚作为SDA,A0作为SCL。这里有两种方式,一种是在添加文件中直接定义引脚,另一种是使用sa_gpio.c文件中的引脚初始化函数进行定义。
在代码中给出了这两种方式。用到的是sa_gpio.c中的引脚初始化函数。
- void start()
- {
- SCL_OUT;
- SDA_OUT;
- SDA_H;
- SCL_H;
- Delay_us(2);
- SDA_L;
- Delay_us(2);
- SCL_L;
- }
- void stop(void)
- {
- SCL_OUT;
- SDA_OUT;
- SDA_L;
- SCL_H;
- Delay_us(2);
- SDA_H;
- Delay_us(2);
- SCL_L;
- }
- void mack(void)
- {
- SDA_OUT;
- SCL_OUT;
- SDA_L;
- SCL_H;
- Delay_us(2);
- SCL_L;
- SDA_H;
- }
- void mnack(void)
- {
- SDA_OUT;
- SCL_OUT;
- SDA_H;
- Delay_us(2);
- SCL_H;
- Delay_us(2);
- SCL_L;
- SDA_L;
- }
- void cack()
- {
- SDA_IN;
- SCL_OUT;
- SCL_L;
- Delay_us(2);
- SCL_H;
- err=0;
- if(SDA_DATE)err=1;
- SCL_L;
- SDA_OUT;
- }
- void write1byte(uchar byte1)
- {
- unsigned char i=8;
- SDA_OUT;
- SCL_OUT;
- while(i--)
- {
- Delay_us(4);
- if(byte1 & 0x80)
- {SDA_H;}
- else
- {SDA_L;}
- Delay_us(2);
- SCL_H;
- Delay_us(2);
- SCL_L;
- byte1<<=1;
- }
- }
- uchar read1byte(void)
- {
- unsigned char i;
- unsigned char ddata=0;
- signed char temp;
- SCL_OUT;
- SDA_IN;
- for(i=0;i<8;i++)
- {
- ddata<<=1;
- Delay_us(4);
- SCL_H;
- temp=SDA_DATE;
- if(temp) ddata++;
- Delay_us(4);
- SCL_L;
- }
- return ddata;
- }
- void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
- {
- start();
- write1byte(SlaveAddress);
- cack();
- write1byte(REG_Address);
- cack();
- write1byte(REG_data);
- cack();
- stop();
- }
- uchar Single_Read_ADXL345(uchar REG_Address)
- {
- uchar REG_data;
- start();
- write1byte(SlaveAddress);
- cack();
- write1byte(REG_Address);
- cack();
- start();
- write1byte(SlaveAddress+1);
- cack();
- REG_data=read1byte();
- mnack();
- stop();
- return REG_data;
- }
- void Multiple_read_ADXL345(void)
- {
- uchar i;
- start();
- write1byte(SlaveAddress);
- cack();
- write1byte(0x32);
- cack();
- start();
- write1byte(SlaveAddress+1);
- cack();
- for (i=0; i<6; i++)
- {
- BUF = read1byte();
- if (i == 5)
- {
- mnack();
- }
- else
- {
- mack();
- }
- }
- stop();
- Delay_us(100);
- }
- void Init_ADXL345()
- {
- RCC->APB2ENR|=1<<3;
- Single_Write_ADXL345(0x31,0x0B);
- Single_Write_ADXL345(0x2C,0x08);
- Single_Write_ADXL345(0x2D,0x08);
- Single_Write_ADXL345(0x2E,0x80);
- Single_Write_ADXL345(0x1E,0x00);
- Single_Write_ADXL345(0x1F,0x00);
- Single_Write_ADXL345(0x20,0x05);
- }
- int Hecheng_data()
- {
- int sum,a,b,c;
- Multiple_read_ADXL345();
- data_xyz[0]=(BUF[1]<<8)+BUF[0];
- data_xyz[1]=(BUF[3]<<8)+BUF[2];
- data_xyz[2]=(BUF[5]<<8)+BUF[4];
- kaifang( data_xyz[0]*data_xyz[0]+data_xyz[1]*data_xyz[1]+data_xyz[2]*data_xyz[2]);
- return sum;
- }
- float kaifang( float number )
- {
- long i;
- float x2, y;
- const float threehalfs = 1.5F;
复制代码
main函数中只需要增加adxl的初始化函数。
- int main(void)
- {
- SystemInit();
- UARTx_Init();
- Printf_SystemRccClocks();
- RTC_Init();
- Hal_Init();
- McuStatusInit();
- Init_ADXL345();
- Delay_Init(8);
- while(1)
- {
- MessageHandle();
- KEY_Handle();
- IR_Handle();
- DHT11_Read_Data(&Device_ReadStruct.Temperature, &Device_ReadStruct.Humidity);
- ReportDevStatusHandle();
- Hecheng_data();
- }
- }
其中在adxl.c中增加了一个很有用的快速开方算法。这个在网上无意中找到的开方算法可以快速的实现开方运算,比math中自带的开方算法要快很多。 |
|