双积分型A/D转换器的设计——如何用51单片机+基本元器件设计一个双积分型A/D转换器?

谨慎借鉴,只用于设计方案交流!!!!!

前段时间电设要求我们用单片机+基本元器件如74LS04、LM324、LM393、三极管等设计一个8位双积分型A/D转换器,翻遍全网很少找到这方面的资料,在经过一段痛苦、崩溃的设计过程后,我们小组也算小有成就(bushi),就把我们的设计过程与设计成果分享给大家吧!(在答辩的过程中老师说我们的设计方案也是有不少问题的,欢迎大家批评指正!)

首先给一个介绍双积分型A/D转换器的链接——双积分A/D转换器电路结构原理图解析 - 电源/新能源 - 电子发烧友网 (elecfans.com)

大家仔细阅读了这个原理以后可以发现其实对我们有用的就是第二次积分的时间,我们来一个一个单元电路讲一下:

一、积分器

由于我们设计的是8位A/D转换器,要求两次积分时间不得超过1s,如何满足这个要求呢?第一次积分的时间是固定的,为 T_{1}=2^{8}\cdot T_{c} ,Tc是时钟信号的周期。

第二次积分的时间一定小于第一次积分的时间。解释如下:在上图中,第一次积分的斜率是k_{1}=-\frac{U_{i}}{RC},第二次积分的斜率是k_{2}=\frac{U_{ref}}{RC}我这里的Ui是正极性,Uref是负极性,如果你的极性刚好和我的相反的话,那积分波形应该是向上的一个小山包。由于你的双积分设计时必须要求 Ui<Uref ,所以第二次积分的时间一定小于第一次积分的时间。

也就是说两次积分时间 T_{1}+T_{2}<2\cdot 2^{8}\cdot T_{c}<1s,得T_{c}<1.95ms,f_{c}<512Hz,我们假设 fc=10kHz,那么第一次积分时间是25.6ms。

回到积分电路的设计上来,如果你的积分电路RC参数选择太大的话,可见第一次积分的结果(小山包的尖尖)数值不会很大,后续的比较器电路很可能根本比较不出结果来;RC参数过小,输入电压Ui稍大,电容充一下子电就充满了,输入不同的Ui值,如果都充电充满了,小山包的尖尖就是一个固定数值,开关转换的时候放电时间/第二次积分时间就固定不变了,那这个A/D转换器就设计废了。

所以基础要求是 RC>T_{1},我经过一系列的调试发现 R=100kΩ,C=1uF最合理。

电路图

这个电路图中还在反相输入端与输出端之间反接了一个二极管,目的是使放电完成时输出端的电压可以稳定在0.7V左右,不加这个二极管的话很可能放电完成以后反向充电,小山包的水平线就不在零线附近了。

二、过零比较器

比较器我真得栓Q,我们组就是因为比较器太过拉胯,噪声太大,最终设计结果才不好。。

我们的比较器主要用到LM393。这里值得注意的就是393要加一个上拉电阻才可以正常输出高电平,上拉电阻阻值不宜过小,一个是噪声会变大,还有一个原因是上拉电阻过小,灌电流过大可能会烧坏393(lj器件就是这么脆弱。。)。

电路图

 

1N4001并无什么特殊用途,只是为了让电路更稳定,可以去掉,影响不大。

捎带说点会导致LM393产生噪声的原因: LM393本身极易受噪声影响,上拉电阻的阻值选取、接地不可靠、检测端输入电压稍比0高等等原因都会产生噪声。

解决方法有:在接地端加一个耦合电容;增大上拉电阻的阻值;在检测端加一个小电容(不建议这样,会对A/D转换结果产生一定的误差);在面包板上换个位置插插。

逻辑门电路就不介绍了哈

三、计数器

学过数电设计一个计数器电路应该不是什么难题,如果你要用硬件搭接的话,需要9个芯片(74LS175或其他),计数结果看的是低八位的芯片的输出结果,最高位的芯片输出结果是用来控制开关电路的。

但是我们要求用51单片机设计计数器,那么就要考验编程能力了。我最开始用的是T1计数器工作在方式2,脉冲输入接在P3.5口。但是我后来方案改进了,就放弃了这一段代码,代码不难,学过单片机C51语言的应该都会照猫画虎地写。

四、开关驱动电路

重头戏来了,开关驱动电路我磨了两个星期才在截止日期前磨出来。​​​​​​​

我们拟用单片机的P1.0口的输出控制开关驱动器,即当P1.0输出高电平时,积分器开始对待测电压Ui积分,当P1.0输出低电平时,积分器输入端连接到-5V的参考电压,电容开始放电。由于单片机P1口低电平有效,所以我们需要在P1.0的输出端加一个非门。

要求开关驱动器既能输出两种大小不一电压,还能保证它们极性相反,我们想到用一个NPN管(S9013)来输出待测电压,一个PNP管(S9012)来输出-5V的参考电压。S9013和S9012的驱动电压不同,驱动S9012需要负电压,因此我们在非门口加一个加法器,让P1.0的输出从0~5V变为-2~3V。

原理图

 

此时,当P1.0接高电平时,S9012导通,输出-5V,S9013截止,输出Ui ,再通过一个加法器,加法器输出即是Ui;当P1.0接低电平时,S9012截止,输出-5V,S9013导通,输出0V,加法器输出-5V。由此完成开关的转换。

在此再强调一下细节,加法器的电阻参数要尽可能大,一是保证具有负反馈的加法器输入电阻无穷大的特性,二是避免在三极管输出电压时,与三极管集电极的电阻构成分压电路,导致实际输入加法器的电压不够,在这里我们选择的是100kΩ。

这个开关驱动电路应该还存在不少的问题,欢迎大家指正!

注:再说小小的一点吧,也是我的老师教我的,分压电路的电阻一般不要太小,好比拿200Ω和300Ω去分压,这样的话当然可以分压,但是功耗太大,白白流失了资源。



到此,电路基本就设计完毕了,但是在后续上代码的时候还是出现了一些问题:

比较器噪声太大,波形抖动剧烈。

原定51单片机计满256个脉冲以后P1.0输出翻转,开关驱动电路切到参考电压上开始放电,但事实上由于比较器波形太抖,使得计数结果误差巨大,加了耦合电容以后效果不明显,仍不能消除噪声,所以我只能被迫换方案。

反正第一段积分时间是固定的,对我们没什么用,我们就可以直接用程序设计一个延时,延时25.6ms用来第一次积分,这样肯定就没有误差了,延时/充电结束后,P1.0由程序控制输出翻转,开始放电。在一个周期内,各单元电路的输出是这样的:

哎?通过这个波形,我们好像发现了新的思路,正如一开始所说的,对我们有用的只是第二段积分的时间而已,那么我们只要将P1.0通过非门的输出与比较器的输出与在一起,就可以得到第二段积分的时间了。

只需要用51单片机测量这段脉冲的宽度即可,测量脉冲需要将定时器的GATE门和TR0/TR1都打开。

给一段测脉冲的C51代码:

sbit PulseIn = P3^2; // P3.2 输入脉冲信号
unsigned short PulseCount = 0; // 保存计数结果
void main()
{
    TMOD = 9;
    TL0 = 0;
    TH0 = 0;
    while(PulseIn); //等待INT0变低
    TR0 = 1; // 启动定时
    while(!PulseIn); //等待INT0变高
    while(PulseIn); //等待INT0再变低
    TR0 = 0; // 停止定时
    PulseCount = TH0; // 读计数结果 TH0
    PulseCount <<= 8; // 左移 8 位至结果高字节
    PulseCount |= TL0; // 读 TL0, 16 位计数值保存到变量 PulseCount
    while(1);
}

 所以最后我给出的设计图纸是这样的:

 图纸小有错误,比较器的上拉电阻忘记画了|||

然后给一下我main函数的主要部分吧:

#include <reg52.h>
#include <stdio.h>
#include <string.h>  
typedef unsigned char u8;
typedef unsigned int u16;
u16 pulse_w=0;
sbit output=P1^0;
sbit in=P3^2;
void main(){
    while(1){
	    pulse_w=0;
	    init();
	    output=1; 
	    delay_25584us();
	    output=0;
	    TR0=1;//启动定时
	    while(!in);//等待高电平
	    while(in);//等待低电平
	    TR0=0;//停止定时
	    pulse_w=TH0;
	    pulse_w<<=8;
	    pulse_w|=TL0;
	    display();
	    delay_25584us();
    }
}

我编程能力也不算出类拔萃,写得当然有不合理的地方,大家酌情借鉴(狗头保命)

完整的设计文件我过几天放一个链接吧!感谢大家花时间阅读完毕!!

最后,吐槽一下电设真得不易!!!

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值