LSM303AGR姿态传感器 risc-v Sifive learn inventor基础之硬件i2c与LSM303AGR通信
文章目录
- 一,硬件连接
- 二,获取数据
- 三,处理数据
- 三,小结
系列文章
- Sifive Learn Inventor 基础之gpio 按键中断
- Sifive learn inventor基础之串口&操作寄存器
- Sifive learn inventor基础之硬件pwm&寄存器
- risc-v Sifive learn inventor基础之硬件i2c与LSM303AGR通信
这一次用iic简单的读取lsm303的加速度数据,对于中断等不做操作;
2020 .7.29 优化了数据处理部分的代码。得到的数据更直观。精度是0.1mm
一,硬件连接
如图的连接,I2C的两根信号都通过R6,R7上拉,通过这点可知与LSM303的通信波特率是400khz。
二,获取数据
1,使用最新的freedom-e-sdk,freedom-e-sdk GitHub仓库,最新的sdk支持iic和pwm库函数开发,而且提供freertos的模板例程。在此基础上开发iic十分方便。
2,首先初始化开发板的iic接口,并通过iic接口配置lsm303的寄存器,设置加速度计的工作模式和输出速率(reg1_a寄存器),这里我设置的是普通模式,输出速率为400hz:
//reg1中是reg1_a寄存器的地址及写入的值 char reg1[2]={0x20,0x77};//初始化iic为master 波特率400khzmetal_i2c_init(i2c, I2C_BAUDRATE, METAL_I2C_MASTER);//写控制寄存器reg1_A 普通模式,400hz输出,使能x,y,z轴加速度计metal_i2c_write(i2c, ACCELEROMETER_I2C_ADDR, 2,reg1 , METAL_I2C_STOP_ENABLE);
然后创建一个定时时间为dt的任务,在这个任务里,我们读取lsm303加速度的输出寄存器的高位数据,比较对精度要求不高的话可以忽略低位数据。然后将数据进行积分处理得到速度和路程。这个项目里我不需要y轴数据所以没有读取。
/** 由于普通模式有效数据10位,且数据为左对齐,只读取高位寄存器* 将数据进行积分处理*/
static void prvAccelerTask(void *pvParameters)
{TickType_t xNextWakeTime;char * pcMessage = "start accelertask\r\n";(void)pvParameters;//out_add中的值是加速度计OUT_X_H_A,OUT_Z_H_A寄存器的地址,static char out_addr[2]={0x29,0x2d},buff[2]={0};//延时时间,同时也是时间的微分dt 单位是msMotor.dt=20;xNextWakeTime = xTaskGetTickCount();write(STDOUT_FILENO,pcMessage,strlen(pcMessage));while(1){//进入临界段,防止通信被打断taskENTER_CRITICAL();//分别读取OUT_X_H_A,OUT_Z_H_A高位寄存器metal_i2c_write(i2c, ACCELEROMETER_I2C_ADDR, 1,out_addr , METAL_I2C_STOP_DISABLE);metal_i2c_read(i2c, ACCELEROMETER_I2C_ADDR, 1,buff , METAL_I2C_STOP_ENABLE);metal_i2c_write(i2c, ACCELEROMETER_I2C_ADDR, 1,&out_addr[1] , METAL_I2C_STOP_DISABLE);metal_i2c_read(i2c, ACCELEROMETER_I2C_ADDR, 1,&buff[1] , METAL_I2C_STOP_ENABLE);//赋值给lsm303对象lsm303.acc_x_raw=buff[0];lsm303.acc_z_raw=buff[1];//对原生数据处理,转化成加速度,速度,位移sensor_data_process();taskEXIT_CRITICAL();write(1,pcMessage,strlen(pcMessage));vTaskDelayUntil( &xNextWakeTime, pdMS_TO_TICKS( Motor.dt ) );}
}
这就是配置的寄存器;
我设置的是400hz,所以代码里写入的值是0x77,其实也不必太高,过高会影响精度。
以下是不同模式下,输出数据的有效位数,普通模式下,输出10位数据,再看看输出寄存器的描述,大概的意思就是输出的数据是左对齐的二进制补码。那就在处理数据时要解析出原码。至于不了解左对齐是什么的可以点我。
三,处理数据
上面得到的数据是原始的,原生态无污染的,要加工成加速度数据,也就是单位为m/s^2的数据。要计算实际的加速度,需要乘以一个比例系数,在开发文档称为灵敏度,灵敏度与加速度计工作模式与full scal(缩放)有关,缩放的配置在reg4_a寄存器,默认是0,也就是±2g。所以可知我配置的灵敏度为3.9mg。详细如下图:
因为板子是倾斜约45°放的,所以要得到水平的加速度需要经过直角坐标转换。
lsm303.acc_x_real=(int)lsm303.acc_x_raw*4*39;
乘4是因为普通模式输出10位数据,而我只读了高八位,舍弃了低二位,所以要左移2位,也就是乘4,39就是灵敏度。经过单位换算,得到的加速度单位是100ug
/** 处理lsm303读取的数据,获取速度,距离*/
void sensor_data_process()
{//如果raw是负数的话需要取绝对值,乘以灵敏度,再将符号返回if(lsm303.acc_x_raw&0x80){lsm303.acc_x_raw =-lsm303.acc_x_raw;lsm303.acc_x_real=(int)lsm303.acc_x_raw*4*39;lsm303.acc_x_real=-lsm303.acc_x_real;}else lsm303.acc_x_real=(int)lsm303.acc_x_raw*4*39;if(lsm303.acc_z_raw&0x80){lsm303.acc_z_raw =-lsm303.acc_z_raw;lsm303.acc_z_real=(int)lsm303.acc_z_raw*4*39;lsm303.acc_z_real=-lsm303.acc_z_real;}else lsm303.acc_z_real=(int)lsm303.acc_z_raw*4*39;//x=8112 z=-6552 滤除重力lsm303.acc_x_filter=lsm303.acc_x_real-8112;lsm303.acc_z_filter=6552+lsm303.acc_z_real;//lsm303.acc_x_filter=lsm303.acc_x_filter & ~0x000000ff;//lsm303.acc_z_filter=lsm303.acc_z_filter & ~0x000000ff;//加速度分解到水平方向 sinθ=2/3 cosθ=3/4Motor.acc=(lsm303.acc_x_filter*2/3+lsm303.acc_z_filter*3/4)/100;//cm/s^2//加速度,速度积分Motor.speed=Motor.speed+Motor.acc*Motor.dt/100;//mmMotor.distance=Motor.distance+Motor.speed*Motor.dt/100;//0.1mm}
三,小结
这种简单粗暴的用加速度双重积分出距离其实非常不准确,积分误差会随时间而增加,需要其他方式进行校准。
LSM303AGR姿态传感器 risc-v Sifive learn inventor基础之硬件i2c与LSM303AGR通信相关推荐
- RISC V (RV32+RV64) 架构 整体介绍
文章目录 riscv 市场 芯片介绍 软件介绍 开发板介绍 PC介绍 riscv 架构 编程模型(指令集/寄存器/ABI/SBI) 运行状态 指令集 寄存器 riscv32和riscv64两者的区别 ...
- Xsens MTi -1 姿态传感器恢复与MTI的通信的方法
恢复与MTI的通信 本人最近因为项目需要,一直在研究Xsens MTi - 1 姿态传感器,因为我写程序是要DSP开发板获取姿态传感器采集的数据,然后从获取的数据中解析出四元数或者欧拉角,并把欧拉角转 ...
- 学习 STM32之九轴姿态传感器(BWT901CL)串口通信读取数据
由于个人应用到3轴传感器,所以买了直接买了一个9轴的,用于学习STM32Core平台串口2连接维特智能串口Normal协议,然后通过串口1直接打印数据,接收传感器数据和与传感器进行通信:需要看产品文档 ...
- IMU 无线姿态传感器-LPMS-B2系列
LPMS-B2 是阿路比推出的一款高性能微型无线传输型姿态传感器,利用蓝牙技术,可以轻松地与个人电脑.智能手机等设备通信,适用于机器人和人类动作的测量.主要应用于人体动作捕捉,物联网(IOT)设备,运 ...
- 高精度姿态传感器LPMS-NAV3系列
LPMS-NAV3 系列是一款6轴高精度.高稳定性的姿态传感器,其航向角经算法特别优化,能够保证长时间内的稳定性.该系列主要应用于工业移动机器人和服务机器人领域.其内嵌一功能强大的处理器,通过整合处理 ...
- 维特智能六轴姿态传感器JY61P_stm32f1xx驱动代码解析
目录 硬件准备/上位机直连 代码驱动 关于官方给出的示例 代码功能及其走位 1.怎样不依托代码验证传感器的某个功能是否有效或者能用? 2.写寄存器的方式 3.为什么不使用WIT私有协议中的关闭上电输出 ...
- stm32 MPU6050 6轴姿态传感器的介绍与DMP的应用
最近应用到三轴姿态传感器,因为之前有MPU6050(6轴传感器,这是6轴的), 进行搭配使用,通过三轴姿态传感器进行舵机的角度调整.(内容来源学习正点原子的教程) 同步B站也已经发布过原子官方教程.让 ...
- MPU6050 6轴姿态传感器的分析与使用(一)
一.MPU6050简介 MPU6050是一个6轴姿态传感器(3轴加速度计和3轴陀螺仪传感器),可以测量芯片自身X.Y.Z轴的加速度.角度参数,通过数据融合,可以得到姿态角. 二.简介分析 1.常见的姿 ...
- 维特智能姿态传感器WT901C-485调试流程
维特智能姿态传感器WT901C-485调试流程 情况描述 更改地址与波特率 改波特率 改地址 磁场校准 下载上位机 进行校准 情况描述 调试维特智能公司的一款姿态传感器,型号为 WT901C-485 ...
最新文章
- 中国工业自动化行业需求现状及投资风险评估报告2022-2027年版
- 【SAS NOTES】sas对中文的支持
- PagerAdapter学习
- C++——二维vector初始化大小方法
- VBA 打开文件对话框
- Windows 2012 英文版系统安装中文语言包及时间格式设置
- Graph Valid Tree
- 20140505 科技脉搏 - “社交”这棵老树,依然在开着新花
- 简单电脑***《菜鸟级》
- 缠论中枢python源码_通达信缠论中枢主图公式源码
- linux进入Mysql 的Dos控制台,dos进入mysql的实现方法
- 再说市场资金流向问题
- H.323-SIP信令网关
- 机器学习 (十三) 电商O2O优惠券使用预测-1
- java项目学生量化管理考核细则_班级管理量化考核细则范本
- html行内样式选择器怎么写,巧用CSS伪类选择器实现九种样式的九宫格
- symfony配置文件之三:routing和路由配置
- 如何安装markman
- 科技幻想(一)——便捷人机交互
- 发送邮件html页面,怎么给邮件发送HTML
热门文章
- NC17389-凤 凰(并查集)
- 《Python深度学习》读书笔记:第1章 什么是深度学习
- 【题解】codeforces765F Souvenirs
- 论文笔记-Reliable Supervision from Transformations for Unsupervised Optical Flow Estimation
- MicroServices(5)---DevOps用户手册
- MTD原始设备与NANDFLASH硬件驱动交互
- java反射机制详解篇一(基础)
- 分享一套开源的即时通讯 IM 聊天系统(附源码)
- 活动 | Authing 首次渠道合作活动圆满落幕
- bzoj5020[THUWC 2017]在美妙的数学王国中畅游(LCT)