基于单片机的数字电容测量仪

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子技术实验报告
设计课题基于单片机的数字式电容仪设计
学院信科院
姓名陈见峰
学号 10
专业班级电信10-1 指导教师蒋存波
设计时间
【摘要】随着科技的不断发展,人类的不断进步,在电子技术领域的发展可谓突飞猛进,然而电容器在电子线路中得到广泛的应用,它的容量大小对电路的性能有着重要的作用。

因此,电容量的测量在日常使用中就不可避免。

本设计详细介绍了一种基于单片机的数字式电容测量仪设计方案及实现方法。

设计的主要方法是采用555芯片构成单稳态触发器,将电容容量转换为脉冲宽度。

通过单片机的计时器测量脉宽, 根据已知的R值,通过单片机的运算功能,计算出电容容量,最后,再通过单片机的普通I/O口控制液晶屏显示出电容容量的计算结果。

系统的测量范围为10pF~ 500uF, 具有多个量程,可根据用户需要由用户选择,与用户的交互是通过键盘实现,不同量程的实现是通过单片机的I/O口控制继电器的吸合与断开来选择不同的R值,从而实现不同的量程。

同时,本设计注重设计方法及流程,首先根据原理设计电路,再通过protues仿真,利用keil 编程,进而借助altium designer 制作PCB,最后到焊接元器件,调试直至成功。

【关键词】电容测量; 脉冲宽度; 单稳态触发器; 单片机; lcd显示
目录
1 系统方案设计
设计说明及要求
设计说明
框图中的外接电容是定时电路中的一部分。

当外接电容的容量不同时,与定时电路所对应的时间也有所不同,即C=f(t),而时间与脉冲数目成正比,脉冲数目可以通过计数译码获得。

设计要求
(1)基本要求 ① 自制稳压电源。

② 被测电容的容量在10pF 至10000μF 范围内 ③ 设计四个的测量量程。

④ 显示测量结果,测量误差小于%。

数字显示:显示分辨率:每档满量程的%; 电容测量:电压可选择5V ,25V ,50V ;
为实现该设计,达到相应的设计要求,本次设计中考虑了三种设计方案,三种设计方案中主要区别在于硬件电路和软件设计的不同,对于本设计,三种方案均能够实现,最后根据设计要求、可行性和设计成本的考虑选择了基于STC89C52单片机和555芯片构成的单稳态触发电路测量电容的方案。

现在一一介绍论证如下。

方案Ⅰ
如果三角波输入给以被测电容器作为微分电容的微分电路,在电路参数选择适当的条件下,微分电路的输出幅度与C x 成正比,再经峰值检测电路或精密整流及滤波电路,可以得到与C x 成正比的直流电压U x ,然后再进行A/D 转换送给数字显示器,便可实现所要求的函数关系。

(电路如图1—1所示)
设三角波函数式为:
U I =K t (0 ≤t<t1) U I =-K t (t1≤t<t2)
因为 dt
dUi
C i =x
R i U x O -=
所以 CKR U O -= (0 ≤t<t1)
CKR U O = (t1≤t<t2)
图1-1 方案Ⅰ电容测量框图
方案Ⅱ
根据积分电路原理可得C=Ui*dt/R*Uo,将经过RC充电电路后,输出的与电容对应的电压值输入到ADC0809中,经过处理后,将相应的数值传到单片机里,再通过公式运算,求得相应的电容C值,在LCD上显示。

图1-2 方案Ⅱ电容测量框图
方案Ⅲ
单稳态触发器接收单片机的窄脉冲触发信号Trig, 输出一个脉冲宽度与待测电容CX 的容量成正比的信号VO。

单片机通过检测VO 高电平持续时间来计算电容大小, 并将结果显示在液晶屏上。

测量过程中, 通过控制单稳态触发器的充电电阻阻值, 实现10pF~ 500uF 范围内电容的测量。

(电路如图1 - 3所示)
图1-3 方案Ⅲ电容测量框图
三种方案作简单的比较
比较上述三种方案可知,方案Ⅰ和ⅠⅠ采用了A/D转换器,价格比较昂贵;而且根据公式可知,再换算电压与电容值时,时间参数t起着至关重要的作用,对t的计算要精确,不然误差值会很大,所以调试起来有一定难度;方案Ⅲ电路简单,原理清晰,易于实现,易于控制,本设计就是基于方案Ⅲ展开的。

2 单元电路设计
工作原理
系统测量的电路原理图如图2-1 所示。

电路主要由单片机U1、NE555 定时芯片U2 和检测电容C X 组成。

NE555 定时器芯片的6 脚与7 脚相连, 与电阻R和待测电容C X 组成单稳态触发电路。

图2-1 系统测量原理图
由图2-1可知, NE555 定时器内部主要由电阻分压器、电压比较器OP1 ~ OP2 、与非门G1 ~ G3、输出缓冲反相器G 4 和集电极开路的三极管T 组成。

G1、G 2 构成基本RS 锁存器。

电阻R1 和电容C1 构成NE555 定时器的上电自动复位电路。

复位之后, G3的输出为高电平, 三极管T 处于饱和状态, 待测电容C X 被短路。

单片机P37 引脚在上电时的默认电平是高电平。

可见, 上电复位后, 比较器OP1、OP2 的输出为高电平, R = S = 1, RS 触发器处于保持状态, 单稳态触发器输出稳态0。

系统需要测量时, 单片机的P37 引脚上输出负向窄脉冲V TR 控制单稳态触发器进入暂态, 即可实现一次测量。

工作时序图如图2-2 所示。

V TR 电平变低后, 比较器OP 2 的输出为
低电平。

此时, S = 0, R =1, RS 触发器处于置1 状态, 单稳态触发器进入了暂态1。

G3 输出的低电平使三极管T 截至, 电源通过电阻R 开始对待测电容充电, 如图2-2 的V CX 波形所示。

当V CX 上升到电源电压的三分之二后, 比较器OP1翻转, 使得R = 0。

由于V TR 的脉冲宽度为T1 , 在V CX升到三分之二电源电压前已经拉高。

此时, R = 0, S= 1, 单稳态触发器的暂态1 结束, 返回到稳态0, 暂态的持续时间为T W , 如图2-2 的V O 波形所示。

在暂态期间, 如果V TR 的低电平宽度变为T2 , V CX 到达翻转点后还没有变高, 基本RS 触发器就会进入到R = 0,S = 0的禁止状态, 输出V O 的波形无法预测, 测量出错误结果。

因此, 要保证T1 < T W 。

图2-2 工作时序图
根据RC 暂态电路理论可知, T W 的时间宽度计算公式为:
T W = ln3RC X = 1. 1RC X
由该公式可知,单稳态的暂态1 持续时间与待测电容C X 的容量成正比。

把输出信号V O 送到单片机的INT0 引脚,控制定时器0 计算出暂态1 期间的标准时钟个数, 就可实现脉冲宽度测量, 从而计算出电容容量。

硬件电路设计
2.2.1 单片机电路设计
为使单片机正常工作,除电源供电部分外,还需提供晶振电路和复位电路。

具体电路如下:
图2-3 单片机工作电路
由图2-3可知,9脚外接的是按键复位电路,18,19脚外接的是晶振电路,这样,就构成了单片机正常工作的必备电路。

同时,为使P0口正常工作,并增加其带负载能力,P0口需接了上拉电阻(在图中未画出)。

2.2.2 555时钟芯片与单片机连接
图2-4是555时钟芯片构成的单稳态触发电路,6脚和7脚接在一起,R2和C4构成商店复位电路,2脚用于接收单片机口产生的低脉冲,3脚接于脚,用于门控制计时器0的启动与停止。

从而将电容容量转为脉冲宽度。

2.2.3 低脉冲产生电路
如图2-5所示,按键接于口,即外部中断1接口,因此低脉冲是利用中断实现的,口产生低脉冲,可在软件中的外部中断1函数中实现,整个过程为,需要测量时,按键,产生外部中断,利用外部中断,用软件再在口产生一个低脉冲,之所以利用中断实现该功能,是为了增加产品的可靠性,因为按键的时间是比较长的,直接用按键产生低脉冲可能导致T1 > Tw ,导致测量错误。

而利用中断,可以直接在中断函数中产生一个固定时间的低脉冲,保证了测量条件,避免发生错误。

图2-5 按键产生低脉冲电路
2.2.4 键盘电路
如图2-6所示键盘电路主要用于与用户进行交互,如用户需要选择量程时,就必须交互。

键盘分为独立键盘和矩阵键盘,这里只需要实现量程的选择,共四个量程,故无需矩阵键盘,4个独立按键就完全够用了。

图2-6 键盘电路
2.2.5 指示灯电路
如图2-7所示,指示灯主要用于给用户以提示,如当前量程提示,超量程提示等等。

D2用于超量程提示,D6用于电源提示。

图2-7 指示灯电路
2.2.6 量程选择电路
在图2-4中可以看到,在RC充电回路中,R值是固定的,不可变的,那么量程也显然是不可变的,因此,需要在此加入可调节充电回路电阻的电路部分,这里,利用继电器可以简单实现。

具体电路如图2-8所示,利用继电器时需特别注意,由于单片机输出电流是很小的,不足以驱动继电器吸合,因此要加驱动电路,在这里,选择ULN2003芯片来实现。

当然,也可以利用典型的三极管驱动来实现,虽然选择的是芯片实现驱动,在这里也将典型的三极管驱动电路列于此。

如图2-9所示。

图2-8 实现量程选择电路
2.2.7 液晶显示电路
至此,整个电容测量仪的硬件设计部分就设计好了,接下来,需要的就是与之相匹配的软件支持了。

软件设计
软件编程平台选择最常用的keil软件。

由于该程序并未涉及到底层的驱动问题,因此选择方便快捷的C语言编程。

在编程中,将该程序分为三个模块:延时模块,1602显示模块及主函数模块。

方便调试与理解。

具体程序见附录二。

总体程序较长,但并不复杂,可根据需要重点看主函数,与硬件电路结合起来,注重程序后紧跟的注释,理解起来是比较容易的,在此就不再一一详细分析。

量程范围设置
由于量程的选择是非常重要的一个环节,在这里单独讨论量程的选择。

系统采用单片机片内16 位的定时器测量T W 的宽度, 标准计数脉冲的周期为1 微秒时,
为确保计数器不发生溢出, 要求T W < 65 毫秒。

同时, 为减小量化误差对结果的影响, 要求T W > 1 微秒。

当T W >100 微秒以上时, 可忽略量化误差的影响。

为满足10pF ~ 500uF 的测量范围, 可通过设置不同充电电阻R 的阻值来实现。

理论计算的电阻R 阻值、理论量程范围以及系统选择的量程范围如表2-1 所示。

系统分为四个量程, 可测量10pF ~ 500uF 的电容。

表2-1 R值与量程范围的关系
altium designer 原理图设计及PCB制作
2.4.1 原理图设计
图2-11 原理图设计
2.4.2PCB制作
图2-12 PCB设计在此并没有布双层板,红色的线仅仅只是为了标志出跳线。

2.4.3设计结果
图2-13 设计结果实物图
各个按键功能如图中文字说明。

3系统测试
由于该作品需实现的功能仅为测电容,在此不列出其他的测试。

测量100pf的电容
在此以100pf电容测试为例,演示整个测试过程。

测试标称值为101的电容,即测量电容值为100pf的电容。

104的电容实物如图2-14所示。

测试结果如图2-15所示。

若量程选择错误,测试结果如图2-16所示。

图2-14 100nf的电容实物
图2-15 2nf电容正常测试
图2-16 量程错误情况下的测试
测量的电容
再以测试电容为例,测试结果如图2-18所示。

图2-18 测试的电容
测试结果
将测量的一系列电容的电容值与标准值比较。

比较结果如表3-1。

表3-1 测量值与标准值比较
标准值测量值误差100pf 1%
2nf 2nf 0%
0%
100uf 1%
由表3-1中数据可知,平均误差是%,低于设计扩展要求的%,测量范围是10pf~500uf,基本满足设计要求的10pf~10000uf。

测量结果由液晶直观显示。

综合以上分析,该设计满足整体设计要求。

误差分析
由于产生的%左右的误差,在这里简要分析一下误差产生的原因。

电容测量的误差主要由NE555 定时器构成的单稳态触发电路的非线性误差T 、计数器的量化误差??N 和标准计数脉冲的频率偏移T C 产生[2] [ 3] 。

因此有:
系统采用的标准计数脉冲来自单片机内核时钟, 由片外的高精度晶振与片内电路自激振荡产生,频率非常稳定, 可以忽略其频偏对测量结果的影响。

量化误差??N 是数字电路的特有误差, 最坏的情况下等于1。

如采用12M 的晶振, 可获得1MHz 的标准计数脉冲, 量化产生的最大误差为1 微秒。

通过设置充电电阻R 的阻值, 使TW 达到毫秒级时, 量化误差的影响非常小, 可以忽略。

非线性误差是由器件的非线性特性产生的, 可通过硬件参数修正和软件算法补偿来减小。

4 结论与心得体会
经过本次历经4周的实习,使得我又进一步对单片机系统,尤其测量电容的电路系统有了深一步认识。

在做前期准备工作时,老师不希望我们用555芯片做这个实验,因为如果
是555芯片震荡电路来测量的话,虽然制作原理简单,但测量值会很不稳定,测范围也不够广。

可出于坚信化繁为简的信念,在没做过实物的情况下,我们还是硬着头皮还是想验证下事实是不是如此(如果不成功再改换方案)。

起初查阅了很多资料,比如伏安法中的自由轴法制作测量电容电路,LC震荡侧电容电路等,老师也推荐了方案二中的积分法测量电路,但因为在进行理论计算时,因为积分测容法中C=Ui*dt/Uo*R,而我们无法精确确定ADC在输出口的传输时间(哪怕是几十us),所以有种无法掌控误差的感觉,再加上出于成本考虑,所以没有首选这种方法。

而对于利用555芯片单稳态触发这种法案的分析,我则很相信,这个电路是可以实现测量功能的,并且只要输出稳定,我就可以做相应补偿。

在经过一系列的仿真,实物制造和调整后,最初做出来的板子并不能运行的,后面反复彻查后,才发现原来自己的设计出现了差漏,少连或错连了一些关键线路,于是又重新修整过。

经过修正后的电路中终于可以开始进行测量了,起初的测量只有在nf档和10uf以下档位下,测量值是基本满足要求的,而PF裆和100uf以上的档位并不满足已要求的,甚至不够稳定,所以我开始将挡位缩小,将10pf~10000uf的要求,缩减为100Pf~500uf,果然修正后的电路,测量稳定了。

再经过软件补偿后,最终获得了在精度上可以满足要求的方案。

(Ps:因为最初设计的时候只选择了4个挡位,而手上电容最大才470uf,出于“最稳定测量”的考虑,所以才改的100pf~500uf挡位。

即:本方案也可能可以测量500uf以上的电容,只要将其中的100欧姆电阻改小即可。


5 参考文献
【1】《单片机基础》第三版李广弟朱月秀冷祖祁编着北京航天大学出版社,2007 【2】《数字式电容测量仪设计》张玉芹, 洪远泉廊坊师范学院学报(自然科学版) 2011 年6 月第11 卷第3 期
【3】梁艳霞,基于单片机控制的电容测试仪设计,总裁,2009.
【4】徐思成,一种基于单品啊及只能电容测试仪的设计与实现,现代电子技术,2010 【5】陶春明,单片机使用技术,北京:人民邮电出版社,2008
【6】何立民,单片机应用程序设计,北京:北京航空航天大学出版社。

【7】陈世良,吴凌燕,丁国臣,基于AT89C2051单片机的数字电容表设计,2009
【8】童诗白,华成英,模拟电子技术基础第三版,北京,高等教育出版社,2007
【9】熊筱芳,郭学提,基本89C51单片机的数字电容表设计,自动化应用技术,2008 【10】何光明,杨健宇,C语言程序设计与应用开发,北京:清华大学出版社,2006.
6 附录
附录1 元器件清单
(1)晶振12M一个
(2)stc89c52芯片一片
(3)30pf 2个;10uf 1个;470uf 1个; 2个; 1个;1nf 1个
(4)40脚活动底座一个
(5)lcd液晶一个
(6)按键6个
(7)发光二极管6个
(8)9引脚排阻 1个
(9)680Ω 6个;10k 1个;1k 2个;1k滑动变阻器 1个;10M 1个;100k 1个;100Ω 1个;2k 1个;200Ω 1个;
(10)开关1个
(11)整流桥1个
(12)7805稳压芯片1片
(13)继电器 3个
(14) ULN2003 1片
(10)排针若干,杜邦线若干
附录2 程序清单
分5个文件:,,,,
(a) 程序清单:
#ifndef __delay_h__
#define __delay_h__
#define uchar unsigned char
#define uint unsigned int
void delay_us(uint cnt);
void delay_ms(uint cnt);
#endif
(b) 程序清单:
#include ""
void delay_us(uint cnt)
{
uchar i;
for(;cnt>0;cnt--)
{
for(i=0;i<12;i++)
{
;
}
}
}
void delay_ms(uint cnt){
uchar i;
for(;cnt>0;cnt--)
{
for(i=0;i<125;i++)
{
;
}
}
}
(c) 程序清单:
#ifndef __1602_h__
#define __1602_h__
#include<>
sbit RS = P2^2; 免tw的值被更//改即不需要测量时,一
直保持
EX1 = 1; // 开外部中断1
}
else // 反之,证明没有计数,无电容,默认值tw置0
{
tw = 0;
}
}
ftemp = tw / ; // 计算电容值根据公式tw = * R * C
c = (unsigne
d long int)(ftemp )*100; //扩大了一百倍便于后续程序
//取两位小数点
process(c); // 调用数据处理函数,根据不同的R值进行处理
}
if(flag == 1 ) // 数据处理结束每次处理结束,证明需要更新显示的数据{
if(tw>=50000 || ledclc == 0) // 量程超出
{
dispchar3(zimu1); // 量程太高
ledclc = 0;
}
else if(tw<=100 && ledclc == 1) //量程太低
{
dispchar3(zimu5);
ledclc = 0;
}
else
{
dispchar1(zimu2);
disp(temp);
}
flag = 0;
}
keyscan();
}
}
void timer0() interrupt 1 // 定时器0中断用于超量程提示{
ledclc = 0;
}
void exint1 () interrupt 2 // 外部中断0 用于产生低脉冲,启动555定时器{
unsigned char a;
tr = 1; // tr端一个负脉冲
a = 1;
while(--a);
tr = 0;
a = 20;
while(--a);
tr = 1; // tr端负脉冲结束大约40us的负脉冲
need = 1; // 表示需要测量
ledclc = 1; // 关闭先前的超量程提示EX1 = 0; // 暂时关闭外部中断,一次测量结束,再开放外部中断
}
void process(unsigned long int c)
{
if(R == 1) // 10M 的电阻量程10pf ~ 5000pf
{
c = c /10;
lcd_pos(0x4a);
LCD_write_Data(' ');
LCD_write_Data('p');
LCD_write_Data('f');
LCD_write_Data(' ');
LCD_write_Data(' ');
}
if(R == 2) // 100k 的电阻量程5nf~ 500nf
{
c = c /100;
lcd_pos(0x4a);
LCD_write_Data(' ');
LCD_write_Data('n');
LCD_write_Data('f');
LCD_write_Data(' ');
LCD_write_Data(' ');
}
if(R == 3) //1k欧姆的电阻量程~ 50uf
{
c = c /1000; // 扩大了一百倍单位 c = tw/500 uf
lcd_pos(0x4a);
LCD_write_Data(' ');
LCD_write_Data('u');
LCD_write_Data('f');
LCD_write_Data(' ');
LCD_write_Data(' ');
}
if(R == 4) //100欧姆的电阻量程50uf ~ 500uf
{
c = c /100; // 扩大了一百倍单位 c = tw/500 uf
lcd_pos(0x4a);
LCD_write_Data(' ');
LCD_write_Data('u');
LCD_write_Data('f');
LCD_write_Data(' ');
LCD_write_Data(' ');
}
temp[0] = c / 100000; // 千位
temp[1] = c / 10000 % 10; // 百位
temp[2] = c / 1000 % 10; // 十位
temp[3] = c / 100 %10; // 个位
temp[4] = c / 10 % 10;
temp[5] = c % 10;
flag = 1;
}
void keyscan()
{
if(key1 == 0)
{
delay_ms(10);
if(key1 == 0) // b3按下
{
while(key1==0);
R = 1; // 10M 的电阻量程10pf~ 5000pf(5nf)
con1 = 1;
con3 = 1;
con2 = 0;
ledclc = 1;
dispchar1(zimu3);
dispchar2(zimu4);
}
}
if(key2 == 0) // b4按下
{
delay_ms(10);
if(key2 == 0)
{
while(key2==0);
R = 2; // 100k 的电阻量程5nf~ 500nf
con1 = 0;
con3 = 1;
con2 = 0;
ledclc = 1;
dispchar1(zimu3);
dispchar2(zimu4);
}
}
if(key3 == 0) // b5按下{
delay_ms(10);
if(key3 == 0)
{
while(key3==0);
R = 3;
con1 = 0; // 1k欧姆的电阻量程~ 50uf
con2 = 0;
con3 = 0;
ledclc = 1;
dispchar1(zimu3);
dispchar2(zimu4);
}
}
if(key4 == 0) // b6按下{
delay_ms(10);
if(key4 == 0)
{
while(key4==0);
R = 4;
con1 = 0; // 100欧姆的电阻量程50uf ~ 500uf
con2 = 1;
con3 = 0;
ledclc = 1;
dispchar1(zimu3);
dispchar2(zimu4);
}
}
ledlight(R);
}
void ledlight(unsigned char R) {
if(1 == R)
{
led1 = 1;
led2 = 1;
led3 = 1;
led4 = 0;
}
if(2 == R)
{
led1 = 1;
led2 = 1;
led3 = 0;
led4 = 1;
}
if(3 == R)
{
led1 = 1;
led2 = 0;
led3 = 1;
led4 = 1;
}
if(4 == R)
{
led1 = 0;
led2 = 1;
led3 = 1;
led4 = 1;
}
}。

相关文档
最新文档