tag 标签: HX711 人体称重模块

相关博文
  • 热度 8
    2020-12-26 20:28
    4981 次阅读|
    9 个评论
    【雕爷学编程】Arduino动手做(72)---HX711 人体称重模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。 【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)实验七十二: 人体秤50kg称重传感器模块(电阻应变半桥式) 应变片 是由敏感栅等构成用于测量应变的元件。电阻应变片的工作原理是基于应变效应制作的,即导体或半导体材料在外界力的作用下产生机械变形时,其电阻值相应的发生变化,这种现象称为“应变效应”。 为了系列实验和了解应变片,我特意去网上买了一片,就是其体积挺惊人,在包装盒里面好不容易才找到 应变效应 金属导体的电阻值,随着它受力所产生机械变形(拉伸或压缩)的大小而发生变化的现象,称之为金属的电阻应变效应。电阻值将发生变化这种现象称为“应变效应”。根据应变效应将应变片粘贴于被测材料上被测材料受到外界作用产生的应变就会传送到应变片上使应变片的电阻值发生变化通过测量应变片电阻值的变化就可得知被测机械量的大小。 应变效应应用范围十分广泛,可测量应变、应力、力矩、位移、加速度、扭矩等物理参量。电阻式应变片应用模式有两种,一是将应变片粘贴于弹性刚体上组成平衡电桥,然后接到转换电路,构成专用应变传感器;二是将应变片粘贴于被测物体上,然后接到专用应变仪直接读取应变量。 电阻应变片 电阻应变片的工作原理是基于应变效应制作的,即导体或半导体材料在外界力的作用下产生机械变形时,其电阻值相应的发生变化,这种现象称为“应变效应”。半导体应变片是用半导体材料制成的,其工作原理是基于半导体材料的压阻效应。压阻效应是指当半导体材料某一轴向受外力作用时,其电阻率发生变化的现象。应变片是由敏感栅等构成用于测量应变的元件,使用时将其牢固地粘贴在构件的测点上,构件受力后由于测点发生应变,敏感栅也随之变形而使其电阻发生变化,再由专用仪器测得其电阻变化大小,并转换为测点的应变值。金属电阻应变片品种繁多,形式多样,常见的有丝式电阻应变片和箔式电阻 应变片。箔式电阻应变片是一种基于应变——电阻效应制成的,用金属箔作为敏感栅的,能把被测试件的应变量转换成电阻变化量的敏感元件。 称重传感器工作原理 称重传感器是用来将重量信号或压力信号转换成电量信号的转换装置。称重传感器采用金属电阻应变片组成测量桥路,利用金属电阻丝在张力作用下伸长变细,电阻增加的原理,即金属电阻随所受应变而变化的效应而制成的。金属电阻具有阻碍电流流动的性质,同一种金属丝,一般来讲,越是细长,其电阻值就越大。当金属电阻丝受外力作用而伸缩时,其电阻值就会在某一范围内增减。因此,将金属丝(或膜)紧贴在被测物体上,当被测物体受外力而伸缩时,金属电阻丝(膜)也会按比例伸缩,其阻值也会相应变化。称重传感器就是将金属电阻应变片粘贴在金属称重梁上进行测量重量信号的。 桥式测量电路 电阻应变式称重传感器包括两个主要部分,一个是弹性敏感元件:利用它将被测的重量转换为弹性体的应变值;另一个是电阻应变计:它作为传感元件将弹性体电阻应变式称重传感器。 当传感器不受载荷时,弹性敏感元件不产生应变,粘贴在其上的应变片不发生变形,阻值不变,电桥平衡,输出电压为零;当传感器受力时,即弹性敏感元件受载荷P时,应变片就会发生形变,阻值发生变化,电桥失去平衡,有输出电压。 内部为1000欧半桥应变片,量程为50kg称重传感器,半桥结构。 测量时,外侧边正确施加外力,E字形传感器的应变梁部分(即中间贴应变片的,有白色覆胶的梁臂)和外侧边要形成一个方向相反的剪切力,即中间的应变梁在受力下必需可以发生弯曲变化,应变梁受力面另一侧不可有阻挡物。 传感器内部是一组半桥应变片,使用方法可以有以下三种: 1、使用一只传感器配合外接电阻组成全桥测量,量程为一个传感器的量程:50kg。对外接电阻要求较高。 2、使用二只传感器组成全桥测量,量程为两只传感器的量程之和:50kgx2=100kg。 3、使用四只传感器组成全桥测量,量程为四只传感器的量程之和:50kgx4=200k。 HX711 24位精度AD称重模块 HX711 是一款专为高精度电子秤而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU 芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A 或通道B,与其内部的低噪声可编程放大器相连。通道A 的可编程增益为128 或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B 则为固定的32 增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D 转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。 主要参数 满额度差分输入范围 V(inp)-V(inn) ±0.5(AVDD/GAIN) V 输入共模电压范围 AGND+0.6 AVDD-0.6 V 使用片内振荡器,RATE = 0 10 使用片内振荡器,RATE = DVDD 80 外部时钟或晶振,RATE = 0 fclk/1,105,920 输出数据速率 外部时钟或晶振,RATE = DVDD fclk/138,240 Hz 输出数据编码 二进制补码 800000 7FFFFF(HEX) RATE = 0 400 输出参考电压(VBG) 1.25 V 外部时钟或晶振频率 1 11.0592 30 MHz 模拟电源电流(含稳压电路) 1600μA 断电 0.3 μA 模块采用24位高精度的A/D转换器芯片hx711,是一款专为高精度电子称而设计的, 具有两路模拟通道输入, 内部集成128倍增益可编程放大器。输入电路可配置为 提供桥压的电桥式(如压力、称重)传感器模式 是一款理想的高精度低成本采样前端模块。采样hx711 24位ad芯片,双通道 差分输入。全贴片 机器焊接,带金属屏蔽,配送直、弯两种插针,满足各种安装焊接方式,板上使用了2个47uF的胆电容,用料很足,内置上拉电阻,且预留CPU焊接位置,很适合自己二次开发各种各样的传感器相关应用。 模块电原理图 模块主要特点 ● 带金属屏蔽,强抗干扰,预留cpu(STC15F104)位置,可自行升级二次开发。 ● 两路可选择差分输入 ● 片内低噪声可编程放大器,可选增益为32、64 和128 ● 片内稳压电路可直接向外部传感器和芯片内A/D 转换器提供电源 ● 片内时钟振荡器无需任何外接器件,必要时也可使用外接晶振或时钟 ● 上电自动复位电路 ● 简单的数字控制和串口通讯:所有控制由管脚输入,芯片内寄存器无需编程 ● 可选择10Hz 或80Hz 的输出数据速率 ● 同步抑制50Hz 和60Hz 的电源干扰 ● 耗电量(含稳压电源电路): 典型工作电流:< 1.7mA, 断电电流:< 1μA ● 工作电压范围:2.6 ~ 5.5V ● 工作温度范围:-20 ~ +85℃ 模块检测方法 1,初步快速判断:断开模块所有连线,仅仅给模块供电5v(就是vcc接+5v,gnd接地),然后把模块的ck端口对地短接,然后再去测 out+对地电压,应该4.5v左右,接着测DO/RX端口对地电压,应该0v左右,如果电压都符合,说明模块99%正常。 2,完整测试判断:使用测试电路图搭个电路,给单片机烧入测试程序,然后用串口线连接电脑,在电脑上运行串口助手,就可以接收到测试电路发出来的读数报告,读数正常,表明模块正常。 实验准备接线时,才发现收来的四个称重传感器中,有一个只有二根线(其它3个都是3根接线),看来要搞不定了 HX711.h头文件 #ifndef HX711_h #define HX711_h #include "Arduino.h" class Hx711 { private: int DOUT;//定义数据引脚 int SCK;//定义时钟引脚 float scale;//定义比例系数 long offset;//定义补偿值 public: Hx711(int IO_DOUT,int IO_SCK);//构造函数 void setScale(float IO_scale);//设置比例系数 void setOffset(long IO_offset);//设置补偿值 long getValue();//采集一次ADC值 long getAverageValue(char IO_times);//采集ADC平均值 float getWeight(char IO_times);//得出重量值 }; #endif HX711.cpp 文件 #include "HX711.h" #include "Arduino.h" //int DOUT;//定义数据引脚 //int SCK;//定义时钟引脚 //float scale;//定义比例系数 //long offset;//定义补偿值 //int times;//定义采集次数 Hx711::Hx711(int IO_DOUT,int IO_SCK)//构造函数 { DOUT = IO_DOUT; SCK = IO_SCK; pinMode(SCK, OUTPUT);//设置IO口工作方式 pinMode(DOUT, INPUT); } void Hx711::setScale(float IO_scale)//设置比例系数 { scale = IO_scale; } void Hx711::setOffset(long IO_offset)//设置补偿值 { offset = IO_offset; } long Hx711::getValue()//采集一次ADC值 { unsigned long Count; unsigned char i; digitalWrite(SCK,LOW); Count = 0; while(digitalRead(DOUT) == 1);//低电平时数据可以输出 for(i=0;i<24;i++)//循环读取数据 { digitalWrite(SCK,HIGH); Count = Count<<1; digitalWrite(SCK,LOW); if(digitalRead(DOUT) == 1) Count++;//最低位置1 } digitalWrite(SCK,HIGH); Count = Count^0x800000;//最高位置0 digitalWrite(SCK,LOW);//128增益 return Count; } long Hx711::getAverageValue(char IO_times)//采集ADC平均值 { long sum=0; char i; for(i=0;i