历史上的今天
返回首页

历史上的今天

今天是:2025年03月26日(星期三)

正在发生

2020年03月26日 | stm32---ADXL345

2020-03-26 来源:eefocus

ADXL345是一款三轴加速度传感器,广泛用于手机、游戏手柄等设计。


ADXL 支持标准的 I2C 或 SPI 数字接口,自带 32 级 FIFO 存储,并且内 部有多种运动状态检测和灵活的中断方式等特性,常用I2C接口

13367077-399ad5f7008bf43d.PNG

检测轴

初始化步骤

1)上电

2)等待 1.1ms

3)初始化命令序列

4)结束


其中上电这个动作发生在开发板第一次上电的时候,在上电之后,等待 1.1ms 左右,就可以开始发送初始化序列了,初始化序列一结束, ADXL345 就 开始正常工作了

13367077-d646e76312aae81f.PNG

stm里的硬件电路

adxl345.c


#include "adxl345.h"

#include "iic.h"

#include "math.h"

#include "SysTick.h"

 

 

//初始化ADXL345.

//返回值:0,初始化成功;1,初始化失败.

u8 ADXL345_Init(void)

{                 

    IIC_Init();                         //初始化IIC总线  

    if(ADXL345_RD_Reg(DEVICE_ID)==0XE5) //读取器件ID

    {  

        ADXL345_WR_Reg(DATA_FORMAT,0X2B);   //低电平中断输出,13位全分辨率,输出数据右对齐,16g量程 

        ADXL345_WR_Reg(BW_RATE,0x0A);       //数据输出速度为100Hz

        ADXL345_WR_Reg(POWER_CTL,0x28);     //链接使能,测量模式

        ADXL345_WR_Reg(INT_ENABLE,0x00);    //不使用中断      

        ADXL345_WR_Reg(OFSX,0x00);

        ADXL345_WR_Reg(OFSY,0x00);

        ADXL345_WR_Reg(OFSZ,0x00);  

        return 0;

    }           

    return 1;                                     

 

//写ADXL345寄存器

//addr:寄存器地址

//val:要写入的值

//返回值:无

void ADXL345_WR_Reg(u8 addr,u8 val) 

{

    IIC_Start();                 

    IIC_Send_Byte(ADXL_WRITE);      //发送写器件指令    

    IIC_Wait_Ack();    

    IIC_Send_Byte(addr);            //发送寄存器地址

    IIC_Wait_Ack();                                                        

    IIC_Send_Byte(val);             //发送值                      

    IIC_Wait_Ack();                    

    IIC_Stop();                     //产生一个停止条件     

 

//读ADXL345寄存器

//addr:寄存器地址

//返回值:读到的值

u8 ADXL345_RD_Reg(u8 addr)      

{

    u8 temp=0;       

    IIC_Start();                 

    IIC_Send_Byte(ADXL_WRITE);  //发送写器件指令    

    temp=IIC_Wait_Ack();       

    IIC_Send_Byte(addr);        //发送寄存器地址

    temp=IIC_Wait_Ack();                                                       

    IIC_Start();                //重新启动

    IIC_Send_Byte(ADXL_READ);   //发送读器件指令    

    temp=IIC_Wait_Ack();       

    temp=IIC_Read_Byte(0);      //读取一个字节,不继续再读,发送NAK               

    IIC_Stop();                 //产生一个停止条件      

    return temp;                //返回读到的值

 

 

//读取3个轴的数据

//x,y,z:读取到的数据

void ADXL345_RD_XYZ(short *x,short *y,short *z)

{

    u8 buf[6];

    u8 i;

    IIC_Start();                 

    IIC_Send_Byte(ADXL_WRITE);  //发送写器件指令    

    IIC_Wait_Ack();    

    IIC_Send_Byte(0x32);        //发送寄存器地址(数据缓存的起始地址为0X32)

    IIC_Wait_Ack();                                                        

    

    IIC_Start();                //重新启动

    IIC_Send_Byte(ADXL_READ);   //发送读器件指令

    IIC_Wait_Ack();

    for(i=0;i<6;i++)

    {

        if(i==5)buf[i]=IIC_Read_Byte(0);//读取一个字节,不继续再读,发送NACK  

        else buf[i]=IIC_Read_Byte(1);   //读取一个字节,继续读,发送ACK 

    }                  

    IIC_Stop();                 //产生一个停止条件

    

    *x=(short)(((u16)buf[1]<<8)+buf[0]); //低字节先读,两个字节表示一个方向位的值    

    *y=(short)(((u16)buf[3]<<8)+buf[2]);        

    *z=(short)(((u16)buf[5]<<8)+buf[4]);       

}

 

 

//读取ADXL的平均值

//x,y,z:读取10次后取平均值

void ADXL345_RD_Avval(short *x,short *y,short *z)

{

    short tx=0,ty=0,tz=0;      

    u8 i;  

    for(i=0;i<10;i++)

    {

        ADXL345_RD_XYZ(x,y,z);

        delay_ms(10);

        tx+=(short)*x;

        ty+=(short)*y;

        tz+=(short)*z;     

    }

    *x=tx/10;

    *y=ty/10;

    *z=tz/10;

}  

 

 

 

//自动校准

//xval,yval,zval:x,y,z轴的校准值

void ADXL345_AUTO_Adjust(char *xval,char *yval,char *zval)

{

    short tx,ty,tz;

    u8 i;

    short offx=0,offy=0,offz=0;

    ADXL345_WR_Reg(POWER_CTL,0x00);     //先进入休眠模式.

    delay_ms(100);

    ADXL345_WR_Reg(DATA_FORMAT,0X2B);   //低电平中断输出,13位全分辨率,输出数据右对齐,16g量程 

    ADXL345_WR_Reg(BW_RATE,0x0A);       //数据输出速度为100Hz

    ADXL345_WR_Reg(POWER_CTL,0x28);     //链接使能,测量模式

    ADXL345_WR_Reg(INT_ENABLE,0x00);    //不使用中断      

 

    ADXL345_WR_Reg(OFSX,0x00);

    ADXL345_WR_Reg(OFSY,0x00);

    ADXL345_WR_Reg(OFSZ,0x00);

    delay_ms(12);

    for(i=0;i<10;i++)

    {

        ADXL345_RD_Avval(&tx,&ty,&tz);

        offx+=tx;

        offy+=ty;

        offz+=tz;

    }           

    offx/=10;

    offy/=10;

    offz/=10;

    *xval=-offx/4;

    *yval=-offy/4;

    *zval=-(offz-256)/4;      

    ADXL345_WR_Reg(OFSX,*xval);

    ADXL345_WR_Reg(OFSY,*yval);

    ADXL345_WR_Reg(OFSZ,*zval); 

}

 

//读取ADXL345的数据times次,再取平均

//x,y,z:读到的数据

//times:读取多少次

void ADXL345_Read_Average(short *x,short *y,short *z,u8 times)

{

    u8 i;

    short tx,ty,tz;

    *x=0;

    *y=0;

    *z=0;

    if(times)//读取次数不为0

    {

        for(i=0;i        {

            ADXL345_RD_XYZ(&tx,&ty,&tz);

            *x+=tx;

            *y+=ty;

            *z+=tz;

            delay_ms(5);

        }

        *x/=times;

        *y/=times;

        *z/=times;

    }

 

//得到角度

//x,y,z:x,y,z方向的重力加速度分量(不需要单位,直接数值即可)

//dir:要获得的角度.0,与Z轴的角度;1,与X轴的角度;2,与Y轴的角度.

//返回值:角度值.单位0.1°.

//res得到的是弧度值,需要将其转换为角度值也就是*180/3.14

short ADXL345_Get_Angle(float x,float y,float z,u8 dir)

{

    float temp;

    float res=0;

    switch(dir)

    {

        case 0://与自然Z轴的角度

            temp=sqrt((x*x+y*y))/z;

            res=atan(temp);

            break;

        case 1://与自然X轴的角度

            temp=x/sqrt((y*y+z*z));

            res=atan(temp);

            break;

        case 2://与自然Y轴的角度

            temp=y/sqrt((x*x+z*z));

            res=atan(temp);

            break;

    }

    return res*180/3.14;

}

 

adxl345.h


#ifndef _adxl345_H

#define _adxl345_H

 

#include "system.h"

 

 

 

#define DEVICE_ID       0X00    //器件ID,0XE5

#define THRESH_TAP      0X1D    //敲击阀值

#define OFSX            0X1E

#define OFSY            0X1F

#define OFSZ            0X20

#define DUR             0X21

#define Latent          0X22

#define Window          0X23 

#define THRESH_ACK      0X24

#define THRESH_INACT    0X25 

#define TIME_INACT      0X26

#define ACT_INACT_CTL   0X27     

#define THRESH_FF       0X28    

推荐阅读

史海拾趣

EDAL公司的发展小趣事

随着技术的不断进步和市场的变化,EDAL公司意识到必须不断优化产品以满足客户的需求。公司投入大量研发资源,对EDA工具进行迭代升级,推出了更加智能化、用户友好的产品。同时,EDAL公司积极拓展市场,与全球各大芯片设计公司建立了合作关系,将产品销售到世界各地。

Hind Rectifiers Ltd公司的发展小趣事

随着云计算、大数据等技术的兴起,传统EDA行业面临着前所未有的挑战。为了应对这些挑战,EDAL公司积极转型升级,将云计算、大数据等技术与EDA工具相结合,推出了更加高效、智能的云端EDA服务。这一创新的服务模式不仅提升了客户的设计效率,还降低了成本,赢得了市场的广泛认可。

迈翔科技(COILMX)公司的发展小趣事

进入21世纪后,迈翔科技面临了来自国内外同行的激烈竞争。为了保持竞争力,公司投入大量资源进行技术研发和创新。通过不懈努力,公司成功开发出了一系列高性能的贴片功率电感和大电流电感,这些产品凭借卓越的性能和稳定的品质,迅速获得了市场的认可。

AMERICASEMI [America Semiconductor, LLC]公司的发展小趣事

为了进一步扩大市场份额,AMERICASEMI积极寻求与其他企业的合作机会。公司与多家知名电子产品制造商建立了稳定的合作关系,为其提供优质的半导体产品和技术支持。同时,AMERICASEMI还积极开拓国际市场,将产品出口到全球多个国家和地区,实现了业务的快速增长。

Advanced Illumination Inc公司的发展小趣事

随着技术的不断进步,Ai公司在LED照明光源领域取得了重大突破。公司成功研发出了一系列高效、稳定、可靠的LED光源产品,这些产品不仅性能卓越,而且设计新颖,满足了市场对于高质量照明光源的迫切需求。同时,公司还不断创新,推出了多款具有自主知识产权的新型LED光源,进一步巩固了公司在行业内的领先地位。

Gamma Microelectronics ( APM )公司的发展小趣事

2007年10月,G24i在英国建立了DSSC的30MW试产线,这是全球范围内的重要里程碑。这条生产线具备高效的生产能力,能够在不到3小时的时间内制造出长达约800米的太阳能电池,生产速度高达每分钟4米以上。这一成就不仅展示了G24i在规模化生产方面的实力,也为后续的商业化应用奠定了产能基础。尽管初期商业化模组产品的转换效率仅为3%,但G24i通过不断优化生产工艺和降低成本,逐步提升了产品的市场竞争力。

问答坊 | AI 解惑

DVR的结构解析以及工作原理

最近关注安防领域,希望同行们多多交流。 DVRDigitalVideoRecorder(数字硬盘录像机),是目前视频监控行业最为常见并且最为理想的监控和记录视频资料的设备。 DVR是一套进行图像存储处理的计算机系统,具有对图像/语音进行长时间录像、录音、远程 ...…

查看全部问答>

射频电路PCB设计

1 板材的选择 印刷电路板的基材包括有机类与无机类两大类。基材中最重要的性能是介电常数εr、耗散因子(或称介质损耗)tanδ、热膨胀系数CET和吸湿率。其中εr影响电路阻抗及信号传输速率。对于高频电路,介电常数公差是首要考虑的更关键因素,应 ...…

查看全部问答>

數位相機光學系統小型化設計技巧

數位相機光學系統小型化設計技巧…

查看全部问答>

维控 开机画面停留5秒进入指定画面

 开机后点开机画面任意点,就跳到指定画面。   首先,在工程配置的系统参数里,一般属性栏下有个“启用系统控制区”,输入控制画面切换的地址,这个地址可以用我们的HDW里的地址,我们就拿HDW0为例。   然后,在开机画面上加个无 ...…

查看全部问答>

小弟刚学CE 举足无错 球帮助

小弟近日学CE 半月有余 不甚进展 苦恼至极 也有看过何老师一些基础的书籍 感觉还是虚的很 而且入门的书大多都讲代码如何写 甚少有讲往哪里写 我(ˇ?ˇ) 想~首先向弄明白写代码的流程 由于老板要求做CE的底层驱动  我看书是只要看 ...…

查看全部问答>

usb线缆插入WinCE设备以后充电过程是在哪里实现的?

如题,请教各位,当usb线缆插入WinCE设备以后应该是先充电再通信,那么充电过程是在哪里实现的?…

查看全部问答>

一个cf卡启动的问题!请指导一下^-^

昨天用cf卡进行vxworks启动,成功了!但是有一个地方我没改,原以为启动不了,但是发现居然也成功了!! 问题是:在sysLib.c中将原来的ataTypes数组 ATA_TYPE ataTypes[ATA_MAX_CTRLS][ATA_MAX_DRIVES] =     { ................   &n ...…

查看全部问答>

LED环氧树脂工艺不良处理方法

[hide]LED生产过程中所使用的环氧树脂(Epoxy),是业界制作产品时的重点之一,以下是LED工艺中个别不良现象的处理方法:一、因硬化不良而引起裂化现象:硬化物中有裂化发生。原因:硬化时间短,烤箱之温度不均匀。处理方法:1.测定Tg是否有硬化不良 ...…

查看全部问答>

最近有没有stm32开发板团购活动

最近有没有stm32开发板团购活动…

查看全部问答>

今天才参加完ST武汉站研讨会,

                                 第一次接触ST的MCU,不能说它很强但整体上觉得ST32还是很特色的一种,至少在USB和Ethernet及ADC(会上说它有16个通道 ...…

查看全部问答>