基于51单片机的数字电容测量仪设计实验报告(编辑修改稿)内容摘要:

G R E E N+ 5 VR96 8 0R 1 06 8 0R 1 16 8 0R 1 26 8 0R66 8 0D6L E D G R E E N 图 27 指示灯电路 量程选择电路 在图 24 中可以看到,在 RC 充电回路中, R 值是固定的,不可变的,那么量程也显然是不可变的,因此,需要在此加入可调节充电回路电阻的电路部分,这里,利用继电器可以简单实现。 具体电路如图 28所示,利用继电器时需特别注意,由于单片机输出电流是很小的,不足以驱动继电器吸合,因此要加驱动电路,在这里,选择 ULN2020 芯片来实现。 当然,也可以利用典型的三极管驱动来实现,虽然选择的是芯片实现驱动,在这里也将典型的三极管驱动电路列于此。 如图 29 所示。 16 I NT 0P 3 . 7THP 0 . 0P 0 . 1P 0 . 2R4DC7Q3GND1VCC8TR2TH6CV5U2NE 5 5 5C21nF+ 5 VC35 0 0 0 p fR22kC44 .7 u fR51 0 0 kR61 0 MR71kR L 1NT E R22 5R L 2NT E R22 5R81 0 0R L 3NT E R22 5+ 5 V+ 5 V+ 5 V1B11C162B22C153B33C144B44C135B55C126B66C117B77C10CO M9U3ULN2 0 0 3 A 图 28 实现量程选择电路 P 0 . 0Q1M P S A 5 5R L 4N T E R 2 2 5 图 29 利用三极管的驱动电路 17 液晶 显示电路 如图 210 所示, lcd 接与 P1 口,用于显示 电容值以及一些相应的测量信息。 P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0P2.2P2.1P2.0D714D613D512D411D310D29D18D07E6RW5RS4VSS1VDD2VEE3L C D 1L M 0 1 6 L+ 5 V 图 210 lcd 显示电路 至此,整个电容测量仪的硬件设计部分就设计好了,接下来,需要的就是与之相匹配的软件支持了。 软件设计 软件编程平台选择最常用的 keil软件。 由于该 程序并未涉及到底层的驱动问题,因此选择方便快捷的 C 语言编程。 在编程中,将该程序分为三个模块 :延时模块, 1602 显示模块及主函数模块。 方便调试与理解。 具体程序见附录二。 总体程序较长,但并不复杂,可根据需要重点看主函数,与硬件电路结合起来,注重程序后紧跟的注释,理解起来是比较容易的,在此就不再一一详细分析。 量程范围设置 由于量程的选择是非常重要的一个环节,在这里单独讨论量程的选择。 系统采用单片机片内 16 位的定时器测量 TW 的宽度 , 标准计数脉冲的周期为 1 微秒时 , 18 为确保计数器不发生溢出 , 要求 TW 65 毫秒。 同时 , 为减小量化误差对结果的影响 , 要求TW 1 微秒。 当 TW 100 微秒以上时 , 可忽略量化误差的影响。 为满足 10pF ~ 500uF 的测量范围 , 可通过设置不同充电电阻 R 的阻值来实现。 理论计算的电阻 R 阻值、理论量程范围以及系统选择的量程范围如表 21 所示。 系统分为四个量程 , 可测量 10pF ~ 500uF 的电容。 表 21 R值与量程范围的关系 R值(欧姆) 理论量程范围 选择的范围 10M 9pF ~ 5. 9nF 10pF ~ 5nF 100K 900pF ~ 590nF 5nF ~ 500nF 1K 90nF ~ 59uF 0. 5uF ~ 50uF 100 900nF ~ 590uF F 50uF ~ 500uF altium designer 原理图设计及 PCB 制作 原理图设计 图 211 原理图设计 19 PCB制作 图 212 PCB 设计 在此并没有布双层板,红色的线仅仅只是为了标志出跳线。 设计结果 图 213 设计结果实物图 各个按键功能如图中文字说明。 20 3 系统测试 由于该作品需实现的功能仅为 测电容,在此不列出其他的测试。 测量 100nf 的电容 在此以 100nf 电容测试为例,演示整个测试过程。 测试标称值为 104 的电容,即测量电容值为 100nf 的电容。 104 的电容实物如图 214 所示。 测试结果如图 215 所示。 若量程选择错误,测试结果如图 216 所示。 图 214 100nf 的电容实物 21 图 215 100nf 电容正常测试 图 216 量程错误情况下的测试 测量 的电容 再以测试 电容为例,测试结果如图 218 所示。 22 图 218 测试 的电 容 测试结果 将 测 量的 一系列电容 的电容 值与标准值比较。 比较结果如表 31。 表 31 测量值与标准值比较 标准值 测量值 误差 300pf 320pf % 100nf % % 100uf % 由表 31 中数据可知,平均误差是 6%,低于设计扩展要求的 10%,测量范围是10pf~500uf,满足设计要求的 100pf~100uf。 测量结果由液晶直观显示。 综合以上分析,该设计满足整体设计要求。 23 误差分析 由于产生的 6%左右的误差,在这里 简要分析一下误差产生的原因。 电容测量的误差主要由 NE555 定时器构成的单稳态触发电路的非线性误差 T 、计数器的量化误差 � N 和标准计数脉冲的频率偏移 TC 产生 [2] [ 3]。 因此有 : 系统采用的标准计数脉冲来自单片机内核时钟 , 由片外的高精度晶振与片内电路自激振荡产生 ,频率非常稳定 , 可以忽略其频偏对测量结果的影响。 量化误差 � N 是数字电路的特有误差 , 最坏的情况下等于 1。 如采用 12M 的晶振 , 可获得 1MHz 的标准计数脉冲 , 量化产生的最 大误差为 1 微秒。 通过设置充电电阻 R 的阻值 , 使 TW 达到毫秒级时 , 量化误差的影响非常小 , 可以忽略。 非线性误差是由器件的非线性特性产生的 , 可通过硬件参数修正和软件算法补偿来减小。 4 结论 与心得体会 总之,通过一系列仿真和设计,数字式电容测量仪还是比较成功的做出来了。 一路下来还是比较坎坷,从原理到实物, 从调试到调试成功, 遇到了很多问题, 在 硬件的 原理图设计中,遇到了一个当时觉得非常困难的问题,就是如何实现量程的选择,首先想到的就是用开关实现,由用户根据不同的选择拨动开关,这样虽然很容易的选择了不 同的电阻,但是,拨动开关之后如何让单片机知道呢。 因为只有单片机知道你选择了何种量程的电阻,才有法作相应的处理,于是想到在用一个按键来通知单片机,可是,这样的话,用户测量一次电容,将会按 3次按键,这样无疑增加了操作的繁琐度。 于是想到可以由用户按键通知单片机选择量程,用单片机控制某种芯片来选择不同的路径,从而引入不同的电阻。 而这种芯片,也是通过查阅很久的资料才查到的,从 CD4052 到继电器也走了不少弯路,最后权衡各个方面,选择了易于控制的内阻很低的继电器。 至此,解决了量程选择问题。 可是,在后续的设计中,没有意识 到继电器的驱动问题,就直接将他接于单片机的 P0口,板子做出来之后,才发现 24 无法驱动继电器,使继电器吸合。 就这样,一步一步,最后又选择以 ULN2020 作为驱动。 才得以解决这一系列问题。 其次,软件设计也遇到了 很多问题,通过很长的时间才调试成功。 通过这次设计也收获了很多,知识层面上,学得了很多新知识,解决问题的新方法。 实践方面,提高了动手能力,提高了解决实际问题的能力等等。 在思想上,更加明白的坚持不懈的重要性,学习探索的重要性,实践动手的重要性。 5 参考文献 【 1】 《单片机基础》第三版 李广弟 朱月秀 冷祖 祁 编著 北京航天大学出版社, 2020 【 2】 《数字式电容测量仪设计》 张玉芹 , 洪远泉 廊坊师范学院学报 (自然科学版 ) 2020 年 6 月 第 11 卷第 3 期 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个 25 ( 14) ULN2020 1片 ( 10) 排针若干,杜邦线若干 附录 2 程序清单 分 5 个文件: , , , , (a) 程序清单: ifndef __delay_h__ define __delay_h__ define uchar unsigned char define uint unsigned int void delay_us(uint t)。 void delay_ms(uint t)。 endif (b) 程序清单: include void delay_us(uint t) { uchar i。 for(。 t0。 t) { for(i=0。 i12。 i++) {。 } } } void delay_ms(uint t){ uchar i。 26 for(。 t0。 t) { for(i=0。 i125。 i++) {。 } } } (c) 程序清单: ifndef __1602_h__ define __1602_h__ include sbit RS = P2^2。 //定义端口 sbit RW = P2^1。 sbit EN = P2^0。 define RS_CLR RS=0 define RS_SET RS=1 define RW_CLR RW=0 define RW_SET RW=1 define EN_CLR EN=0 define EN_SET EN=1 unsigned char pro_data(unsigned char mda)。 void LCD_write_(unsigned char )。 void LCD_write_Data(unsigned char Data)。 void LCD_init(void)。 void lcd_pos(unsigned char pos)。 27 void disp(unsigned char *p)。 void dispchar1(unsigned char *p)。 void dispchar2(unsigned char *p)。 void dispchar3(unsigned char *p)。 endif。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。