基于ARM的数据采集系统.docx

上传人:b****5 文档编号:4174256 上传时间:2022-11-28 格式:DOCX 页数:14 大小:216.99KB
下载 相关 举报
基于ARM的数据采集系统.docx_第1页
第1页 / 共14页
基于ARM的数据采集系统.docx_第2页
第2页 / 共14页
基于ARM的数据采集系统.docx_第3页
第3页 / 共14页
基于ARM的数据采集系统.docx_第4页
第4页 / 共14页
基于ARM的数据采集系统.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

基于ARM的数据采集系统.docx

《基于ARM的数据采集系统.docx》由会员分享,可在线阅读,更多相关《基于ARM的数据采集系统.docx(14页珍藏版)》请在冰豆网上搜索。

基于ARM的数据采集系统.docx

基于ARM的数据采集系统

课程实习报告

实习名称:

嵌入式课程设计

*************************

学号:

专业班级:

*****************************

完成时间:

评阅意见:

 

评阅教师日期

报告成绩:

 

基于ARM的数据采集系统课程设计

一、设计要求

1、查阅相关文献资料,熟悉所选的ARM(S3C44B0)芯片。

2、系统硬件设计,熟悉AD转换原理及过程,12864液晶与ARM芯片的硬件接口实现及显示。

3、系统软件设计,包括采集电压的AD转换及显示的软件实现,用C语言编程。

二、设计的作用及目的

本设计是基于S3C44B0ARM芯片为主控处理器,实现了电压的实时采集、传输、处理、12864液晶上的显示等功能,并讨论了如何提高系统的速度、可靠性和可扩展性。

并解决了传统的数据采集系统存在的响应慢、精度低、可靠性差等弊端,能够完全适应现代化工业的高速发展。

1、注重培养综合运用所学的知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练。

2、了解所选择的ARM芯片各个引脚的功能、工作方式、计数/定时、I/O口、中断等相关原理,并巩固学习嵌入式的相关内容知识。

3、通过软件和硬件的设计,实现利用ARM芯片对模拟量的采集、转换、处理及显示。

三、课题分析

数据采集(DAQ),是指从传感器和其它待测设备等模拟和数字被测单元中自动采集非电量或者电量信号,送到上位机中进行分析,处理。

数据采集系统是结合基于计算机或者其他专用测试平台的测量软硬件产品来实现灵活的、用户自定义的测量系统。

被采集数据是已被转换为电讯号的各种物理量,如温度、水位、风速、压力等,可以是模拟量,也可以是数字量。

采集一般是采样方式,即隔一定时间(称采样周期)对同一点数据重复采集。

采集的数据大多是瞬时值,也可是某段时间内的一个特征值。

准确的数据量测是数据采集的基础。

数据量测方法有接触式和非接触式,检测元件多种多样。

不论哪种方法和元件,均以不影响被测对象状态和测量环境为前提,以保证数据的正确性。

本课程设计研究基于ARM的数据采集系统,通过S3C44B0芯片自带的8路10位A/D转换器对模拟量电压采样,采集的数据由主控芯片处理,送至LCD12864液晶实时显示。

四、系统组成及工作原理

本系统采用的是S3C44B0ARM7系列主控芯片,由晶振电路和复位电路构成了基本应用系统。

系统包括AD采样部分(芯片内部自带的8路10位A/D变换器)、12864液晶显示部分、JTAG在线下载调试部分、电源模块分别给系统提供CPU内核所需的2.5V电压和芯片所需的3.3V电压及液晶所需的5V电压。

本系统通过对电位器电压的变化的采集,由芯片内部自带的8路10位A/D转换器将模拟量变成数字量通过系统的一系列处理,在12864液晶上实时显示。

五、系统硬件设计

5.1硬件设计思路

本设计的基于ARM的数据采集系统和显示装置的原理框图如图1所示。

有图可见,本系统采用“电源部分+ARM核心控制模块+电压的采集模块”实现所需的功能。

并考虑到系统的可扩展性和延伸性,本系统采用主从CPU协同工作,实现了电压的实时采集、传输与显示,具有处理速度快、精度高、人机交互界面友好、稳定性高、扩展性好等优点。

5.2电源电路设计

本系统的电源电路由三部分组成,系统总电源电路和RAM核心模块电源电路及液晶所需要的电源电路。

如图2:

220V的交流电经过降压变压器和整流得到+12V恒定直流电源经电容滤波,分别进入7805和7905稳压,得到+5V和-5V的稳定电压输出后分别供给12864液晶显示,然后5V的电压分别经AMS1117-2.5和ASM1117-3.32.5V供给S3C44B0的内核,转变为3.3V供给S3C44B0的I/O口和其余电路部分使用。

图中IN4148是为了防止输出端并接高于本稳压模块的输出电压而烧坏7905和7805而特别设计,达到了可靠性电源设计目的。

另外,由于系统正常工作电流较大,因此使用时均应在7809和7805上加散热片散热。

由图可见,系统采用双电源供电,提供了系统正常工作所需的电源电压。

另外,由于考虑到便携目的,本系统采用+12V铅蓄电池提供系统所需的恒定直流电源。

 

如图2:

I/O口提供了相应的稳定直流电源。

由于S3C44B0采用2.5V作为ARM内核电源,使用3.3V作为I/O口电压,故ARM核心控制模块电源需要另外单独设计,其电源电路如图3-2所示。

由系统总电源电路提供的+5V稳压电源作为输入,分别经7805、AS1117-3.3、AS1117-2.5稳压后,输出5.0V、3.3V和2.5V恒定电源,为RAM内核和I/O口提供了相应的稳定直流电源。

5.3基本应用系统

 

基本应用系统包括S3C44B0主控芯片、晶振和复位电路。

主控芯片控制整个系统工作,晶振为系统正常工作提供动力,复位电路使整个系统复位,包括了上电自动复位和手动复位,复位电路的两种方法的原理都是低电平复位。

5.4人机接口电路

人机接口电路如下图4所示:

 

人机接口电路负责数据的处理、显示,以及键控模式的切换、参数的设定等功能。

人机接口交互电路由矩阵键盘、LCD12864液晶两部分组成,其电路原理图如图4所示。

主控芯片采用S3C44B0芯片,芯片的DATA0、DATA1、DAYA2分别接LCD12864的CS、SID、SCLK。

5.5A/D采样电路

 

本系统用于电压采集,采用S3C44B0芯片自带的8路10位A/D转换器。

当扭动电位器时相应的AD采集的电压也会改变,经过主控芯片的处理在LCD12684液晶上实时显示。

5.6JTAG调试电路

 

JTAG最初是用来对芯片进行测试的,JTAG的基本原理是在器件内部定义一个TAP(TestAccessPort;测试访问口)通过专用的JTAG测试工具对内部节点进行测试。

JTAG测试允许多个器件通过JTAG接口串联在一起,形成一个JTAG链,能实现对各个器件分别测试。

如今,JTAG接口还常用于实现ISP(In-SystemProgrammer,在系统编程),对FLASH等器件进行编程。

JTAG编程方式是在线编程,传统生产流程中先对芯片进行预编程然后再装到板上,简化的流程为先固定器件到电路板上,再用JTAG编程,从而大大加快工程进度。

JTAG接口可对DSP芯片内部的所有部件进行编程。

六、系统软件设计

6.1软件设计思路

本系统软件设计是在CodeWarriorforADS开发环境下完成的。

本电压数据采集与LCD12864液晶显示装置的主体由S3C44B0核心控制模块和电压数据采集模块构成,所以系统软件也是围绕这两个模块来编写的。

实现所要求的功能,程序流程图如图7。

 

由该流程图可看出,刚上电时,S3C44B0要先进行ARM内部的初始化,以使ARM进入相应的状态和模式;然后初始化硬件装置,以使硬件系统可以正常支持电压数据采集;接着通信初始化,以确定电压采集模块与ARM核心控制模块连接正常,并通过UART复位电压数据采集模块,确保其进入正常电压数据采集状态;然后初始化LCD显示和键盘,在LCD上显示相应的菜单列表,供用户通过键盘选择操作;至此,系统初始化完成,并进入正常主程序循环状态。

其主程序包括温度采集程序、ARM获取温度子程序、温度处理和转换子程序。

当ARM处理器接收到正确的温度数据后,立即进行相应的电压数据处理与转换,变成可被LCD直接显示的正确电压值。

6.2软件调试问题分析及解决办法

1、ADS软件使用不熟练导致各种各样的小问题。

2、没有正确对S3C44B0芯片I/O口初始化。

3、A/D采样程序没有初始化。

4、12864液晶显示程序没有延时。

5、程序相对应的头文件没有添加,导致寄存器无法识别。

通过对ADS编程软件的学习,学会使用了ADS软件的开发、编译、调试方法学会了跟踪/调试程序,掌握断点的设置与取消,对自己编写的代码进行编译,以及下载到开发板上。

当我软件调试遇到问题时,通过查阅书籍、上网查资料之外,还有我们实验室的师兄师姐的鼎力相助。

使我的这些问题迎刃而解。

七、心得体会及建议

在这次ARM嵌入式系统课程设计中,我们小组的设计课题是《基于ARM的数据采集系统设计》。

通过这次课程设计,我对ARM嵌入式系统尤其是数据处理中的电压采集系统有了更进一步的了解,同时知识面也进一步得到了扩展和加深。

本次课程设计的任务主要是对基于传统电压采集系统的使用环节中遇到的一些问题提出的一种改进方法,有助于数据采集系统更好的发展与使用,帮助我们更好的理解嵌入式系统和数据采集系统的原理和应用。

数据采集是一种直接数字处理方法。

所谓电压采集系统,就是通过扭动电位器使A/D采集的电压发生变化后经过收集与处理,最后得到我们所需要的有用的数字信号并送入系统的下一环节进行其他操作。

目前,由于传统的数据采集系统存在响应慢、精度低、可靠性差、效率低、操作繁琐等弊端,已经不能完全适应现代化工业的高速发展。

随着嵌入式技术的迅猛发展,设计高速度、高效率、低成本、高可靠性、操作方便的数据采集系统成为当务之急。

所以,学习和应用数据采集系统及其应用技术对我们以后的学习和工作有着十分重要的意义。

在这次为期一周课程设计的过程中,我深深的感触到了团队合作的重要性,尤其是在当今的社会工作中,一个人的力量在一个巨大的任务前是那么的渺小,必须靠多人合作才能共同完成。

在设计规划过程,我们小组三个人亲密无间的合作,使得本次课程设计能够非常顺利地完成,在课程设计的过程中,每个人都能按要求很好的完成分配给自己的任务,最后大家一起通过讨论把所有任务串连起来完成总的设计任务。

通过本次课程设计,让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计产品的能力。

既让我们懂得了怎样将理论应用于实际,又让我们懂得了在实践中遇到的问题怎样用理论去解决。

在设计过程中,总是会遇到这样或那样的问题。

有时一个问题可能会需要大家集体去查阅资料,做大量的工作,花大量的时间才能解决。

通过不断地发现问题,解决问题,自然而然,我的发现问题和解决问题的能力便在其中建立起来了。

这都为以后的工作积累了经验,同时也增强了我们解决问题的能力。

八、参考文献

[1].熊茂华、杨震伦ARM体系结构与程序设计[M].北京:

清华大学出版社2009年.

[2].邱铁ARM嵌入式系统结构与编程[M].北京:

清华大学出版社2009年.

[3].王孝良基于ARM平台的嵌入式核心编程[M].北京:

清华大学出版社2011年.

[4].刘迎春C语言程序设计[M].北京:

.北京大学出版社,2006.

[5].王田苗嵌入式系统设计与实例开发[M].北京:

清华大学出版社2003年.

[6].杜春雷ARM体系结构与编程[M].北京:

.清华大学出版社2003年.

 

附录1总原理图

附录2源程序

/*******************************主程序******************************/

#include "..\inc\main.h"

#include "..\inc\12864.h"

#include "..\inc\ADC.h"

//我们用这个片编存储我们的IRQ ISR入口地址

U32 pIrqStart = 0;

U32 pIrqFinish = 0; 

U32 pIrqHandler = 0;

/*主函数*/

int main(void)

{

 sysUtilsSetPllValue (24, 6, 1); //设置片内的锁相环

 IoConfig (); //io端口的初始化

 Clr_Pled();  //关闭跑马灯

 Clr_DZ();  //关闭点阵显示

 Clr_led();  //关闭数码管显示

 ADC_Init(void);//ADC初始化

    lcd_init();    //初始化LCD      

 console_init (115200); //初始化控制台

 while

(1)

 ADC_Test();

 while

(1);

 return 0;

}

/****************************AD采样程**************************/

#include "..\inc\ADC.h"

#include "..\inc\12864.h"

void ADC_Init(void)

{

 rCLKCON = rCLKCON | (1<<12);  //控制系统主时钟进入ADC单元模块

 rADCCON = 0x1|(0<<2);  

 sysUtilsUSecDelay(100);  //延时若干个100us

 rADCPSR = 10;

}

unsigned short Read_Adc(unsigned char ch)

{

 int i;

    static int prevCh=‐1;

    if(prevCh!

=ch)

    {

  rADCCON = 0x1|(ch<<2); //设置AD转换通道

     for(i=0;i<150;i++);  //最小15uS

   }

    rADCCON=0x1|(ch<<2); //开始AD转换

   while(rADCCON & 0x1); //避免标志FLAG错误

    while(!

(rADCCON & 0x40));  //等待AD转换结束

   for(i = 0; i < rADCPSR; i++);  //避免第二次标志FLAG错误

    prevCh=ch;

   return rADCDAT;  //返回AD转换值

}

void ADC_Test(void)

{

     int a0=0,b0=0;

    ADC_Init() ;  //模数转换初始化 

     while( !

( kbhit && (getkey()==ESC_KEY) ) )

     {

    a0 = Read_Adc(0);  //ADC某一通道进行转换,返回转换的数据

     b0=a0*2.500/1024;

displayint(3,3,b0);

  }

/************************12864液晶显示程序**************************/

#include "..\inc\12864.h"

#include "..\inc\sysUtils.h"

//总线地址声明

volatile U8 * LCD12864_MAdd = (volatile U8 *)(0x6000000);

#define LCD12864_WR_H() rPDATC|=0x01;

#define LCD12864_WR_L() rPDATC&=~0x01;

void lcd_wcmd(U8 cmd);

void lcd_wdat(U8 dat);

void lcd_init(void);

void lcd_pos(U8 X,U8 Y);

static U8 dis1[] = {"数据采集系统"};

U8 IRDIS[2];

U8 IRCOM[4];

void lcd_wcmd(U8 cmd)

{   

 sysUtilsUSecDelay(150000);                       

 LCD12864_WR_L();

 LCD12864_MAdd=cmd;

 sysUtilsUSecDelay(15000);

}

void lcd_wdat(U8 dat)

{  

 sysUtilsUSecDelay(150000);                        

 LCD12864_WR_H();

 * LCD12864_MAdd=dat;

 sysUtilsUSecDelay(15000);

}

/************************LCD初始化******************************/

void lcd_init(void)

 lcd_wcmd(0x34);         //扩充指令操作

 sysUtilsUSecDelay(5000);/*delay(5);*/

 lcd_wcmd(0x30);         //基本指令操作

 sysUtilsUSecDelay(5000);/*delay(5);*/

 lcd_wcmd(0x0C);         //显示开,关光标

 sysUtilsUSecDelay(5000);/*delay(5);*/

 lcd_wcmd(0x01);         //清除LCD的显示内容

 sysUtilsUSecDelay(5000);/*delay(5);*/

}

/*******************************************************/

void diaplaystring(U8X,U8Y,U8*P)

{

    U8 i;       

    lcd_pos(0,0);    //设置显示位置为第一行的第1个字符

    i = 0;

    while(*(P+i) !

= '\0')

    {                    

     lcd_wdat(*(P+i));

     i++;

    }

 }

/* 设定显示位置 */

void lcd_pos(U8 X,U8 Y)

{                          

   U8  pos;

   if (X==0)

     {X=0x80;}

   else if (X==1)

     {X=0x90;}

   else if (X==2)

     {X=0x88;}

   else if (X==3)

     {X=0x98;}

   pos = X+Y ;  

   lcd_wcmd(pos);     //显示地址

}

/***********************显示数据在指定位置**************************/

voiddisplayint(ucharx,uchary,uintNUM)

{

uchara_SHOW[3];

a_SHOW[0]=NUM/10+'0';

a_SHOW[1]=NUM%10+'0';

a_SHOW[2]='\0';

displaystr(x,y,a_SHOW);

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1