背景:在无人机动力系统的选型时,为了测试无人机的动力系统所能提供的最大拉力,使用压力传感装置测量拉力。

链接:

压力传感器tb链接:

HX711模块是一个24位精度的AD模块。

(1)https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-21223910208.20.6c496a4bdA2Bew&id=522572281513

(2)https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-21223910208.14.6c496a4bdA2Bew&id=569898995913

另外还有一个固定压力传感器的支架,通过机械方式将螺旋桨产生的拉力加到拉力传感器上。暂时找不到链接。

代码github连接:

https://github.com/W-yt/YuTian_Pro/tree/master/press_measure

程序说明:

使用STM32F103C8T6最小系统板连接HX711模块和一个OLED12864显示屏,读取HX7111模块的数据,经过处理后通过显示屏显示实际的拉力大小。

程序的初始化写在main.c文件中

程序的主循环写在control.h文件中(包括读取拉力数据和液晶显示)

代码:

读取AD芯片数据,一般有两种方式,直接利用GPIO读写操作读取数据和使用STM32的SPI读取数据。

这里由于模块自带的资料中提供了使用51单片机读取HX711数据的例程,使用的直接操作IO口的方式,我直接根据例程移植到了STM32下。

GPIO配置:

void Sensor_Init(void)
{
GPIO_InitTypeDef gpio; RCC_APB2PeriphClockCmd(Sensor_Clock,ENABLE); //时钟线推挽输出
gpio.GPIO_Pin = CLK;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Sensor_Gpio,&gpio); //数据线浮空输入
gpio.GPIO_Pin = DATA;
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Sensor_Gpio,&gpio);
}

HX711数据读取函数(程序主要内容):

unsigned long Sensor_Read(void)
{
unsigned long value;
unsigned char i; //每次读取数据前保证数据线电平稳定
//此处只是为了稳定电平 拉高或拉低效果相同
// GPIO_ResetBits(Sensor_Gpio,DATA);
GPIO_SetBits(Sensor_Gpio,DATA); //为了等待输出电平稳定
//在每次一操作电平时加微小延时
delay_us(2); //时钟线拉低 空闲时时钟线保持低电位
GPIO_ResetBits(Sensor_Gpio,CLK); delay_us(2); //等待AD转换结束
while(GPIO_ReadInputDataBit(Sensor_Gpio,DATA)); for(i=0;i<24;i++)
{
//时钟线拉高 开始发送时钟脉冲
GPIO_SetBits(Sensor_Gpio,CLK); delay_us(2); //左移位 右侧补零 等待接收数据
value = value << 1; //时钟线拉低
GPIO_ResetBits(Sensor_Gpio,CLK); delay_us(2); //读取一位数据
if(GPIO_ReadInputDataBit(Sensor_Gpio,DATA))
value ++;
} //第25个脉冲
GPIO_SetBits(Sensor_Gpio,CLK); delay_us(2); //第25个脉冲下降沿到来时 转换数据
//此处说明:
// HX711是一款24位的AD转换芯片
// 最高位是符号位 其余为有效位
// 输出数组最小值0x800000
// 最大值0x7FFFFF
//异或运算:
// 相同为0
// 不同为1
//数据处理说明:
// 之所以会发生 INPA-INNA < 0mv 的情况
// 是因为发生了零点漂移
// 例如上面的数据就是初始状态INPA-INNA = -0.5mv
// 然后随着重量的增加会发生过零点
// 这时如果直接使用读取到的数据就会发生错误
// 因为读取到的是小于0的二进制补码
// 是不能直接使用的 需要转换成其原码 // 比较简单的处理方法就是读到的数据直接和0x800000进行异或
// 这时最高位可以看做是有效位
// 不代表符号位而代表的下一位的进位
// 这样数据会一直往上增长
// 我们可以直接拿来进行使用
value = value^0x800000;
// value = value&0x7FFFFF; //第25个脉冲结束
GPIO_ResetBits(Sensor_Gpio,CLK); delay_us(2); return value;
}

关于读取数据操作的说明都在以上代码中有详细注释。

获取拉力:

void Get_Weight(void)
{
HX711_Buffer = Sensor_Read(); Weight_Lode = HX711_Buffer; //判断非空载
if(Weight_Lode > Weight_No_Lode)
{
Weight_Real = (Weight_Lode - Weight_No_Lode)/Kp_Weight;
}
else if(Weight_Lode <= Weight_No_Lode)
Weight_Real = 0.0f; //拉力达到一定阈值 则串口显示
// if(Weight_Real>100.0f)
// printf("当前拉力%u\r\n\r\n",Weight_Real);
}

粗略直线拟合:(确定上面代码段中的系数)

//比例系数确定数据:
// 42500 --> 160g --> 265.65
// 80000 --> 285g --> 280.7
// 115000 --> 405g --> 283.95
// 405000 --> 1400g --> 289.29
//拟合直线:
// y = 291.92x-3580.2 (忽略截距)

这里只是用电子秤称量了几个重物作为样本,大致拟合,为了获得更高精度,可以改进样本和拟合方式。

如有问题,欢迎交流。

——cloud over sky

——2019/10/31

STM32读取HX711(AD)模块数据——压力传感器的更多相关文章

  1. STM32读取Guidance数据——Guidance SDK

    更新记录:2019/11/14    更新STM32(F407VET6)读取Guidance数据 Github地址. 背景:想要将祖传的Guidance用于DJI A3/新固件的N3飞控.DJI已经停 ...

  2. python接口自动化之读取excel表的数据(使用openpyxl模块)

    1.安装openpyxl:pip install openpyxl 2.基础知识,直接上代码 import openpyxl #导入模块 wd2=openpyxl.load_workbook('stu ...

  3. 一个I/O线程可以并发处理N个客户端连接和读写操作 I/O复用模型 基于Buf操作NIO可以读取任意位置的数据 Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel 事件驱动消息通知观察者模式

    Tomcat那些事儿 https://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng==&mid=2650860016&idx=2&sn=549 ...

  4. 第五章 Odoo 12开发之导入、导出以及模块数据

    大多数Odoo 模块的定义,如用户界面和安全规则,实际是存储在对应数据表中的数据记录.模块中的 XML 和 CSV 文件不是 Odoo 应用运行时使用,而是载入数据表的手段.正是因为这个原因,Odoo ...

  5. STM32与物联网02-网络数据收发

    在上一节中,介绍了 ESP8266 的使用方法.不过上一节中都是通过串口调试工具手动发送信息的方式来操作 ESP8266 ,这肯定不能用于实际开发.因此,本节介绍如何编写合适的程序来和 ESP8266 ...

  6. Python中如何读取xls中的数据

    要想读取EXCEL中的数据,首先得下载xlrd包,地址:https://pypi.python.org/pypi/xlrd  安装方法:下载解压后,利用windows  dos命令进入解压目录eg,c ...

  7. 编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释

    在自学杨中科老师的视频教学时,拓展编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时 会产生Additional information: 阅读器关闭时尝试调用 ...

  8. 读取、写入excel数据

    在实际项目中,不可避免的会操作excel表格.一直以来都是读取excel表格,可今天为了写入excel表格,可是煞费苦心,终于完成,记录下来以便后续使用. 1.读取excel表格的数据 读取excel ...

  9. 读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots

    读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots   以下为异常详细信息: Exception in thread &q ...

随机推荐

  1. 小白,你要的Java抽象类,操碎了心!

    自从给小白写了两篇科普性质的文章后,我就有点一发不可收拾,觉得很有必要继续写下去.因为有读者留言"鼓励"我说,"二哥,你真的是为小白操碎了心啊!"我容易吗?我. ...

  2. ASP.NET Core MVC 如何获取请求的参数

    一次HTTP请求,就是一次标准IO操作.请求是I,是输入:响应式O,是输出.任何web开发框架,其实都是在干这两件事: 接受请求并进行解析获取参数 根据参数进行渲染并输出响应内容 所以我们学习一个框架 ...

  3. matlab-均值滤波

    均值滤波 主要思想为邻域平均法,即用几个像素灰度的平均值来代替每个像素的灰度.有效抑制加性噪声.缺点:容易引起图像模糊,可以对其进行改进,主要避开对景物边缘的平滑处理. 均值滤波器的缺点是存在着边缘模 ...

  4. P1364 医院设置(树型结构)

    传送门闷闷闷闷闷闷 ~~放一个可爱的输入框.~~ 考虑在O(n)的时间内求数以每个节点为医院的距离和. \(设想一下,如果我们已知以1为根节点的距离和f[1],如何求出子节点呢?\) 当医院从1转换到 ...

  5. 微软原文翻译:适用于.Net Core的WPF数据绑定概述

    原文链接,大部分是机器翻译,仅做了小部分修改.英.中文对照,看不懂的看英文. Data binding overview in WPF 2019/09/19 Data binding in Windo ...

  6. Day_12【集合】扩展案例4_判断字符串每一个字符出现的次数

    分析以下需求,并用代码实现 1.利用键盘录入,输入一个字符串 2.统计该字符串中各个字符的数量(提示:字符不用排序) 3.如: 用户输入字符串 "If~you-want~to~change- ...

  7. 这一份MySQL书单,可以帮你搞定90%以上的面试题!

  8. [zoj3629]找规律

    题意:a[n] = ([n/1] + [n/2] + ... + [n/n]) & 1 == false,找出a数组的规律来就ok了. #pragma comment(linker, &quo ...

  9. JTextpane 添加行号

    最近项目需求,需要在JTextPane上添加行号等信息,网上找了好久只找到JTextArea添加行号信息,copy网上的程序研究了下,发现自己改改就可以让JTextPane显示行号! 代码: pack ...

  10. php5.2安装memcached 扩展

    需要注意版本号,好坑. libmemcached release 1.0.16 - installed from sourcephp-memcached release 2.1.0 - install ...