stm32 ADXL345传感器
加速度灵敏度轴
沿敏感轴加速时相应输出电压增加
寄存器映射
寄存器定义
0x31—DATA_FORMAT
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范围
0x2C—BW_RATE
LOW_POWER位:设置为0,选择正常操作,设置为1,选择低功率操作,而此时噪声有所增加
速率位:选择器件带宽和输出数据速率。默认值为0x0A,转换为100Hz的输出数据速率
0x2D—POWER_CTL
链接位:活动和静止功能的链接位设置为1,延迟活动功能开始,直到检测到静止。检测到活动后,静止检测开始,活动检测停止。该位串行链接活动和静止功能。此位设置为0时,静止功能和活动功能同时进行
AUTO_SLEEP位:设置链接位, AUTO_SLEEP位设置为1,自动休眠功能使能
测量位:测量位设置为0,将器件置于待机模式,设置为1,置于测量模式
休眠位:休眠位设置为0,将器件置于普通工作模式,设置为1,置于休眠模式
唤醒位:控制休眠模式下的读取频率
0x2E—INT_ENABLE
设置位值为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 磁场传感器HMC5883
一.IIC协议 默认(出厂) HMC5883LL 7 位从机地址为0x3C 的写入操作,或0x3D 的读出操作. 要改变测量模式到连续测量模式,在通电时间后传送三个字节:0x3C 0x02 0x00 ...
- OneNET麒麟座应用开发之五:获取加速度传感器ADXL345数据
由于数据采集站基本都安装在野外或者楼顶,安装位置以及震动对检测数据的准确性有一定影响.所以想要有一个位置状态数据,正好发现麒麟作上有ADXL345,这样一个数字输出的加速度传感器.如图中红框所示: 1 ...
- STM32学习笔记(七) ADC模数转换测电平(普通和DMA模式)
嵌入式系统在微控制领域(温度,湿度,压力检测,四轴飞行器)中占据着重要地位,这些功能的实现是由微处理器cpu(如stm32)和传感器以及控制器共同完成的,而连接他们,使它们能够互相正常交流的正是本小节 ...
- (四)HXDZ-30102-ACC检测心率血氧数据并通过串口助手显示
主要参考模块说明书 写在前面的话 硬件原理我是真的搞不明白,所以心率血氧传感器数据检测就是模块卖家自带的代码... 我使用HXDZ-30102-ACC传感器也是偶然在网上检索到的,集成心率血氧和三轴加 ...
- stm32软件模拟IIC读取PX4FLOW光流传感器数据
这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...
- STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题
1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...
- stm32与HC-SR04超声波传感器测距
首先,先来看一下这个模块的基本功能和原理. HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm:模块包括超声波发射器.接收器与控制电路.像智能小车的测距 ...
- STM32之光敏电阻传感器模块的使用
本实验配合2.2寸TFT液晶屏显示,当光弱的时候显示“昏暗”,光强时显示“明亮”. 实验使用的是下图所示的3线光敏电阻传感器模块,用途:光线亮度检测,光线亮度传感器,智能小车寻光模块.模块特色:比较器 ...
- stm32与地磁传感器HMC5883L
1.简介 霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域.HMC5883L 包括最先进的高分辨率 HMC118X 系列磁阻传感器 ...
随机推荐
- RabbitMQ 入门教程(PHP版) 第六部分:远程调用(RPC)
在云计算环境中,很多时候需要用它其他机器的计算资源,把一部分计算任务分配到其他节点来完成.RabbitMQ 如何使用 RPC 呢?下面将会通过其它节点完成斐波纳契示例. 流程图  当客户端启动时,它 ...
- How to Plan and Configure YARN and MapReduce 2 in HDP 2.0
As part of HDP 2.0 Beta, YARN takes the resource management capabilities that were in MapReduce and ...
- Java extract amplitude array from recorded wave
转载自:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/java-extract-amplitude-array-from.html Extra ...
- MVC4笔记 RedirectResult,RedirectToRoute
RedirectResult:运行重新导向到其他网址,在RedirectResult的内部,基本上还是以Response.Redirect方法响应HTTP 302暂时导向. eg: public Ac ...
- RobotFramework:查询条件为最近一个月的数据(2019-07-09 00:00:00.000 到 2019-08-07 23:59:59.999)
自动化测试中遇到,默认查询条件为最近一个月,所以起始时间就应该为(2019-07-09 00:00:00.000 到 2019-08-07 23:59:59.999) test ${current_ ...
- centos7 install docker
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo y ...
- Appium移动自动化测试-----(十二)appium API 之 TouchAction 操作
Appium的辅助类,主要针对手势操作,比如滑动.长按.拖动等. 1.按压控件 方法: press() 开始按压一个元素或坐标点(x,y).通过手指按压手机屏幕的某个位置. press(WebElem ...
- Vmware player--打开vmdk; 导出系统;
https://www.cnblogs.com/wxdblog/p/7091496.html 用vmware player打开已经存在的VMDK的方法: https://jingyan.baidu.c ...
- Zero-shot Learning / One-shot Learning / Few-shot Learning
Zero-shot Learning / One-shot Learning / Few-shot Learning Learning类型:Zero-shot Learning.One-shot Le ...
- [转帖]ARM发布Ethos-N57/N73 NPU、Mali-G57 Valhall GPU和Mali-D37 DPU
ARM发布Ethos-N57/N73 NPU.Mali-G57 Valhall GPU和Mali-D37 DPU https://www.cnbeta.com/articles/tech/902417 ...