70| 1
|
[K10教程] 【行空板K10】增加HX711重量传感器的用户库 |
引言 今天继续“义教信息科技教学活动实践案例”的设计,在我的案例中需要使用重量传感器进行重量的测量。所以需要先在Mind+中添加重量传感器。在DF创客商城中有重量传感器,它有两种接口,分别是数字接口和I2C接口。I2C接口功能更强些,数字接口简单些。 不过在Mind+中,K10开发板只提供了I2C重量传感器,而没有提供数字接口的重量传感器。但是像掌控板等开发板就是提供了两种接口的传感器组件。 我手上恰巧有一个HX711的重量传感器(4个数字口的形式),所以就想着自己添加一个重量传感器的用户库,这样就可以节约一点,不用再买I2C接口的重量传感器了。下面就介绍一下如何把HX711传感器接入到行空板K10中。 HX711的工作原理 HX711是一种高精度的模数转换芯片,常用于电子秤和各种重量测量设备中。其工作原理如下: 1. 引脚功能 HX711有多个引脚,主要的引脚包括:
2. 传感器接口 HX711通过A+、A-、B+、B-四个引脚与外部传感器连接。传感器的输出信号(一般为微小的电压变化)接到HX711的差分输入通道(A+、A-)上。这些引脚用于接收传感器的微小电压变化信号 。 3. 差分放大器 HX711内部包含一个差分放大器,用于放大传感器的微小信号。放大器的增益可以通过外部电阻的选择来调整,这使得HX711适用于不同精度要求的应用 。 4. 模数转换 HX711内部使用24位的Σ-Δ ADC(Sigma-Delta ADC)对输入信号进行模数转换。Σ-Δ ADC的核心原理是通过将输入信号与一个高频噪声进行加和,然后对其进行采样,将结果进行积分、累加和调制,最终得到一个高精度的数字输出 。 5. 增益和偏置校准 为了适应不同的传感器和应用场景,HX711提供了多个增益位和偏置校准位。通过设置这些位,可以调整HX711的增益和偏置,使其适应不同范围和精度的传感器输出。校准操作通常在初始化时进行,可以通过加载相应的校准参数来实现 。 6. 数据输出 数据的传输是通过SCK引脚的时钟脉冲控制的。每个时钟周期可以采样一位数据,通过连续的时钟脉冲可以采样多位数据。采样后的数据通过DT引脚输出,以供外部微控制器或计算机读取和处理。输出数据的格式是24位的二进制补码 。 7. 串口通讯 串口通讯线由管脚PD_SCK和DOUT组成,用来输出数据、选择输入通道和增益。具体步骤如下: 当DOUT(数据输出引脚)为高电平时,表明A/D转换器还未准备好输出数据,此时串口时钟输入信号PD_SCK应为低电平。 当DOUT从高电平变低电平后,PD_SCK应输入25至27个不等的时钟脉冲。其中前24个时钟脉冲输出的是传感器测得的ADC数据,第25-27个时钟脉冲与数据无关,仅用于选择下一次传感器的输出增益和输出通道 。 8. 复位和断电 当芯片上电时,芯片内的上电自动复位电路会使芯片自动复位。管脚PD_SCK输入用来控制HX711的断电。当PD_SCK为低电平时,芯片处于正常工作状态。如果PD_SCK从低电平变高电平并保持在高电平超过60μs,HX711即进入断电状态。当PD_SCK重新回到低电平时,芯片会自动复位后进入正常工作状态 。 通过以上步骤,HX711能够将传感器的微小电压变化信号转换为高精度的数字信号,从而实现高精度的重量测量。 硬件连接 行空板K10有2个3pin的数字/模拟接口,见下图。 前面的介绍已经知道,HX711模块对外有4根线的接口,VCC、GND、PD_SCK和DOUT,而3PIN接口是电源、地加上一个数字接口。所以我们需要把2个接口都用上,才能连上HX711模块。买了2根PH2.0mm间距的数据线,将P0的+、-和P0分别连接到HX711模块的VCC、GND和DOUT,P1管脚连到PD_SCK口。 用户库的编写 用户库的完整代码见Gitee(https://gitee.com/zealsoft/ext-hx711),这里介绍一下设计思路。 在Mind+的Ardiuno库中其实是提供了HX711传感器的代码的,在目录D:\win-ia32-unpacked20250103\Arduino\libraries\DFRobot_SEN0160中。核心代码如下:
这段代码是一个用于控制HX711芯片的库文件,主要功能是初始化HX711芯片,读取重量数据,并进行校准和单位转换。 初始化函数: Hx711::begin(uint8_t pin_dout, uint8_t pin_slk):设置数据引脚和时钟引脚,并进行初始化操作,包括设置引脚模式、复位芯片、读取初始值并设置偏移量和比例因子。 数据读取函数: long Hx711::averageValue(BYTE times):读取多次重量数据并计算平均值,以减少误差。 long Hx711::getValue():从HX711芯片读取一次重量数据,通过控制时钟信号和读取数据引脚来获取24位数据。 校准函数: void Hx711::setOffset(long offset):设置偏移量,用于校准零点。 void Hx711::setScale(float scale):设置比例因子,用于将读取的原始数据转换为实际重量。 重量计算函数: float Hx711::getGram():计算并返回重量值,通过读取平均值、减去偏移量并除以比例因子来得到最终的重量值。 整体来说,这个库文件提供了一套完整的接口,用于初始化HX711芯片、读取重量数据、进行校准和单位转换,方便在嵌入式项目中使用HX711芯片进行重量测量。 其中的所谓设置偏移量,就是电子称领域中常说的“去皮”。比例因子也有个常用的术语叫“校准值”。 积木的设计 官方的传感器积木对于HX711传感器只提供了2个积木,分别对应前面代码中的setup+scale和getGram。但是这个设计有个问题,由于设置校准值的积木里面同时做了去皮操作,所以设置校准值的积木只能在程序中被调用一次,不能在程序中灵活地调整校准值。所以我增加了一个积木,就是不做去皮,仅设置校准值,这样就方便动态地调整校准值。 DFRobot_Hx711.o文件的添加 要正常使用组件,还需要将K10开发板对应的DFRobot_Hx711.cpp.o文件放到D:\win-ia32-unpacked20250103\Arduino\static\libraries\DFRobot_SEN0160\esp32s3bit目录中。DFRobot_Hx711.cpp.o文件可以从我的Gitee仓库中下载。 测试程序 下面就是测试程序。A/B键用于校准工作,主程序不断地查询重量传感器的数据,并将测量结果显示到屏幕上。程序中将传感器返回的数据转换为整数,是因为我们的模块精度不高,小数点后面的数据没有意义。不同的模块的校准值可能是不同的,像官方的SEN160是1kg量程的,校准值大概1900,而我的是5kg量程的,校准值大概420左右。不同的模块的精度也是不同的,我这个是非常便宜的,电路也简单,所以精度差一些。 测试结果 我使用了一个100g砝码进行校准,下面就是测量结果。 结语经过一番折腾,已经将电子秤实现了,离最终的案例设计很接近了。不过下周较忙,不知道能不能搞完案例的设计,希望春节前手工。 |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed