Numher-ofBits)⑴
=速率二10Hz
197
Bits
兀噪声位散(Noise-
1r«eBits.)'2
増益=128.建率=40Hz
173
Bits
这个表格说明两点问题:
(1)AD输出范国虽然为J4位,其实只仃19位冇效。
但这19位可能不线性。
又因为无噪声位为17位,所以取17位才能保证线性。
因此在代码屮我读取了17位的有效值。
(2)W为AD芯片在放k128倍时.AD转换频率只能达到1OHZ,所以延时时间对应为
lOOniSo
第二,同样参照主耍电气参数表格:
输出总定时间的定义是指从上电、复位、输入通道或增益改变到仃效的稳定输出数据时间。
也就是说芯片只耍求在上电、复位.增益调整时,延迟400ms,AD的值才稳定。
由丁・
设备提供商的参数仃町能是在特殊条件卜•测績的.所以我们在设置时设延时500ms•这样町以留点有余最,扩人适用性范阳。
3•主控单片机
这里我们使用的取片机是STC12LE5A60S2系列单•片机,它是STC生产的单•时钟/机器周期(1T)的单片机.是高速/低功耗/超强抗于扰的新一代8051单片机.指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM»8路高速10位A/D转换(250K/S,即25力次/秒),针对电机控制,强干扰场合。
STC12LE5A60S2系列巾•片机工作电压为22V-36V,为3V电压单片机。
所以这里要说明的问题是3V电斥单片机怎么能够既与AD电源匹配,乂能使传感器可以正常T•作?
其实就是要在准双向II模式屮向3V单片机引脚施加5V电压,那么就耍加限流电阻或用二极管做输入隔离,或用三极管做输出隔离。
又由丁•仃些外国接的是NPN三极管,没仃加上拉电阻,其实基极串多大电阻,I/OII就应该上拉多大的电阻,或者将该I/O丨1设置为
强推免输出。
这也我们所使用的HX711使用的就是8550NPN三极管•正确的做法是应该上拉电阻或强推免,但是不加也是可以,只不过容易造成I/O损坏。
我们这由于前期做主控板时没有考渥到这个问题,所以没有任何处理。
后期会改善这个问题。
4如图6所示传感器与hx711及主控板连接方法。
供电+红色
*地线
抑:
线接CPU—1OU二B寸计线接CPU」O口垓45V屯源
供电•白色
图6连接方法
5破件这三方面的连接如图7所示:
图7AD与MCU连接图
图屮小板子是HX711.人板子是主控单•片机。
贰中HX711左端端II依次是E+、
E-、A+、A-、B+、B-,与传感器相连,颜色与传感器导线颜色对应,依次红白黑绿。
与E+、E・、A+、A-对应相连;其右端端I1依次为GND、DT、SCK、VCC分别-
一对应接于单片机上的GND、P26、P2.7.5V电源处。
接卜•來讲解软件代码坏节。
我们足运用软件keil4,C语言。
卜•而我先把代码呈现给人家:
#include〃51系列单片机头文件sbitADDO=P2A6,〃声明AD的DT端IIsbitADSK=P2A7,〃声明AD的SCK端IIvoidinitO:
〃声明初始函数
voiddelayms(charms),〃声明延时两数voidsend_char(char明串丨I函数
voidget_weiglitO,〃声明获取体巫函数longa,weight,//定义变盘类型
charc[6],al,a2,〃同上
chartab[H0123456789';//同I:
〃同上
〃主函数
〃延时500ms
〃初始化函数
//人循环
〃调用get_weight
longReadCouiit(void),mainO
{
delayms(500),mitQ:
while(l)
{get_weightO,
}
}
voidinitO
TMOD=0x20,
TH1=0xFD,
TL1=0xFD,
SCON=0x50,
PCON&=Oxef,
TRI=1,
IE=0x0,
〃定时器1「•作J:
8位自动鱼载模式,用于产生波特率
//波特率9600
//同上
//设定串行口工作方式
//波特率不倍増
//启动定时器1
//禁止任何中断
/
voidsend_char(chartxd)
/
//传送一个字符
SBOT=txd,while(ITI);
TI=0,
}
voiddelayms(charms)
〃将中丨1发送寄存器中的数据一位位从吊11发送出去//等待数据传送
//清除数据传送标,忐
//延时子程序
for(i=0,i<1卫i卄)■〃農个循坏近似等J-1ms}
}
longReadCount(void)
/
//AD骡动程序
V
longCount,
chari,
ADSK=0,
〃使能AD(PD_SCK置低)
Count=0,
〃清零
while(ADDO),
//AD转换未结束则等待,否则开始读取。
起了同步作用
for(r=0」v24,i++)
/
//24位时钟脉冲从授高位到最低位逐位输出
\
ADSK=1,
//PD_SCK置高(发送脉冲)
Count=Count«l,
〃卜嗓沿來时变駅Count左移-位,右侧补零
ADSK=0,
//PD_SCK置低
if(ADDO)Count-w-,//当数据输出为高电Countftll1
〃获取被测物体匝駅
}ADSK=1,_nop_0;
ADSK=0>retuni(Count)>}voidget_weight()
〃第25个脉冲到來〃延长一个机器周期//第25个脉冲结束〃输出Count
intcount=0,〃定义count变M:
为整型,初值为0
longsum=0,〃定义sum变量为长整型,初值为0
for(coiint=0,count<6,count++)//for循环,变彊count累加到5时跳出for循环{
a=ReadCount(),〃读取AD输出数据,賦值给a
a=a»8,//a右移8位,舍去低八位,a为16位仃效,保证了线性sum+=a,〃将a累加赋值给sum
}
a=sum/5,//sum求'卜均什i赋值给a
//al=a&0xff,//a低8位赋值给al
//a2=a»8,//a右移8位后再把此时的a的低八位赋值给a2
//send_char(a2),〃串II输出a2
//send_char(a1),//串II输出a1
//send_char(Oxab),//«HII输tLlAB
weight=(long)((float)(a-546)*99),
//■RIp:
转换函数,传感器型号不同此曲数要适当修改weight=(weight+50)/l00*100,〃实现I•位四舍五入
c[0]=tab[weight/l00000],〃重鼠值整除得十力位
c[l]=tab[weight%100000/10000],//TE录值帑除得力位
c[2]=tab[weight%10000/1000],〃币;吊値整除得千位
c[3]=tab[weight%1000/100],〃晅彊值整除得百位
c[4]=tab[weight%100/10],〃重彊值整除得十位
c[5]=tab[weight%10];〃乘帚:
值除余得个位
send_char(c[0]),//串II输出从c[0]到c[5],由為位到低位依次输出send_chai*(c[1]),
send_chai*(c[2]),
send_char(c[3]),
send_char(c[4]),
send_char(c⑸),send_chai<64),//?
|lII输出@标记符号
}
/*由J:
称匝传感器线性度参数的不同,而对获得的贞帚数据处理,此处町能会根据不同称重传感器,程序的代码会有所不同*/
对丁•该程序的确定主耍冇两部分:
调试AD输出结果程序和weight转换函数公式。
调试AD输出结果程序:
a=ReadCount0,〃读取AD输出数据a=a»8,//a右移8位,舍去低八位,a为16位仃效,保证了线性
//al=a&0xff,//a低8位赋值给al
//a2=a»8,//a右移8位后再把此时的a的低八位赋值给a2
//send_char(a2),〃串II输出a2
//send_char(a1),//:
I:
II输illa1
//send_char(0xab),〃串II输出AE
通过该代码的加入,能够准确读出AD的初始值,和加上标准重量的AD值,然后就可
以根据它们來计算出k值(k为称區传感器线性度参数)。
然后帯入公式W=AD-无承眞AD值)*标准称重/(标准称重AD值-无承重AD值),就可以紂到weight转换函数公式。
就我们的实验数据为例,人家一起看下这个推亍的过程:
运行调试AD程序,得到初始AD值0222——(546)心加35OOg的币帰时AD值0383
——(899)io,得出标准称贞/(标准称晅AD值-无承暇AD值)=3500/(899-546)=99。
进而推出weight转换函数公式:
weiglit=(long)((float)(a-546)*99),
由电源千扰严匝,所以传感器输出信号•波形不可测。
HX711调试电路見冇同步抑制50HZ和60HZ的电源十•扰,所以调试过程中从AD中测得的数据输出波形DT,时钟输入波形SCK
(1)DT波形
(2)SCK波形