单片机实例分享,自制电感和电容测量仪
电子爱好者进行制作时经常需要绕制电感,而一般的数字万用表通常又没有电感测量挡,所以无法测量绕好的电感的电感量。本文介绍一种用单片机制作的电感和电容测量仪(见图23.1),可以有效地解决这一问题。
测量原理
本测量仪采用谐振法测量电感和电容,其方法是用谐振回路的谐振特性来进行测量,其测量原理可用如图23.2所示的电路进行说明。
图23.1 电感和电容测量仪
测量电感Lx时,配用标准电容C1,用Lx和C1组成谐振回路,测量出回路的谐振频率f即可计算出Lx的电感量;测量电容Cx时,配用标准电感L1,用L1和Cx组成谐振回路,测量出回路的谐振频率f即可计算出Cx的电容量。
上述测量方法也有一个缺陷:当Lx或Cx很小时,谐振频率f会很大,测量比较困难,为此我们可以采用如图23.2所示的改进型电路,分别用L1和C1作“垫底”,降低了测量时的谐振频率。
假设由 L1和C1 组成的谐振回路谐振频率为f1,测量Lx时,Lx和L1串联,测得(L1+Lx)和C1组成的谐振回路谐振频率为f2,则根据下式可计算出Lx的电感量:
Lx=[(f1/f2)2-1]L1
测量Cx时,Cx和C1并联,测得L1和(C1+Cx)组成的谐振回路谐振频率为f2,则可根据下式可计算出Cx的电容量:
Cx=[(f1/f2)2-1]C1
硬件电路
测量仪电路如图23.2所示。电路由LC振荡电路、单片机电路、显示电路等部分组成。
CD4069是6非门CMOS集成电路,其中非门F1、F2和C2、R1、R2等组成两级放大电路。第一级放大电路中,R2是负反馈偏置电阻,将F1输出端的直流电位钳制在VCC/2,使F1工作在线性放大区域。第二级放大电路没有加反馈电阻,直接用第一级放大电路输出的直流电压作偏置电压,以提高放大器的增益。放大电路通过正反馈回路R3、C3与L1、C1谐振电路一起组成正弦波振荡电路,非门F3用于信号整形,把F2输出的正弦波转换成矩形波输入到单片机ATmega8的T1脚,由单片机进行脉冲计数,从而测出LC回路的谐振频率。通过单片机对数据进行计算处理后,由LCD1602液晶屏显示测量结果。
图23.2 测量仪电路原理图
S1为测量转换开关,当S1转向L时测量电感,转向C时测量电容。S2是归0按钮。
LCD1602采用4线制传递数据,只使用了数据端口D4~D7。
当开关S1在电容挡但没有测量电容Cx,或在电感挡并且用短路线代替Lx时,电路的振荡频率约为503kHz,我们把这个频率称为基准频率。测试电容或电感时,被测试元件的电容量或电感量越大,对应的振荡频率越低。当被测电容的电容量为10μF(或电感的电感量为1H)时,对应的振荡频率约为5.03kHz。
电阻R5的阻值控制LCD1602液晶屏的对比度,R5阻值越小,液晶屏对比度越大。LED和LED+是液晶屏背光发光二极管的供电端口。
程序设计
测量仪的电路比较简单,而功能的实现更重要地依赖于程序的设计。程序的设计和优化需要花费更多的精力。
程序由频率测量、测试数据的计算处理、LCD1602液晶屏驱动显示三大部分组成。频率测量部分用定时器T/C1作脉冲计数,定时器T/C2产生测量脉冲频率的闸门时间。这里闸门时间选择0.5s,定时器T/C1累计的脉冲数乘以2即得脉冲频率。闸门时间选择0.5s是为了提高LCD1602显示数据刷新速度,如果闸门时间选1s,则刷新速度偏慢。
测试数据的计算处理部分主要利用前面给的两个公式计算出测量结果,并经过数据预处理后,输出到显示电路显示读数。
LCD1602的数据传输采用4线制,8位数据分两次传送,先传高4位,后传低4位,因为传递的数据量不大,所以你感觉不到4线制速度传输和8线制有什么区别。
安装调试
制作所需元器件的清单见表23.1。
C1、L1要选用精度比较高的元件,有条件的可用万能电桥进行筛选。L1如买不到成品电感也可自制,磁芯用Φ8×10的工字磁芯,用Φ0.42的漆包线绕55.5圈。
安装前先将程序的目标文件写入单片机ATmega8L,熔丝位的设置如图23.3所示。
图23.3 熔丝位的设置
电路板的装配图如图23.4所示。LCD1602的接口排座焊接在电路板上,排针焊接在LCD1602模块上如图23.5所示。
表23.1 元器件清单
图23.4 电路板装配图
安装完成后,用一根USB线将电源接口连到电脑USB插座上,接通测量仪的电源,将S1置于电容挡,测量端不接电容,这时LCD1602第二行显示的是基准频率f1,如图23.6所示。基准频率如果超出503kHz±5kHz的范围,说明L1、C1中有元件误差较大,需进行相应的调整。如果L1是自绕的,出现误差的可能性相对较大,可适当增减其圈数,直至满足要求。
接通电源后,以电容挡为例,虽然我们在测试端并没有接任何电容,但LCD1602第一行显示的电容量读数并不为零,如图23.6所示,我们称其为初始值,这是由基准频率略有漂移造成的。这时如果测量小容量的电容,误差就比较大,当初始值后有“-”号时,测量值是实际值减去了初始值,即读数比实际容量小了。反之,测量值是实际值加上了初始值,即读数比实际容量大了。
对于上述问题,我在程序中也作了考虑,只要在不接测试电容的情况下按一下S2就可以归0了,其实质就是基准频率作了修正,并把修正结果存入EEPROM,掉电后不会丢失。归0后的显示数据如图23.7所示。
电容挡归0后,电感挡就不需要归0了,因为电容挡归0就相当于在电感挡测试端接了一个短路线,等同于电感挡归0(在S1置于电感挡,S2归0时其测试端必须接短路线),分析一下电路就明白了。
图23.5 排针的焊接
如果使用中发现测量误差较大,可通过程序进行修正,具体做法如下:找一个精度高的1000pF电容进行测量,假设读数为950pF,则计算1000/950≈1.05,我们将其称为修正系数,将计算公式Cx=[(f1/f2)2-1]C1改为Cx=[(f1/f2)2-1]C1×1.05,用这个公式计算就能减小测量误差了。为了简化程序中的计算,我采取把程序中的语句“unsigned int C1=1000”改为“unsigned int C1=1050”的方法,效果是一样的。
再找一个精度高的100μH电感进行测量,假设读数为94,则计算100/94≈1.06,把程序中的语句“unsigned char L1=100”改为“unsigned char L1=106”,同样也能减小测量误差。
把重新编译好的目标文件烧写到ATmega8L,再进行测量,精度就提高了。
用本测试仪测量电容的实例如图23.8所示(测量对象分别为240pF云母电容和0.47μF安规电容),测量电感的实例如图23.9所示(测量对象分别为10μH电感和电子节能灯的电感线圈)。
当测量值超过量程时,读数显示“OVE”,测电感时电感测试端不接电感(相当于电感量为无穷大),读数也显示“OVE”。
图23.6 基准频率的测量结果
图23.7 按S2归0后的显示数据
使用这个电感和电容测量仪时有一个问题需要注意,即电感或电容的参数会受测试频率的影响。例如,具有磁芯的电感,由于受磁芯的频率特性影响,不同的测试频率,其结果可能有所不同,用这个测量仪测的数据和用信号源频率为1000Hz的万能电桥测的数据可能会不一致。笔者认为,用更接近实际工作频率的测试频率可以得到比较符合实际的测试结果。由于本测试仪工作频率比较高,不适合测量电解电容器。笔者测量一个10μF的电解电容器,对应测试频率为6.5kHz,读数为6.26μF,误差很大。
图23.8 电容的测量结果
图23.9 电感的测量结果
基于单片机的LCD数字电流表的设计与实现
摘 要 : 本文中数字电流表的控制系统采用AT89S51单片机,A/D转换器采用ADC0809为主要硬件,实现数字电流表的硬件电路与软件设计。该系统的数字电流表电路简单,所用的元件较少,成本低,调节工作可实现自动化。数字电流表可以测量0~200 mA的8路输入电流值,并在LCD液晶显示屏上显示出来。
0 引言
在现实中,根据测试系统的要求,往往需要采集被测对象的各种参数,如电压、电流等,这些参数的采集是至关重要的,它们直接影响到整个测试系统的测试精度。在有些应用中,需要对电流进行检测,必须先将其电流信号转换为电压信号,然后才能实现A/D转换。常用的转换方法是在电路中加入精密电阻,由此将电流信号转换为电压信号[1]。这种方法的优点是测量简单方便,但是这种方法当电流很小时,从电阻上取得的电压值可能很小,影响测量精度,因而很难选择一个合适的阻值;其次,所得到的电流检测信号只有通过放大以后才能进入电路中的比较器,从而增加了电路设计调试时的复杂度。因此,需要采用电流/电压转换芯片,并结合单片机以实现对电流信号的检测。本文中采用精密电阻,克服了常规测量电流方法存在的测量范围小、测量误差大等缺点,可提高测量精度,同时采用单片机可实现自动检测。
1 硬件电路设计
本设计旨在设计一款测量范围在0~200 mA、显示精度在小数点前一位的基于AT89S51单片机带液晶显示功能的电流表,经查阅多种相关资料,确定本设计的总体框图如图1所示。
图1所示电路工作过程:将需要检测的电流信号经过I/V变换变为电压信号,将其输出的电压信号连接到ADC0809进行A/D转换,电压信号经过采样后,输出到单片机,单片机控制中断的过程以及数据的读取过程,最后通过控制液晶显示所读取的数据。
1.1 I/V变换电路部分
对本设计来说,由于精度要求并不高,故用有源I/V即可满足要求,有源I/V变换是利用有源器件——运算放大器和电阻电容组成的,如图2所示。
该有源I/V变换电路利用同相放大电路,把电阻R1上的输入电压变成标准输出电压。该同相放大电路的放大倍数为:
若取R1=20 Ω,R2=100 kΩ,R3=100 kΩ,R4=25 kΩ,R5=10 kΩ,则当输入电流为0~200 mA时,对应于0~5 V的电压输出。
1.2 A/D转换模块
基于成本、功耗、分辨率、模拟电压转换范围等因素,此处选择ADC0809芯片。ADC0809与8051单片机的硬件接口有3种形式,分别是查询方式、中断方式和延时等待方式。A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。在本设计中,选择中断方式,即把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
1.3 单片机模块
该电流表可测量0~200 mA的直流电压,通过电位器调节产生,显示位数3位[2],工作电压5 V。通过A/D转换芯片ADC0809把模拟信号转换为数字量传送到单片机的P3口,并在P2口把转换的结果显示出来。在仿真软件Protesus[3]里选择元器件后连接电流表总图,如图3所示。
本设计选用的AT89S51是ATMEL公司推出的高性能8位微控制器,由于ADC0809无片内时钟,时钟信号可由AT89S51的ALE信号经D触发器二分频后获得。ALE引脚的脉冲频率是8051时钟频率的1/6。本设计中单片机时钟频率采用6 MHz,则ALE输出的频率是1 MHz,二分频后为500 kHz,符合ADC0809对频率的要求。
1.4 显示部分
本电流表的显示[4]选择LCDl602型LCD,它具有电流小、功耗低、体积小、字迹清晰、美观、方便、使用寿命长、无电磁辐射等优点。从图3中可看出其与AT89S51的P0口相连,其DO~D7为8位双向数据线,VSS为地电源,VDD接5 V正向电源,VEE为液晶显示器对比度调整端,接正向电源时对比度最弱,而接地电源时对比度最高。该引脚通过一只1 kΩ的电位器来调整其对比度。RS为寄存器选择引脚,RS为高电平时选用数据寄存器;RS为低电平时选用指令寄存器。RW为可读写信号引脚,RW高电平时为读操作;RW低电平时为写操作。当RS和RW共同为低电平时则写入指令或者显示地址;当RS为低电平、RW为高电平时为读忙信号;当RS为高电平、RW为低电平时为写人数据。E为使能端,当E由高电平跳变为低电平时,LCD液晶模块开始执行命令。
2 电流表软件设计
本电流表的主程序流程包括:系统初始化、中断处理程序、数值转换程序、显示处理程序。较关键的是数据采集部分和显示部分。
2.1 数据采集部分
本部分程序设计的思想如下:首先由ADC0809采集数据,采集完成后单片机通过中断将数据读入,然后将所得十六进制数转换成十进制数,将此十进制数的百、十、个位分别取出,在预先设置好的表中查出其所对应的显示指令并显示出来。以下为数值转换的主代码[5]。
codes=PORT;//将中断值赋予codes
codes1=(codes&0xf0)>>4;//取出codes的高4位
codes0=codes&0x0f;//取出codes的低4位
code_d=codes1*16+codes0;//将codes转化为十进制数
bai=code_d/100;//将code_d的百位取出
shi=code_d/10%10;//将code_d的十位取出
ge=code_d%10;//将code_d的个位取出
2.2 数值显示程序
这部分程序首先要将单位mA显示出来,因为这单位是不变的。要把测得的数值在液晶屏上显示出来时,此处调用一个getchar函数。在这个函数中,用了一个do{}while语句。在此语句的一开头首先测试液晶模块是否空闲,若不空闲则等待其空闲,当液晶空闲时,执行嵌套switch/case语句。由于要显示三个数字,所以设定了一个变量i,当i=0时显示百位,当i=1时显示十位,当i=2时显示个位。显示数字时可选择查表法。先建立三个表,每一位对应一个表。以下为显示十位的例子。
case 1:
{
PA=TABLE2[shi*2+t];
t++;
}break;
显示完成后,进行适当的延时以保证显示的稳定性。
3 结论
在本次设计中,通过使用Proteus绘制电路图,用C语言编写程序,程序运行完毕后,电压表的显示屏上就可以显示出电流数值来。调节电位器,显示数值就会发生变化。电压表的最小显示值是0 mA,最大显示值是200 mA,这与设计目的一致,1 s内大约可以测量2次电压值。
参考文献
[1] 柳金龙.浅谈数字电压表的特点[J].中国计量,2004(8):43-44.
[2] 王韬.3位半积分式A/D转换DC电压表[J].电子设计工程:电子世界,2002(2):44-45.
[3] 周润景,张丽娜.刘映群.PROTEUS入门使用教程[M].北京:机械工业出版社,2007.
[4] 马俊,刘晓林.智能键盘字符输入及LCD显示系统设计[J].电子设计工程,2009,17(1):66-68.
[5] 马忠梅,籍顺心,张凯,等.单片机的C语言应用程序设计(第3版)[M].北京:北京航空航天大学出版社,2003.
相关问答
怎样用 单片机 I/O口直接驱动 LCD ?LCD耗电少,可以直接用IO口驱动,即直接连接当然,如果单片机的IO口电压与LCD要求的电压不一致时,需要用到电平转换LCD耗电少,可以直接用IO口驱动,即直接连接...
单片机 上的 lcd 不亮怎么测试?要测试单片机上的LCD是否亮,可以按照以下步骤进行测试。首先,检查LCD的电源是否正常连接,确保电源线没有松动或损坏。然后,检查LCD的背光是否正常工作,可...
单片机 中的 LCD -ZOL问答单片机中的LCD显示器讨论回答(7)看你的程序,大概猜出应该是在液晶第二行显示时分秒信息Voidwrite_sfm(ucharadd,uchardate),add看程序是指LCD第二...
单片机 驱动 lcd 屏亮度不够怎么办?单片机LcD是电流驱动的元件,亮度不够可能是因为你接的限流电阻太大了,你把电阻换成3K到1K试试,应该就会变亮了。又或者可加一适当延时,避免花屏,段码更新...
单片机 程序中lcdrs是什么意思?有什么作用?是液晶的数据/命令选择端,一般高电平代表传输的是数据,低电平代表传输的是命令。液晶资料上面有详细介绍是液晶的数据/命令选择端,一般高电平代表传输的是数...
单片机控制 7寸tft模块液晶屏,具体怎么写程序,大概思路?第一,逻辑上是一样的,如果接的口一样,改动量会很小第二,如果没有gui的话那就需要你进行液晶屏的最底层操作,比如说初始化,画点,画线这些最基本的工作都需...
单片机lcd 名词解释?单片机LCD是一种用于单片机显示的液晶显示器,它具有低功耗、高分辨率、清晰的图像等特点。其中,液晶是一种类似于晶体的物质,具有一定的电学性质。LCD采用的是...
哪个 单片机 自带触摸按键和 lcd 功能?触摸的单片机有,新塘,赛普拉斯,昆泰,ST,飞思卡尔,TI,ADS…触摸的单片机有,新塘,赛普拉斯,昆泰,ST,飞思卡尔,TI,ADS…
如何将数码管与 LCD 同时接入 单片机 ,我想做一个999秒的倒计时,同时用 LCD 显示我的英文名字?用个引脚比较多的单片机就可以了。比如STC89C52等等。数码管用扫描方式,LCD如果用1602就直接写,也不会占用单片机多少时间。用个引脚比较多的单片机就可以了...
单片机 驱动 lcd 显示老是闪屏?可能是因为单片机驱动LCD时序设置不正确导致的。要解决这个问题,首先需要确认单片机的时钟频率和LCD的驱动时序是否匹配,然后检查驱动程序中的时序设置是否正...