当前位置:   article > 正文

STM32和HX711压力传感器(电子秤)_stm32 hx711

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值是一样的,只需要在计算时做出改变就行了

  1. 压力传感器学习意义

电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。它与我们日常生活紧密结合息息相关。电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成。电子称不但计量准确、快速方便,更重要的自动称重、数字显示,对人们生活的影响越来越大,广受欢迎。

2、HX711电子秤模块重要引脚介绍

1.DT口介绍

DTHX711芯片的数据输出端口,它输出经过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口所用的引脚代码

  1. void HX711_Init(void)
  2. {
  3. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB的时钟
  4. GPIO_InitTypeDef hx711_gpio_struct;//创建一个GPIO结构体
  5. //SCK
  6. hx711_gpio_struct.GPIO_Mode=GPIO_Mode_Out_PP;//SCK为开漏输出模式
  7. hx711_gpio_struct.GPIO_Pin=GPIO_Pin_1;
  8. hx711_gpio_struct.GPIO_Speed=GPIO_Speed_50MHz;//通用50MHz
  9. GPIO_Init(GPIOB,&hx711_gpio_struct); //使能
  10. //DT
  11. hx711_gpio_struct.GPIO_Mode=GPIO_Mode_IPU;//DT为上拉输入模式,
  12. //如果IO口外部没有信号输入或者悬空,则IO口默认为高电平。
  13. //如果此时IO口有输入低电平,那么引脚就为低电平,MCU读取到的就是低电平
  14. hx711_gpio_struct.GPIO_Pin=GPIO_Pin_0;
  15. hx711_gpio_struct.GPIO_Speed=GPIO_Speed_50MHz;
  16. GPIO_Init(GPIOB,&hx711_gpio_struct);
  17. GPIO_WriteBit(GPIOB,GPIO_Pin_1,1);//这里是初始化定义拉高SCK
  18. }

(2)实现A/D采样所使用的通信介绍

  1. unsigned long HX711_Read(void)//unsigned long 为无符号整数,不能表示负数
  2. {
  3. unsigned long Count;
  4. unsigned char i;//为无符号字符,不能表示负
  5. W_SCK(0);//拉低SCK时钟
  6. Count=0;//相当于清空Count里的所有数
  7. while(R_DT);//由于DT是上拉输入,所以当DT口没有信号输入或者悬空
  8. //则IO口默认为高电平,即R_DT==1
  9. //直到DT口检测到了信号输入,才置为低电平,进入下面程序
  10. for (i=0;i<24;i++)//这里由于是128增益,所以要循环24
  11. {
  12. W_SCK(1);
  13. Count=Count<<1;//这里指的是将Count左位移一位
  14. W_SCK(0);
  15. if(R_DT) //如果有DT电平输入,那空的Count那一位就由01
  16. //否则Coun那一位任然为0,等下一次Count位移继续判断
  17. Count++;
  18. }
  19. W_SCK(1);
  20. Count=Count^0x800000; //最高位取反,其他位不变
  21. //在HX71芯片中,count是一个32位的有符号整数,
  22. //用于存储称重传感器的读数。
  23. //count的最高位为1时,表示读数为负数,
  24. //而HX711芯片不支持负数的读数。
  25. //因此,为了将负数转换为正数,需要将count的最高位取反,
  26. //即将count0x800000进行异或操作。
  27. //具体来说,0x800000的二进制表示为100000000000000000000000
  28. //count进行异或操作后,
  29. //可以将count的最高位从1变为0,从而得到对应的正数读数。
  30. W_SCK(0);
  31. return(Count);
  32. }

增益数值不同意味着循环的次数不同【增益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)采样结果与实际重量转化算法

  1. //校准参数
  2. #define GapValue 3355.4
  3. void Get_Maopi(void)
  4. {
  5. Weight_Maopi = HX711_Read();
  6. }
  7. void Get_Weight(void)
  8. {
  9. HX711_Buffer = HX711_Read();
  10. if(HX711_Buffer > Weight_Maopi)
  11. {
  12. Weight_Zhengshu = HX711_Buffer;
  13. Weight_Zhengshu = Weight_Zhengshu - Weight_Maopi; //获取实物的AD采样数值。
  14. Weight_Zhengshu = (int32_t)(((float)Weight_Zhengshu/GapValue)*10/1.082); //weight(x)=x*5kg/2^24
  15. Weight_tmp = ((float)Weight_Zhengshu/GapValue)*10/1.082;//注意,这里GapValue与1.082都是校准值,根据自己的实际情况进行调整
  16. Weight_tmp -= Weight_Zhengshu;
  17. if(Weight_tmp<0)
  18. {
  19. Weight_tmp = -Weight_tmp;
  20. }
  21. Weight_xiaoshu = (int32_t)(Weight_tmp*10);
  22. }
  23. }

                                                         

一节5号南孚电池是24g,误差为0.1g。(校准的时候可以再细调一下,减小误差,或用卡尔曼滤波减少了数值的波动)

总结:

以上就是用stm32使用压力传感器的用法与注意点,希望能帮到各位!

下面是工程源码:

链接:https://pan.baidu.com/s/14fwtXKRCCFLkCsFXAwA6ug 
提取码:f94f

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号