单片机实例分享,自制电感和电容测量仪
电子爱好者进行制作时经常需要绕制电感,而一般的数字万用表通常又没有电感测量挡,所以无法测量绕好的电感的电感量。本文介绍一种用单片机制作的电感和电容测量仪(见图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 电感的测量结果
单片机外围模块漫谈之四,USB总线基本概念
1. USB概述
USB设备现在是用的非常普遍的一种接口了,它即插即用的特性给人们带来了很大的方便。在嵌入式的应用中, USB经常被用来作为与上位机通信的接口,还用来通过U盘存储数据等。USB按通讯速度可分为低速,全速和高速设备。在我们的应用中,低速和全速是最为普遍的,在此我们对USB从物理层到协议层做一个简要的介绍。高速USB的原理是一样的,在理解了低速和全速设备的工作原理后再去理解高速设备就比较简单了,在此我们暂不讨论。
低速(Low Speed, 1.5Mbps):键盘,鼠标,手写笔
全速(Full Speed, 12Mbps):音频
高速(High Speed, 480Mbps):视频
USB协议是开放的,可以从官方网站usb.org下载。
2. 主机,设备(Host, Device)
上图是一个典型的USB全速主机和设备的连接示意图。主机要有对外的供电能力,图中可以看到作为主机的单片机,一个引脚用来控制三极管或MOSFET,提供5V的电源至USB口。设备供电有两种方法:一种是通过USB总线,从主机提供的5V获得,如我们常用的U盘;一种是自己从另外的电源获得,此时主机至设备的电源线可以不连。如果设备的1.5k上拉电阻是加在D-上,那么此设备将被主机识别为低速设备。高速设备的上拉与全速设备一样是加到D+,需要靠软件协议进一步区分。
通过USB总线获得供电的设备,分为两种配置:
低功率设备(Low-power devices): 最大电流不超过100mA
高功率设备(High-power devices): 刚连接后设备后的枚举阶段不超过100mA,配置完成后最大不超过500mA。
USB所有的通讯都是由主机发起。当主机检测到有设备连接时,首先会询问设备,让设备自报家门,看看设备都具备哪些能力,其中就包括最大电流,然后主机根据上报的描述进行相应的操作。这个过程叫自举(Enumeration)。设备通过描述符(Descriptor)来声明自己的能力,包括:
设备描述符(Device Descriptor)
配置描述符(Configuration Descriptor)
接口描述符(Interface Descriptor)
端点描述符(Endpoint Descriptor)
字符串描述符(String Descriptor)
端点(Endpiont)是USB通信的基本单元,每个USB设备都会包含若干个端点。主机下发的数据最终会根据设备地址和端点地址到达某一个端点,主机获取数据也是给某个端点发出读数据命令,此端点随后把存储在自己缓冲区的数据发给主机。
在端点之上是逻辑组织,多个端点可以归到一个接口,多个接口可以归为一个配置。而一个设备可以有多个配置。
3. USB物理层
(USB Specification 2.0)
1 红色 Vbus(5V)
2 白色 D-
3 绿色 D+
4 黑色 GND
有的USB接口会多出一根ID线,以支持OTG(On The Go)。支持OTG的线两端是不一样的,其中一端插到OTG设备时会把设备接口的识别引脚ID拉低,此设备识别到自己的ID拉低后会进入主机状态(Host),连线另一端的设备ID没有拉低,默认进入设备状态(Device)。之后通过软协议可以主从切换。但是集中这种应用不是太多,一台设备要么作主机,要么作设备的情况比较多。
USB使用的是差分传输模式,有两根数据线D+和D-。
Differential 1 :D+ > VOH(min) (2.8V) 且D- < VOL(max)(0.3V)
Differential 0 :D- > VOH and D+ < VOL
J状态: 对于低速USB是Differential 0,对于全速USB是 Differential 1
K状态: 对于低速USB是Differential 1,对于全速USB是 Differential 0
除此之外,通过把D+,D-当作单端信号拉低,拉高,可以表示一些特殊的状态。
SE0状态(Single Ended 0) :D+ 低,D- 低
SE1状态(Single Ended 1): D+ 高,D- 高
Reset信号: D+ and D- < VOL for >= 10ms 主机在要和设备通信之前会发送Reset信号来把设备设置到默认的未配置状态。即主机拉低两根信号线(SE0状态)并保持10ms。
看到这里也许有点晕,不过没关系,你如果看USB协议会更晕。
我们千万不要掉进这个坑里出不来,就像我们用串口也从来不会去触发一个起始信号,或者拉出一个结束信号一样,这些物理层信号状态的处理完全由芯片集成的USB控制器来处理。而且提供USB软件协议栈也是必须的,靠用户自己完全把所有细节搞清楚是不现实的。然而就像开车一样,你如果对汽车的原理有更深入的了解,一定更能充分的发挥出这辆车的性能。
继续,除了以上状态,还有:
Idle State, Resume State, Start of Packet, End of Packet, Disconnect, Connnect.
4. Packet
Packet 是USB通讯最基本的单位。
SOP: Start Of Packet,标志由空闲状态转入数据包发送。
SYNC: 同步段,供USB设备进行时钟同步。
PID: Packet Identifier。种类比较多,下面再详细说明。
Address: 设备和端点地址。一个主机可以挂接多个设备,主机会给每个设备分配不同地址。
Frame Number: 帧号,每发一帧加1,达到7FFFH时变为0。
Data: 数据段。
CRC: 校验和。
EOP: End Of Packet。
通过不同的PID,数据包被分成4个大类,每个大类又包含一些小类:
令牌 (Token) OUT,IN,SETUP,SOF
数据 (Data) DATA0,DATA1
握手 (Handshake) ACK,NAK,STALL,NYET
特殊包 (Special) PRE,ERR
5. Transaction
一次Transaction总是从主机向设备发出一个令牌(Token)开始。再次强调,USB所有的通信过程都是由主机发起。三种令牌把Transaction分为三类:
OUT: 主机发送数据给设备。
IN: 主机从设备获取数据。
SETUP: 主机对设备进行设置。
USB协议里的OUT和IN,都要站在主机的角度来看。下面是比较典型的获取,发送数据的例子:
每一次Transaction,Token总是必需的,数据段和握手则视情况而定。比如在上一个例子中,当主机发出IN令牌获取数据时,如果设备没准备好数据,则可以返回NAK结束此Transaction。
6. Transfer
好了,有了以上这些,似乎万事俱备了。但是如果进一步想一下,那么还是有些问题不好解决。什么呢?比方说DATA数据段的长度规定多长好呢?主机多长时间发起一次通信比较好呢?
一个USB主机上是允许挂载多个设备的,而这些设备千差万别:比如像鼠标,按键后需要快速响应,把位置信息发送到主机,它的数据量很少,而像U盘则需要传输大量的数据。如果按鼠标的时候U盘正在传输数据怎么办呢?
为了解决上述问题,USB首先规定了四种传输类型:
控制传输(Control Transfers): 主要用来在设备刚连接到主机时对设备进行设置。还有平时对设备状态的管理。它需要双向的数据传输。
批量传输(Bulk Data Transfers): 主要用来进行量大,但对传输时间要求不严格的场景。例如U盘。
中断传输(Interrupt Data Transfers): 需要及时准确的传输信息的场景。中断传输总是单向的。比如鼠标。
同步传输(Isochronous Data Transfers): 一般需要占用相对固定的带宽,延时短而且比较确定。传输是单向的,数据出错后不需要重传。比如USB摄像头。
然后,为了解决设备的及时响应问题,USB每隔1ms (高速USB是每隔125us)发出一个SOF令牌,紧接令牌进行同步类型的传输,之后依次是中断类型,控制类型和批量数据传输类型。在每一个Frame内,Isochronous,Interrupt和Control都会保证一定的带宽。而Bulk型的传输优先级最低,不一定每帧都得到带宽进行数据传输。
一个Transfer 由一个或多个Transactions组成。比如一次控制传输可以由Setup,IN,OUT等Transactions组成。Packet和Transaction是不允许被中间打断的,而Transfer的多个Transactions可以分多次传输。
7. 小结
我们对USB的物理层和协议层做了简要的介绍。在接下来的文章里我们将通过实际的例子来看一下USB是如何工作的,并对很多工程师经常忽略或者没有意识到的一些问题进行探讨。
参考资料:
USB Specification 2.0
相关问答
单片机 中怎么实现 USB 既可以作为 供电 使用,又可以作为数据传输使用?如果单片机是USB的主口(MASTER),则直接把USB的电源接到5V对外供电,为了与USB标准相符合,请加上500ma限流,一般用一只10欧姆或更小的电阻即可。如果单片机是US...
单片机 与 usb 怎么连接?单片机与电脑连接一般有以下几种:1、RS232串口连接,这是最普遍的连接方式。2、RS232-usb,这种方式越来越受欢迎。3、JTAG--JLINK--USB(RS232),主要用于...
电脑上的 USB 口可以当做 单片机 的 供电 电源吗?可以,但在连接之前,要确保电路上的VCC和GND不能短路,否则很有可能烧坏USB口。可以,但在连接之前,要确保电路上的VCC和GND不能短路,否则很有可能烧坏USB口。
如何用 USB 为51 单片机供电 ?USB口的1脚为+5V,4脚为GND,在你设计版时可以直接引用这个电源为单片机供电,如板上需要3.3V则再加个1117模块稳压输出3.3V使用时要注意:1、不要知路及反接2...
我用充电宝给51 单片机供电 , usb 转串口给单片机下载程序,这样行不行?为什么?可以的,只要共地就可以。把充电宝的地跟USB转串口的线的地相连,两边都是5V电压。我常这样分开供电,有时候比较方便。可以的,只要共地就可以。把充电宝的地...
51 单片机 的 USB 通讯端口是哪两个?首先需要确定开发者选择的51单片机是否有USB通讯模块,如果没有,那肯定就没有标准对外接口,需要用IO口来模拟,IO口模拟的话,只要支持输入输出并有输入上拉功...
单片机 中 USB 转串口什么意思, USB 不是串口吗,我记得是啊,为什么还要转?USB是通用串行总线接口,是四线的;串口,是九针的,也叫COM口,现在的主板上基本不作这个接口了,所以很多都是用USB口转成串口。USB是通用串行总线接口,是四线的;...
电脑无法识别 单片机 板 USB 怎么处理-ZOL问答主要是看用的是什么usb芯片了,找win7下的驱动去驱动装了吗主要注意供电电源,比如说你的供电电源是5V的,别接12V上了。其它一般不会烧板子的1、如...
单片机 通电但检测不到?51单片机连接电脑后,关闭单片机电源电脑无法检测出单片机,必须打开单片机电源才可以原因如下:1、要想让电脑检测到51单片机,那么单片机必须处于工作状态。...
怎样可以使用C#通过 usb 向STM32 单片机 发送数据和文件?FTDI类型的芯片如FT245等或者PL2303都是USB转串口的芯片。STM32增强型的单片机或者互联型的单片机有USB接口,同时ST公司提供了USB固件库,如果你不用USB转串口,...