三电阻式传感器接口电路的设计.docx
- 文档编号:30755861
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:20
- 大小:861.95KB
三电阻式传感器接口电路的设计.docx
《三电阻式传感器接口电路的设计.docx》由会员分享,可在线阅读,更多相关《三电阻式传感器接口电路的设计.docx(20页珍藏版)》请在冰豆网上搜索。
三电阻式传感器接口电路的设计
实验三电阻式传感器的仿真与接口电路设计
首先介绍一款应变片传感器YZC-1B称重传感器。
它的主要参数见下表。
额定载荷:
3,5,8,10,15,20,25,30,35,40,45kg
绝缘电阻:
≥5000MΩ
工作温度范围:
-40~+80℃
灵敏度:
2.0±0.002mv/v
安全过载:
150%F.S
综合误差:
±0.02%F.S
极限过载:
200%F.S
蠕变:
±0.02%F.S
推荐激励电压:
10~12V(DC)
零点平衡:
±1%F.S
最大激励电压:
15V
零点温度影响:
±0.02%F.S/10℃
密封等级:
IP67
输出温度影响:
±0.02%F.S/10℃
材质:
铝合金
输入电阻:
405±5Ω
电缆:
线长:
0.3~3m;直径:
¢4mm
输出电阻:
350±3Ω
输入+:
红;输入-:
黑;
输出+:
绿;输出-:
白
这种传感器主要的应用领域是电子计价秤、计重秤等小台面电子秤。
它的外观是这样的。
这个实验里首先对这样一款传感器进行仿真,然后设计一个接口电路,使其具有测量压力(重量)的功能。
电阻应变片的工作原理基于电阻应变效应,即在导体产生机械变形时,它的电阻值相应发生变化。
应变片是由金属导体或半导体制成的电阻体,其阻值随着压力的变化而变化。
对于金属导体,导体变化率△R/R的表达式为:
△R/R≈(1+2μ)ε
式中μ为材料的泊松系数;ε为应变量。
通常把单位应变所引起电阻值相对变化称作电阻丝的灵敏系数。
对于金属导体,其表达式为:
K0=△R/R=(1+2μ)
所以△R/R=K0ε。
在外力作用下,应变片产生变化,同时应变片电阻也发生相应变化。
当测得阻值变化为ΔR时,可得到应变值ε,根据应力与应变关系,得到应力值为:
σ=Eε
式中:
σ为应力;ε为应变量(为轴向应变);E为材料的弹性模量(kg/mm2)。
又知,重力G与应力σ的关系为G=㎎=σs。
式中:
G为重力;S为应变片截面积。
根据以上各式可得到:
ΔR/R=K0mg/ES。
由此便得出应变片电阻值变化与物体质量的关系,即ΔR=RK0mg/ES。
根据应变片的材料,取K0=2,E=16300kg∕mm2,s=100mm2,R=350Ω,g=9.8m∕s,ΔR=[(2×9.8×348)∕(16300×100)]m。
最终确定电阻变化与质量的对应关系为:
ΔR=4.185×10-3m
下面用multisim10建立一个包含有传感器和放大电路在内的电路原理图,来进行输入输出的仿真。
原理图如下。
在这个电路里采用了恒流源对传感器电桥的激励。
适用四个350Ω的电阻来代替传感器上的四个应变片。
当没有外界压力的时候,传感器四个应变片不产生应变而保持原来的阻值,因此电桥平衡,输出为0。
当传感器感知压力的时候,对角线的电阻阻值将发生相应的变化,因此破坏了电桥臂的平衡,有电压输出。
但输出电压值很小。
于是在后面连接了两级放大电路。
电路中有四个滑动变阻器分别是R13,R5,R10,R12。
其中R13和R5用于电路的调零,R10和R12用于调整电路的放大倍数。
首先将放大电路两端接地调零。
假定传感器在重物的压力下发生了应变,按照前面计算的关系ΔR=4.185×10-3m,在受到30kg的重物的压力时,它的ΔR应为0.125Ω。
于是调整电桥上的电阻的阻值为350.125Ω,350.125Ω,349.875Ω,349.875Ω。
此时,为了使输出电压与输入的重量成对应关系,可调整滑动变阻器R10和R12使输入30kg时输出3V。
然后观测各表的显示并记录下来。
可见,此时恒流源输出6.779mA电流,电桥输出874.434μV的电压,放大输出后的电压是2.999V。
当传感器受到20kg的重物压力时,相应的电阻变化ΔR时0.084Ω。
相应的输出是1.937V。
这样再进行10kg、40kg、50kg情况下的仿真。
记录在表格里。
重量(kg)
10
20
30
40
50
ΔR(Ω)
0.042
0.084
0.125
0.167
0.209
电桥输出μV
284.737
571.183
847.434
1132
1417
放大后输出V
0.836
1.937
2.999
4.093
5.187
仿真结果并不理想。
接下来讲输出的电压经过A/D转换输入单片机并仿真。
在proteuse中建立原理图。
◀放大器输出
A/D转换电路▶
单片机▶
图中的恒流源、传感器电桥、放大电路已在前文出现,接下来是A/D转换、单片机处理和液晶显示。
A/D转换采用ADC0809(仿真中用ADC0808),单片机采用89C51。
在Keil4中编写代码编译并生成.hex文件(代码在附录2中)。
双击图中的AT89C51加载.hex文件,查看仿真结果。
在液晶屏幕上显示出了电压(或者说物体的重量)。
下图是这次实验的完整电路。
接下来是由protel99SE再绘制原理图,形成PCB版图,并焊电路板。
附录1:
元器件一览表
名称
数量
名称
数量
附录2:
//--------------include.h-----------------
#ifndef__INCLUDES_H__
#define__INCLUDES_H__
#include
#include"SMC1602.h"
#include"DATransform.h"
#endif
//--------------main.c--------------------
#include"includes.h"
#defineTIME0H0x3C
#defineTIME0L0xB0
//全局变量
unsignedcharuc_Clock=0;//定时器0中断计数
bitb_DATransform=0;
//LCD上显示电压
voidvShowNum(unsignedintuiNumber)
{
unsignedcharucaNumber[3],ucCount;
if(uiNumber>999)
uiNumber=999;
ucaNumber[0]=uiNumber/100;//把计算数字的每个位存入数组。
ucaNumber[1]=(uiNumber-100*(int)ucaNumber[0])/10;
ucaNumber[2]=uiNumber-100*(int)ucaNumber[0]-10*ucaNumber[1];
for(ucCount=0;ucCount<3;ucCount++)
{
vShowOneChar(ucaNumber[ucCount]+48);//从首位到末位逐一输出。
//if(ucCount==0)
//vShowOneChar('.');
}
}
voiddelay(unsignedchara)
{
unsignedchari;
while(a--)
for(i=100;i>0;i--);
}
voidmain()
{
//charkey_pre=0,key_cur=0;
charweight;
//设置定时器0
TMOD=0x01;//定时器0,模式1。
TH0=TIME0H;
TL0=TIME0L;
TR0=1;//启动定时器。
ET0=1;//开定时器中断。
EA=1;//开总中断
vdInitialize();
vWriteCMD(0x00);
vShowChar("");
while
(1)
{
vWriteCMD(0xC0);
vShowChar("xiexieDUlaoshi");
while(b_DATransform!
=1);
b_DATransform=0;
while((weight=uiADTransform())==0);
vWriteCMD(0x88);
//vShowNum("");
vShowNum(weight);
vShowChar("kg");
vWriteCMD(0xC0);
delay(250);
delay(250);
delay(250);
delay(250);
vdCleanLCD();
}
}
//定时器0中断函数
voidTime0()interrupt1
{
if(uc_Clock==0)
{
uc_Clock=5;
b_DATransform=1;
}
else
uc_Clock--;
TH0=TIME0H;//恢复定时器0。
TL0=TIME0L;
}
//-------------DATransform.h-------------
#ifndef__DATRANSFORM_H__
#define__DATRANSFORM_H__
unsignedintuiADTransform();
#endif
//-------------SMC1602.h-----------------
#ifndef__SMC1602_H__
#define__SMC1602_H__
#include
//LCD设置函数
#definevdInitialize()vWriteCMD(0x01);vWriteCMD(0x38);vWriteCMD(0x0C);vWriteCMD(0x0F);//初始化
#definevdCleanLCD()vWriteCMD(0x01);//清屏
//#definevdSetShowMode()vWriteCMD(0x38);//显示模式设置:
8位2行5x7点阵
//#definevdSetInput()vWriteCMD(0x0C);//文字不动,光标自动右移
//vWriteCMD(0x0F);//显示器开、光标开、闪烁开
//端口设置宏定义
#defineLCDRSP3_5//寄存器选择信号:
//0--数据寄存器;
//1--指令寄存器。
#defineLCDRWP3_6//读写信号:
//1--读LCD;
//0--写LCD。
#defineLCDEP3_7//片选信号,当输入下降沿信号时,
//执行指令或传送数据。
#defineLCDPORTP0//LCD数据接口。
//写数据命令函数
voidvDelay();//延时函数。
voidvWriteCMD(unsignedcharucCommand);//把1个命令写入LCD。
voidvWriteData(unsignedcharucData);//把1个数据写入LCD。
voidvShowOneChar(unsignedcharucChar);
voidvShowChar(unsignedcharucaChar[]);
#endif
//-----------------DATransform.c---------------------
//AD转换函数
#include
#defineSTARTP3_4//ATART,ALE接口。
0->1->0:
启动AD转换。
#defineEOCP3_3//转换完毕由0变1.
#defineOUTPORTP2
//AD转换函数,返回转换结果。
//转换结果是3位数,小数点在百位与十位之间。
unsignedintuiADTransform()
{
unsignedintuiResult;
START=1;//启动AD转换。
START=0;
while(EOC==0);//等待转换结束。
uiResult=OUTPORT;//出入转换结果。
uiResult=(100*uiResult)/51;//处理运算结果。
returnuiResult;
}
//------------------------SMC1602.c(SMC1602驱动程序)-------------------
#include"SMC1602.h"
//把1个命令写入LCD
voidvWriteCMD(unsignedcharucCommand)
{
vDelay();//先延时。
LCDE=1;//然后把LCD改为写入命令状态。
LCDRS=0;
LCDRW=0;
LCDPORT=ucCommand;//再输出命令。
LCDE=0;//最后执行命令。
}
//把1个数据写入LCD
voidvWriteData(unsignedcharucData)
{
vDelay();//先延时。
LCDE=1;//然后把LCD改为写入数据状态。
LCDRS=1;
LCDRW=0;
LCDPORT=ucData;//再输出数据。
LCDE=0;//最后显示数据。
}
voidvShowOneChar(unsignedcharucChar)
{
switch(ucChar)
{
case'':
vWriteData(0x20);break;
case'!
':
vWriteData(0x21);break;
case'"':
vWriteData(0x22);break;
case'#':
vWriteData(0x23);break;
case'$':
vWriteData(0x24);break;
case'%':
vWriteData(0x25);break;
case'&':
vWriteData(0x26);break;
case'>':
vWriteData(0x27);break;
case'(':
vWriteData(0x28);break;
case')':
vWriteData(0x29);break;
case'*':
vWriteData(0x20);break;
case'+':
vWriteData(0x2A);break;
case'-':
vWriteData(0x2D);break;
case'/':
vWriteData(0x2F);break;
case'=':
vWriteData(0x3D);break;
case'<':
vWriteData(0x3E);break;
case'?
':
vWriteData(0x3F);break;
case'.':
vWriteData(0x2E);break;
case':
':
vWriteData(0x3A);break;
case'0':
vWriteData(0x30);break;
case'1':
vWriteData(0x31);break;
case'2':
vWriteData(0x32);break;
case'3':
vWriteData(0x33);break;
case'4':
vWriteData(0x34);break;
case'5':
vWriteData(0x35);break;
case'6':
vWriteData(0x36);break;
case'7':
vWriteData(0x37);break;
case'8':
vWriteData(0x38);break;
case'9':
vWriteData(0x39);break;
case'A':
vWriteData(0x41);break;
case'B':
vWriteData(0x42);break;
case'C':
vWriteData(0x43);break;
case'D':
vWriteData(0x44);break;
case'E':
vWriteData(0x45);break;
case'F':
vWriteData(0x46);break;
case'G':
vWriteData(0x47);break;
case'H':
vWriteData(0x48);break;
case'I':
vWriteData(0x49);break;
case'J':
vWriteData(0x4A);break;
case'K':
vWriteData(0x4B);break;
case'L':
vWriteData(0x4C);break;
case'M':
vWriteData(0x4D);break;
case'N':
vWriteData(0x4E);break;
case'O':
vWriteData(0x4F);break;
case'P':
vWriteData(0x50);break;
case'Q':
vWriteData(0x51);break;
case'R':
vWriteData(0x52);break;
case'S':
vWriteData(0x53);break;
case'T':
vWriteData(0x54);break;
case'U':
vWriteData(0x55);break;
case'V':
vWriteData(0x56);break;
case'W':
vWriteData(0x57);break;
case'X':
vWriteData(0x58);break;
case'Y':
vWriteData(0x59);break;
case'Z':
vWriteData(0x5A);break;
case'a':
vWriteData(0x61);break;
case'b':
vWriteData(0x62);break;
case'c':
vWriteData(0x63);break;
case'd':
vWriteData(0x64);break;
case'e':
vWriteData(0x65);break;
case'f':
vWriteData(0x66);break;
case'g':
vWriteData(0x67);break;
case'h':
vWriteData(0x68);break;
case'i':
vWriteData(0x69);break;
case'j':
vWriteData(0x6A);break;
case'k':
vWriteData(0x6B);break;
case'l':
vWriteData(0x6C);break;
case'm':
vWriteData(0x6D);break;
case'n':
vWriteData(0x6E);break;
case'o':
vWriteData(0x6F);break;
case'p':
vWriteData(0x70);break;
case'q':
vWriteData(0x71);break;
case'r':
vWriteData(0x72);break;
case's':
vWriteData(0x73);break;
case't':
vWriteData(0x74);break;
case'u':
vWriteData(0x75);break;
case'v':
vWriteData(0x76);break;
case'w':
vWriteData(0x77);break;
case'x':
vWriteData(0x78);break;
case'y':
vWriteData(0x79);break;
case'z':
vWriteData(0x7A);break;
default:
break;
}
}
voidvShowChar(unsignedcharucaChar[])
{
unsignedcharucCount;
for(ucCount=0;;ucCount++)
{
vShowOneChar(ucaChar[ucCount]);
if(ucaChar[ucCount+1]=='\0')
break;
}
}
//延时函数
voidvDelay()
{
unsignedintuiCount;
for(uiCount=0;uiCount<250;uiCount++);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电阻 传感器 接口 电路 设计