历史上的今天
返回首页

历史上的今天

今天是:2025年01月04日(星期六)

2019年01月04日 | stm32 ADXL345传感器

2019-01-04 来源:eefocus

加速度灵敏度轴 

沿敏感轴加速时相应输出电压增加 

1


寄存器映射 

1


寄存器定义 

0x31—DATA_FORMAT 

1


SELF_TEST位:设置为1,自测力应用至传感器,造成输出数据转换。值为0时,禁用自测力 
SPI位:值为1,设置器件为3线式SPI模式,值为0,则设置为4线式SPI模式 
INT_INVERT位:值为0,设置中断至高电平有效,值为1,则设置至低电平有效 
FULL_RES位:设置为1,该器件为全分辨率模式,输出分辨率随着范围位设置的g范围,以4 mg/LSB的比例因子而增加。 FULL_RES位设置为0时,该器件为10位模式,范围位决定最大g范围和比例因子 
对齐位:设置为1,选择左对齐(MSB)模式,设置为0,选择右对齐模式,并带有符号扩展功能 
范围位:设置g范围 

1

0x2C—BW_RATE 

1


LOW_POWER位:设置为0,选择正常操作,设置为1,选择低功率操作,而此时噪声有所增加 
速率位:选择器件带宽和输出数据速率。默认值为0x0A,转换为100Hz的输出数据速率


0x2D—POWER_CTL 

1


链接位:活动和静止功能的链接位设置为1,延迟活动功能开始,直到检测到静止。检测到活动后,静止检测开始,活动检测停止。该位串行链接活动和静止功能。此位设置为0时,静止功能和活动功能同时进行 
AUTO_SLEEP位:设置链接位, AUTO_SLEEP位设置为1,自动休眠功能使能 
测量位:测量位设置为0,将器件置于待机模式,设置为1,置于测量模式 
休眠位:休眠位设置为0,将器件置于普通工作模式,设置为1,置于休眠模式 
唤醒位:控制休眠模式下的读取频率 

1


0x2E—INT_ENABLE 


1


设置位值为1,使能相应功能,生成中断,设置为0时,阻止这些功能产生中断

寄存器0x1E、0x1F、0x20 — OFSX、OFSY、OFSZ。提供用户设置偏移调整

寄存器0x32至0x37 — DATAX0、DATAX1、DATAY0、DATAY1、DATAZ0和DATAZ1。保存各轴的输出数据

举例

#define DEVICE_ID       0X00 //器件ID

#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    

#define TIME_FF     0X29 

#define TAP_AXES        0X2A  

#define ACT_TAP_STATUS  0X2B 

#define BW_RATE     0X2C 

#define POWER_CTL       0X2D 


#define INT_ENABLE      0X2E

#define INT_MAP     0X2F

#define INT_SOURCE      0X30

#define DATA_FORMAT 0X31

#define DATA_X0     0X32

#define DATA_X1     0X33

#define DATA_Y0     0X34

#define DATA_Y1     0X35

#define DATA_Z0     0X36

#define DATA_Z1     0X37

#define FIFO_CTL        0X38

#define FIFO_STATUS 0X39


#define ADXL_READ    0X3B //读指令

#define ADXL_WRITE   0X3A //写指令


typedef enum

{

    X, //与x轴的角度

    Y, //与y轴的角度

    Z  //与z轴的角度

}DIR_t;


void ADXL345_write(u8 addr, u8 data)

{

    I2C_start();

    I2C_send_byte(ADXL_WRITE);

    I2C_wait_ack();

    I2C_send_byte(addr);

    I2C_wait_ack();

    I2C_send_byte(data);

    I2C_wait_ack();

    I2C_stop();  


    delay_ms(10);

}


u8 ADXL345_read(u8 addr)

{

    u8 d = 0;


    I2C_start();    

    I2C_send_byte(ADXL_WRITE);

    I2C_wait_ack();

    I2C_send_byte(addr);

    I2C_wait_ack();

    I2C_start();    

    I2C_send_byte(ADXL_READ);

    I2C_wait_ack();

    d = I2C_recv_byte();

    I2C_ack(1);

    I2C_stop();


    return d;   

}


void ADXL345_init()

{

    u8 d;


    I2C_init();


    d = ADXL345_read(DEVICE_ID);


    printf("ADXL345_read %d\n", d);


    if(d == 0xE5)

    {

        ADXL345_write(DATA_FORMAT, 0x2B); //中断低电平有效,13位全分辨率模式,16g量程

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

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

        ADXL345_write(OFSX, 0x00);

        ADXL345_write(OFSY, 0x00);

        ADXL345_write(OFSZ, 0x00);

    }   

}


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

{

    u8 i = 0;

    u16 buf[6] = {0};


    I2C_start();    

    I2C_send_byte(ADXL_WRITE);

    I2C_wait_ack();

    I2C_send_byte(0x32); //数据首地址

    I2C_wait_ack();

    I2C_start();    

    I2C_send_byte(ADXL_READ);

    I2C_wait_ack();


    for(i = 0; i < 6; i++) //总共6个

    {

        buf[i] = I2C_recv_byte();

//      printf("I2C_recv_byte [%d] %d\r\n", i, buf[i]);

        if(i == 5)

        {

            I2C_ack(1);

        }

        else

        {

            I2C_ack(0);

        }

    }


    I2C_stop();


    *x = (short)((buf[1]<<8) + buf[0]);         

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

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

}


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

{

    u8 i = 0;

    short tx, ty, tz;


    *x = *y = *z = 0;


    for(i = 0; i < times; i++) //读取times次

    {

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


        *x += tx;

        *y += ty;

        *z += tz;       


        delay_ms(5);

    }


    *x /= times; //求平均

    *y /= times;

    *z /= times;    

}


short ADXL345_get_result(float x, float y, float z, u8 dir) //计算角度

{

    float t;

    float res;


    switch(dir)

    {

        case X:

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

            res = atan(t); //求出弧度

            break;

        case Y:

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

            res = atan(t);

            break;

        case Z:

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

            res = atan(t);

            break;

        default:

            break;

    }


    return (res * 180 / 3.14); //求出角度

}


void ADXL345_main()

{

    short x, y, z;

    short rx, ry, rz;


    ADXL345_read_times(&x, &y, &z, 10); //读出x,y,z方向加速度值

    printf("x %d\n", x);

    printf("y %d\n", y);

    printf("z %d\n", z);


    rx = ADXL345_get_result(x, y, z, X);

    ry = ADXL345_get_result(x, y, z, Y);

    rz = ADXL345_get_result(x, y, z, Z);

    printf("rx %d\n", rx);

    printf("ry %d\n", ry);

    printf("rz %d\n", rz);

}


推荐阅读

史海拾趣

Electrocube Inc公司的发展小趣事

在稳固国内市场的同时,Electrocube Inc公司积极开拓国际市场。公司参加了多个国际电子展会,与全球知名电子企业建立了广泛的合作关系。通过不断的市场拓展,Electrocube Inc公司的产品已经远销欧美、亚洲等多个国家和地区,实现了跨越式的发展。

Dalian Dlicap Corporation公司的发展小趣事

大连达利凯普科技股份公司自成立以来,始终坚持自主创新和技术研发。公司拥有一支专业的研发团队,致力于射频微波磁介电容器(射频微波MLCC)的研发和生产。通过不懈努力,公司成功掌握了射频微波MLCC的关键核心技术,并获得了全部自主知识产权。这一技术突破不仅使达利凯普在行业内树立了技术领先地位,也为公司赢得了广泛的市场认可。

BUSSMANN公司的发展小趣事

1985年,库柏工业收购了Bussmann公司,成立了新的事业部——“Cooper Bussmann熔断器”。这一收购为Bussmann带来了更广阔的市场和更多的资源,同时也带来了新的挑战和机遇。在库柏工业的支持下,Bussmann开始了更加积极的创新和市场拓展,逐渐成为了全球熔断器行业的领导者。

Grayhill公司的发展小趣事
使用万用表等工具测量电路的输出电压和电流,确保它们符合设计要求。
DCX-CHOL Enterprises公司的发展小趣事

DCX-CHOL Enterprises成立于一个科技蓬勃发展的时代。公司的创始人是一群热衷于电子技术的年轻人,他们看到市场上对于高性能、低功耗芯片的巨大需求,于是决定自主研发。经过数年的艰苦努力,他们成功开发出了一款具有革命性意义的低功耗芯片,该芯片不仅性能卓越,而且成本远低于同类产品。这一创新成果迅速赢得了市场的认可,DCX-CHOL Enterprises因此获得了第一桶金,为公司后续的发展奠定了坚实的基础。

B+B SmartWorx公司的发展小趣事

B+B SmartWorx在成立初期便注重全球市场布局,特别是在美国和欧洲市场。通过多年的深耕细作,公司在这些地区建立了广泛的销售渠道和优秀的团队。其产品在美洲市场占据了58%的份额,欧洲市场占28%,其余地区占14%。这种全球布局不仅提升了公司的品牌知名度,也为其后续发展奠定了坚实的基础。

问答坊 | AI 解惑

新手求助,帮忙推荐本书

我大三,微电子的,跟老师做蓝牙接收机前端芯片,包括LNA和混频器,想找几本关于射频段电容电感对频率特性和噪声特性影响的书,希望找本讲的比较透彻的那种,最好还有关于极点特征频率之类仔细推倒的。哪位前辈推荐几本吧,不胜感激…

查看全部问答>

spwm波用单片机怎么编程?

spwm波用单片机怎么编程?如果用定时计数器的话,初值怎么选定?…

查看全部问答>

按按键有时候发出异常的响声是驱动的问题吗?

rt 我们的产品还在完善阶段,按按键有时候发出异常的声音,但是没有进行违规的操作,会是驱动的原因吗?…

查看全部问答>

我用alsa的arecord录音问题

我用alsa的arecord工具录制外面接入的mp3音频数据,存成pcm格式,但录制结束后 播放的时候,总是会比正常文件的播放速度快很多,我录制的时候,采用44100hz,2声道,立体声 为什么录制的文件速度会快呢…

查看全部问答>

难道 WinCE 不支持 动画光标吗

找了好几天了,一直没有找到方法 btw: 我用的是evc…

查看全部问答>

高薪招聘!!!

本公司招聘“网络协议工程师”若干名,一经录用,待遇从优, 联系方式:HR_HONG@foxmail.com 有意向的朋友,请将个人简历发送到以上邮箱里,我会第一时间与您取得联系! 谢谢! 岗位名称:网络协议工程师 任职条件: 1.一年以上的嵌入式系统 ...…

查看全部问答>

刚去听了TI讲堂

论坛新开了个TI在线课堂,前两天没注册成功,今天上午溜进去看了看,嘿嘿,很久没上课了.....添加个人信息,点进去没视频,哦换了IE就好了。公司网络还是很流畅的,不错讲课的老师很熟悉的样子,奇怪,难道在哪次TI Day上见过?课程从MSP430的产品 ...…

查看全部问答>

EL2070 带宽内增益变化很大

用EL2070 做的一个放大器,但在10M--60M频带内增益变化很大: 请教大家,这是相位余量的问题还是什么原因导致的: 电路原理图及测试的SIG_OUT输出波形如下:…

查看全部问答>

低价出ti tms320f28035,新唐nuc140,linear dc590b 等开发板

上次没有上图,这次把图上上。低价出给需得着的朋友。 1. tms320f28035  ti原厂   50元  不包邮。2. 新唐 nuc140  新唐原厂  单个30  两个50   不包邮。 3. linear dc590 ...…

查看全部问答>