资源描述
传感课程设计报告
基于单片机的电子秤设计
2
目 录
摘要 1
关键字:电子秤、电子应变片、A/D转换器,显示电路 1
一、系统整体描述 1
二、 系统模块设计 2
2.1 电阻应变式传感器的组成以及原理 2
2.2 直流差动电桥检测电路 3
2.3放大电路 5
2.4 A/D转换 6
2.5单片机系统 7
三、数据处理及程序的设计 9
3.1数据处理及程序的设计 9
3.2参数整定 10
3.2.1测量数据及误差分析 10
3.2.2曲线拟合及参数整定 10
3.3 显示子程序的设计 13
总结 13
参考文献 14
附录1程序 15
摘要
本文设计的电子秤以单片机为主要部件,用C语言进行软件设计,硬件则以半桥传感器为主,测量0~500g电子秤,随时可改变上限阈值,本课程设计的电子秤以单片机为主要部件,利用差动半桥测量原理,通过对电路输出电压和标准重量的线性关系,建立具体的数学模型,将电压量纲(V)改为重量纲(g)即成为一台原始电子秤。其中测量电路中最主要的元器件就是电阻应变式传感器。电阻应变式传感器是传感器中应用最多的一种。 芯片HX711-BF的A/D转换的作用是把模拟信号转变成数字信号,进行模数转换,然后把数字信号输送到显示电路中去,最后由显示电路显示出测量结果 。
关键字:电子秤、应变片、A/D转换器,显示电路
一、系统整体描述
系统由敏感元件、电桥测量电路、放大电路、模数转换电路、单片机最小系统、显示电路构成。敏感元件产生物理量变化,由测量电路将信号转换为电信号,并放大输出。通过模数转换后将信号输入单片机中,经过处理后由显示电路显示。
单片机最小系统
模数转换电路
电桥测量电路
放大电路
应变片
显示电路
二、 系统模块设计
2.1 电阻应变式传感器的组成以及原理
电阻应变式传感器是将被测量的力,通过它产生的金属弹性变形转换成电阻变化的元件。由电阻应变片和测量线路两部分组成。常用的电阻应变片有两种:电阻丝应变片和半导体应变片,本设计中采用的是电阻丝应变片,为获得高电阻值,电阻丝排成网状,并贴在绝缘的基片上,电阻丝两端引出导线,线栅上面粘有覆盖层,起保护作用。
电阻应变片也会有误差,产生的因素很多,所以测量时我们一定要注意,其中温度的影响最重要,环境温度影响电阻值变化的原因主要是:
A. 电阻丝温度系数引起的。
B. 电阻丝与被测元件材料的线膨胀系数的不同引起的。
对于因温度变化对桥接零点和输出,灵敏度的影响,即使采用同一批应变片,也会因应变片之间稍有温度特性之差而引起误差,所以对要求精度较高的传感器,必须进行温度补偿,解决的方法是在被粘贴的基片上采用适当温度系数的自动补偿片,并从外部对它加以适当的补偿。非线性误差是传感器特性中最重要的一点。产生非线性误差的原因很多,一般来说主要是由结构设计决定,通过线性补偿,也可得到改善。 滞后和蠕变是关于应变片及粘合剂的误差。由于粘合剂为高分子材料,其特性随温度变化较大,所以称重传感器必须在规定的温度范围内使用。
图1原理应变式传感器安装示意图
2.2 直流差动电桥检测电路
图2-4 单臂电桥转换电路
⑴ 电桥平衡条件和调零
直流电桥转换电路如图2-5(a)所示。 当RL=∞时,输出电压为
(2-15)
电桥达到平衡时,输出电压为零,令Uo=0,由式(2-15)得
(2-16)
式(2-16)即为直流电桥的平衡条件。
图 2-5 直流电桥转换电路和调零电路
当式(2-16)不满足时,输出电压U0不为零,此时需要调零电路完成调零。图2-5(b)是典型的直流电桥调零电路,调节电位器Rr可以补偿R1、R2、R3、R4间的不平衡。
⑵ 电桥的电压灵敏度
① 单臂电桥的电压灵敏度
单臂电桥是将电阻应变片接入电桥的一个桥臂,如图2-4的R1位置,其余桥臂为固定电阻,则其输出电压为
(2-17)
因为电桥初始状态时是平衡的,有R2/R1=R4/R3,令n=R2/R1= R4/R3为桥比。由于ΔR1/R1很小,则
(2-18)
定义直流电桥电路的灵敏度系数为
(2-19)
欲使电路的灵敏度最大,令 ,得(1+n)2-2n(1+n)=0 (2-20)
即n=1。所以,选择桥臂电阻阻值,使桥比为1,电路灵敏度达到最大。此时的输出电压为 (2-21)
电路的灵敏度系数为
(2-22)
从前面的推导得知,式(2-21)的输出电压是式(2-17)略去分母中ΔR1/R1项得到的结果,简化后的输出电压Uo与电阻相对变化ΔR1/R1之间是线性的。如果不作简化,实际输出电压为
(2-23)
令n=1,这一线性化引起的非线性误差为
(2-24)
例如,测量过程中电阻的相对变化ΔR1/R1=1%,当采用单臂电桥作为转换电路时,由式(2-24)计算后,得到的非线性误差为γL=4.8%。它表明电阻的相对变化较大时,这种简化带来的非线性误差将变得非常严重。
② 半桥、全桥的电压灵敏度
在试件上粘贴两个工作应变片,一个为受拉应变片,一个为受压应变片,大小相等,方向相反,接入电桥相邻桥臂,将构成半桥电路,如图2-6(a)所示;在试件上粘贴四个工作应变片,两个为受拉应变片,两个为受压应变片,分别接入对边桥臂,构成全桥电路,如图2-6(b)所示。
图2-6 差动电桥转换电路
对于图2-6(a)所示的半桥电路,输出电压为
(2-25)
若ΔR1=ΔR2,R1=R2=R3=R4,则
(2-26)
半桥电路的灵敏度系数为:
(2-27)
对于图4-6(b)所示的全桥电路,输出电压为
(2-28)
全桥电路的灵敏度系数为
KU=E (2-29)
考虑传感器的灵敏度和操作难度,我们选择以差动半桥电路作为本设计的检测电路
2.3放大电路
目前的电子称重装置大都使用电阻应变桥式传感器,其核心是由电阻应变计(应变片)构成的电桥电路,这类传感器具有成本低、精度高且温度稳定性好的特点。但其检测原理决定该类传感器输出电压低,要经过差分放大电路放大数百倍才能用于A/D转换。一般说来,传感器输出的电压值都非常小,基本上都是毫伏级甚至微伏级。在设计高精度电子秤时,需要外部放大电路来获得足够的增益。
差动放大电路:
原理: 本次设计中,要求用一个放大电路,即差动放大电路,主要的元就是差动放大器。在许多需要用A/D转换和数字采集的单片机系统中,多数情况下,传感器输出的模拟信号都很微弱,必须通过一个模拟放大器对其进行一定倍数的放大,才能满足A/D转换器对输入信号电平的要求,在此情况下,就必须选择一种符合要求的放大器。仪表仪器放大器的选型很多,我们这里使用一种用途非常广泛的放大器,就是典型的差动放大器ina114ap。它只需高精度和几只电阻器,即可构成性能优越的仪表用放大器。广泛应用于工业自动控制、仪器仪表、电气测量等数字采集的系统中。本设计中差动放大电路结构图如下:
放大倍数的推导过程:
2.4 A/D转换
A/D转换的作用是进行模数转换,把接收到的模拟信号转换成数字信号输出。由于输入电源为直流,电桥经放大后输出电压为直流电压,为模拟信号。经过芯片HX711-BF转为数字信号,便于下一步单片机的处理和显示。
HX711是一款专为高精度称重传感器而设计的24位A/D 转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU 芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A 或通道B,与其内部的低噪声可编程放大器相连。通道A 的可编程增益为128 或64,对应的满额度差分输入信号幅值分别为±20mV 或±40mV 。通道B 则为固定的64 增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D 转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。
2.5单片机系统
使用的单片机芯片为8位HX711芯片,外部晶振频率为12MHz。
HX711-BF是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得HX711-BF为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,2个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外HX711-BF可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
单片机最小系统由晶振、复位电路和单片机芯片构成,电路如图所示。
2.6总电路图
三、数据处理及程序的设计
3.1数据处理及程序的设计
数据处理子程序是整个程序的核心。主要用来调整输入值系数,使输出满足量程要求。另外完成A/D的采样结果从十六进制数向十进制数形式转化。
对于重量与传感器的电压之间的关系,为了确保测量的准确度,用MATLAB软件编程。Lsline指令实现了对多组测量数据的最小二乘拟合,得到了比较理想的线性关系,又运用回归函数polyfit(x,y',1)得到压力与电压的函数关系,使压力的测量的精度进一步提高。
数据采集由HX711-BF芯片来完成,主要分为启动、读取数据、延时等待转换结束、读出转换结果、存入指定内存单元、继续转换(退出)几个步骤。HX711-BF初始化后,就具有了将某一通道输入的0~5V模拟信号转换成对应的数字量00H—FFH,然后再存入8051内部RAM的指定单元中。其转换方式可以采用程序查询方式,延时等待方式和中断方式三种。本设计采用的是延时等待方式,具体程序流程图如图13所示。
图13 实验数据采集流程图
3.2参数整定
3.2.1测量数据及误差分析
在IN0输入的数最大为5V,要求的质量303g对应的是4.8V,为十六进制向十进制转换方便,将系数放大100倍。并用小数点位置的变化体现这一过程。
数据处理子程序是整个程序的核心。主要用来调整输入值系数,使输出满足量程要求。另外完成A/D的采样结果从十六进制数向十进制数形式转化。在硬件调试过程中重量与电压的关系如下表所示:
重量(g)
0
20
40
60
80
100
120
140
160
180
200
310
电压(mv)
0
-0.025
-0.054
-0.082
-0.109
-0.138
-0.167
-0.199
-0.228
-0.259
-0.291
-0.48
根据实验过程的情况以及实验时所使用的器材,分析实验所带的误差原因有:
1、作为应变梁的钢尺实验时所产生的应变弯曲不一定是线性的,也就是说实验的重物每增加单位重量时,钢尺所产生的应变大小并不一样;
2、应变片所粘贴的位置并不一定对称;
3、重物所挂在应变钢尺的位置会直接影响电子秤的输出,这是由于杠杆原理的关系;
4、设计电子秤时其中需要用到的器件是模数转换元件,把输入的模拟信号转换成数字信号时所带来的量化误差也在一定程度上影响电子秤的输出;
5、测量开始时需要进行调零,调节电位器使到电桥测量电路的输出为零,再调节相关的电位器调节差动放大器的放大倍数,可能是两个电位器的调节并不理想,才使得输出发生偏差。
由于测得实验电压数据太过于小,需经过放大器放大十倍后才能更准确的被A/D采集,进行数据处理。所得拟合曲线如下图所示:
3.2.2曲线拟合及参数整定
经MATLAB软件编程,得拟合函数为:
(
(其中a1= -68.5907 , a0= 3.22476 )
数据处理过程是对A/D转换结果的数字量的处理,即
数据采集由芯片来完成,主要分为启动、读取数据、延时等待转换结束、读出转换结果、存入指定内存单元、继续转换(退出)几个步骤。初始化后,就具有了将某一通道输入的0~5V模拟信号转换成对应的数字量00H—FFH,然后再存入8051内部RAM的指定单元中。其转换方式可以采用程序查询方式,延时等待方式和中断方式三种。本设计采用的是延时等待方式,具体程序流程图如图14所示。
加上a0
乘以a1
图14 A/D接口设计流程图
3.3 显示子程序的设计
显示程序是用来实时显示所测质量值,该部分程序是将显缓单元数据进行实时显示。
总结
随着集成电路和计算机技术的迅速发展,使电子仪器的整体水平发生巨大变化,传统的仪 器逐步的被智能仪器所取代。智能仪器的核心部件是单片机,因其极高的性价比得到广泛的应 用与发展,从而加快了智能仪器的发展。而传感器作为测控系统中对象信息的入口,越来越受 到人们的关注。传感器好比人体“五官”的工程模拟物,它是一种能将特定的被测量信息(物理 量、化学量、生物量等)按一定规律转换成某种可用信号输出的器件或装置本次设计中的电阻应变片电子称就是在以上仪器的基础上设计而成的。因此,只有充分了解有关智能仪器、单片机、传感器以及各部分之间的关系才能达到要求。 经过几周的努力,终于按照设计进度要求如期完成了电子秤系统的设计任务。在做课程设计的过程中,虽然碰到了不少的困难,但是在老师的指导以及共同的努力下,终于取得了一定成果。
在此次课程设计中,虽然顺利完成了电子称的设计和制作,但也存在一定的不足,如电子称的的精度不够高。同时也有很多的收获,对电阻式应变片的工作原理及性能指标有了更加直观和深入的认识。通过对数据采集的分析, 放大器及 A/D 转换器对信号的转换、传输和处理有了更深的认识。熟悉 单片机功能及工作特性,掌握其接口扩展方法。这些都为我今后学习和工作留下了积极的影响。
参考文献
[1] 杨新荣.《智能仪器原理、设计与发展》.中南大学出版社,2003
[2] 张毅刚.MCS-51单片机应用设计.哈尔滨:哈尔滨工业大学出版社,2003
[3] 贾伯年,俞朴.传感器技术.南京:东南大学出版社,2000
[4] 徐仁贵等.《单片微型计算机应用技术》.机械工业出版社,2001
[5] 李道华,李玲,朱艳.传感器电路分析与设计.武汉大学出版社,2000
[6] 李刚,林凌,姜苇.单片机系统设计与应用技巧.北京航空航天大学出版社,2004
附录1程序
##include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//#define delayNOP();{_nop_();_nop_();_nop_();_nop_();};
#define RATIO 6797/1000
volatile bit FlagTest = 0;
int Counter;
ulong idata FullScale; //满量程AD值/1000
ulong AdVal; //AD采样值
ulong weight; //重量值,单位g
uchar DotPos; //小数点标志及位置
#define data_1602 P0
sbit rs=P2^5;
sbit rw=P2^6;
sbit e =P2^7;
void Timer0_Init();
void Timer0_ISR () ;
void INT1_Init();
void To_Zero();
void Display_Weight();
void lcd_pos(uchar hang,uchar add);
void write_com(uchar com);
void write_data(uchar dat);
unsigned long readcount(void);
void To_Zero()
{
FullScale=readcount()/1000;
}
//显示重量,单位kg,两位整数,三位小数
void Display_Weight()
{
uint i,j;
uchar A1,A2;
uchar B1,B2,B3;
i = weight/1000; //得到整数部分
j = weight - i*1000;//得到小数部分
A1=i/10+48;
A2=i%10+48;
B1=j/100+48;
B2=j%100/10+48;
B3=j%100%10+48;
// int2str(i,str1);
if (i>=10)
{
}
else
{
lcd_pos(2,3);
write_data(' ');
write_data(A2);
}
// int2str(j,str1);
if (j<10)
{
lcd_pos(2,5);
write_data('.');
write_data('0');
write_data('0');
write_data(B3);
}
else if (j<100)
{
lcd_pos(2,5);
write_data('.');
write_data('0');
write_data(B2);
write_data(B3);
}
else
{
lcd_pos(2,5);
write_data('.');
write_data(B1);
write_data(B2);
write_data(B3);
}
}
/**********参考驱动程序**********/
sbit ADDO=P1^4;
sbit ADSK=P1^5;
unsigned long readcount(void)
{
unsigned long count;
unsigned char i;
ADDO=1;
ADSK=0; //使能AD(PD_SCK置低)
count=0;
while(ADDO); //AD转换未结束则等待,结束则开始读取
for(i=0;i<24;i++)
{
ADSK=1; //PD_SCK置高(发送脉冲)
count=count<<1; //下降沿来时左移一位,右侧补零
ADSK=0;
if(ADDO)count++;
}
ADSK=1;
count=count^0x800000;//第25个脉冲下降沿来时,转换数据
ADSK=0;
return(count);
}
/***********************延时函数************************/
void delay_uint(uint q) //q=1,延时10uS
{
while(q--);
}
/***********************lcd1602写命令函数************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************lcd1602写数据函数************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************lcd1602初始化设置************************/
void init_1602() //lcd1602初始化设置
{
write_com(0x38); //显示模式设置,16X2显示,5X7点阵,8位数据并口
write_com(0x0c); //开显示,不显示光标,光标闪烁开
write_com(0x06); //读写一个字符后,指针自动加一,整屏显示不移动
//清屏指令 write_com(0x01);
}
/************1602weizhi******************/
void lcd_pos(uchar hang,uchar add)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
}
//定时器0初始化
void Timer0_Init()
{
ET0 = 1; //允许定时器0中断
TMOD = 1; //定时器工作方式选择
TL0 = 0x06;
TH0 = 0xf8; //定时器赋予初值
TR0 = 1; //启动定时器
}
//定时器0中断
void Timer0_ISR (void) interrupt 1 using 0
{
TL0 = 0x06;
TH0 = 0xf8; //定时器赋予初值
//每0.5秒钟刷新重量
Counter ++;
if (Counter >= 200)
{
FlagTest = 1;
Counter = 0;
}
}
void main()
{
init_1602();
write_com(0x01);
EA = 0;
Timer0_Init();
EA = 1;
write_com(0x01); //clear all dots
To_Zero();
lcd_pos(2,10);
write_data('k');
write_data('g');
while(1)
{
//每0.5秒称重一次
if (FlagTest==1)
{
//称重,得到重量值weight,单位为g
AdVal=readcount();
weight=FullScale-AdVal/1000;
if (weight>0x8000) weight=0;
weight=10000*weight/FullScale;
weight=weight*RATIO;
if (weight >= 10000)
{
}
//如果不超量程
else
{
//显示重量值
Display_Weight();
//清测试标志
FlagTest = 0;
}
}
}
}
20
展开阅读全文