嵌入式接口课设报告.docx
《嵌入式接口课设报告.docx》由会员分享,可在线阅读,更多相关《嵌入式接口课设报告.docx(27页珍藏版)》请在冰豆网上搜索。
嵌入式接口课设报告
电气工程与自动化学院
项目驱动实践报告
(ARM嵌入式接口课程实践)
题目:
基于ARM的多路数据采集系统设计
专业班级:
自动化班
学号:
号
学生姓名:
指导老师:
日期:
2013年12月22日
基于ARM的多路数据采集系统设计摘要
ThispaperdesignedadataacquisitionsystembasedonARM7LPC2124processor,usingthebuilt-inabundantperipheralresources,andrealizingthemulti-channelanaloginputvoltagesignalofcontinuousacquisitionandorderconversiontorealizethereal-timemonitoringofvoltagesignalonthespot.Specificdesigngoalswhichcanrealize8-waydatacollection,signalsamplingmethodisdividedintomultipleloopandsingleacquisition,displayand1in8roadinputsignalpathforthefrequencyconversioncircuitofvoltage,theother7roadbyadjustingthepressuretypesliderheostatasadjustableinputvoltagesource,throughtheADconversion,andthroughthepressedkeyinputacquisitionchannelselection,theresultsofthedataacquisitionthroughLCDLCDdisplay,andfinallyinprotuessimulationenvironmenttoachievethemulti-channeldataacquisitionsystem,andacquisitionprecisionmeetthedesignrequirements.
本文设计了一个基于ARM7LPC2124处理器的数据采集系统,利用内置的丰富的外设资源,实现多路模拟输入电压信号的连续采集和顺序转换实现对现场电压信号的实时监测。
具体设计目标即可以实现8路数据的采集,信号的采集方式分为多路循环采集及显示和单路采集,8路输入信号中1路为频压转换电路所提供的电压,另外7路通过调节分压式滑动变阻器来作为可调输入电压源,经过AD转换,并通过按键选择输入采集通道,数据采集的结果通过LCD液晶显示器显示出来,,最终在protues仿真环境中实现了多路数据采集系统,且采集精度满足设计要求。
关键词:
数据采集系统;嵌入式系统;ARM7微处理器,AD转换,频压转换
第一章绪论
1.1课题研究的背景、发展历史及意义
随着社会的发展,科技的进步,计算机在生产生活的各个方面都发挥着极其重要的作用,尤其是在各种生产和科研当中其作用更是无法替代。
同时近几十年来集成工艺的迅速发展尤其是大规模集成工艺的发展,使得计算机普及化,微型化,于是嵌入式成为一个朝阳领域而蓬勃发展,广泛应用于更重智能控制器之中。
嵌入式系统是以应用为中心,以计算机为基础,软硬件可裁剪,使用与对功能,可靠性,成本,体积和功耗有严格要求的专用计算机系统。
嵌入式系统的核心是各种类型的嵌入式处理器。
目前,采用ARM技术的微处理器占据了主流,其应用遍及工业控制,消费类电子产品、通信系统、DSP、网络系统、无线应用而等各类市场产品。
而应用于控制领域的嵌入式系统中所面对的一个问题就是:
如何更可靠的完成精度要求下的系统数据的采集与处理,因此,研究嵌入式系统下的多路数据采集是非常有意义的。
数据采集系统是将采集传感器的温度,压力,流量,位移等模拟信号转换成计算机能识别的数字信号,进行相应的计算存储和处理;同时,可将计算所得的数据进行显示或打印,以便实现对某些物理量的检测和控制。
1.2多路数据采集系统的目的和功能
很多的情况下,应用环境中的变量因素不止一个或不止一种,这时要对多个不同类型的信号进行检测,以便进行控制,此时就需要搭建多路数据采集系统。
1.3本设计的主要内容
1.3.1设计课题
设计一个八路数据采集系统,主控制器能对模拟信号产生的各路数据,通过数据采样器进行采集并在主控制器的程控下进行单路或多路同时显示
1.3.2设计要求
(1)在protues信号源模式下选取正弦信号波发生器,设置信号源频率在200HZ至2KHZ范围变化,再经过频率电压变换电路后输出相应1V至5V的直流电压(200HZ对应于1V,2KHZ对应于5V)。
(2)数据采集第一路输入自制1V至5V直流电压,第2路至第7路分别输入来自直流源的5,4,3,2,1,0V直流电压,第八路备用。
将各路模拟信号分别转换成八位二进制数字信号,再经并串变换电路,用串行码送入传输线路
(3)主控制器通过串行传输线路对各路数据进行采集和显示。
使用循环采集(即1路、2路、…、8路、1路…)方式,显示部分能同时显示地址和相应的数据。
1.3.3拓展部分
⑴减少串行传输线数目至4路以下
⑵可通过按键对采集通道进行选择,如只采集第一路信号。
第二章
多路数据采集系统总体方案的设计
2.1温度控制系统的整体结构图
电阻炉温度控制系统一共分为温度测量模块,显示模块,PID控制模块,上位机,微控制器,整个控制系统采取闭环负反馈原理,
各模块之间的关系结图
2.2微控制器的选择
本设计中采用由NXP生产的基于ARM7架构的LPC2124作为主控芯片,该芯片最多可以使用46个GPIO,外部8,16或32为总线,内置有8路10位A/D转换器,转换时间低至2.44ms,同时有多个串行接口,包括两个16C50工业标准UART,高速I2C(400kbit/s)和2个SPI接口,4路外部中断以便实时控制。
2.3频压转换设计方案
2.3.1基于LM2907的频率电压转换:
LM2907为集成式频率/电压转换器,芯片中包含了比较器、充电泵、高增益运算放大器,能将频率信号转换为直流电压信号。
LM2917与LM2907基本相同,区别是:
LM2917内部有一只稳压管,用于提高电源的稳定性。
主要特点:
LM2917进行频率倍增时只需使用一个RC网络;以地为参考点的转速计(频率)输入可直接从输入管脚接入;运算放大器/比较器采用浮动三极管输出;最大50mA的输出电流可驱动开关管、发光二极管等;内含的转速计使用充电泵技术,对低纹波有频率倍增功能;比较器的滞后电压为30mv利用这个特性可以抑制外界干扰;输出电压与输入频率成正比,线性度典型值为0.3%;具有保护电路,不会受高于VCC值或低于地参考点输入信号的损伤;在零频率输入时,LM2907的输出电压可根据外围电路自行调节;当输入频率达到或超过某一给定值时,可将输出用于驱动继电器、指示灯等负载,输出电压与输入频率的关系为
Vo=Vcc*fin*Ci*Ri*K
K为增益系数,典型值为1。
电容C2取决于纹波电压的大小和实际应用所需要的响应时间
2.3.2.基于LM331的频率电压转换
当输入负脉冲到达时,由于
脚电平低于
脚电平,所以S=1(高电平),
=0(低电平)。
此时放电管T截止,于是Ct由VCC经Rt充电,其上电压VCt按指数规律增大。
与此同时,电流开关S使恒流源I与
脚接通,使CL充电,VCL按线性增大(因为是恒流源对CL充电)。
经过1.1RtCt的时间,VCt增大到2/3VCC时,则R有效(R=1,S=0),
=0,Ct、CL再次充电。
然后,又经过1.1RtCt的时间返回到Ct、CL放电。
以后就重复上面的过程,于是在RL上就得到一个直流电压Vo(这与电源的整流滤波原理类似),并且Vo与输入脉冲的重复频率fi成正比。
CL的平均充电电流为i×(1.1RtCt)×fi
CL的平均放电电流为Vo/RL
当CL充放电平均电流平衡时,得
Vo=I×(1.1RtCt)×fi×RL
式中I是恒流电流,I=1.90V/RS
式中1.90V是LM331内部的基准电压(即2脚上的电压)。
于是得
可见,当RS、Rt、Ct、RL一定时,Vo正比于fi,显然,要使Vo与fi之间的关系保持精确、稳定,则上述元件应选用高精度、高稳定性的。
对于一定的fi,要使Vo为一定植,可调节RS的大小。
恒流源电流I允许在10
A~500
A范围内调节,故RS可在190kΩ~3.8kΩ范围内调节。
一般RS在10kΩ左右取用。
基于LM331制作的V/F和F/V转换
考虑到LM331的频压转换外围电路较复杂,且对元件精度要求高,同时要调节4个参量,远比LM2907复杂,所以本系统决定采用基于LM2907的频压转换
2.3.3系统频压转换电路图
2.4AD转换电路设计
虽然LPC2124本身内置有8路10位AD转换功能,但由于Protues仿真环境的限制实际上只有4路仿真AD引脚。
同时内部AD精度并不太高,且操作繁琐。
本系统决定采用外部集成AD转换芯片TLC2543
2.4.1TLC2543功能简介
TLC2543是一款8位、10位、12位为一体的可选输出位数的11通道串行A/D转换器 。
使用开关电容逐次逼近技术完成A/D转换过程;每一路转换时间为10us。
由于是串行输入结构,能够节省I/O资源,更重要的是通道选择方便允许正负双极性参考电压。
管脚信号:
外部输入信号为:
D_IN(数据输入) ;CS(片选);CLOCK(串行时钟);AIN(模拟输入)四种信号;
输出信号为:
EOC转换结束信号,D_OUT信号。
工作原理为:
_CS由高变为低时候,允许D_IN;CLOCK;AIN信号输入,DATA out 信号输出;由低到高禁止DATA input;AD_IO_CLK;信号输入。
当忽略ADC转换启动的CS时候,数据的输出是在CS的下降沿,既是将片选的时候,而考虑到CS时候,第一个输出数据发生在EOC变为高的时候的上升沿。
注意:
初始化时候,必须将CS由高拉低才能进行数据输出或者是数据输入。
也就是说,当一次转换完成后,进行下一次或者是下一个通道的转换,需要将CS由低拉高,为下一次转换做好准备,当进行下一个转换时候,进行CS拉低,DATA input输入或者DATA out输出(忽略CS转换作用时候)。
信号解释:
DATA input:
4位串行地址输入,用来选择模拟输入通道功能或者测试引脚;高位在前,在每一个AD_IO_CLK的上升沿输入ADC的寄存器。
由八位组成:
前四位:
D7:
D4用作选择模拟输入通道,D3:
D2用作选择数据长度,D1是选择输出高低位顺序的,D0选择是选择输出极性(单双极性)。
2.4.2基于TLC2543的AD转换电路
由于本系统采集单极性电压,所以直接将REF-接至电源地,仅保留正极性参考电压REF+(取+5V)
2.5系统显示子系统设计
由于考虑到传统的数码管所可以显示的内容有限,仅仅是数字内容,而且显示容量较小。
至于LED点阵的显示,若要达到一定的显示效果(比如数字和字符同时显示)时,所需要点阵数量和硬件驱动电路也很庞大,二者仅适用于一些简单的显示,人机交互性能并不理想,所以本系统决定采用LCD1604液晶显示接口,一是显示内容丰富,而是接口电路简单,再者驱动程序也不复杂。
虽然占用引脚较多(8个数据口和3个控制脚),不过数据口可通过串并转换来补偿这一缺点。
具体的显示电路图如下
2.6按键输入电路的设计
按照系统可以通过按键来选取采集通道的设计要求,由于共有8路数据采集,有三种解决方案:
1:
设置三个独立按键,通道加1键,通道减1键,单路显示与多路显示切换键,优点是I/O口占用少,键处理与扫描函数简单,缺点是无法直接选取某一通道,需要至少一次加1或减1操作;
2:
8个设置独立按键,单路显示与多路显示切换键共9个键,优点是切换快速准确,键处理和扫描程序简单,缺点是I/O口占用多
3:
采用4*3矩阵式键盘,性能与2相当,缺点是键扫描函数较1和2稍复杂。
但与方案2相比,方案3占用7个I/O口,却得到12个按键,虽然本系统不需要太多按键,但保留几个空键以便日后扩展也是一种便利。
综上考虑,设计采用矩阵式键盘。
电路图如下:
第三章
软件设计与系统调试
3.1程序设计的总体思想及调试原则
一个嵌入式系统是有不同的模块来组成的,所以程序设计时主要遵循的原则:
模块化设计,先将整个系统分成若干个子模块,然后按照自顶向下,分层设计,逐步细化的思路设计程序。
本系统主要由主控模块,A/D模块,LCD显示模块,按键模块,频压转换模块组成,为确保及时发现问题,同时应该设计一个,测试一个,只有各子模块设计成功才能保证系统可靠。
其中频压转换模块为纯硬件模块,其余模块为软硬件同时需要模块。
同时还应该注意,尽量减少模块间耦合,先做好接口规划,以免相互影响。
3.2按键模块的程序设计
矩阵键盘的扫描分为行列扫描和线翻转扫描,此处选用列扫描法,按键消抖采用软件消抖。
下图为按键扫描流程图
3.3A/D模块的程序设计
A/D转换相关函数共有2个,分别是
A/D接口管脚初始化函数:
设置相应管脚使芯片处于待工作状态;A/D转换函数,主要完成A/D转换,并将结果串行发送至ARM7,本系统为保证测量的精度,决定采取每路AD连续测取3次,取最后一次结果为准。
AD转换程序设计流程图:
3.4LCD模块的程序设计
LCD1604的驱动程序主要包括:
LCD1604初始化函数、LCD写指令函数、LCD写数据函数,LCD清屏函数,LCD指定位置显示指定字符串函数共五个函数。
为避免各模块耦合,只有LCD1604初始化函数,LCD清屏函数,LCD指定位置显示指定字符串函数声明为外部接口函数
3.5主控程序的设计
主控制程序处于最顶层,负责整个系统的协调运行,首先应完成系统初始化,该函数主要是各个功能子模块初始化函数调用,相关参数及变量的初始化。
其次是检测是否有按键按下,有则进行相应键处理。
还有刷新显示、数据采集等工作。
主程序框图和初始化子程序框图如下:
致谢
在本次嵌入式课程实践之中,我学到了很多东西,这次课程设计不同以往的实物制作,由于是基于纯虚拟的仿真设计,毕竟与实际之间还存在一定的差距,所以在设计过程中我遇到了很多的问题,尤其在编写程序的时候,但在老师和同学的热心帮助之下,我还是找到了问题的所在,并成功解决问题。
在此,向温老师和我的同学致以诚挚的感谢
参考文献
[1]刘凯.ARM嵌入式接口技术应用.清华大学出版社.2009
[2]童诗白.华成英模拟电子技术基础.高等教育出版社.2006
[3]彭伟.单片机C语言程序设计实训.电子工业出版社.2009
[4]周立功.深入浅出ARM7——LPC2200.广州致远电子有限公司
附录
附录一基于ARM的多路数据采集系统整体电路图
附录二基于ARM的多路数据采集系统的控制程序
1LCD1604驱动程序(LCD1604.c)
/*********************************************************
**文件名LCD1604.c
**文件描述1604液晶驱动程序
**创建时间2012-9-11
*********************************************************/
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//LCD1604管脚接口
/********************************************************************
P0.0-P0.7D0--D7数据传输脚
P0.8RS0输入指令1输入数据
P0.9RW0写LCD1读LCD
P0.10EN使能引脚
********************************************************************/
#defineRS(1<<8)
#defineRS_LIO0CLR=RS
#defineRS_HIO0SET=RS
#defineRW(1<<9)
#defineRW_LIO0CLR=RW
#defineRW_HIO0SET=RW
#defineEN(1<<10)
#defineEN_LIO0CLR=EN
#defineEN_HIO0SET=EN
/********************************************************************
**函数名称voidDelayms(uintms)
**函数描述软件延时
**传入参数uintms延时毫秒数
**传出参数无
**返回值无
*******************************************************************/
voidDelayms(uintms)
{
uchari;
while(ms--)
{
for(i=0;i<120;i++);
}
}
/********************************************************************
**函数名称Busy_Check()
**函数描述检查总线是否忙碌
**传入参数无
**传出参数无
**返回值LCD_Status若为0x80代表总线忙
********************************************************************/
ucharBusy_Check(void)
{
ucharLCD_Status;
RS_L;
RW_H;
EN_H;
IO0DIR=0x700;
LCD_Status=(IO0PIN&0X80);
IO0DIR=0x7ff;
EN_L;
returnLCD_Status;
}
/********************************************************************
**函数名称Write_LCD_Command(ucharcmd)
**函数描述LCD写指令函数
**传入参数cmd指令代码
**传出参数无
**返回值无
********************************************************************/
voidWrite_LCD_Command(ucharcommand)
{
while(Busy_Check()==0x80);
RS_L;
RW_L;
IO0CLR=0XFF;
IO0SET=command;
EN_H;
EN_L;
}
/********************************************************************
**函数名称Write_LCD_Data(uchardat)
**函数描述LCD写数据函数
**传入参数uchardat待写入数据
**传出参数无
**返回值无
********************************************************************/
voidWrite_LCD_Data(uchardata)
{
while(Busy_Check()==0x80);
RS_H;
RW_L;
IO0CLR=0XFF;
IO0SET=data;
EN_H;
EN_L;
}
/********************************************************************
**函数名称Initialize_LCD()
**函数描述LCD初始化函数
**传入参数无
**传出参数无
**返回值无
********************************************************************/
voidInitialize_LCD(void)
{
PINSEL0=PINSEL0&0xFFFFFC00;/*LCD接口初始化P0.0-P0.10为GPIO模式*/
IO0DIR=IO0DIR|0x000007FF;/*P0.0-P0.10输出模式*/
IO0CLR=IO0CLR|0x000007FF;/*P0.0-P0.10输出低电平*/
Write_LCD_Command(0x38);
Delayms
(2);
Write_LCD_Command(0x0c);
Delayms
(2);
Write_LCD_Command(0x06);
Delayms
(2);
Write_LCD_Command(0x01);/*LCD清屏命令*/
Delayms
(2);
}
/********************************************************************
**函数名称ShowString(ucharx,uchary,char*pstr)
**函数描述LCD指定位置写字符串函数
**传入参数x位置行参数
y位置列参数
pstr待写入字符串指针
**传出参数无
**返回值无
********************************************************************/
voidShowString(ucharx,uchary,char*pstr)
{
chari;
switch(x)
{
case0:
Write_LCD_Command(0x80|y);
break;
case1:
Write_LCD_Command(0xc0|y);
break;
case2:
Write_LCD_Command(0x90|y);
break;
case3:
Write_LCD_Command(0xd0|y);
break;
default:
Write_LCD_Command(0x80|y);
break;
}
Delayms
(2);
for(i=0;pstr[i]!
='\0'