问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

HX711模块+称重传感器的简单应用

创作时间:
作者:
@小白创作中心

HX711模块+称重传感器的简单应用

引用
CSDN
1.
https://blog.csdn.net/qq_44836335/article/details/139671033

一、前言

最近需要使用称重模块,经过搜索发现市面上大多数都是HX711模块搭配称重传感器的组合,因此购买了一个进行验证。虽然没有购买配套的结构件,但可以进行基本的测量测试。

二、HX711模块简介

HX711采用了海芯科技的集成电路专利技术,是一款专为高精度电子秤设计的24位A/D转换器芯片。与同类产品相比,该芯片集成了稳压电源、片内时钟振荡器等外围电路,具有集成度高、响应速度快、抗干扰能力强等优点。它降低了电子秤的整体成本,提高了整机的性能和可靠性。

该芯片与后端MCU的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B则为固定的32增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。

三、使用步骤

1.硬件连接

1.1 原理图说明

由原理图可以看出,桥式传感器(应变片或称重传感器)的差分输出连接到HX711的通道A上。HX711除了通道A,还有通道B。由于桥式传感器输出的信号较小,为了充分利用A/D转换器的输入动态范围,通道A的可编程增益较大,为128或64。这些增益所对应的满量程差分输入电压分别±20mV或±40mV。通道B为固定的32增益,所对应的满量程差分输入电压为±80mV,主要用于系统参数检测。

时钟选择方面,将X1管脚接地,HX711将自动选择使用内部时钟振荡器,并自动关闭外部时钟输入和晶振的相关电路。这种情况下,典型输出数据速率为10Hz或80Hz。如果需要准确的输出数据速率,可以将外部输入时钟通过一个20pF的隔直电容连接到XI管脚上,或将晶振连接到XI和XO管脚上。这种情况下,芯片内的时钟振荡器电路会自动关闭,晶振时钟或外部输入时钟电路被采用。此时,若晶振频率为11.0592MHz,输出数据速率为准确的10Hz或80Hz。输出数据速率与晶振频率以上述关系按比例增加或减少。使用外部输入时钟时,外部时钟信号不一定需要为方波。可以将MCU芯片的晶振输出管脚上的时钟信号通过20pF的隔直电容连接到XI管脚上,作为外部时钟输入。外部时钟输入信号的幅值可低至150mV。

通讯方面,HX711的通讯引脚为PD_SCK和DOUT,用来输出数据,选择输入通道和增益。当数据输出管脚DOUT为高电平时,表明A/D转换器还未准备好输出数据,此时串口时钟输入信号PD_SCK应为低电平。当DOUT从高电平变低电平后,PD_SCK应输入25至27个不等的时钟脉冲。

其中第一个时钟脉冲的上升沿将读出输出24位数据的最高位(MSB),直至第24个时钟脉冲完成,24位输出数据从最高位至最低位逐位输出完成。第25至27个时钟脉冲用来选择下一次A/D转换的输入通道和增益。

PD_SCK的输入时钟脉冲数不应少于25或多于27,否则会造成串口通讯错误。当A/D转换器的输入通道或增益改变时,A/D转换器需要4个数据输出周期才能稳定。DOUT在4个数据输出周期后才会从高电平变低电平,输出有效数据。

1.3 实物连接

实物连接时,接线方式为:红线接电压+E,黑线接电压-E,绿线接信号A+,白线接信号A-。供电电压可以在2.6V-5.5V之间选择,既可以接5V电源,也可以接3.3V电源。接单片机的引脚根据实际引脚而定。

1.4 使用注意事项

  1. 所有数字输入管脚,包括RATE、XI和PD_SCK管脚,芯片内均无内置拉高或拉低电阻。这些管脚在使用时不应悬空。
  2. 建议使用通道A与传感器相连,作为小信号输入通道;通道B用于系统参数检测,如电池电压检测。
  3. 建议使用PNP管S8550与片内稳压电源电路配合。也可根据需要使用其他MOS或双极晶体管,但应注意稳压电源的稳定性。
  4. 无论是采用片内稳压电源或系统上其他电源,建议传感器和A/D转换器使用同一模拟供电电源。
  5. PD_SCK的输入时钟脉冲数不应少于25或多于27,否则会造成串口通讯错误。
  6. 与DOUT相连的MCU接口应设置为输入口,并且不接任何拉高或拉低电阻,以减少MCU与ADC之间的电流交换(干扰)。

2.软件编程

以下是不同平台的参考程序:

2.1 汇编语言参考程序
PUBLIC	ReadAD
HX711ROM	segment code
rseg	HX711ROM
sbit	ADDO = P1.5;
sbit	ADSK = P0.0;
/*--------------------------------------------------
OUT:	R4, R5, R6, R7	R7=>LSB
如果在C中调用,不能修改R4,R5,R6,R7。
---------------------------------------------------*/
ReadAD:
CLR	ADSK	//使能AD(PD_SCK置低)
JB	ADDO,$	//判断AD转换是否结束,若未结束则等待否则开始读取MOV	R4,#24
ShiftOut:
SETB	ADSK	//PD_SCK置高(发送脉冲) NOP
CLR	ADSK	//PD_SCK置低
MOV	C,ADDO	//读取数据(每次一位)
XCH	A,R7	//移入数据RLC	A
XCH	A,R7
XCH	A,R6
RLC	A
XCH	A,R6
XCH	A,R5
RLC	A
XCH	A,R5
DJNZ	R4,ShiftOut	//判断是否移入24BIT SETB	ADSK
NOP
CLR	ADSK RET
END
2.2 51单片机C语言参考程序
sbit ADDO = P1^5;
sbit ADSK = P0^0;
unsigned long ReadCount(void)
{
 unsigned long Count;
 unsigned char i;
 ADSK=0; //使能AD(PD_SCK 置低)
 Count=0;
 while(ADDO); //AD转换未结束则等待,否则开始读取
 for (i=0;i<24;i++)
 {
 ADSK=1; //PD_SCK 置高(发送脉冲)
 Count=Count<<1; //下降沿来时变量Count左移一位,右侧补零
 ADSK=0; //PD_SCK 置低
 if(ADDO) Count++;
 }
 ADSK=1;
 Count=Count^0x800000;//第25个脉冲下降沿来时,转换数据
 ADSK=0;
 return(Count);
}
2.3 32位单片机C语言参考程序
void HX711_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    HX711_GPIO_APBxClkCmd(HX711_GPIO_CLK, ENABLE);
    GPIO_InitStructure.GPIO_Pin = HX711_SCK_GPIO_PIN;	
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(HX711_SCK_GPIO_PORT, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = HX711_DATA_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(HX711_DATA_GPIO_PORT, &GPIO_InitStructure);
}
void HX711_Data_Out(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    HX711_GPIO_APBxClkCmd(HX711_GPIO_CLK, ENABLE);
    GPIO_InitStructure.GPIO_Pin = HX711_DATA_GPIO_PIN;	
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(HX711_DATA_GPIO_PORT, &GPIO_InitStructure);
}
void HX711_Data_In(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    HX711_GPIO_APBxClkCmd(HX711_GPIO_CLK, ENABLE);
    GPIO_InitStructure.GPIO_Pin = HX711_DATA_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(HX711_DATA_GPIO_PORT, &GPIO_InitStructure);	
}
u32 Read_HX711(void)
{
    uint8_t i;
    uint32_t value = 0;
    
    /**
    数据手册写到,当数据输出管脚 DOUT 为高电平时,表明A/D 转换器还未准备好输出数据,此时串口时
    钟输入信号 PD_SCK 应为低电平,所以下面设置引脚状态。
    **/
    HX711_Data_Out();
    HX711_DATA=1; //初始状态DT引脚为高电平
    delay_us(1);
    HX711_SCK=0; //初始状态SCK引脚为低电平
    HX711_Data_In();
    /**
    等待DT引脚变为高电平
    **/
    while(HX711_DATA);
    delay_us(1);
    
    /**
    当 DOUT 从高电平变低电平后,PD_SCK 应输入 25 至 27 个不等的时钟脉冲
    25个时钟脉冲 ---> 通道A 增益128
    26个时钟脉冲 ---> 通道B 增益32
    27个时钟脉冲 ---> 通道A 增益64
    **/
    for(i=0; i<24; i++) //24位输出数据从最高位至最低位逐位输出完成
    {
        HX711_SCK=1;
        delay_us(1);
        HX711_SCK=0;
        if(HX711_DATA == 0)
        {
            value = value << 1;
            value |= 0x00;
        }
        if(HX711_DATA == 1)
        {
            value = value << 1;
            value |= 0x01;
        }
        delay_us(1);
    }
    
    //第 25至 27 个时钟脉冲用来选择下一次 A/D 转换的输入通道和增益
    HX711_SCK=1;; 
    value = value^0x800000; 
    delay_us(1); 
    HX711_SCK=0; 
    delay_us(1);  
    return value; 	
}

四、总结

本文详细介绍了HX711模块与称重传感器的使用方法,包括硬件连接和软件编程。通过本文的介绍,读者可以快速掌握该模块的使用方法,并将其应用于实际项目中。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号