赞
踩
最近要用到称重模块,上淘宝搜了一下,出来的大多数都是HX711模块+称重传感器,为此特地买了一个回来验证,可惜没买成品结构件,只能简单测量下。
HX711 采用了海芯科技集成电路专利技术, 是一款专为高精度电子秤而设计的 24 位 A/D 转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。
该芯片与后端 MCU 芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道 A 或通道 B,与其内部的低噪声可编程放大器相连。通道 A 的可编程增益为 128 或 64, 对应的满额度差分输入信号幅值分别为±20mV 或±40mV。通道 B 则为固定的 32 增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的 A/D 转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。
管脚说明如下:
应变式力传感器的受力工作原理如图 2 所示。
将应变片粘贴到受力的力敏型弹性元件上, 当弹性元件受力产生变形时,应变片产生相应的应变, 转化成电阻变化。将应变片接成如图 3 所示的电桥,力引起的电阻变化将转换为测量电路的电压变化, 通过测量输出电压的数值, 再通过换算即可得到所测量物体的重量。
传感器一端通过螺丝孔固定,另一端保持悬空状态,按标签指示方向施加重力。特别注意,一定不要直接按压白色覆胶部分,有可能直接超量程,破坏传感器内部应变片,到时候在外力撤除后不能恢复原形状,发生塑性变形,则传感器就损坏了。
由上面的原理图可以看出桥式传感器(也就是应变片或叫做称重传感器)的差分输出连接到HX711的通道A上,而HX711除了通道A,还有个通道B。这里为什么不接通道B呢,这是因为两者的增益不同,对应的应用场景也就不一样了。一般由于桥式传感器输出的信号较小,为了充分利用A/D转换器的输入动态范围,该通道A的可编程增益较大,为128或64。这些增益所对应的满量程差分输入电压分别±20mV或±40mV。通道B为固定的32增益,所对应的满量程差分输入电压为±80mV。通道B应用于包括电池在内的系统参数检测。
如上面的原理图可以看出,X1接GND。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个数据输出周期后才会从高电平变低电平,输出有效数据。
这里接线方式为红线电压+E,黑线电压-E,绿线信号A+,白线信号A-。供电不一定接5V电源,也可以接3.3V电源。因为我们知道HX711的供电电压是2.6V-5.5V之间。接单片机的引脚根据实际引脚而定。
参考驱动程序(汇编) /*------------------------------------------------------------------- 在ASM中调用: LCALL ReadAD 可以在C中调用: extern unsigned long ReadAD(void); . . unsigned long data; data=ReadAD(); . . ----------------------------------------------------------------------*/ 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
/************************************************************** 24bit HX711参考驱动程序(C) 优质人生 2010/11 在C中调用: extern unsigned long ReadAD(void); . . unsigned long data; data=ReadAD(); . . -------------------------------------------------------------*/ 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); }
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模块+称重传感器的简单应用。
感谢你的观看!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。