PCF8591DA模拟小信号

发布时间:2014-07-01 10:13:47   来源:文档文库   
字号:

课程设计报告

课程名称: 课程设计

目: PCF8591产生小信号


摘要

本文主要介绍利用PCF8591芯片DA转换产生小信号(100毫伏以内),然后经LM358放大滤波,最后再用ADC0809芯片AD转换将放大后信号用单片机显示。

DA产生的小信号可用来模拟霍尔线性传感器产生的小信号。即本设计可用来模拟磁场检测

关键词:PCF8591小信号放大滤波ADC0809


一、绪论

1.2 磁场检测系统发展概况

最早的磁场探测器已有2000多年的历史,通过感应地球磁场辨识方向或为舰船导航。随着现代科技的进步,磁场传感器的应用越来越广泛,磁场传感技术向着高灵敏度、高分辨率、小型化以及和电子设备兼容的方向发展。文献[14]等传感器专著对各类传感器进行了论述,但关于磁场传感器的篇幅不多,介绍不全面。本文在广泛查阅国内外文献的基础上,对磁场传感器进行了系统总结。从应用的观点出发,根据磁场感应范围将磁场传感器分为三类:低强度磁场、中强度磁场及高强度磁场传感器[5]

低强度磁场传感器通常检测1μG以下的磁场;中强度磁场传感器通常检测1μG10G磁场;高强度磁场传感器检测范围通常在10G以上。

1.3 课题研究的目的和意义

磁场强度是工业检测的重要手段,利用检测磁场强度检测转速,利用磁场处理水研究,利用检测磁场降低人类血液黏度等。磁场已经应用于各行各业中,所以其强度的检测也显得很有市场。本设计原理可将微弱的磁场变化信号放大,并让显示发生变化,变化的电压对应磁场强度的变化值。

通过制作本课程设计,也让自己更加灵活的运用单片机以及信号处理方面的知识,理论与实际紧密结合,增强对理论的分析能力。

本课题基于单片机的磁场强度检测系统设计,系统维护简单,工作应用简单。因此,本课题是非常有意义的。


二、系统设计

2.1 设计任务

1、用DXP软件画出系统原理图;

2、将原理图导入PCB,制作PCB

3、编写简单程序,对焊完的板子进行简单调试,检查数码管、蜂鸣器等处是否有问题,以及检查整体电路是否缺失、短接;

4、编写程序,实现模拟信号的产生,信号滤波,信号放大,信号AD转换处理等功能。

5、将程序烧进单片机,对实物进行调试,最后完善功能。

2.2 系统设计思路

充分设计利用STC89C5240个引脚,节省其他硬件的使用,主要实现以下功能:

1. 当系统上电时,数码管显示的是模拟信号经放大后的电压值。

2. 通过按键可改变(增加或减少)产生模拟信号的大小。

3. 长按按键1可显示增加的磁场强度单位个数。

4. 长按按键2可让模拟信号产生变化的锯齿波。

5. 对模拟信号进行放大,数码管实时显示。

2.3 系统设计框图

1 系统设计框图


三、硬件设计

系统硬件分为7个模块:

1主单片机STC89C52部分,主控制芯片

2DA转换部分采用的是PCF8591芯片,输出信号为小信号(单个变化6MV多一点,整体变化60MV)变化。

3信号放大模块采用LM358运放芯片。

4AD转换采用ADC0809芯片。

5按键采用四脚轻触开关。

6显示模块采用四位共阴数码管。

7报警模块采用5V有源蜂鸣器。

3.1 DA模块

此模块采用的是PCF8591芯片来实现,原理如下图2所示:

2 DA转换模块

PCF8591是具有I2C总线接口的8A/DD/A转换器。有4A/D转换输入,1D/A模拟输出。这就是说,它既可以作A/D转换也可以作D/A转换。A/D转换为逐次比较型。引脚图如图2所示。电源电压典型值为5V

AIN0AIN3:模拟信号输入端。

A0A3:引脚地址端。

VDDVSS:电源端。(2.56V

SDASCLI2C总线的数据线、时钟线。

OSC:外部时钟输入端,内部时钟输出端。

EXT:内部、外部时钟选择线,使用内部时钟时EXT接地。

AGND:模拟信号地。 AOUTD/A转换输出端。

VREF:基准电源端。

此模块需要说明的是在PCF8591VREF引脚接了一个10K的滑动变阻器,其目的是用来改变其基准电压,从而提高其DA输出的信号的最小分辨率。其中AOUT引脚输出产生的模拟信号,接一了一个10UF电容用来滤除其中的噪声信号,电容容值的选取根据信号频率的大小,本设计产生连续自动变化的模拟小信号时其频率大约为10HZ,因此,其叠加在上面的噪声会比10HZ要高,根据经验因此选用了10UF电容。

3.2 信号放大滤波模块

此模块采用LM358芯片构成二阶低通滤波电路实现,其原理如下图3所示:

3 信号放大滤波模块

此二阶低通滤波电路中的电阻与电容值根据信号频率选取,具体内容此处不详述。下面三个排针引出的分别为模拟的最初小信号输出,一级放大后的输出,二级放大后的输出。第一级放大倍数为2.5倍,这是因为考虑到二阶低通滤波器增益在2.5倍效果较好,一般不能超过3倍,第二级放大电路放大41倍,所以总的放大倍数为2.5*41=102倍。

其中OUT2输出端接了一个电阻和发光二极管,当DA输出自动变化的小信号经放大后,其灯将闪烁。

3.3 AD模块

此模块采用的是ADC0809芯片实现,具体原理如下图4所示:

4 AD转换模块

3.4 主单片机STC89C52部分

单片机晶振:12MHZ,STC89C52;电源:VCC=5V,接地GND及复位电路。如图5所示:

5 单片机最小系统

RST引脚是复位信号输入端,高电平有效。采用上电加按钮复位,因为本系统设计考虑到该系统比较重要,所以除了采用上电复位的方式外,应该还有按钮复位备用复位方式以防止系统死机时能。

3.5 按键模块

6 按键模块

本模块有两个按键,其中K1表示信号增加,当按下该键时,发出相应控制信号,使信号发生器信号输出增加,增加的一个幅度与VREF的基准电压有关,此处经测量增加大约3.5mv,经放大102倍,显示将增加0.35V

3.6 显示模块

在应用系统中,设计要求不同,使用的LED显示器的位数也不同,因此就生产了位数,尺寸,型号不同的LED显示器供选择,在本设计中,选择4位一体的数码型LED显示器,简称“4-LED”。本系统中前三位显示电压的整数位,最后一位显示转速的小数位。

4-LED显示器引脚如图7所示,是一个共阴极接法的4LED数码显示管,其中abcefg4LED各段的公共输出端,1234分别是每一位的位数选端,dp是小数点引出端,4位一体LED数码显示管的内部结构是由4个单独的LED组成,每个LED的段输出引脚在内部都并联后,引出到器件的外部。

7 四位共阴数码管

在本设计中,数码显示的为小信号经二级放大后的电压值,前三位为有效数值,最后一位显示的是字符“V”。当然按键切换模式时,显示也会发生相应的变化。

3.7 报警模块

该电路中蜂鸣器用的是有源蜂鸣器,如图8蜂鸣器驱动模块:

8 蜂鸣器连接图

3.8 整体电路

9 整体电路图

此原理图采用Altium Designer软件设计,在保准正确性的前提尽量使布局合理,美观。其中大部分分连线采用的都网络标号的形式来连接,这样省空间,有时也更一目了然。


四、软件设计

根据上述硬件及框图设计,设计出软件流程图,如图6所示:

10 模式1和模式2软件流程图

其中长按住K2键即可实现模式的切换,在模式2下,自动变化的小信号经放大后到驱动的LED灯会闪烁,因为数值在不断变化,所以数码管显示也是在变化。

再按住K2键软件将又切换回模式1,在模式1下,其信号的增加或者减少只能通过按键来实现。

软件设计中还有一个中断程序,其主要是为了给ADC0809CLK引脚提供时钟脉冲。


五、系统仿真与调试

5.1 Proteus仿真

调试与仿真图如图11、图12所示:

11 整体仿真

12 仿真示波器显示

从仿真上示波器的显示来看,最后经放大后的波形上端有一点被截止了,但实际板子测得的波形没有失真,所以程度调整为适合实际情况。

5.2 硬件调试

实物图做的是PCB板,PCB图和实物图如下图所示

13 实物图正面、反面

由于一开始画PCB时有个封装弄错了,导致线路有些地方有点小错误,然后加上ADC0809的引脚本身就很不好连线,所以从实物图的背面可以看到有几根飞线,在设计PCB是我也尽量避免飞线的出现,但板子较小,只有7CM*9CM,所以最终还是有了几根飞线。

在正面图中,下面左边的按键为K1键,右边按键为K2键。

14 PCB设计图


六、设计总结与心得体会

本次设计从选定方案到最终实施花了较长时间,因为涉及到的内容较多。包括DA模拟,信号放大,信号滤波,AD转换等。其中在滤波器的设计中花的时间最多,因为以前对这一块接触得较少,但通过这次课程设计后感觉自己收获不少,学会了怎样对模拟电路进行分析,也更加熟悉了仿真软件的作用,其实仿真如果用得好对学电路知识是有很大的帮助的。比如,在滤波电路中,对电容的选取不太懂,这时可以利用仿真改变电容容值大小,然后观察对波形有什么影响,我觉得这一点对实际分析电路是很有帮助的,因为有时理论计算出电容,电阻值,但有时在实际电路中包含了各种噪声,这时滤波器中的电阻电容可能还得根据实际情况来调整。

本次课设虽然圆满完成,但这之中的过程还是很值得自己去思考,在设计PCB时,有些问题考虑得不周全,以至于后面实际板子做出来后才发现有东西要改,这样就造成了很多的麻烦,因此也就要浪费更多的调试时间。所以在花原理图时对一些细节就要求考虑全面,要做到先发现错误,先改正错误。并且做电路板是一件烦琐的事情,对这整个过程不能嫌麻烦,一旦有这种排斥心情是很难将这些事情做好的。

通过这次设计,我对数字电路设计中的逻辑关系等有了一定的认识,对以前学的数字电路又有了一定的新认识,温习了以前学的知识,就像人们常说的温故知新,但在设计的过程中,遇到了很多的问题,有一些知识都已经不太清楚了,但是通过一些资料又重新的温习了一下数字电路部分的内容。在这次设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法我们更好的理解知识,所以在这里非常感谢帮助我的同学。


七、参考文献

1】彭伟 单片机C语言程序设计实训100 电子工业出版设 2009

2】阎石 数字电子技术基础 高等教育出版社2006

3】李朝青 单片机原理及接口技术 北京航空航天大学出版 2006

4】张国雄 测控电路-4 机械工业出版社 2011


附录一 源程序

#include

#define uint unsigned int

#define uchar unsigned char

#define SCL_SET SCL=1 //DA

#define SCL_CLR SCL=0 //DA

#define SDA_SET SDA=1 //DA

#define SDA_CLR SDA=0 //DA

#define AddWr 0x90 //写数据地址

sbit K1=P1^4; //按键增加送入DA的数字量

sbit K2=P1^5; //按键减少送入DA的数字量

sbit SCL=P1^0; //DA时钟脉冲

sbit SDA=P1^1; //DA双向输入输出数据端

sbit ST=P1^2; //ADC0809各引脚

sbit EOC=P1^3;

sbit OE=P1^7;

sbit CLK=P2^0;

sbit beep=P1^6; //蜂鸣器

sbit P07=P0^7; //数码管小数点

bit model=0; //波形发生模式,通过K2来改变,为0时按键增加光强,为1时锯齿波变化

uchar juchi_data=0; //锯齿波自动增加,减少数字量

uchar KEY_Data; //送给DA的数字量

uchar delaytime; //按键长延时时间

uint num[1]; //用来存AD转换后小数点后第34位的数值,精确四舍五入

uchar weima[4]; //存储数码管四位数,送显示的只有012,最后一个3用来判断四舍五入

uchar code duanma[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3e};

//数码管段码显示 0 1 2 3 4 5 6 7 8 9 V

void delayus(uint cnt) //延时1US

{

while(--cnt);

}

void delayMS(uint z) //延时1MS

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void DA_start()

{

SDA_SET;

delayus(1);

SCL_SET;

delayus(5);

SDA_CLR;

}

/*

void DA_stop() //本程序没用到此函数

{

SDA_CLR;

delayus(1);

SCL_SET;

delayus(5);

SDA_SET;

}

*/

void DA_ack()

{

SDA_CLR;

SCL_SET;

delayus(1);

SCL_CLR;

}

void DA_send(uchar Data)

{

uchar i=0;

uchar temp=0;

temp=Data;

for(i=0; i<8; i++)

{

SCL_CLR;

delayus(1);

if(temp&0x80) SDA_SET;

else SDA_CLR;

delayus(1);

SCL_SET;

delayus(1);

temp<<=1;

}

SCL_CLR;

}

void DAC(uchar light)

{

DA_start();

DA_send(AddWr);

DA_ack();

DA_send(0x40); //写入控制位,使能DAC输出

DA_ack();

DA_send(light);

DA_ack();

// DA_stop();

}

uchar ADC()

{

uchar value;

ST=0; OE=0; ST=1; delayus(1); ST=0; //启动转换

delayus(2);

while(EOC==0); //等待转换结束

OE=1; //允许输出

delayus(1);

value=P3;

OE=0;

return value;

}

void display()

{

uchar delaytime=8;

uint AD_value;

AD_value = (ADC()*1.0/255)*500-13;

weima[0] = AD_value%10; //因此可以认为小数后面第二位是AD的个位数(第三位数)

weima[1] = AD_value/10%10; //小数点后面的第一位是adc的十位(第二位数)

weima[2] = AD_value/100; //个位为adc的百位(第一位数)

P2 =0xef; //送第一位

P0=duanma[weima[2]];

P07=1; //显示小数点

delayMS(delaytime);

P2 = 0xdf; //第二位

P0 = duanma[weima[1]];

delayMS(delaytime);

P2 = 0xbf; //第三位

P0=duanma[weima[0]];

delayMS(delaytime);

P2 = 0x7f; //第四位

P0=duanma[10];

delayMS(delaytime);

}

void KEY()

{

delaytime=0;

if(K1==0)

{

delayMS(5);

while(K1==0) //这里进行长延时,实现长按时出现另一功能

{

delaytime++;

delayMS(10);

if(delaytime>=200) //长按超过2S

{

while(K1==0)

{

P2=0Xef;

P0=duanma[KEY_Data];

}

}

}

KEY_Data++; //让送进去的数加1

}

if(K2==0)

{

delayMS(5);

KEY_Data--; //让送进去的数减1

}

}

void BEEP()

{

uchar i=3;

if((weima[2]>=3))

while(i--)

{

beep=~beep;

delayMS(5);

}

beep=1;

}

void Init_interrupt()

{

TMOD=0X01;

TH0=(65536-100)/256;

TL0=(65536-100)%256;

IE=0X82;

TR0=1;

}

void Amplitude() //锯齿波产生函数

{

DA_send(juchi_data); //取地址

DA_ack();

juchi_data++;

if(juchi_data == 12 )

juchi_data = 0;

}

void main()

{

Init_interrupt();

DAC(0);

P07=1;

while(1)

{

while(model==0)

{

DA_send(KEY_Data); //发送数字量

DA_ack();

KEY();

while(K2==0) //这里进行长延时,实现长按时出现另一功能

{

delayMS(10);

delaytime++;

if(delaytime>=200) //长按超过2S

{

model=!model;

while(K2==0)

delayMS(10);

}

}

BEEP();

display();

}

while(model==1)

{

Amplitude();

while(K2==0) //这里进行长延时,实现长按时出现另一功能

{

delayMS(10);

delaytime++;

if(delaytime>=200) //长按超过2S

{

model=!model;

while(K2==0);

}

}

display();

}

}

}

void Timer0_INT() interrupt 1

{

TH0=(65536-100)/256;

TL0=(65536-100)%256;

CLK=~CLK;

}

本文来源:https://www.2haoxitong.net/k/doc/833a1d420b4e767f5acfcece.html

《PCF8591DA模拟小信号.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式