stm32 ADXL345传感器

发布者:RadiantBlossom最新更新时间:2019-01-04 来源: eefocus关键字:stm32  ADXL345传感器 手机看文章 扫描二维码
随时随地手机看文章

加速度灵敏度轴 

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

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);

}


关键字:stm32  ADXL345传感器 引用地址:stm32 ADXL345传感器

上一篇:stm32 定时器 通用定时器
下一篇:stm32 FSMC-外扩SRAM IS62WV51216

推荐阅读最新更新时间:2024-03-16 16:21

关于stm32启动文件的选择
- startup_stm32f10x_ld_vl.s: for STM32 Low density Value line devices - startup_stm32f10x_ld.s: for STM32 Low density devices - startup_stm32f10x_md_vl.s: for STM32 Medium density Value line devices - startup_stm32f10x_md.s: for STM32 Medium density devices - startup_stm32f10x_hd.s: for STM32 High density devices - sta
[单片机]
STM32使用16M外部晶振时串口乱码
1.出现的问题: 修改RCC配置代码如下: 将语句:RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //之前使用8MHz外部晶振,9倍频到72MHz 修改为:RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9); //使用16MHz外部晶振之后,2分频再9倍频到72MHz 测试 中发现串口1一直是乱码。 2.解决办法: (1).去除库文件:stm32f10x.h的只读属性。 (2).此文件中找到语句:#define HSE_VALUE ((uint32_t)8000000) /*! Value of the Ext
[单片机]
如何通过控制寄存器来点亮LED灯
学习本章时,配合《STM32F4xx中文参考手册》 通用I/O(GPIO) 章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。关于建立工程时使用KEIL5的基本操作,请参考前面的章节。 7.1 GPIO简介 GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32芯片的GPIO被分成很多组,每组有16个引脚,如型号为STM32F4IGT6型号的芯片有GPIOA、GPIOB、GPIOC至GPIOI共9组GPIO,芯片一共176个引脚,其中GPIO就占了一大部分,所有的GPIO引脚都有基本的输入输出功能。 最基
[单片机]
如何通过控制寄存器来点亮LED灯
STM32——时钟系统
一、时钟树 普通的MCU,一般只要配置好GPIO 的寄存器,就可以使用了。STM32为了实现低功耗,设计了非常复杂的时钟系统,必须开启外设时钟才能使用外设资源。 左边开始,从时钟源一步步分配 到外设时钟。 从时钟频率来说,又分为高速时钟和低速时钟,高速时钟是提供给芯片主体的主时钟,而低速时钟只是提供给芯片中的 RTC(实时时钟)及独立看门狗使用。 从芯片角度来说,时钟源分为内部时钟与外部时钟源,内部时钟是在芯片内部 RC 振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用 内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而
[单片机]
设置stm32系统各部分时钟
函数如下: /************************************************************************** * 函数名 : RccInitialisation * 函数描述 : 设置系统各部分时钟 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 **************************************************************************/ void RccInitialisation(void) { /* 定义枚举类型变量 HSEStartUpStatus */ ErrorStatus H
[单片机]
STM32中的看门狗
先复制一段度娘的东西: 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。 简单来说,看门狗就是在不停地对我们正在运行的程序进行监视,我们必须在规定的时间的有效的时间内去进行“喂狗”操作,这样看门狗就知道我们的程序正在正常的运行,如果我们程序由于外界原因跑飞了,那么就无法进行喂狗操作,那么看门狗由于饥饿难耐,他就会使我们的单片
[单片机]
<font color='red'>STM32</font>中的看门狗
怎样在Linux上开发STM32程序
步骤1:下载所需的一切 您需要下载三个部分才能正常工作: 用于ARM的GCC编译器 STM32固件文件 St-link实用程序 Sample Project 编译器是将我们的C代码和所有其他库文件编译成stm32控制器可以理解的机器语言的主要软件。下载此编译器的最新预编译版本。 包含STM32固件的文件夹是保存主处理器运行所需的所有启动文件和核心文件的文件夹。我们将使用HAL已超越的标准外围设备库。我更喜欢StPeriphLibrary,因为使用该处理器的公司都在使用它们,因为它功能强大,更老旧并且受支持。它也更坚固。它不会减少初始化外围设备或打开LED所需的工作,但是会迫使您学习这些处理器的工作方式。这样一来,您将对内部工作
[单片机]
怎样在Linux上开发<font color='red'>STM32</font>程序
stm32使用 ST-LINK Utility量产,程序读保护、写保护
一、下载 ST-LINK Utility 去ST官网下载ST-LINK Utility,下载链接,安装。 二、使用ST-Link链接板子,打开ST-LINK Utility,点连接,如果正常,则stm32的相关信息会被读出来显示。 三、开始量产 “Target”-“Automatic Mode” 勾选相关设置,比如是否全片擦除、是否检验、是否配置Option bytes、下载完成是否自动运行 如果要使能读保护和写保护,先勾选复选框,然后点击“Configure...”,弹出设置: 选择使能读保护,下面几个复选框一般勾上即可,比如WDG_SW是控制是否打开硬件看门狗的,如果不勾,就会打开,造成芯片一段时间后
[单片机]
<font color='red'>stm32</font>使用 ST-LINK Utility量产,程序读保护、写保护
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved