文章目录

  • 一,硬件连接
  • 二,获取数据
  • 三,处理数据
  • 三,小结

系列文章

  1. Sifive Learn Inventor 基础之gpio 按键中断
  2. Sifive learn inventor基础之串口&操作寄存器
  3. Sifive learn inventor基础之硬件pwm&寄存器
  4. 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通信相关推荐

  1. RISC V (RV32+RV64) 架构 整体介绍

    文章目录 riscv 市场 芯片介绍 软件介绍 开发板介绍 PC介绍 riscv 架构 编程模型(指令集/寄存器/ABI/SBI) 运行状态 指令集 寄存器 riscv32和riscv64两者的区别 ...

  2. Xsens MTi -1 姿态传感器恢复与MTI的通信的方法

    恢复与MTI的通信 本人最近因为项目需要,一直在研究Xsens MTi - 1 姿态传感器,因为我写程序是要DSP开发板获取姿态传感器采集的数据,然后从获取的数据中解析出四元数或者欧拉角,并把欧拉角转 ...

  3. 学习 STM32之九轴姿态传感器(BWT901CL)串口通信读取数据

    由于个人应用到3轴传感器,所以买了直接买了一个9轴的,用于学习STM32Core平台串口2连接维特智能串口Normal协议,然后通过串口1直接打印数据,接收传感器数据和与传感器进行通信:需要看产品文档 ...

  4. IMU 无线姿态传感器-LPMS-B2系列

    LPMS-B2 是阿路比推出的一款高性能微型无线传输型姿态传感器,利用蓝牙技术,可以轻松地与个人电脑.智能手机等设备通信,适用于机器人和人类动作的测量.主要应用于人体动作捕捉,物联网(IOT)设备,运 ...

  5. 高精度姿态传感器LPMS-NAV3系列

    LPMS-NAV3 系列是一款6轴高精度.高稳定性的姿态传感器,其航向角经算法特别优化,能够保证长时间内的稳定性.该系列主要应用于工业移动机器人和服务机器人领域.其内嵌一功能强大的处理器,通过整合处理 ...

  6. 维特智能六轴姿态传感器JY61P_stm32f1xx驱动代码解析

    目录 硬件准备/上位机直连 代码驱动 关于官方给出的示例 代码功能及其走位 1.怎样不依托代码验证传感器的某个功能是否有效或者能用? 2.写寄存器的方式 3.为什么不使用WIT私有协议中的关闭上电输出 ...

  7. stm32 MPU6050 6轴姿态传感器的介绍与DMP的应用

    最近应用到三轴姿态传感器,因为之前有MPU6050(6轴传感器,这是6轴的), 进行搭配使用,通过三轴姿态传感器进行舵机的角度调整.(内容来源学习正点原子的教程) 同步B站也已经发布过原子官方教程.让 ...

  8. MPU6050 6轴姿态传感器的分析与使用(一)

    一.MPU6050简介 MPU6050是一个6轴姿态传感器(3轴加速度计和3轴陀螺仪传感器),可以测量芯片自身X.Y.Z轴的加速度.角度参数,通过数据融合,可以得到姿态角. 二.简介分析 1.常见的姿 ...

  9. 维特智能姿态传感器WT901C-485调试流程

    维特智能姿态传感器WT901C-485调试流程 情况描述 更改地址与波特率 改波特率 改地址 磁场校准 下载上位机 进行校准 情况描述 调试维特智能公司的一款姿态传感器,型号为 WT901C-485 ...

最新文章

  1. 中国工业自动化行业需求现状及投资风险评估报告2022-2027年版
  2. 【SAS NOTES】sas对中文的支持
  3. PagerAdapter学习
  4. C++——二维vector初始化大小方法
  5. VBA 打开文件对话框
  6. Windows 2012 英文版系统安装中文语言包及时间格式设置
  7. Graph Valid Tree
  8. 20140505 科技脉搏 - “社交”这棵老树,依然在开着新花
  9. 简单电脑***《菜鸟级》
  10. 缠论中枢python源码_通达信缠论中枢主图公式源码
  11. linux进入Mysql 的Dos控制台,dos进入mysql的实现方法
  12. 再说市场资金流向问题
  13. H.323-SIP信令网关
  14. 机器学习 (十三) 电商O2O优惠券使用预测-1
  15. java项目学生量化管理考核细则_班级管理量化考核细则范本
  16. html行内样式选择器怎么写,巧用CSS伪类选择器实现九种样式的九宫格
  17. symfony配置文件之三:routing和路由配置
  18. 如何安装markman
  19. 科技幻想(一)——便捷人机交互
  20. 发送邮件html页面,怎么给邮件发送HTML

热门文章

  1. NC17389-凤 凰(并查集)
  2. 《Python深度学习》读书笔记:第1章 什么是深度学习
  3. 【题解】codeforces765F Souvenirs
  4. 论文笔记-Reliable Supervision from Transformations for Unsupervised Optical Flow Estimation
  5. MicroServices(5)---DevOps用户手册
  6. MTD原始设备与NANDFLASH硬件驱动交互
  7. java反射机制详解篇一(基础)
  8. 分享一套开源的即时通讯 IM 聊天系统(附源码)
  9. 活动 | Authing 首次渠道合作活动圆满落幕
  10. bzoj5020[THUWC 2017]在美妙的数学王国中畅游(LCT)