900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 使用LIS2DH12三轴加速度传感器检测震动与倾斜角度

使用LIS2DH12三轴加速度传感器检测震动与倾斜角度

时间:2023-07-31 03:16:54

相关推荐

使用LIS2DH12三轴加速度传感器检测震动与倾斜角度

项目上用到LIS2DH12检测震动告警,设备倾斜状态,原理图如下

要检测震动跟倾斜角度,配置LIS2DH12的相关寄存器即可,寄存器很多,这里只说明程序中使用到的

#define LIS2DH12_FROM_FS_2g_HR_TO_mg(lsb) (float)((int16_t)lsb>>4)* 1.0f#define LIS2DH12_FROM_FS_4g_HR_TO_mg(lsb) (float)((int16_t)lsb>>4)* 2.0f#define LIS2DH12_FROM_FS_8g_HR_TO_mg(lsb) (float)((int16_t)lsb>>4)* 4.0f#define LIS2DH12_FROM_FS_16g_HR_TO_mg(lsb) (float)((int16_t)lsb>>4)*12.0f#define LIS2DH12_FROM_LSB_TO_degC_HR(lsb) (float)((int16_t)lsb>>6)/4.0f+25.0f/* iic 通讯相关操作 */int32_t drv_lis2dh12_iic_write_byte(uint8_t addr, uint8_t data);int32_t drv_lis2dh12_iic_read_byte(uint8_t addr, uint8_t* data);/* lis2dh12 init 配置检测阈值与中断 */int32_t drv_lis2dh12_init(){/* Initialization of sensor */if(drv_lis2dh12_iic_write_byte(0x21, 0x01)) /* CTRL_REG2(21h): Filtered data and High-pass filter selection */return -1;if(drv_lis2dh12_iic_write_byte(0x22, 0x40)) /* CTRL_REG3(22h): IA1 interrupt on INT1 pin */return -1;if(drv_lis2dh12_iic_write_byte(0x23, 0x80)) /* CTRL_REG4(23h): Set Full-scale to +/-2g */return -1;/* Wakeup recognition enable */ if(drv_lis2dh12_iic_write_byte(0x30, 0x2a)) /* INT1_CFG(30h): INT1 Configuration */return -1;if(drv_lis2dh12_iic_write_byte(0x32, 0x36)) /* INT1_THS(32h): INT1 Threshold set */return -1;if(drv_lis2dh12_iic_write_byte(0x33, 0x0)) /* INT1_DURATION(33h): INT1 Duration set */return -1;/* Start sensor */if(drv_lis2dh12_iic_write_byte(0x20, 0x57)) /* CTRL_REG1(20h): Start sensor at ODR 100Hz Low-power mode */ return -1;return 0;}/* 获取当前倾斜角度 */float drv_lis2dh12_get_angle(){float acc_x, acc_y, acc_z, acc_g;float angle_x, angle_y, angle_z, angle_xyz;int8_t data[6];uint8_t i;for (i=0; i<6; i++)drv_lis2dh12_iic_read_byte(0x28 + i, data+i);/* x, y, z 轴加速度 */acc_x = abs(LIS2DH12_FROM_FS_2g_HR_TO_mg(*(int16_t*)data));acc_y = abs(LIS2DH12_FROM_FS_2g_HR_TO_mg(*(int16_t*)(data+2)));acc_z = abs(LIS2DH12_FROM_FS_2g_HR_TO_mg(*(int16_t*)(data+4)));/* 重力加速度 */acc_g = sqrt(pow(acc_x, 2) + pow(acc_y, 2) + pow(acc_z, 2));if (acc_z > acc_g)acc_z = acc_g;/* angle_z/90 = asin(acc_z/acc_g)/π/2 */angle_z = asin(acc_z/acc_g) * 2 / 3.14 * 90;angle_z = 90 - angle_z;if(angle_z < 0)angle_z = 0;return angle_z;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。