基于PCMCU和FPGA的远程数据采集系统设计.docx
《基于PCMCU和FPGA的远程数据采集系统设计.docx》由会员分享,可在线阅读,更多相关《基于PCMCU和FPGA的远程数据采集系统设计.docx(26页珍藏版)》请在冰豆网上搜索。
基于PCMCU和FPGA的远程数据采集系统设计
中国矿业大学徐海学院
专业技能考核培训设计报告
姓名:
学号:
专业:
设计题目:
基于PC、MCU和FPGA的远程数据采集系统设计
专题:
专业技能考核
指导教师:
2013年05月
专业技能考核培训设计任务书
专业年级学号学生姓名
任务下达日期:
2013年05月06日
设计日期:
2013年05月06日至2013年05月21日
设计题目:
基于PC、MCU和FPGA的远程数据采集系统设计
设计专题题目:
专业技能考核
设计主要内容和要求:
利用上位计算机、单片机、可编程逻辑器件和ADC器件构成一个远程数据采集系统,系统具备远程/就地两种控制模式,具有8通道循环采集和指定通道采集两种数据采集方式。
具体要求如下:
1、FPGA硬件电路和AHDL控制软件设计
电路具备控制ADC0809的采集功能,具备6位数码管动态扫描功能,具备8位按键输入功能,具备和单片机信号交换功能。
2、单片机硬件电路和监控软件设计
电路具备和FPGA交换信息,以及和上位机算计进行RS232的通讯功能,能将上位机发出的控制指令下达到FPGA中,并将采集的数据传送到上位计算机中。
单片机程序要求用C51编制。
3、上位机算计软件设计
利用VB或VC程序编制上位计算机控制程序,实现远程数据采集功能并实时显示采集的数据和通道号。
指导教师签字:
摘要
本文介绍一种基于EP1K30TC144-3的FPGA和89S52单片机的一种电压测量电路。
基本内容包括单片机最小系统、键盘和LED显示电路,以及设计系统涉及的其他电路。
系统硬件电路由标准电路和自制电路两部分组成。
标准电路包括单片机最小系统、6个LED数码管电路和键盘电路以及FPGA系统,这部分电路已制成电路板,自制电路自行设计焊接,包含标准电路不具备的其他电路。
系统软件根据设计任务自行独立编制并进行调试。
最终实现利用上位机远程控制系统进行数据采集功能并实时显示采集的数据和通道号。
关键字:
单片机;FPGA;上位机;电压采集;指定采集;循环采集
目录
1概述1
1.1课题的提出1
1.2设计流程说明1
1.3设计思想1
1.3.1设计思路1
1.3.2方案论证及比较2
1.4系统结构原理图3
1.4.1系统结构图3
1.4.2原理说明3
2硬件电路设计4
2.1电路模块4
2.1.1FPGA硬件电路4
2.1.2单片机硬件电路4
2.1.3A/D转换电路5
3软件设计8
3.1程序框图8
3.1.1主程序框图8
3.2CPLD程序9
3.3单片机程序9
3.4上位机程序9
3.5定时中断程序框图10
4系统调试11
4.1硬件部分11
5总结13
参考文献14
附录1:
元器件清单15
附录2:
程序17
附录3:
管脚分配23
附录4:
ADC0809与单片机连接图25
1概述
1.1课题的提出
数据采集系统的设计是单片机系统实际的必修课题,它完完全全地体现了微控制器在实际应用中独特功能:
通过微控制器,可以将许多产品实现数字化、自动化、有效地进行相关的辅助操作,并实现远程控制。
之前的设计内容主要是以AT89C52芯片为核心,设计简单的数据采集系统,用以完成基本的数据采集功能。
而本次设计将实现远程控制的数据采集系统,使系统功能更进一步地优化。
1.2设计流程说明
在对远程数据采集装置进行设计时,其设计分为硬件设计与软件设计两部分,具体的设计流程如图:
比较所选方案
设计计算
元器件选择
硬件制作
编制流程
系统调试
图1-1设计流程
1.3设计思想
1.3.1设计思路
要设计一个远程数据采集系统,可以利用上位计算机、单片机、可编程逻辑器件和ADC器件构成,使系统具备远程/就地两种控制模式,具有8通道循环采集和指定通道采集两种数据采集方式。
主要电路模式有FPGA硬件电路、单片机硬件电路、A/D转换电路、译码显示电路以及设计系统涉及的其他电路。
设计中采用了模数转换器,利用AD0809型8位MOS型A/D转换器,可实现8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道地址锁存用译码电路,实现模拟信号到数字信号的转换。
控制部分采用单片机89C52来完成。
显示部分利用LED数码管显示模块,来显示采集到的数据。
FPGA硬件电路具备控制AD0809的采集功能,具备6位数码管动态扫描功能,具备8位按键输入功能,具备和单片机信号交换功能。
单片机硬件电路具备和FPGA交换信息,以及和上位机算计进行RS232的通讯功能,能将上位机发出的控制指令下达到FPGA中,并将采集的数据传送到上位计算机中。
上位机利用VB或VC程序编制上位机计算机控制程序,实现远程数据采集功能并实现显示采集的数据和通道口。
1.3.2方案论证及比较
1.单片机控制方案的选用
方案一:
采用8031为核心,由于其内部没有存储器,所以利用2764扩展8KB的外部存储器,用8031的两组I/O接口作为存储器接口。
方案二:
采用AT89C52位核心,对AD转换的数据进行采集并显示。
其内置8K字节点擦除可编程EEPROM片内程序存储器和256字节RAM,无需外部扩展。
所以选用方案二,采用AT89C52作为核心,其片内程序存储器空间足够满足本系统程序存储的需要,可以省去对片外EPROM程序存储器和地址锁存器,使电路结构简捷。
2.EPGA控制方案的选用
方案一:
采用EEP1K30QC-208-3为核心,具备6位数码管动态扫描功能,具备8位按键输入功能,具备和单片机信号交换功能等。
方案二:
采用EEP1K30TC144-3为核心,同样具备6位数码管扫描、8位按键输入和单片机信号交换等功能,且管脚数较少,适于本次设计使用。
所以选用方案二,采用EEP1K30TC144-3作为核心。
其功能已经满足设计需要,且应用简单,管教分配方便,使电路结构简捷。
1.4系统结构原理图
1.4.1系统结构图
图1-2系统结构图
1.4.2原理说明
计算机通过RS232接口下载程序到CPLD电路板及单片机内,控制电路采集数据并通过ADC0809芯片将模拟信号转换为数字信号并由数码管显示出来。
其中,单片机的作用为执行指令进行数据采集,CPLD则控制A/D转换,译码显示等模块,并与单片机进行信号交换。
2硬件电路设计
2.1电路模块
2.1.1FPGA硬件电路
本模块的核心是EEP1K30TC-144-3芯片,主要用于连结其他各电路模块,并与单片机进行信号交换。
芯片采用贴片焊接工艺,将芯片各个管脚焊接与印刷版表层。
由于各个管教之间的间距因其数量和集成度而易造成管脚间短路,故贴片焊接精度要求很高。
2.1.2单片机硬件电路
单片机选用的是ATMEL公司推出的AT89S52,如图2-1所示。
该芯片具有低功耗、高性能的特点,是采用CMOS工艺的8位单片机,与AT89C51完全兼容。
图2-1AT89S52管脚图
AT89S52还有以下主要特点:
1采用了ATMEL公司的高密度、非易失性存储器技术;
2其芯片内具有256字节RAM,8KB的可在线编程(ISP)FLASH存储器;
3有两种低功耗节电工作方式:
空闲模式和掉电模式;
4片内有一个看门狗定时器(WDT),WDT包含一个14位计数器和看门狗定时器复位寄存器(WDTRST),只要对WDTRST按顺序先写入01EH,后写入0E1H,WDT便启动,当CPU由于扰动而是程序陷入死循环后“跑飞”状态时,WDT即可有效的使系统复位,提高了系统的抗干扰能力。
2.1.3A/D转换电路
ADC0809由8路模拟开关、地址锁存与译码器、比较器、256电阻阶梯、树状开关、逐次逼近式寄存器SAR、控制电路和三态输出锁存器等组成。
1)ADC0809芯片介绍
输入:
8路(0V~5V)
线性误差:
1LSB
数字输出:
TTL电平,三态输出
电源:
+5V~15V
时钟频率:
640KHz(典型)
转换时间:
100μs
分辨率:
8位
功耗:
15mW
输入电压范围:
0V~VREF
转换方式:
逐次逼近
CMOS工艺,28Pin
输出:
2)
原理图
图2-2A/D转换电路
3)ADC0809结构图
图2-3ADC0809结构
4)工作原理
表2-1ADC0809通道地址选择表
图2-4ADC0809转换时序图
1)当模拟量送至某一输入通道后,CPU将标识该通道编码的三位地址信号经数据线或地址线输入到ADDC、ADDB、ADDA引脚上。
2)地址锁存允许ALE锁存地址信号,启动命令START启动A/D转换。
3)转换开始,EOC变低电平,转换结束,EOC变为高电平。
EOC可作为中断请求信号。
4)转换结束后,可通过执行IN指令,设法在输出允许OE脚上形成一个正脉冲,打开三态缓冲器把转换的结果输入到DB,一次A/D转换便完成。
3软件设计
3.1程序框图
3.1.1主程序框图
图3-1主程序框图
3.2CPLD程序
CPLD划分为四个模块:
AD模块、乘法器模块、十进制转换模块、动态扫描显示模块。
首先CPLD通过ADC0809采集某一通道的电压值上传到CPLD的AD模块,此时的电压值是8位的二进制数;接着将这个二进制数通过乘法器模块,乘以固定常数196,转换成十六进制数;然后将此数送入十进制转换模块,输出十进制数;最后通过动态扫描显示模块,在数码管上显示出通道号及对应通道的电压值。
3.3单片机程序
图3-2单片机主程序框图
3.4上位机程序
1)单片机接收上位机发来的通道号,并以此控制CPLD进行该通道AD转换;
2)单片机将通道号和转换结果发送到上位机算计。
3)在数码管显示通道号和转换结果;
3.5定时中断程序框图
图3-3定时中断程序框图
4系统调试
系统调试分为硬件调试和软件调试两部分,在硬件设计焊接结束后应注意调试程序的编写,全面系统地测试出系统的基本功能,为后来的程序编写扫清非主观障碍。
4.1硬件部分
1)FPGA芯片采用的是贴片方形塑料封装,144个管脚,排列密集,焊接难度大,要先将芯片用手按住在小板上,然后用焊锡固定其中一边的引脚,再全部加锡,来回拖拉几次保证上锡良好,再用烙铁收干净锡即可。
2)焊接完成后,用万用表来检测芯片的各个管脚是否有短路现象。
3)焊接扩展电路时,先要将原理图画出,然后在草稿纸上进行分布,保证之后布线的合理性,布线时讲究“横平竖直”。
4.2软件部分
(1)CPLD(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总结
在这50课时的技能考核中,让我学会了解决问题的能力,对51单片机、CPLD这两门课程有了更进一步的理解和认识,加深了对AD转换以及单片机和PC机实现通讯的原理,更熟练掌握了CPLD语言的编写和使用Keil软件编写单片机程序实现相应电路功能的技术与本领,熟练学习应用拖锡技术实现贴片式芯片的焊接。
在电路调试的时候,板子遇到点小问题,造成电压显示不正确,但在老师的悉心教导和同学的帮助下,找到问题的根源,并解决问题,最终顺利完成本次技能考核。
每一分耕耘都会有一分收获,每一次学习都会对所学知识的回顾,并从中学到更多更深的知识,增强了动手能力和逻辑思维能力。
再次感谢翟老师和有老师的的悉心教导。
参考文献
[1]胡汉才,《单片机原理及其接口技术》(2版),清华大学出版社
[2]张迎新,《单片机中级教程》,北京航空航天大学出版社
[3]丁元杰,《单片机原理与应用》,机械工业出版社
[4]孙育才,《MCS-51系列单片微型计算机及其应用》,东南大学出版社
[5]曹巧媛,《单片机原理及应用——教学、实践、设计指导》,电子工业出版社
[6]谢自美,《电子线路设计·实验·测试》(2版),华中科技大学出版社
[7]单片机实验指导书
附录1:
元器件清单
名称
型号
规格
数量
电容
16V/470uF
电解电容
2
16V/2200uF
1
16V/22uF
6
0.1uF
独石电容
7
20pF
磁片电容
4
1//4W电阻
200
8
50
2
1K
6
2K
2
10K
2
4.7K
1
单片机
AT89S52
1
芯片座
DIP-40
2
DIP-20
1
DIP-28
1
DIP-32
1
DIP-14
3
DIP-16
1
芯片
74HC04
3
MAX232
1
发光二极管
红色
9
数码管
LG5011AH
6
薄码开关
8P
1
牛角座
无锁(10P)
1
按键
6*6*6mm
6
卧式串口
2
有源晶振
40M
1
晶振
22.1184M
2
二极管
1N4007
7
7805
1
阻排
4.7K
9P
1
1K
1
470
1
103
1
稳压电源
φ3.5空心座
1
双排针
40P
4
双排座
40P
4
电位器
103
1
附录2:
程序
1、八位二进制乘法器
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;
2、16位BCD码转换与显示电路
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
(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
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;p=vcc;
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";---“0111111”
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、模数转换器
Include"dcbzhhh.inc";
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;
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[]==999999then
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
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;