【随手笔记】三轴:ADXL345

ADXL345之倾角+活动中断

1. 硬件

ADDRESS 引脚接地
所以IIC设备地址为0x53

中断INT1 的引脚为PB9

2. 测量范围

ADXL345是一款数字三轴加速度计,可以测量沿三个方向的加速度。
这里的“2g”、“4g”、“8g”和“16g”指的是加速度计可以测量的不同最大加速度范围。
这里的“g”代表地球表面的标准重力加速度,大约为9.80665 m/s²。

自由落体的加速度是指物体在仅受重力作用下自由下落时的加速度,
这个加速度被称为重力加速度,通常用符号 ( g ) 表示。在地球表面附近,
重力加速度的平均值大约是 9.8 米每秒平方(m/s²),有时为了简化计算,也会近似取为 10 m/s²。

测量范围的理解
2g:表示加速度计可以测量从-2g到+2g之间的加速度,即从-19.6133 m/s²到+19.6133 m/s²。
4g:表示加速度计可以测量从-4g到+4g之间的加速度,即从-39.2266 m/s²到+39.2266 m/s²。
8g:表示加速度计可以测量从-8g到+8g之间的加速度,即从-78.4532 m/s²到+78.4532 m/s²。
16g:表示加速度计可以测量从-16g到+16g之间的加速度,即从-156.9064 m/s²到+156.9064 m/s²。
分辨率与灵敏度
分辨率:指加速度计能够区分的最小加速度变化。对于ADXL345,它的分辨率最高可达13位,这意味着在不同的测量范围内,每个LSB(最低有效位)所代表的实际加速度值是不同的。
灵敏度:指加速度计将物理加速度转换为数字输出的能力。ADXL345的灵敏度是固定的4 mg/LSB(毫克每最低有效位),这意味着无论选择哪个测量范围,每个LSB都代表相同的加速度值(0.004 g/LSB 或者 0.0392266 m/s²/LSB)。
这意味着每个最低有效位(Least Significant Bit, LSB)代表 0.004 g 的加速度变化。这里 mg 是毫克(milli-g),1 g 相当于地球表面的标准重力加速度,大约为 9.80665 m/s²。

不同测量范围的选择
如果你的应用只需要测量较小的加速度变化,比如人体运动或轻微震动,可以选择±2g的范围,这样可以获得更高的分辨率。
对于更大的加速度变化,如车辆行驶或机器振动,可以选择±4g或±8g的范围。
对于极端情况,如碰撞测试或非常快速的动态运动,可以选择±16g的范围。
总结
±2g:适用于测量较轻的加速度变化,如人体活动。
±4g:适用于测量中等程度的加速度变化,如日常设备的运动。
±8g:适用于测量较大的加速度变化,如车辆行驶。
±16g:适用于测量极端的加速度变化,如碰撞测试或剧烈的冲击。
你可以根据自己的应用需求选择合适的测量范围。
如果不确定,通常会选择一个能够覆盖预期加速度变化范围的设置,并且尽可能保持较高的分辨率

  • 选用16g 的测量范围

3. 寄存器概念

    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x2E,0x00);   //禁用中断

    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入
    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入
    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x20,0x00);   //Z 偏移量 根据测试传感器的状态写入

    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x1D,0x10);   //敲击阀值
    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x21,0x00);   //持续时间
    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x22,0x00);   //开始延迟
    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x23,0x00);   //敲击窗口

    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x24,0x0A);   //活动阀值
    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x25,0x05);   //静止阀值
    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x26,0x01);   //进入静止时间
    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x27,0xFF);   //三轴参与

    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x28,0x05);   //自由落体阀值
    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x29,0x14);   //自由落体时间

    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x2A,0x00);   //抑制双击检测

    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x2C,0x0A);   //标准默认速率
    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x2D,0x08);   //测量不休眠

    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x31,0x0B);   //测量范围,正负16g,13位模式
    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x38,0xA0);   //流

    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x2F,0xEF);   //使能中断引脚
    user_write_byte_extend(&iic_ctl_triaxial, ADXL345_ADDR, 0x2E,0x93);   //使能中断

在这里插入图片描述
重要关注的中断寄存器

在这里插入图片描述
详细的查看数据手册

实现功能

每次开启电源后
读取倾角数据
清空活动中断
等待一段时间比如1秒
根据上述寄存器配置
如果环境存在震动,大于设置的阀值
会触发活动中断-高电平
相应的0x30 寄存器位会为1
此时可知环境存在震动

<think>好的,用户想要寻找与ADXL345倾角传感器相关的代码示例。我需要先理解ADXL345的基本功能和常见应用场景。根据提供的引用内容,ADXL345是一款加速度传感器,用于测量倾斜角度,常用于STM32、Arduino等平台。用户可能是在进行嵌入式开发,需要具体的代码实现来获取倾角数据。 首先,我需要回忆ADXL345的通信接口,通常是I2C或SPI。用户可能使用的是I2C,因为这在STM32和Arduino中较为常见。接下来,代码示例需要包括初始化传感器、读取原始加速度数据,并将其转换为角度。转换公式通常是使用反正切函数,比如atan2。 然后,参考引用中的内容,引用[2]提到了使用STM32与ADXL345通信,调用函数获取倾斜角度并打印到串口。引用[3]则涉及Arduino与ADXL345结合BLDC电机的应用。因此,用户可能需要不同平台的示例代码,比如STM32和Arduino。 我需要确保提供的代码语法正确,特别是I2C的配置和寄存器读写部分。例如,ADXL345的I2C地址通常是0x53,数据格式寄存器需要设置正确。在STM32中,可能需要使用HAL库函数,而在Arduino中则可能使用Wire库。 此外,需要注意加速度数据的单位转换。ADXL345的输出通常是LSB值,需要根据量程(比如±2g)转换为实际的加速度值(g单位),然后再计算角度。例如,±2g时,灵敏度为1024 LSB/g。 最后,用户可能还需要了解如何验证代码的正确性,比如通过串口输出检查角度值是否合理。需要提醒用户校准传感器的重要性,确保测量准确。</think>### ADXL345 倾角传感器示例代码 以下是基于STM32和Arduino平台的ADXL345倾角传感器代码示例,包含角度计算的核心逻辑。 #### 1. STM32 HAL库示例(I2C通信) ```c #include "stm32f1xx_hal.h" #define ADXL345_ADDR 0x53 << 1 // I2C从机地址[^2] // 初始化传感器 void ADXL345_Init(I2C_HandleTypeDef *hi2c) { uint8_t data[2] = {0x2D, 0x08}; // 电源控制寄存器,测量模式 HAL_I2C_Master_Transmit(hi2c, ADXL345_ADDR, data, 2, 100); data[0] = 0x31; data[1] = 0x0B; // 数据格式寄存器,±2g,右对齐 HAL_I2C_Master_Transmit(hi2c, ADXL345_ADDR, data, 2, 100); } // 获取倾斜角度 void ADXL345_GetTiltAngle(I2C_HandleTypeDef *hi2c, float *angleX, float *angleY) { uint8_t buffer[6]; uint8_t reg = 0x32; // 数据寄存器起始地址 HAL_I2C_Master_Transmit(hi2c, ADXL345_ADDR, &reg, 1, 100); HAL_I2C_Master_Receive(hi2c, ADXL345_ADDR, buffer, 6, 100); int16_t x = (buffer[1] << 8) | buffer[0]; int16_t y = (buffer[3] << 8) | buffer[2]; int16_t z = (buffer[5] << 8) | buffer[4]; // 转换为g值(±2g量程,灵敏度1024 LSB/g) float ax = x / 1024.0; float ay = y / 1024.0; float az = z / 1024.0; // 计算倾角(单位:度) *angleX = atan2(ax, sqrt(ay*ay + az*az)) * 180 / M_PI; *angleY = atan2(ay, sqrt(ax*ax + az*az)) * 180 / M_PI; } ``` #### 2. Arduino示例 ```cpp #include <Wire.h> #define ADXL345_ADDR 0x53 void setup() { Wire.begin(); Serial.begin(9600); // 初始化配置 writeRegister(0x2D, 0x08); // 启动测量模式 writeRegister(0x31, 0x0B); // ±2g量程[^3] } void loop() { float x,y,z; readAccel(&x, &y, &z); float angleX = atan2(x, sqrt(y*y + z*z)) * 180/PI; float angleY = atan2(y, sqrt(x*x + z*z)) * 180/PI; Serial.print("X倾角:"); Serial.print(angleX); Serial.print(" Y倾角:"); Serial.println(angleY); delay(200); } void writeRegister(uint8_t reg, uint8_t value) { Wire.beginTransmission(ADXL345_ADDR); Wire.write(reg); Wire.write(value); Wire.endTransmission(); } void readAccel(float *x, float *y, float *z) { Wire.beginTransmission(ADXL345_ADDR); Wire.write(0x32); Wire.endTransmission(false); Wire.requestFrom(ADXL345_ADDR, 6, true); *x = (Wire.read() | Wire.read() << 8) / 1024.0; *y = (Wire.read() | Wire.read() << 8) / 1024.0; *z = (Wire.read() | Wire.read() << 8) / 1024.0; } ``` #### 关键实现说明: 1. **角度计算原理** 使用公式: $$ \theta_x = \arctan\left(\frac{a_x}{\sqrt{a_y^2 + a_z^2}}\right) \times \frac{180}{\pi} $$ 该公式通过加速度分量计算物体在X/Y的倾斜角度[^1] 2. **校准建议** - 水平放置传感器时理论加速度应为$(0,0,1)g$ - 可通过偏移寄存器(0x1E-0x20)补偿零偏误差 - 采样时建议取多次测量平均值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值