《测控系统现代仪器设计》课程设计虚拟示波器的设计Word文档下载推荐.docx
- 文档编号:20078574
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:24
- 大小:674.81KB
《测控系统现代仪器设计》课程设计虚拟示波器的设计Word文档下载推荐.docx
《《测控系统现代仪器设计》课程设计虚拟示波器的设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《测控系统现代仪器设计》课程设计虚拟示波器的设计Word文档下载推荐.docx(24页珍藏版)》请在冰豆网上搜索。
电路工作原理如图2.1所示。
图2.1电路工作原理
2.1AT89C516RD+单片机
AT89C516RD+是Atmel公司生产的一款微处理器,该处理器共有40个管脚,4组8位I/O口P0~P4,其中P0口为双向三态I/O口,其他三组为准双向I/O口,在读管脚值前应先向管脚写1。
P0口内部无上拉电阻,使用时应外接上拉电阻,否则无法输出高电平。
引脚图如图2.2所示。
图2.2AT89C51引脚图
AT89C51支持5个中断源,分别是外部中断0、定时器0、外部中断1、定时器1和串口中断[1]。
中断优先级可配置,默认情况下5个中断为同级中断。
P3口的各脚除普通I/O口功能外都有第二功能。
P3.0是串口发送脚,P3.1是串口消息接收。
P3.2和P3.3分别是外部中断0和外部中断1的输入引脚。
外部中断支持低电平触发和下降沿触发两种模式。
定时器0有四种工作方式。
工作方式0是一个13为定时器,定时的最长时间为2^13=8192us,工作方式1为16位定时器,最长定时时间为65536us,工作方式2是8位定时器,最长定时时间为256us。
前两种工作方式在每次定时完成产生中断时都要在中断服务子程序中重新给定时器赋初值,否则从第二次开始定时器将以最长定时时间工作,而工作方式2采用的是8位自动重加载模式。
定时器初值写到TH0和TL0中,溢出后硬件会自动将TH0中的值装入TL0中,从而使定时器按原来的定时时长工作。
与用程序重装初值相比,硬件自动重装速度很快,因而定时时间更准确,所以常用于串口波特率的发生等对定时精度要求很高的场合。
工作方式3是将定时器0拆成了两个8位定时器:
TH0和TL0。
TH0被固定为一个8位定时器,并使用定时器T1的状态控制位TR1,同时占用定时器T1的中断请求源TF1,此时,定时器TH0的启动或停止只受TR1控制。
定时器1只有前三种工作方式,不支持工作方式3,其他与定时器0相同。
串口是下位机与电脑通信时非常常见的一种方式。
AT89C51支持串口通讯功能,有一个串口。
串口通讯有两种常用的电平标准:
RS232和TTL电平标准。
RS232协议中规定,-3~-15V为高电平,+3~+15V为低电平,采用的是负逻辑,电脑串口采用这种标准。
而TTL对电平标准的规定是0V为低电平,5V为高电平,单片机采用的是TTL电平标准。
所以两者之间要想正常完成通讯必须进行电平转换。
由于现在的电脑上很少还有串口接口,所以本次设计采用了USB虚拟串口的形式,将USB转换为串口,比直接采用接口进行电平转换更加方便。
这里采用的是CH340芯片进行转换,转换电路如图2.3所示。
图2.3CH340USB转串口电路
2.2模数转换
由于现实世界中存在的只能是模拟量,而计算机处理的只能是数字量。
所以要想用计算机处理信号就必须将模拟量转换为数字量,这就是模数转换(AD)。
模数转化的步骤为采样--采样保持--量化--数字化。
采样是感受外界模拟量,这一步的关键在于采样频率的确定。
根据奈奎斯特采样定律,只有采样频率大于两倍的最大信号频率时,采集到的信号才能真正反映原信号的变化[2]。
两次采样之间需要一定的时间,这段时间内认为模拟量保持不变,直到下一次采集,这个过程就是采样保持。
衡量AD转换的主要指标有分辨率、转换速率、量化误差等。
分辨率与采样位数有关。
转换速率是指完成一次从模拟转换到数字的AD转换所需的时间的倒数,要想正确完成采样,采样速率必须小于转换速率。
量化误差产生是因为模拟量是连续的,而AD的分辨率是有限的,不可能精确的表示出模拟量中的每一个值,只能取与其最接近的值。
根据不同的量化方法,量化误差通常等于量化步长或其一半。
本次设计中采用的芯片是模数转换芯片是PCF8591。
这个芯片同时具备AD和DA(数模转换)功能。
PCF8591具有4个模拟输入、1个模拟输出和1个串行I²
C总线接口,4个模拟输入可编程为单端型或差分输入,输入电压范围为2.5V-6V。
引脚图如图2.4所示。
图2.4PCF8591引脚图
AIN0~AIN3是四路模拟信号输入端,A0~A2是引脚地址端,SDA和SCL分别是I2C总线的数据线和时钟线,VREF是参考电压输入端。
芯片外部电路如图2.5所示。
图2.5PCF8591电路连接图
W1为电位器,按上图连接方式可获得0~5V的连续可调电压,从AIN0输入。
A0~A3接地,决定此器件在I2C总线上的地址为0x00。
VCC即作为芯片的供电电源,又作为参考电压,所以AD转换的最高电压为VCC。
R26和R27为I2C总线的上拉电阻,保证总线工作稳定。
PCF8591是8位AD转换器,我们用其采集的电压范围为0~5v,所以分辨率为5/256v。
2.318B20温度传感器
DS18B20温度传感器具有体积小,硬件开销低,抗干扰能力强,精度高的特点,是一种常用的温度传感器。
18B20的外观与三极管很相似,有三个脚。
平面面对自己时从左到右依次是地线、数据线和电源正(GND、DQ和VDD),如图2.6所示。
图2.618B20外观图
18B20采用的是独特的单线接口方式,在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,使用方便。
接线的时候要注意一定不要将电源线接反,否则会严重发热或者烧毁。
供电电压范围为3.0V至5.5V,无需备用电源。
VDD是可供选择的电源端,不使用时可直接接地,此时由数据总线供电。
测量温度范围为-55℃至+125℃。
在-10℃至+85℃范围内精度为±
0.5℃,可以满足大多数测温场合的要求。
18B20的分辨率可由程序控制,可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
其输出量为数字量,在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,对于温度这种缓慢变化的信号来说速度还是非常快的。
18B20的硬件连接如图2.7所示。
图2.718B20硬件连接图
3单片机程序设计
3.1I2C总线介绍
I2C总线是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点[3]。
在主从通信中,可以有多个I2C总线器件同时接到I2C总线上,所有与I2C兼容的器件都具有标准的接口,通过地址来识别通信对象,使他们可经由I2C总线直接相互通信。
I2C总线由数据线SDA和时钟线SCL两条线构成,既可以发送数据又可以接收数据。
各种器件并联在总线上,但每个器件都有唯一的地址。
CPU发出的控制信号分为地址码和数据码两部分,地址码用来选择与那个器件通讯,数据码是通讯内容,这样各个器件虽然同时挂在一条总线上却是彼此独立的。
I2C总线通信格式如图3.1所示。
图3.1I2C总线通信格式图
进行数据传送时,在SCL呈现高电平期间,SDA上的电平必须保持稳定,低电平为数据0,高电平为数据1。
只有在SCL为低电平期间,才允许SDA上的电平改变状态。
通信过程如下:
1.发送起始信号
在SCL为高电平期间,SDA出现一个下降沿则为起始信号。
由于其起始条件建立的时间至少需要4.5us,因此一般下降沿要出现在SCL拉高5us之后。
SDA出现下降沿是,I2C总线上的从器件会检测到该信号,随后进入等待状态。
起始信号由主器件发出。
启动时序图如图3.2所示。
图3.2I2C总线启动时序图
2.发送寻址信号
主机发送启动信号后,在发出寻址信号。
寻址信号的作用是确定总线上要通讯的器件。
总线上每个器件都有自己的独特的地址,器件地址有7位和10位两种形式,本次设计采用的是7位形式。
寻址地址由一个字节构成,高7位是地址,最低位是读写标识位,为1表示主机从从器件读取数据,为0表示主机向从器件发送数据。
主机发送地址后,总线上所有从器件都将这个地址与自己的地址对比,若相同则认为自己是主机此时寻求通讯的对象,然后根据R/W信息确定自己将要接收还是发送数据,否则不做回应,从而可以确定接下来与总线通讯的是哪一个器件。
3.应答信号与非应答信号
I2C总线协议规定,每传送一个字节(无论是地址还是数据)后都要有一个回应信号,以确定数据是否被对方收到。
从器件发出的回应信号叫做应答信号,主器件发出的回应信号叫非应答信号。
从器件接收完一个字节后,在SCL信号为高电平期间,将SDA拉为低电平,表示自己已经正确收到数据。
主器件接收数据后不应答(保持SDA为高电平),表示主设备接收结束。
应答与非应答的时序如图3.3所示。
图3.3应答与非应答时序图
4.数据传输
主机发送寻址信号并得到从器件应答后便可进行数据传输,每次传输一个字节,每个字节传输完成后都需要得到应答(或非应答)信号后才能传输下一个字节。
在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,每一位数据都是在SDA上逐位地串行传送的。
5.发送停止信号
在时钟线SCL保持高电平期间,数据线SDA被释放,使得SDA返回高电平(即正跳变),称为I2C总线的停止信号,它标志着一次数据传输的终止。
停止信号也是一种电平跳变时序信号,而不是一个电平信号,停止信号也是由主控器主动建立的,建立该信号之后,I2C总线将返回空闲状态。
停止信号时序图如图3.4所示。
图3.4停止信号时序图
3.2模数转换
前边已经介绍过,PCF8591是通过I2C总线传输数据的,所以只要按照I2C总线协议标准,先启动I2C总线,然后发送PCF8591的地址,收到应答信号后即可从总线上读取数据,读取数据的通信格式为:
第一字节
第二字节
第三字节
第四字节
写入器件地址(0x90)
写入控制字节
读出一字节数据
读取数据的程序如下:
unsignedcharReadADC(unsignedcharChl)
{
unsignedcharVal;
Start_I2C();
//启动总线
SendByte(AddWr);
//发送器件地址(写)
if(ack==0)
return(0);
//没有应答,返回
SendByte(0x40|Chl);
//发送器件子地址
SendByte(AddWr+1);
//发送器件地址(读)
Val=RcvByte();
NoAck_I2C();
//发送非应位
Stop_I2C();
//结束总线
return(Val);
}
3.3温度采集
获取温度信息的方式有多种,如利用热敏电阻或热电偶将温度信息转化为电信号,然后再由单片机处理。
也可以利用18B20等数字温度传感器来采集温度信息。
但是热敏电阻或热电偶是将温度信息转化为模拟电压量,要想用单片机处理还需要做一步模数转换,比较繁琐。
而18B20温度传感器是数字温度传感器,直接将温度转化为数字量,这样处理起来更方便,而且18B20的精度要比普通热电偶高。
与第一种方式相比,第二种方式的成本也要低,所以本次设计采用的是第二种方式。
18B20的初始化时序如图3.5所示。
初始化过程为:
先将数据线置高电平1,延时一小段时间(尽可能短),将数据线拉低为0,再延时480~960us后数据线置高电平1,这时等待15~60ms后18B20会返回低电平0,单片机读到这个低电平后延时至少480us后将数据线再次拉高,初始化过程结束。
图3.518B20初始化时序图
初始化完成后就可以写入和读取数据了。
写入数据的过程为:
先将数据线电平拉低,精确延时15us后发送一位数据,然后延时45us后将数据线置1。
重复这个过程,直到发完一个字节,写的时候先写数据的低位,在写数据的高位,发完一个字节后将数据线置1。
写时序图如图3.6所示。
图3.618B20写时序图
读取数据的过程为:
将数据线拉高到1,延时2us后将数据线拉低,延时6us后再次将数据线拉高,延时4us后便可读到第一个数据位。
重复以上过程,直至读完一个字节,每两位之间要有30us的延时。
读取时序图如图3.7所示。
图3.718B20读时序图
有了以上函数,结合18B20的指令,便可实现温度读取。
18B20的常用的控制指令如表3-1所示。
表3-118B20的常用的控制指令
指令代码
指令作用
33H
读ROM
44H
温度转换
55H
匹配ROM
BEH
读暂存器
F0H
搜索ROM
4EH
写暂存器
CCH
跳过ROM
48H
复制暂存器
ECH
告警搜索命令
B8H
重调E2PROM
读取温度的程序如下:
unsignedintReadTemperature(void)//温度读取函数
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
while(Init_DS18B20());
//检测初始化是否成功
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
DelayMs(10);
Init_DS18B20();
//跳过读序号列号的操作
WriteOneChar(0xBE);
//读取温度寄存器,前两个就是温度
a=ReadOneChar();
//低位
b=ReadOneChar();
//高位
b<
<
=8;
t=a+b;
return(t);
从18B20读取的数据总共有16位,其中最高5位是正负标志,这五位同时变换,所以只需判断第12位就可以了。
低十一位为温度数据,其中最低4位为小数部分,剩下的为整数部分。
所以要想以十进制的形式将温度显示温度就必须进行格式转换。
3.4与电脑数据传输
要将采集到的温度数据在电脑上用波形显示出来,就必须建立电脑与单片机之间的通讯,这里我们采用的是串口方式。
发送串口消息有两种形式,一种是直接对SBUF赋值,这种形式每次只能发送一个字节,想要发送多个字节时比较麻烦。
另一种是利用printf()函数,该函数的使用方法和电脑上显示一个字符串的语句使用方法相同[4]。
如假设a=10,b=15,那么printf(“%d.%d”,a,b);
语句将把10.15发送到串口。
利用printf()函数发送串口消息时要手动将发送中断标志位TI置1或始终保持TI=1,否则无法发送消息。
voidSendTemp()
unsignedintTempH,TempL,temp;
if(ReadTempFlag==1)//温度读取标识
{
ReadTempFlag=0;
temp=ReadTemperature();
if(temp&
0x8000)
{
temp=~temp;
//取反加1
temp+=1;
}
TempH=temp>
>
4;
//取高位
TempL=temp&
0x0F;
//取低位
TempL=TempL*6/10;
//保留一位小数
printf("
%d.%d"
TempH,TempL);
//发送数据
TI=1;
//手动置标志位
}
温度读取标识的作用是控制读取温度的频率,防止读取太频繁。
该标志在定时器中每隔一定时间就会被设为1。
程序可采集的信息有电压和温度两种,具体需要进行哪项采集,程序还需要通过接收电脑端发送的命令进行判断,这样才能保证电脑的显示与单片机同步。
我们在程序中定义了如下指令:
收到字符’V’则进行电压采集工作,把采集到的电压数据发送到电脑,收到字符’T’则进行温度采集工作,若收到字符’0’则停止采集。
这一功能放在串口消息处理函数中实现。
上位机根据需求,若需要采集温度信息,则向单片机发送字符’T’,若需要电压信息则向单片机发送’V’。
单片机收到’T’和’V’时分别执行不同的程序来获得相应的信息,若收到的是’0’,则不采集任何数据,从而实现了由软件控制单片机的采集工作。
4PC端软件设计
4.1软件界面设计
PC端软件的作用主要是将单片机采集到的数据用波形显示出来。
程序界面如图4.1所示。
图4.1软件界面
上边一排为操作面板,中间空白区域为采集量随时间变化的波形显示区。
启动程序后首先要选择正确的端口号以实现与单片机的通信。
打开开关后将开始数据采集。
采集项目包括电压和温度两项,默认的项目是温度。
控制面板为波形显示控制,包括波形的缩放、移动等操作。
另外在右键菜单里LabView也为我们提供了丰富的操作,如自动调整坐标级别、清除图表、更改曲线更新方式以及将波形数据导出等。
最下方为一个滑动条,当曲线一屏显示不下时刻滑动滑动条查看不同时刻的数据。
4.2主程序
PC端串口通讯是通过LabView的VISA系列控件实现的[5]。
这一些列控件包括串口的打开和关闭、串口初始化、数据的接收和发送以及数据缓冲区的清空等操作。
主程序如图4.2所示。
图4.2主程序
启动程序后首先会判断端口号是否正确,只有选择的正确的端口号程序才会继续往下执行,确保能够正常的从单片机获取数据;
若串口不存在或已被打开则弹出端口错误提示框,然后中止程序。
端口错误处理程序如图4.2所示。
图4.2端口错误处理程序
选择了正确的端口号后就可以打开开关,用一个case结构判断采集项目选择的是温度还是电压。
若选择的是温度则执行温度处理子程序,若是电压则执行电压处理子程序。
处理完的数据用波形图显示出来。
若关闭开关,则会向单片机发送字符’0’,通知单片机停止数据采集,然后关闭串口。
关闭开关的处理程序如图4.3所示。
图4.3关闭开关的处理程序
4.3温度采集子程序
温度采集子程序如图4.4所示。
图4.4温度采集程序
进入温度采集程序后先向单片机发送字符’T’,通知单片机现在需要返回温度数据。
单片机返回温度数据采用的是printf("
语句,语句中的“%d”代表的是整形数,整形数在51单片机中占两个字节,两个整形数之间的“.”占一个字节,所以一个完整的温度数据总共是5个字节。
所以先对接收缓冲区的字符数进行判断,若满5个字节则一次性接收。
串口接收到的数据仍然是字符串格式,需要将其转换为十进制的数字才能正确的在波形图中显示出来。
将数字格式的字符转换为数字用到的是DecimalStringToNumber节点,输入要转换的字符串与转换的起始位和终止位即可将这部分十进制数字格式的字符串转换为十进制数字。
本次程序中对整数部分和小数部分分别进行了转换,然后将两者相加后便得到我们需要的温度值。
字符串转数字的程序如图4.5所示。
图4.5十进制形式字符串转数字程序
程序中的
节点是BuildWaveform,作用是将波形图表所需的信息合并,这里输入的信息是系统时间和采集到的数据,这样便能以系统时间为横坐标显示数据温度了。
另外还在程序中加了一个800ms的延时,因为温度采集需要一定时间,且温度是缓变信号,每800ms采集一次足以反映出温度的变化同时有能够减小不必要的开销。
4.4电压采集子程序
图4.6电压采集程序
电压采集程序如图4.6所示。
与温度采集程序类似,进入电压采集程序奇后先向单片机发送字符’V’,通知单片机进行电压采集。
电压采集用的是8位AD,所以得到的电压数据只有一个字节,将这个值写入SBUF就可以发送到电脑了。
由于只有一个字节,所以只要串口接收缓冲区中有内容就将其取出,同样取出来之后为字符格式,需要转换为十进制。
与温度转换不同的是,这里的字符不是十进制形式的,我们需要的信息是该字符的ASCII码,所以这里用到了另一种转换节点StringToByteArray(图中的
),这个节点的作用是将字符串转化为ASCII码数组。
因为我们采集的电压是0~5V,用0~255表示,所以还需要进一步转换才能得到真正的电压值。
同样,转换完的数值加上时间信息后通过波形图表显示出来。
5设计结果及应用
5.1结果展示
连接好硬件电路,打开开关,电脑开始显示温度曲线。
从曲线中可以看出我所处环境当前温度为27℃。
然后用手捏住温度传感器,此时温度开始上升。
开始阶段上升较快,到达32℃后上升速度减慢,约一分钟后到达最高温度32.8℃。
这时松开手指,温度开始下降,这一过程符合实际规律,说明该设计可以正确的检测到实际温度并绘制出温度随时间变化的波形。
图5.1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 测控系统现代仪器设计 测控 系统 现代 仪器 设计 课程设计 虚拟 示波器