低成本宽动态范围数据采集电路设计报告.docx
《低成本宽动态范围数据采集电路设计报告.docx》由会员分享,可在线阅读,更多相关《低成本宽动态范围数据采集电路设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
低成本宽动态范围数据采集电路设计报告
组号:
006
低成本宽动态范围数据采集电路设计报告
2012年秋季西南交通大学大学生电子设计竞赛设计报告
微软用户
目录
一、摘要……………………………………………………2
二、系统方案………………………………………………2
三、理论分析与设计………………………………………2
3.1峰值检测电路设计……………………………………2
3.2阶码比较电路设计……………………………………3
3.3阻抗匹配滤波电路设计………………………………4
3.4程控放大电路设计……………………………………4
四、电路与程序设计………………………………………6
4.1总体电路………………………………………………6
4.2工作流程………………………………………………6
五、测试方案与测试结果…………………………………7
5.1调试方法与仪器………………………………………7
5.2测试数据完整性………………………………………7
5.3测试结果分析…………………………………………7
六、附件……………………………………………………8
6.1完整电路原理图………………………………………8
6.2重要的源程序…………………………………………9
一、
摘要
低成本宽动态范围数据采集电路包括输入信号阻抗变换电路及低通滤波电路、浮点放大电路、A/D转换电路、时序控制电路及单片机系统。
我们小组在自己分析设计后将电路分为四个模块制作,分别是峰值检测电路、阶码比较电路、阻抗匹配滤波电路和程控放大电路,方便电路的问题检测和修改调试。
在使用学校提供的MSP430LauchPad单片机学习板的同时,我们用热转印法制作实验所需PCB,焊接实验所需的器件,保证数据采集电路的低成本。
二、系统方案
传感器输出的信号经过低通滤波滤去高频噪声,然后进行浮点放大,得到阶码,放大后的信号进入A/D转换器,得到尾码,最后将阶码和尾码一并送入单片机MSP430。
三、理论分析与设计
3.1峰值检测电路设计
峰值检测电路(PKD)目的是对输入信号峰值进行提取,其中,
。
为实现电路功能,电路输出值会一直保持不变,直到一个新的更大峰值出现或电路复位。
图1峰值检测电路图
3.2阶码比较电路设计
电路由两个四电压比较器LM339构成的8路比较器在10-4优先编码器编码后产生阶码,形成阶码比较电路。
对于LM339,当其“+”端电压高于“-”端时,输出管截止,输出端处于开路(高电位)状态;当它的“-”端电压高于“+”端时,输出管饱和,输出端输出低电位。
当此四电压比较器两端相差10mV时,输出状态就能可靠地转换为另一状态。
LM339在弱信号处理时比较理想,其输出端相当于一只不接集电极电阻的晶体三极管,在使用时输出端到正电源一般需接一只电阻(上拉电阻3—15K)。
下表显示了电压与增益比较器的输出、编码结果和相应的放大倍数:
八路比较输出
编码器输出
放大倍数
00000000
0000
1
00000001
0001
2
00000011
0010
4
00000111
0011
8
00001111
0100
16
00011111
0101
32
00111111
0110
64
01111111
0111
128
11111111
1000
256
表一对八路比较输出编码产生的阶码和相对应的程控放大倍数
标注:
是输入信号(待比较信号),
是参考电压(门限电压),当
>
时,输出高电平
。
具体电路图如下:
图二阶码比较电路图
3.3阻抗匹配滤波电路设计
首先是阻抗匹配的考虑,如果信号源的输出阻抗与放大电路的输入电阻相比不能忽略,则需要调理电路,将高阻信号源输出的信号转变成低内阻信号后,再送至下级放大电路放大。
具体电路图如下:
图三阻抗匹配滤波电路图
3.4程控放大电路设计
设计时,通过观察电路产生的正弦波、方波是否可用来判断AD637等有效值芯片是否为程控增益放大器。
计算过程如下:
已知:
级联最大增益
最小分辨值:
动态测量范围:
PGA放大倍数
由题目条件:
1.A/D转换器分辨率不低于8位(要求低成本),采集电路整体动态范围为96dB;2.输入电压为正弦波,频率20Hz~2kHz,幅值100mV~2.5V可调。
因此,系统能分辨的最小数值
为:
系统动态测量范围
为:
若AD为8位,则
具体电路图如下:
图四程控放大电路图
四、电路与程序设计
4.1总体电路
系统总体框图如下:
图五系统总体框图
4.2工作流程
软件部分采用模块化程序设计方法,整个系统工作的流程如图六。
系统上电即执行初始化程序,进行数据采集并将采集的结果暂存于数据缓冲区内,当采集的数据达到要求的点数时,系统停止工作,直到下一个指令传递给系统。
图六工作流程图
五、测试方案与测试结果
5.1调试方法与仪器
调试方法:
将实验电路板和电源、函数信号发生器和示波器连接起来,首先,单独测试各个模块的电压和显示波形图,观察结果并分析。
当实验电路的四个模块——峰值检测、阶码比较、阻抗匹配滤波和程控放大电路都能正常独立工作时,连接四个模块构成实验要求的宽动态范围数据采集电路,观察液晶显示器的电压数值和示波器的波形图,并和理论值相比较,适当调试电路以符合要求。
调试电路的主要仪器有DF1731SB3A(直流稳压电源,提供±12V电压和﹢5V电压)、DG2041A(函数信号发生器)和TDS1012B-SC(数字存储示波器)。
5.2测试数据完整性
下表为测试所得数据:
输入电压/V
阶码
编码输出
输出电压/V
2.300
1
0000
2.3004005
1.000
2
0001
1.0201010
0.500
4
0010
0.4998763
0.250
8
0011
0.2499865
0.130
16
0100
0.1298374
0.050
32
0101
0.0489687
0.030
64
0110
0.0293878
0.015
128
0111
0.0152092
0.006
256
1111
0.0059879
表二实验测试数据表
5.3测试结果分析
由数据的变化可以看出,此时采集的恰好是方波信号由高电平跳变到0的部分,电压由2.3004005急剧减小,当电压减小到0.0059879时,若不加浮点放大电路,系统能分辨的最小电压为0.001,因此这个点的采集结果精度非常低,然而加了浮点放大电路之后,系统可分辨的最小电压是0.0000095,因此的电压可以被比较准确地分辨出来,说明系统进行浮点放大后获得了较宽的动态范围。
六、附件
6.1完整电路原理图
图七完整电路图
6.2重要的源程序
/***********************内部基准电压2.5V*****************************/
#include"msp430g2553.h"
chara[]="V";
chartable[]="TheVoltageis";
intj;
unsignedcharbei;
unsignedintresults[16];
unsignedintaverage,data;
doubleb,c;
voiddelay(intt)
{
ints=500;
for(;t>0;t--)
{
for(;s>0;s--)
{
;;
}
}
}
voidwrite_com(charcom)
{
P1OUT&=~(1<<5);//rS=0;
P1OUT&=~(1<<6);//RW=0;
P1OUT&=~(1<<7);//en=0;
P1OUT&=~(1<<0);//
delay(8);
P2OUT=com;
delay(8);
P1OUT|=(1<<7);//en=1;
delay(8);
P1OUT&=~(1<<7);//en=0;
}
voidwrite_data(chardt)
{
P1OUT|=(1<<5);//rs=1;
P1OUT&=~(1<<6);//rw=0;
P1OUT&=~(1<<7);//en=0;
delay(8);
P2OUT=dt;
delay(8);
P1OUT|=(1<<7);//en=1;
delay(8);
P1OUT&=~(1<<7);//en=0;
}
voidinitial_lcd(void)
{
delay(20);
write_com(0x38);
delay(15);
write_com(0x0c);
delay(15);
write_com(0x06);
delay(15);
write_com(0x01);
}
voidLCD_Disp(charx,chary,char*character)
{
charxtemp;
switch(x)
{
case0:
xtemp=0x80+y;break;
case1:
xtemp=0xc0+y;break;
default:
break;
}
write_com(xtemp);
while(*character!
=0)
{
write_data(*character);
character++;
}
}
voidmain(void)
{
char*pa;
pa=a;
WDTCTL=WDTPW+WDTHOLD;//StopWDT
P2SEL=0x00;
P2DIR|=0xff;//SetP1.0tooutputdirection
P1DIR|=0xE0;
initial_lcd();//LCD初始化
ADC10CTL0=SREF_1+ADC10SHT_3+MSC+REFON+ADC10ON+ADC10IE+REF2_5V;//SREF_1+REFON+REF2_5V表示使用内部参考电压2.5v
ADC10CTL1=CONSEQ_2;
__enable_interrupt();//Enableinterrupts.
TACCR0=30;//DelaytoallowReftosettle
TACCTL0|=CCIE;//Compare-modeinterrupt.
TACTL=TASSEL_2|MC_1;//TACLK=SMCLK,Upmode.
LPM0;//Waitfordelay.
TACCTL0&=~CCIE;//DisabletimerInterrupt
__disable_interrupt();
ADC10CTL1=INCH_0;//inputA1
ADC10AE0|=0x01;//PA.1ADCoptionselect
LCD_Disp(0,0,table);
for(;;)
{
ADC10CTL0|=ENC+ADC10SC;//Samplingandconversionstart
__bis_SR_register(CPUOFF+GIE);//LPM0,ADC10_ISRwillforceexi
bei=P1IN&0X1E;
data=average;
switch(bei)
{
case0x00:
data>>=0;break;
case0x02:
data>>=1;break;
case0x04:
data>>=2;break;
case0x06:
data>>=3;break;
case0x08:
data>>=4;break;
case0x0a:
data>>=5;break;
case0x0c:
data>>=6;break;
case0x0e:
data>>=7;break;
case0x18:
data>>=8;break;
default:
break;
}
c=((double)data/1024)*2.5;
a[0]=((longint)c%10+0x30);
a[1]=0x2e;
a[2]=((longint)(c*10)%10+0x30);
a[3]=((longint)(c*100)%10+0x30);
a[4]=((longint)(c*1000)%10+0x30);
a[5]=((longint)(c*10000)%10+0x30);
a[6]=((longint)(c*100000)%10+0x30);
a[7]=((longint)(c*1000000)%10+0x30);
a[8]=((longint)(c*10000000)%10+0x30);
a[9]=((longint)(c*1000000000)%10+0x30);
LCD_Disp(1,0,pa);
}
}
//ADC10interruptserviceroutine
#pragmavector=ADC10_VECTOR
__interruptvoidADC10_ISR(void)
{
staticunsignedcharindex=0;
results[index++]=ADC10MEM;
if(index==16)
{
unsignedchari;
average=0;
for(i=0;i<16;i++)
average+=results[i];
average>>=4;
index=0;
}
__bic_SR_register_on_exit(CPUOFF);//ClearCPUOFFbitfrom0(SR)
}
#pragmavector=TIMER0_A0_VECTOR
__interruptvoidta0_isr(void)
{
TACTL=0;
LPM0_EXIT;//ExitLPM0onreturn
}