STM32搭配HX711使用压力传感器制作电子秤
目录
1、什么是HX711压力传感器(电子秤)?
(1)电子秤模块简介
(2)压力传感器工作原理:
具体工作流程
(3)压力传感器规格简介
2、HX711电子秤模块重要引脚介绍
1.DT口介绍
2.SCK口介绍
3.VCC供电口介绍
3、在STM32标准库中使用HX711的程序代码
(1)初始化DT口和SCK口所用的引脚代码
(2)实现A/D采样所使用的通信介绍
(3)采样结果与实际重量转化算法
总结:
1、什么是HX711压力传感器(电子秤)?
(1)电子秤模块简介
原理图如下
(2)压力传感器工作原理:
压力传感器由一个重要构成是HX711的芯片,内部由二进制模数转换器(ADC)和一个放大器组成。ADC将模拟信号转换为数字信号,放大器则扩大转化出来的信号的幅度,以便更精确地测量。
HX711压力传感器的工作原理是基于万用表电桥原理,利用压力传感器的阻值变化来实现重量的测量。
具体工作流程
1、通过引脚A+和A-接入压力传感器。在未加载的情况下,两个引脚之间的电阻为R1。
2、在HX711芯片中,使用一个基准电压(通常为VCC/2)来作为压力传感器电桥电路的中心点。
3、当压力传感器开始承受载荷时,电桥电路会产生一个微小的电压差。
4、这个电压差通过A+和A-引脚输入到HX711芯片中,并经过内置的差分放大器放大。
5、放大之后的信号被送到24位的A/D转换器中进行数字化处理,并通过DOUT引脚输出。
6、PD_SCK引脚则是用于通过时钟信号来同步转换器的输出数据。
7、最终,通过对输入信号的放大和数字化处理,HX711芯片可以输出重量数据。
(3)压力传感器规格简介
市面上有很多不同规格的压力传感器,但大多殊途同归,读取的ADC值是一样的,只需要在计算时做出改变就行了
- 压力传感器学习意义
电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。它与我们日常生活紧密结合息息相关。电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成。电子称不但计量准确、快速方便,更重要的自动称重、数字显示,对人们生活的影响越来越大,广受欢迎。
2、HX711电子秤模块重要引脚介绍
1.DT口介绍
DT口是HX711芯片的数据输出端口,它输出经过A/D转换处理后的24位数据。
注意:DT口和SCK口都接stm32的GPIO(通用输出输入端口)。
2.SCK口介绍
SCK是HX711芯片的时钟输入端口,用于控制A/D转换的时钟。
3.VCC供电口介绍
VCC引脚连接到5V或3.3V的正电源,选择5V或3.3V电源不影响正常使用。
3、在STM32标准库中使用HX711的程序代码
(1)初始化DT口和SCK口所用的引脚代码
void HX711_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB的时钟
GPIO_InitTypeDef hx711_gpio_struct;//创建一个GPIO结构体
//SCK
hx711_gpio_struct.GPIO_Mode=GPIO_Mode_Out_PP;//SCK为开漏输出模式
hx711_gpio_struct.GPIO_Pin=GPIO_Pin_1;
hx711_gpio_struct.GPIO_Speed=GPIO_Speed_50MHz;//通用50MHz
GPIO_Init(GPIOB,&hx711_gpio_struct); //使能
//DT
hx711_gpio_struct.GPIO_Mode=GPIO_Mode_IPU;//DT为上拉输入模式,
//如果IO口外部没有信号输入或者悬空,则IO口默认为高电平。
//如果此时IO口有输入低电平,那么引脚就为低电平,MCU读取到的就是低电平
hx711_gpio_struct.GPIO_Pin=GPIO_Pin_0;
hx711_gpio_struct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&hx711_gpio_struct);
GPIO_WriteBit(GPIOB,GPIO_Pin_1,1);//这里是初始化定义拉高SCK
}
(2)实现A/D采样所使用的通信介绍
unsigned long HX711_Read(void)//unsigned long 为无符号整数,不能表示负数
{
unsigned long Count;
unsigned char i;//为无符号字符,不能表示负
W_SCK(0);//拉低SCK时钟
Count=0;//相当于清空Count里的所有数
while(R_DT);//由于DT是上拉输入,所以当DT口没有信号输入或者悬空
//则IO口默认为高电平,即R_DT==1,
//直到DT口检测到了信号输入,才置为低电平,进入下面程序
for (i=0;i<24;i++)//这里由于是128增益,所以要循环24次
{
W_SCK(1);
Count=Count<<1;//这里指的是将Count左位移一位
W_SCK(0);
if(R_DT) //如果有DT电平输入,那空的Count那一位就由0变1
//否则Coun那一位任然为0,等下一次Count位移继续判断
Count++;
}
W_SCK(1);
Count=Count^0x800000; //最高位取反,其他位不变
//在HX71芯片中,count是一个32位的有符号整数,
//用于存储称重传感器的读数。
//当count的最高位为1时,表示读数为负数,
//而HX711芯片不支持负数的读数。
//因此,为了将负数转换为正数,需要将count的最高位取反,
//即将count与0x800000进行异或操作。
//具体来说,0x800000的二进制表示为100000000000000000000000,
//与count进行异或操作后,
//可以将count的最高位从1变为0,从而得到对应的正数读数。
W_SCK(0);
return(Count);
}
增益数值不同意味着循环的次数不同【增益128-循环24次;增益32-循环25次;增益64循环26次】,这里用的是增益128。
以下是通信流程图(借鉴三马分享家大佬的):
首先,我们读出的ADC值是一个无符号的32为数,所以要定义为unsigned long,后面根据上图的通信流程图,如代码中进行拉高和拉低SCK,进行DT口的数据传输通行,DT口的数据传输的细节与注意事项,如代码注解所示。注意,我们获取的数据还得进行一次倒置,因为在HX71芯片中,count是一个32位的有符号整数,用于存储称重传感器的读数。当count的最高位为1时,表示读数为负数,而HX711芯片不支持负数的读数。因此,为了将负数转换为正数,需要将count的最高位取反,即将count与0x800000进行异或操作。
具体来说,0x800000的二进制表示为100000000000000000000000,与count进行异或操作后,可以将count的最高位从1变为0,从而得到对应的正数读数。
(3)采样结果与实际重量转化算法
//校准参数
#define GapValue 3355.4
void Get_Maopi(void)
{
Weight_Maopi = HX711_Read();
}
void Get_Weight(void)
{
HX711_Buffer = HX711_Read();
if(HX711_Buffer > Weight_Maopi)
{
Weight_Zhengshu = HX711_Buffer;
Weight_Zhengshu = Weight_Zhengshu - Weight_Maopi; //获取实物的AD采样数值。
Weight_Zhengshu = (int32_t)(((float)Weight_Zhengshu/GapValue)*10/1.082); //weight(x)=x*5kg/2^24
Weight_tmp = ((float)Weight_Zhengshu/GapValue)*10/1.082;//注意,这里GapValue与1.082都是校准值,根据自己的实际情况进行调整
Weight_tmp -= Weight_Zhengshu;
if(Weight_tmp<0)
{
Weight_tmp = -Weight_tmp;
}
Weight_xiaoshu = (int32_t)(Weight_tmp*10);
}
}
一节5号南孚电池是24g,误差为0.1g。(校准的时候可以再细调一下,减小误差,或用卡尔曼滤波减少了数值的波动)
总结:
以上就是用stm32使用压力传感器的用法与注意点,希望能帮到各位!
作者:仰望星(兴)空