远程数据采集系统设计.docx
《远程数据采集系统设计.docx》由会员分享,可在线阅读,更多相关《远程数据采集系统设计.docx(35页珍藏版)》请在冰豆网上搜索。
远程数据采集系统设计
中国矿业大学徐海学院
专业技能考核培训设计报告
姓名:
学号:
专业:
电子科学与技术
设计题目:
远程数据采集系统设计
专题:
基于CPLD/FPGA的电压数据采集
指导教师:
设计地点:
时间:
2013年5月
CPLD课程设计任务书
专业年级学号学生姓名
任务下达日期:
2013年5月6日
设计日期:
2013年5月6日至2013年5月20日
设计题目:
基于PC、MCU和CPLD/FPGA的远程数据采集系统设计
设计专题题目:
基于CPLD/FPGA的电压数据采集
设计主要内容和要求:
利用上位计算机、单片机、可编程逻辑器件和ADC器件构成一个远程数据采集系统,系统具备远程/就地两种控制模式,具有8通道循环采集和指定通道采集两种数据采集方式。
具体要求如下:
1.CPLD/FPGA硬件电路和AHDL控制软件设计
电路具备控制ADC0809的采集功能,具备6位数码管动态扫描功能,具备8位按键输入功能,具备和单片机信号交换功能。
2.单片机硬件电路和监控软件设计
电路具备和CPLD/FPGA交换信息,以及和上位机算计进行RS232的通讯功能,能将上位机发出的控制指令下达到CPLD/FPGA中,并将采集的数据传送到上位计算机中。
3.单片机程序要求用C51编制。
上位机算计软件设计
利用VB或VC程序编制上位计算机控制程序,实现远程数据采集功能并实时显示采集的数据和通道号。
指导教师签字:
摘要
随着科学技术的迅猛发展,新技术革命将把人类由工业化社会推进到信息化社会为主要内容的数据采集测试技术,已形成了一门专门的技术科学。
数据采集系统是计算机、智能仪器与外界物理世界联系的桥梁,是获取信息的重要途径。
数据采集技术是信息科学的重要分支,它不仅应用在智能仪器中,而且在现代工业生产、国防军事及科学研究等方面都得到了广泛应用,无论是过程控制、状态检测,还是故障诊断、质量检测,都离不开数据采集系统。
本文介绍一种基于EP1K30TC144-3的CPLD/FPGA和89S52单片机的一种电压测量电路,基本内容包括单片机最小系统、AD转换电路、键盘和LED显示电路,以及设计系统涉及的其他电路。
系统硬件电路由标准电路和自制电路两部分组成。
标准电路包括单片机最小系统、6个LED数码管电路和键盘电路以及CPLD/FPGA系统,这部分电路已制成电路板,自制电路自行设计焊接,包含标准电路不具备的其他电路。
系统软件根据设计任务自行设计独立编制并进行调试,最终实现利用上位机远程控制系统进行数据采集功能并实时显示采集的数据和通道号。
关键词:
89S52单片机、EP1K30TC144-3芯片、CPLD/FPGA、上位机、电压采集、AD转换电路
1绪论
1.1课程简介
1.1.1课程设计的性质、目的和任务
《单片机系统设计》是在学习《单片机原理及应用》、《CPLD》等相关理论课程之后,所设置的重要的综合性实践教学环节。
此次技能考核的目的是通过课题的设计、安装和调试,使我们全面了解掌握电子技术应用设计的基本技能,巩固已学的理论知识并综合应用,进行电子系统的设计,从而培养工程实践能力、创新能力,培养严肃认真的工作作风和科学态度,具备简单科技论文、技术综述报告的写作能力等。
通过查阅资料、选定方案、设计电路、安装调试、写技术报告等过程,得到一次科学研究工作的启蒙训练,也为以后利用单片机开发电子产品奠定坚实的基础。
在对远程数据采集装置进行设计时,其设计分为硬件设计与软件设计两部分,具体的设计流程如图:
图1-1设计流程图
1.2系统设计思路
本次实验要求设计基于单片机的电压数据采集装置,课程设计分设计、制作和调试三个部分。
设计选题以单片机、AD0809为核心,基本内容应包括单片机最小系统、CPLD系统、键盘(拨码开关)和LED显示电路,以及设计系统涉及的其他电路。
系统硬件电路由单片机系统和CPLD系统两部分组成。
其中单片机系统包括单片机最小系统、8个LED数码管电路和键盘电路,可根据设计需要进行配置选用。
CPLD系统则需自行设计焊接,包含EP1K30TC144芯片。
设计中采用了模数转换器,利用ADC0809型8位MOS型A/D转换器,可实现8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道地址锁存用译码电路,实现模拟信号到数字信号的转换。
显示部分利用LED数码管显示模块,来显示采集到的电压分量。
1.3方案论证及比较
1.3.1单片机控制方案的选用
方案一:
采用8031为核心,由于其内部没有存储器,所以利用2764扩展8KB的外部存储器,用8031的两组I/O接口。
方案二:
采用AT89C52作为核心,对AD转换的数据进行采集并显示。
其内置的8KB字节点擦除可编程EEPROM片内程序存储器和256字节RAM,无需外部扩展。
所以选用方案二,采用AT89C52作为核心,其片内程序存储器空间足够满足本系统程序存储器的需要,可以省去对片外EPROM程序存储器和地址锁存器,使电路结构简捷。
1.3.2FPGA控制方案的选用
方案一:
采用EP1K30TC144-3为核心,具备6位数码管动态扫描功能和8位按键输入功能,以及与单片机进行信号交换等功能。
方案二:
采用EP1K30TC144-3为核心,同样具备6位数码管动态扫描功能和8位按键输入功能,以及与单片机进行信号交换等功能。
且管脚数目较少,适合本次设计使用。
所以选用方案二,采用EP1K30TC144-3为核心,其功能已经满足设计需要,且应用简单,管脚分配方便,使电路结构简洁。
1.4系统设计原理框图
图1-2系统设计原理框图
2硬件电路设计
系统硬件电路由单片机系统和CPLD系统两部分组成。
其中单片机系统包括单片机最小系统、8个LED数码管电路和键盘电路,可根据设计需要进
行配置选用。
CPLD系统则需自行设计焊接,包含EP1K30TC144芯片。
2.1单片机电路
2.1.1单片机电路板
单片机电路板电路框图如图2;
图2-1电路框图
2.1.2单片机最小系统
图2-2单片机最小系统图
该原理图包含单片机以及外部连接译码,锁存电路端口,其中的ALE,REST为高电平时用来启动ADC0809.P0、P2口控制数码输出显示,P3口的P3.3、P3.4、P3.5控制按键,P1.1~P1.3控制通道选择。
晶振采用12MHZ,该频率有利于提高串口的通信可靠性,同时又保证单片机有较高的运行速度。
2.1.3显示译码电路
LED显示电路可提供8位LED显示;可显示P1(P3)口状态;也可显示输入按键状态。
图2-3LED显示电路
显示电路采用6位共阳极LED动态扫描显示,CD4511输出所需字形,74LS138选择字位。
在动态方式中,逐个地循环地点亮各位显示器。
图2-4数码管显示电路
显示译码电路部分由P0口或P2口输出显示。
显示译码器采用CD4511芯片:
输入:
BCD输出:
七段码
74LS138芯片是用来控制显示时候的字位的,由于单片机的管脚是有限的通过使用138芯片可以避免少使用些单片机的管脚,当输入001时,译码可得:
输入:
0~7输出:
低电平
2.2A/D转换
2.2.1ADC0809内部结构
ADC0809由8路模拟开关、地址锁存与译码器、比较器、256电阻阶梯、树状开关、逐次逼近式寄存器SAR、控制电路和三态输出锁存器等组成。
图2-5ADC0809结构图
2.2.2ADC0809转换原理
图2-6ADC0809转换工作时序
工作原理:
当单片机端的P3.3接低电平时,可以使两个非门打开
(1)当模拟量送至某一输入通道后,CPU将标识该通道编码的三位地址信号经数据线或地址线输入到ADDC、ADDB、ADDA引脚上。
(2)地址锁存允许ALE锁存地址信号,启动命令START启动A/D转换。
(3)转换开始,EOC变低电平,转换结束,EOC变为高电平。
EOC可作为中断请求信号。
(4)转换结束后,可通过执行IN指令,设法在输出允许OE脚上形成一个正脉冲,打开三态缓冲器把转换的结果输入到DB,一次A/D转换便完成。
2.2.3AD转换电路
转换结束:
EOC=1
图2-7AD转换电路原理图
2.2.4电路设计
硬件资源分配
数码管显示电路:
用P2口:
bcd码输出--P2.3~P2.0;字位选择--cba=P2.6~P2.4;小数点--P2.7
键盘电路:
P3口低四位
1号按键P3.0---模式切换
2号按键P3.1---通道、报警限加
3号按键P3.2--通道、报警限减
4号按键P3.3--查询法,接收ad转换状态(不作为按键使用)
中断法,收ad结束中断信号
ADC0809电压转换电路控制信号:
/wr==p3.6/rd==p3.7
eoc==p3.3Cs==p3.5
转换通道选择地址线:
CBA==P1(6-4)
2.3硬件设计流程
2.3.1硬件设计流程图
图2-8硬件设计框图
2.3.2CPLD系统流程框图
图2-9CPLD系统功能模块框图
2.3.3详细管脚说明
(1)时钟源
图2-10时钟源与CPLD对应管脚连接图
(2)输入开关
图2-1116个数据开关与CPLD对应管脚连接图
(3)数码管显示
实验箱有10个数码管(SEG1——SEG10),采用共阴极8段LED显示。
其中SEG1——SEG2采用静态显示方式,SEG3——SEG10采用动态扫描显示方式。
且SEG1、SEG2的8段LED显示输入端分别与8个LED管相连同时显示。
图2-12数码管管脚分配图
3软件设计
3.1设计任务
3.1.1基本任务
(1)、进行电压采集并显示
3.1.2扩展任务
(1)、指定通道采集
(2)、循环采集显示,默认每通道显示1秒钟。
3.2程序设计
3.2.1软件设计流程
图3-1软件设计流程框图
3.2.2单片机设计流图
图3-2单片机设计与AD0809设计流程图
3.2.3BCD码转换电路与显示电路设计程序:
Subdesigndcbzhhh--定义输入输出管脚
(ibd[15..0],inclk:
input;
odd[6..0],p,bitout[4..0]:
output;
)
Variable--定义触发器
mh[3..0],mm[3..0],mw[3..0],mr[3..0],ml[3..0]:
dff;
mrd[15..0],sta[1..0],stb[2..0],mseg[3..0],bitout[4..0],fpq[15..0],fp:
dff;
mhr[3..0],mmr[3..0],mwr[3..0],mrr[3..0],mlr[3..0]:
dff;
Begin
p=vcc;--点亮小数点
(fpq[],fp).clk=inclk;--分频
Iffpq[]==19999then
fp=!
fp;fpq[]=0;
Else
fp=fp;fpq[]=fpq[]+1;
Endif;
sta[].clk=fp;stb[].clk=fp;bitout[].clk=fp;mseg[].clk=fp;--给触发器输入时钟
(mh[],mm[],mw[],mr[],ml[],mrd[]).clk=inclk;
(mhr[],mmr[],mwr[],mrr[],mlr[]).clk=inclk;
Casesta[]is--BCD码转换
When0=>
mrd[]=ibd[];sta[]=1;
mhr[]=mhr[];mmr[]=mmr[];mwr[]=mwr[];mrr[]=mrr[];mlr[]=mlr[];
When1=>
Ifmrd[]==0then
mhr[]=mh[];mmr[]=mm[];mwr[]=mw[];mrr[]=mr[];mlr[]=ml[];
mh[]=mh[];mm[]=mm[];mw[]=mw[];mr[]=mr[];ml[]=ml[];
sta[]=0;
Else
mhr[]=mh[];mmr[]=mm[];mwr[]=mw[];mrr[]=mr[];mlr[]=ml[];
mrd[]=mrd[]-1;
sta[]=1;
Ifml[]==9then
ml[]=0;
Ifmr[]==9then
mr[]=0;
Ifmw[]==9then
mw[]=0;
Ifmm[]==9then
mm[]=0;
Ifmh[]==9then
mh[]=0;
Else
mh[]=mh[]+1;
Endif;
Else
mm[]=mm[]+1;mh[]=mh[];
Endif;
Else
mw[]=mw[]+1;mm[]=mm[];mh[]=mh[];
Endif;
Else
mr[]=mr[]+1;mw[]=mw[];mm[]=mm[];mh[]=mh[];
Endif;
Else
ml[]=ml[]+1;mr[]=mr[];mw[]=mw[];mm[]=mm[];mh[]=mh[];
Endif;
Endif;
Endcase;
casestb[]is--隐含状态机的使用
when0=>--动态扫描显示电路
mseg[]=mlr[];
bitout[]=1;
stb[]=1;
when1=>
mseg[]=mrr[];
bitout[]=2;
stb[]=2;
when2=>
mseg[]=mwr[];
bitout[]=4;
stb[]=3;
when3=>
mseg[]=mmr[];
bitout[]=8;
stb[]=4;
when4=>
mseg[]=mhr[];
bitout[]=16;
stb[]=0;
endcase;
Table
mseg[3..0]=>odd[6..0];
h"0"=>h"3f";---“”
h"1"=>h"06";
h"2"=>h"5b";
h"3"=>h"4f";
h"4“=>h"66";
h"5“=>h"6d";
h"6“=>h"7d";
h"7"=>h"07";
h"8“=>h"7f";
h"9"=>h"6f";
endtable;
End;
3.2.4八位二进制乘法器
FUNCTIONlpm_mult(dataa[7..0],datab[7..0],sum[7..0])--设置乘法器参数
WITH(LPM_WIDTHA=8,LPM_WIDTHB=8,LPM_WIDTHP=16,
LPM_WIDTHS=16,INPUT_A_IS_CONSTANT="no",
INPUT_B_IS_CONSTANT="no",USE_EAB="off",
LPM_REPRESENTATION="unsigned")
RETURNS(result[15..0]);
Subdesignmultt--定义输入输出管脚
(daa[7..0],dab[7..0]:
input;
res[15..0]:
output;
)
Variable--实现乘法器功能
multa:
lpm_mult;
Begin
multa.sum[]=gnd;
multa.dataa[]=daa[];
multa.datab[]=dab[];
res[]=multa.result[];
End;
3.2.5用上位机和拨码开关控制8路通道选择:
Include“dcbzhhh.inc”;--调用BCD转换和显示模块
Include“multt.inc”;--调用乘法器模块
Subdesignsjcjjj--定义输入输出管脚
(inclk,eoc,ds[7..0],tdxuanze[2..0],fsxuanze,bomakg[2..0]:
input;
add[2..0],otclk,out[6..0],st,oe,led[7..0],p,wx[4..0]:
output;
)
Variable
zhq:
dcbzhhh;
cfq:
multt;
fpq[4..0],fp,outd:
dff;--定义D触发器
sm[1..0],dp[7..0],st,outdd[20..0]:
dff;
Begin
oe=vcc;
(fpq[],fp,outdd[],outd).clk=inclk;
zhq.inclk=inclk;
Iffpq[]==19then--分频
fpq[]=0;fp=!
fp;
Else
fpq[]=fpq[]+1;fp=fp;
Endif;
ifoutdd[]==then
outdd[]=0;outd=!
outd;
else
outdd[]=outdd[]+1;outd=outd;
endif;
(sm[],st,dp[]).clk=fp;otclk=fp;
iffsxuanze==0then--选择通道方式
add[]=tdxuanze[];
else
add[]=bomakg[];
endif;
Casesm[]is--实现ADC转换功能
When0=>
st=gnd;dp[]=ds[];
sm[]=1;
When1=>
st=gnd;dp[]=dp[];
ifeocthen
sm[]=2;
else
sm[]=1;
endif;
When2=>
st=vcc;sm[]=0;dp[]=ds[];
Endcase;
cfq.daa[]=196;--将采集的二进制数据转化为十进制数据
cfq.dab[]=dp[];
zhq.ibd[]=cfq.res[];
wx[]=zhq.bitout[];
p=zhq.p;
out[6..0]=zhq.odd[];
led[]=dp[];
End;
3.2.6单片机与PC机通讯程序
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharr;
voidinit();
voidmain()//主程序
{
init();
while
(1)//while()死循环
{
}
}
/**串口中断服务程序**/
voidser()interrupt4
{
RI=0;//清除串行接收中断申请位
r=SBUF;//接收上位机数据
P2=r;//将数据送给P2口
r=P0;
SBUF=r;//发送P0数据给上位机
while(TI==0);//当TI=1时,完成发送,向CPU申请中断
TI=0;//关闭串口中断
}
/**串口初始化**/
voidinit()
{
r=0xff;//将P0口置高电平
TMOD=0x20;//写控制字20H
TH1=0x98;//T1高4位赋初值98H
TL1=0x98;//T1低4位赋初值98H
TR1=1;//启动定时器T1,从而设定串口通信的波特率
SM0=0;
SM1=1;//设定串口通信方式为十位异步收发器(方式1)
REN=1;//打开串口通讯,允许接收
ES=1;//开放串口中断
EA=1;//开放CPU中断
}
4系统调试
系统调试包括硬件调试和软件调试两部分,介绍一下我在这两方面遇到一些问题,以及如何解决的。
4.1硬件部分
硬件焊接分为EP1K30TC144贴片式芯片小板的焊接和CPLD开发板及CPLD扩展板的焊接,在焊接EP1K30TC144时,由于拖锡技术应用的不是很娴熟,所以导致芯片的焊接出现管脚短路的情况。
其次就是焊接CPLD扩展板时,由于AD0809芯片与电位器是管脚连接出错,即开始时电位器的管脚定义出错,导致调节电位器旋钮时数码管显示的数值不发生变化,经万用表检测,发现焊接问题之后及时纠正便实现了功能。
4.2软件部分
(1)CPLD(AD、乘法器)模块程序:
将AD转换的输出结果转换为电压值,即乘以196得到的数据,此时要扩展输入输出端口的长度。
255*196=49980需要5个数码管,其中4个只需要7段,最高一个数码管需要8段,多添加了一个小数点,只需要在输出端定义一个变量,然后在管脚分配时分给小数点即可(取名为dcbzhh)。
但由于实验程序名为dcbzhh(输入管脚p表示小数点,fpq和fp都表示分频)的程序中引用数码管是调用了五个,其中有两个是静态扫描,另三个是动态扫描。
而使用静态扫描下载程序时在CPLD板上会出现错误。
所以设计时全部用动态扫描数码管,并设置一个公共端!
而动态扫描时seg1~seg6共用七段数码管,所以定义输出odd时只需要定义为odd[6..0](取名为dcbzhhh)。
(2)单片机与CPLD实现通信的程序:
输出定义为out[6..0]即一组5个动态显示数码管。
修改时在dcbzhhh里面将小数点定义在case语句的字位码描述语句中,即在最高位后面添加一句p=vcc,而不用在begin语句里面定义p=vcc.同时,在sjcjjj模块里面调用dcbzhhh模块时,将输出定义为out[6..0],同时将AD转换的输出dp[]连接到AD转换的8通道输出,同时连接到单片机的P0口,而单片机则通过P2口低3位连接到CPLD通道选择端。
最后将dcbzhhh模块的输出接到out[6..0]的输出即可完成CPLD与单片机的通信,但是要注意重新对管脚进行分配。
(3)软件特色:
在最终的CPLD模块中调用了八位二进制乘法器模块程序,以及16位BCD转换模块和动态扫描显示模块。
即将乘法器模块、BCD转换模块、动态扫描显示模块的文本编辑程序最终融入整合在CPLD模块程序中,而没有采用直接调用乘法器图形文件的方法。
虽然这样为程序调试带来了很多麻烦,使整体的程序设计显得比较繁琐,但是在我们小组成员的共同努力商讨以及老师的悉心指导下,最终我们程序调试成功,实现了相应的功能!
5总结
这次单片机课程设计过后,让我对单片机和CPLD这两门课程有了更进一步的理解和感悟。
经过这次课程设计,自己收获很多,明白了团队合作的重要性,更加深了自己对AD转换以及单片机和PC机