【行空板K10】增加HX711重量传感器的用户库
引言今天继续“义教信息科技教学活动实践案例”的设计,在我的案例中需要使用重量传感器进行重量的测量。所以需要先在Mind+中添加重量传感器。在DF创客商城中有重量传感器,它有两种接口,分别是数字接口和I2C接口。I2C接口功能更强些,数字接口简单些。不过在Mind+中,K10开发板只提供了I2C重量传感器,而没有提供数字接口的重量传感器。但是像掌控板等开发板就是提供了两种接口的传感器组件。我手上恰巧有一个HX711的重量传感器(4个数字口的形式),所以就想着自己添加一个重量传感器的用户库,这样就可以节约一点,不用再买I2C接口的重量传感器了。下面就介绍一下如何把HX711传感器接入到行空板K10中。HX711的工作原理HX711是一种高精度的模数转换芯片,常用于电子秤和各种重量测量设备中。其工作原理如下:1. 引脚功能HX711有多个引脚,主要的引脚包括:[*]VCC:电源正极
[*]GND:电源地
[*]DT(数据输出):数据输出引脚
[*]SCK(时钟输入):时钟信号输入引脚
[*]PD_SCK:用于控制芯片的断电和复位
[*]A+、A-、B+、B-:差分输入通道,用于连接传感器
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中。核心代码如下:#include "DFRobot_Hx711.h"
Hx711::Hx711()
{
}
void Hx711::begin(uint8_t pin_dout, uint8_t pin_slk)
{
_pin_dout = pin_dout;
_pin_slk = pin_slk;
pinMode(_pin_slk, OUTPUT);
pinMode(_pin_dout, INPUT);
digitalWrite(_pin_slk, HIGH);
delayMicroseconds(100);
digitalWrite(_pin_slk, LOW);
averageValue();
this->setOffset(averageValue());
this->setScale();
}
Hx711::~Hx711()
{
}
long Hx711::averageValue(BYTE times)
{
long sum = 0;
for (BYTE i = 0; i < times; i++)
{
sum += getValue();
}
return sum / times;
}
long Hx711::getValue()
{
BYTE data;
while (digitalRead(_pin_dout)==HIGH){delay(1);}
for (BYTE j = 0; j < 3; j++)
{
for (BYTE i = 0; i < 8; i++)
{
digitalWrite(_pin_slk, HIGH);
bitWrite(data, 7 - i, digitalRead(_pin_dout));
digitalWrite(_pin_slk, LOW);
}
}
digitalWrite(_pin_slk, HIGH);
digitalWrite(_pin_slk, LOW);
return (((long) data << 16) | ((long) data << 8) | (long) data)^0x800000;
}
void Hx711::setOffset(long offset)
{
_offset = offset;
}
void Hx711::setScale(float scale)
{
_scale = scale;
}
float Hx711::getGram()
{
long val = (averageValue() - _offset);
return ((float) val / _scale);
}
这段代码是一个用于控制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砝码进行校准,下面就是测量结果。结语经过一番折腾,已经将电子秤实现了,离最终的案例设计很接近了。不过下周较忙,不知道能不能搞完案例的设计,希望春节前手工。
6666
页:
[1]