赞
踩
目录
原理图如下
压力传感器由一个重要构成是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芯片可以输出重量数据。
市面上有很多不同规格的压力传感器,但大多殊途同归,读取的ADC值是一样的,只需要在计算时做出改变就行了
电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。它与我们日常生活紧密结合息息相关。电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成。电子称不但计量准确、快速方便,更重要的自动称重、数字显示,对人们生活的影响越来越大,广受欢迎。
DT口是HX711芯片的数据输出端口,它输出经过A/D转换处理后的24位数据。
注意:DT口和SCK口都接stm32的GPIO(通用输出输入端口)。
SCK是HX711芯片的时钟输入端口,用于控制A/D转换的时钟。
VCC引脚连接到5V或3.3V的正电源,选择5V或3.3V电源不影响正常使用。
- 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
- }
- 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,从而得到对应的正数读数。
- //校准参数
- #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使用压力传感器的用法与注意点,希望能帮到各位!
下面是工程源码:
链接:https://pan.baidu.com/s/14fwtXKRCCFLkCsFXAwA6ug
提取码:f94f
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。