基本原理讲解
- 100kg 传感器
满量程输出电压=激励电压*灵敏度2.0mv/v
例如:供电电压是5v 乘以灵敏度2.0mv/v=满量程10mv。
相当于有100Kg 重力产生时候产生10mV 的电压。 - 711模块对产生的10mV 电压进行采样。
概述:711模块 A 通道带有128倍信号增益,可以将10mV 的电压放大128倍,然
后采样输出24bit AD 转换的值,单片机通过指定时序将24bit 数据读出。
详细讲解程序计算原理:
小强电子设计
步骤1 :如何计算传感器供电电压
HX711可以在产生 VAVDD 和 AGND 电压,即711模块上的 E+和 E-电压。
该电压通过 VAVDD=VBG(R1 +R2 )/R2计算。
VBG 为模块儿基准电压1.25v
R1 = 20K,R2 = 8.2K
因此得出 VAVDD = 4.3V
(为了降低功耗,该电压只在采样时刻才有输出, 因此用万用表读取的值可能低
于4.3v,因为万用表测量的是有效值。 )
步骤2 :如何计算 AD 输出最大值
在4.3V 的供电电压下100Kg 的传感器最大输出电压是4.3v2mv/V = 8.6mV
经过128倍放大后,最大电压为8.6mV128 = 1100.8mV
经过 AD 转换后输出的24bit 数字值最大为:
1100.8mV*(2^24) /4.3V ≈ 4294967
步骤3 :程序中数据如何转换
小强电子设计
程序中通过
HX711_Buffer = HX711_Read();
获取当前采样的 AD 值,最大4294967,存放在 long 型变量 HX711_Buffer 中,
因 long 型变量计算速率和存放空间占用资源太多,固除以100,缩放为 int 型,
便于后续计算。
Weight_Shiwu = HX711_Buffer/100;
Weight_Shiwu 最大为42949。
步骤4 :如何将 AD 值反向转换为重力值 。
假设重力为 A Kg, (x<100Kg),测量出来的 AD 值为 y
100Kg 传感器输出,发送给 AD 模块儿的电压为 A Kg * 8.6mV / 100Kg = 0.086A mV
经过128倍增益后为 128 * 0.086A = 11.008AmV
转换为24bit 数字信号为 11.008A mV * 2^24 /4.3V = 42949.67296A
所以 y = 429496.7296A /100 = 429.4967296 A
因此得出 A = y / 429.4967296 Kg
特别注意:
因为不同的传感器斜率特性曲线不一样,因此,每一个传感器需要软件校正调零。
每个传感器都要校准。
参考驱动程序(汇编)
/*-------------------------------------------------------------------
在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
ENDHX711
AVIA SEMICONDUCTOR 9
参考驱动程序( C)
sbit ADDO = P1^5;
sbit ADSK = P0^0;
unsigned long ReadCount(void){
unsigned long Count;
unsigned char i;
ADSK=0;
Count=0;
while(ADDO);
for (i=0;i<24;i++){
ADSK=1;
Count=Count<<1;
ADSK=0;
if(ADDO) Count++;
}
ADSK=1;
Count=Count^0x800000;//此处进行的异或运算,是因为Count最高位是符号位,符号位为1表示是负数,为了让数值能够呈现递增显示,即压力越大值越大,所以在这里需要进行异或处理,使得符号位始终为0,即始终是非负数。
ADSK=0;
return(Count);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65