|
基于aduc842瞬态波形存储器 作者:杨程泽
刘强 谢婷 地址:华中师范大学物理学院电子信息科学与技术专业 摘 要
本作品由增益放大与控制模块、极性转换模块、触发以及以aduc841/
aduc831为核心的单片机最小系统4个部分构成,由单片机实现控制与波形存储回放功能。 一、方案论证与设计 1. 增益放大与测量方案 方案一:将输入信号经放大后送入窗口比较器,上限1V,下限0.1V。若小于0.1V,则通过单片机(p0.2=1,p0.3=0)控制增益放大电路将信号放大10倍,再输入到控制模块与0.1V和1V比较,若仍小于0.1V,则通过单片机控制增益放大电路将信号放大100倍;若大于1V,则通过单片机(在一个
周期内出现p0.2=1,p0.3=0;p0.2=1,p0.3=1;p0.2=0,p0.3=1这几种情况)控制增益放大电路将信号衰减10倍(当前信号已经放大100倍或10倍),如果信号放大1倍,则衰减为零,阻止通过;若在0.1V和1V之间,则通过单片机(在一个
周期内出现p0.2=1,p0.3=0;p0.2=1,p0.3=1这两种种情况)控制增益放大电路将信号无增益的输出。通过此电路使输出信号幅度控制在0.2V至2V之间。
方案二:将放大后的信号其中一路转换为直流信号,再将此信号给窗口比较器,上限2V,下限0.2V。若小于0.2V,则通过单片机(p0.2=1,p0.3=0)控制增益放大电路将信号放大10倍,再输入到控制模块与0.2V和2V比较,若仍小于0.2V,则通过单片机控制增益放大电路将信号放大100倍;若大于2V,则通过单片机(p0.2=0,p0.3=1)控制增益放大电路将信号衰减为零,阻止通过;若在0.2V和2V之间,则通过单片机(p0.2=1,p0.3=1)控制增益放大电路将信号无增益的输出。通过此电路使输出信号幅度控制在0.2V至2V之间。
对以上两种方案进行比较,方案一虽在软件控制方面稍繁,但也易于实现,而方案二在将交流变为直流的硬件方面较为复杂,故采用方案二。 2.
采样方案
方案一:通过触发模块提供给单片机一个周期信号,通过软件实现定时采样。
方案二:先将信号经过100倍频之后,送给单片机作为采样触发信号,也就是说每个周期固定采100个点。但是同步回放频率难以控制。
对以上两种方案进行比较,方案二虽然在采样方面比较精准,但回放难以实现,而方案一在两方面均可兼顾。故采用方案一。 二、原理分析与硬件电路图
根据题目要求,该调理系统包括增益放大与控制模块、极性转换模块、触发3个模块,由于3个模块相对独立,其中增益放大与控制模块是重点。以下分别对其进行原理分析与电路设计。 1.增益放大与循环取样模块 (1)原理分析 设输入信号幅度为A,将输入信号输入循环取样模块与0.1V和1V比较:若小于0.1V,则通过单片机控制增益放大电路将信号放大10倍,再输入到控制模块与0.1V和1V比较,若仍小于0.1V,则通过单片机控制增益放大电路将信号放大100倍;若大于1V,则通过单片机控制增益放大电路将信号衰减10倍(当前信号已经放大100倍或10倍),如果信号放大1倍,则衰减为零,阻止通过;若在0.1V和1V之间,则通过单片机控制增益放大电路将信号无增益的输出。通过此电路使输出信号峰峰值控制在0.2V至2V之间。 (2)原理电路 ①循环取样模块。本电路采用专用比较器LM339,使用三端稳压管TL431提供2.5V的稳压源,通过调节滑动变阻器使LM339的6脚和5脚分别得到0.1V和1V的电平。将取样信号送给由LM339构成的窗口比较器,可以从1脚和2脚得到随信号变化的TTL电平,从而将比较结果送给单片机,以便单片机做出判决,发出控制信号。该增益控制模块电路的基本原理如下图所示。
②增益控制模块。根据单片机发出的控制信号送给CD4051,选择X0,X1,X2,X3导通,从而改变运放U2B的放大倍数。通过滑动变阻器的微调使放大倍数达到指标(1倍、10倍、100倍)。该增益放大模块电路的基本原理如下图所示。
2.极性转换模块 (1)原理分析 将输入信号通过极性转换模块(含有一加法器和一提供稳定电压的稳压源),使信号幅度均抬高1.25V,从而将输入的双极性信号转换成单极性信号输出。 (2)原理电路 使用三端稳压管TL431向TL084的正极提供1.25V的稳压源,由TL084组成加法器,使输入信号与1.25V相加。该极性转换模块电路的基本原理如下图所示。
3.触发模块 (1)原理分析 将输入信号通过触发模块(含有比较器),一周期的输入信号得到一上升沿触发。 (2)原理电路 将输入信号接入比较器LM339的正极,负极接入一可通过滑动变阻器微调的电压,通过与8脚电压比较,得到一个周期与输入信号相同的方波,作为触发信号送给单片机。该触发模块电路的基本原理如下图所示。
三、软件设计与流程
四、总结 在这个电路中,通过模拟处理模块和单片机配合实现对输入信号的自动放大,当输入信号在0.002V至2V之间, 使单片机采样信号始终保持在0.2V至2V之间。同时利用ADuC842内部的AD和DA对信号采样并同步输出, 在这个过程中,把采样值保存在数组中,通过按键实现回放。 附件: #include
"zlg7290b.h" //SCLK--SCL
MOSI--SDA INT--INT0 #define
uchar unsigned char #define
uint unsigned int bit
con_caiji=0; bit
tongb_hf=0; sbit
P0_0=P2^0; sbit
P0_1=P2^1; sbit
P0_2=P0^2; sbit
P0_3=P0^3; unsigned
int k,tb_shuzu; unsigned
int j=0,i=0; unsigned
char caiji_2=100; unsigned
char panduan,panduan1; unsigned
int xdata tongbu[4000]={0}; /****************************************** 函数:void
DispValue(unsigned char x, unsigned char dat) 功能:通过ZLG7290
显示一个字符型数据 说明:显示范围:0--255 参数:x,显示起始位置。dat,需要显示的数据 ******************************************/ void
DispValue(unsigned char x, unsigned char dat) {
unsigned char d;
d = dat / 10;
ZLG7290_Download(x,0,0,d);
d = dat - d * 10;
ZLG7290_Download(x+1,0,0,d); } /****************************************** 函数:unsigned int
ADC(unsigned char channel) 功能:控制单片机的AD的工作 说明:无 参数: channel,AD通道选择 ******************************************/ unsigned
int ADC(unsigned char channel) {
ADCCON2 = channel; //选择通道
SCONV = 1; //启动转换
while(SCONV); //等待转换完成
return((ADCDATAH & 0x0F) * 256 + ADCDATAL);
} /****************************************** 函数:void
DAC1(unsigned int da_data) 功能:控制单片机DA1的工作 说明:无 参数:da_data,AD转换的数字量 ******************************************/ void
DAC1(unsigned int da_data)
{
DAC1H = da_data >> 8;
DAC1L = da_data; } /****************************************** 函数:INT0_SVC() 功能:ZLG7290
键盘中断服务程序 说明:中断触发方式选择负边沿触发,
因此不必等待中断请求信号恢复为高电平 参数:无 ******************************************/ void
INT0_SVC() interrupt 2 {
unsigned char KeyValue=1;
unsigned char RepeatCnt=0;
unsigned char FunctionKey=0;
EA=0;
FunctionKey=gets2(ZLG7290_FunctionKey);
//读功能计数器的值
KeyValue=gets2(ZLG7290_Key);
//读键值
RepeatCnt=gets2(ZLG7290_RepeatCnt);
//读连击计数器
DispValue(0,KeyValue);
//显示连键值
if(KeyValue==1)
{
tongb_hf=0;
caiji_2=0;
}
if(KeyValue==2)
{
tongb_hf=1;
j=0;
}
P0_0=P0_0;
P0_1=P0_1;
EA=1; } /****************************************** 函数:caiji_data() 功能:数据采集触发 说明:无 参数:无 ******************************************/ void
caiji_data() interrupt 0 {
EA=0;
caiji_2++;
panduan++;
panduan1++;
if(caiji_2==4)
{
con_caiji=1;
i=0;
}
if(caiji_2==60)
{
con_caiji=0;
tb_shuzu=i;
}
if(caiji_2>=200)
{
caiji_2=80;
}
if(panduan==30)
{
panduan=0;
}
EA=1; } /****************************************** 函数:ad_start() 功能:AD转换,同时DA进行,实现同步输出 说明:无 参数:无 ******************************************/ void
ad_start() interrupt 1 {
uint temp_data;
EA=0;
TH0=(65536-1800)/256;
TL0=(65536-1800)%256;
temp_data = ADC(5);
if(tongb_hf==0)
{
DAC1(temp_data);
if(con_caiji==1)
{
tongbu[i]=temp_data;
i++;
}
}
if(tongb_hf==1)
{
DAC1(tongbu[j]);
j++;
if(j==tb_shuzu)
{
j=1;
}
}
EA=1; } void
main() {
uint k;
uchar x1,x2,x3,x4;
uchar fanda;
SystemInit();
//7290复位
PLLCON = 0x00;
//for 842
I2CCON=0xa8;
//I2C初始化
I2C_Init();
//I2C初始化 7290用
ClearAll();
//7290全部清除
ADCCON1 = 0xBC;
//ADC上电,内部基准,clk 8分频
DACCON = 0x16;
//DAC采用内部ref做基准
TMOD=0x01;
//定时器0方式1
TH0=(65536-1000)/256;
TL0=0;
IT0 = 1;
//负边沿触发中断
EX0 = 1;
//允许外部中断
EA = 1;
//开中断
ET0=1;
//开c0的中断
EX1=1;
//开中断 int1
TR0=1;
//启动c0记时
PT0=1;
//同步回放中断优先
k=5000;
while(k--)
{
P2=0x00;
}
while(1)
{
while(panduan!=28)
{
if(P0_3!=1)
{
x1++;
}
if(P0_2!=0)
{
x2++;
}
}
if(panduan==29)
{
x3=x1;
x4=x2;
x1=0;
x2=0;
}
if((fanda==10)&&(x4==0)&&(x3==0))
{
P0_0=1;
P0_1=0;
fanda=100;
}
if(P0_2==1)
{
P0_0=0;
P0_1=0;
}
if(x4==0&&x3==0)
{
if(P0_0==1&& P0_1==0)
{
P0_0=1;
P0_1=0;
}
else
{
P0_0=0;
P0_1=1;
fanda=10;
}
}
} } |