查看: 674|回复: 0

利用机智云做加速度的东东

[复制链接]

该用户从未签到

发表于 2015-11-20 13:16:53 | 显示全部楼层 |阅读模式
分享到:
最近在做加速度相关的东东,一致过来让大家看看。
首先是关于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中自带的开方算法要快很多。
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

手机版|小黑屋|与非网

GMT+8, 2024-4-27 03:24 , Processed in 0.108044 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.