学林杯第二届单片机征文大赛公开评奖稿件 深圳学林电子www.51c51.com 版权所有 转载注明出处   请不要忘了:现在为你喜欢的稿件投票!
千元大奖1名:XL2000实验仪  一等奖1名:xl600实验仪  优秀奖:4名:ep51编程器全套散件  参与奖 :5名 ep51编程器pcb
作品1:征文-我是怎样开始学习电子的 山西省大同市 作品6:多功能自行车测速仪  北京大学  崔健
作品2:数字温度计的设计  杭州电子科技大学 陈智杰 作品7:带闹钟智能电子钟 深圳市天安数码城 谢玉平 
作品3:如何使自制的单片机电子钟走时精准 作者 舒新生 作品8:电话回拨服务告知装置 武汉市桥口区 詹显德
作品4:宽带数控放大器 陕西省西安通信学院 韩宏伟 作品9:单片机应用 之摩斯密码电子锁 广东省顺德  吴志光
作品5:一些事,一些情 韶关市 :冯敬锋 作品10:基于aduc842瞬态波形存储器 华中师范大学物理学院 杨程泽
作品11:基于AT89S52单片机的毫欧表电路设计 中南林业科技大学 涉外学院 郭海  

 

返回主页 给我留言 单片机教学 单片机提高 音响技术 品质技术 技术资料 软件下载 学液晶 产品介绍 如何购买

基于aduc842瞬态波形存储器

 

作者:杨程泽  刘强  谢婷

地址:华中师范大学物理学院电子信息科学与技术专业

  本作品由增益放大与控制模块、极性转换模块、触发以及以aduc841/ aduc831为核心的单片机最小系统4个部分构成,由单片机实现控制与波形存储回放功能。

 

一、方案论证与设计

 1. 增益放大与测量方案

    方案一:将输入信号经放大后送入窗口比较器,上限1V,下限0.1V。若小于0.1V,则通过单片机(p0.2=1,p0.3=0)控制增益放大电路将信号放大10倍,再输入到控制模块与0.1V1V比较,若仍小于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.1V1V之间,则通过单片机(在一个 周期内出现p0.2=1,p0.3=0;p0.2=1,p0.3=1这两种种情况)控制增益放大电路将信号无增益的输出。通过此电路使输出信号幅度控制在0.2V2V之间。

    方案二:将放大后的信号其中一路转换为直流信号,再将此信号给窗口比较器,上限2V,下限0.2V。若小于0.2V,则通过单片机(p0.2=1,p0.3=0)控制增益放大电路将信号放大10倍,再输入到控制模块与0.2V2V比较,若仍小于0.2V,则通过单片机控制增益放大电路将信号放大100倍;若大于2V,则通过单片机(p0.2=0,p0.3=1)控制增益放大电路将信号衰减为零,阻止通过;若在0.2V2V之间,则通过单片机(p0.2=1,p0.3=1)控制增益放大电路将信号无增益的输出。通过此电路使输出信号幅度控制在0.2V2V之间。

   对以上两种方案进行比较,方案一虽在软件控制方面稍繁,但也易于实现,而方案二在将交流变为直流的硬件方面较为复杂,故采用方案二。

2. 采样方案

     方案一:通过触发模块提供给单片机一个周期信号,通过软件实现定时采样。

      方案二:先将信号经过100倍频之后,送给单片机作为采样触发信号,也就是说每个周期固定采100个点。但是同步回放频率难以控制。

   对以上两种方案进行比较,方案二虽然在采样方面比较精准,但回放难以实现,而方案一在两方面均可兼顾。故采用方案一。

 

二、原理分析与硬件电路图

    根据题目要求,该调理系统包括增益放大与控制模块、极性转换模块、触发3个模块,由于3个模块相对独立,其中增益放大与控制模块是重点。以下分别对其进行原理分析与电路设计。

1.增益放大与循环取样模块

1)原理分析

   输入信号幅度为A,将输入信号输入循环取样模块与0.1V1V比较:若小于0.1V,则通过单片机控制增益放大电路将信号放大10倍,再输入到控制模块与0.1V1V比较,若仍小于0.1V,则通过单片机控制增益放大电路将信号放大100倍;若大于1V,则通过单片机控制增益放大电路将信号衰减10倍(当前信号已经放大100倍或10倍),如果信号放大1倍,则衰减为零,阻止通过;若在0.1V1V之间,则通过单片机控制增益放大电路将信号无增益的输出。通过此电路使输出信号峰峰值控制在0.2V2V之间。

2)原理电路

循环取样模块。本电路采用专用比较器LM339,使用三端稳压管TL431提供2.5V的稳压源,通过调节滑动变阻器使LM3396脚和5脚分别得到0.1V1V的电平。将取样信号送给由LM339构成的窗口比较器,可以从1脚和2脚得到随信号变化的TTL电平,从而将比较结果送给单片机,以便单片机做出判决,发出控制信号。该增益控制模块电路的基本原理如下图所示。

增益控制模块。根据单片机发出的控制信号送给CD4051,选择X0X1X2X3导通,从而改变运放U2B的放大倍数。通过滑动变阻器的微调使放大倍数达到指标(1倍、10倍、100倍)。该增益放大模块电路的基本原理如下图所示。

2.极性转换模块

1)原理分析

     将输入信号通过极性转换模块(含有一加法器和一提供稳定电压的稳压源),使信号幅度均抬高1.25V,从而将输入的双极性信号转换成单极性信号输出。

2)原理电路

    使用三端稳压管TL431TL084的正极提供1.25V的稳压源,由TL084组成加法器,使输入信号与1.25V相加。该极性转换模块电路的基本原理如下图所示。

 

 

3.触发模块

1)原理分析

     将输入信号通过触发模块(含有比较器),一周期的输入信号得到一上升沿触发。 

2)原理电路

     将输入信号接入比较器LM339的正极,负极接入一可通过滑动变阻器微调的电压,通过与8脚电压比较,得到一个周期与输入信号相同的方波,作为触发信号送给单片机。该触发模块电路的基本原理如下图所示。

 

 

 

 

 

 

 

三、软件设计与流程

 

四、总结

在这个电路中,通过模拟处理模块和单片机配合实现对输入信号的自动放大,当输入信号在0.002V2V之间,

使单片机采样信号始终保持在0.2V2V之间。同时利用ADuC842内部的ADDA对信号采样并同步输出,

在这个过程中,把采样值保存在数组中,通过按键实现回放。      

 

附件:

主程序

#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;

            }

        }

    }

}