练习三 AD、DA的使用与调试报告(苑振涛组)
- 格式:doc
- 大小:743.00 KB
- 文档页数:22
杭州电子科技大学实验报告课程名称:嵌入式系统原理课程设计姓名:应海东实验项目:DMA实验、A/D与D/A实验班级:10052313 指导教师:任彧学号:10051329 日期:2012.12.11实验目的DMA实验:了解DMA传送原理;掌握S3C2410 DMA控制器的使用;掌握DMA软件编程方法。
A/D与D/A实验:熟悉S3C2410本身自带的八路十位A/D控制器及相应寄存器;编程实现ARM 系统的A/D 与D/A功能;掌握带有A/D 的CPU 编程实现A/D 功能的主要方法;掌握D/A的实现方法,并使用IIC通信的D/A器件MAX5380。
实验环境硬件:DM2410实验板;测控与显示扩展板;PC机;J-Link V8仿真器;软件:PC机操作系统(WINDOWS XP);ARM Developer Suite v1.2;J-link ARM V4.081;实验内容(算法、程序、步骤和方法)DMA实验代码:1)头文件、函数声明及特殊功能寄存器#include <string.h>#include "def.h"#include "option.h"#include "2410addr.h"#include "2410lib.h"#include "2410slib.h"//函数声明static void __irq Dma0Done(void);static void __irq Dma1Done(void);static void __irq Dma2Done(void);static void __irq Dma3Done(void);void DMA_M2M(int ch,int srcAddr,int dstAddr,int tc,int dsz,int burst);//DMA特殊功能寄存器typedef struct tagDMA{volatile U32 DISRC; //0x0 DMA初始源寄存器volatile U32 DISRCC; //0x4 DMA初始源控制寄存器volatile U32 DIDST; //0x8 DMA初始目的寄存器volatile U32 DIDSTC; //0xc DMA初始目的控制寄存器volatile U32 DCON; //0x10 DMA控制寄存器volatile U32 DSTAT; //0x14 DMA状态寄存器volatile U32 DCSRC; //0x18 当前源寄存器volatile U32 DCDST; //0x1c 当前目的寄存器volatile U32 DMASKTRIG; //0x20 DMA掩码触发寄存器}DMA;static volatile int dmaDone;2)DMA内存拷贝函数void DMA_M2M(int ch,int srcAddr,int dstAddr,int tc,int dsz,int burst) {int i,time;volatile U32 memSum0=0,memSum1=0;DMA *pDMA;int length;length = tc*(burst ? 4:1)*((dsz==0)+(dsz==1)*2+(dsz==2)*4);Uart_Printf("[DMA%d MEM2MEM Test]\n",ch);switch(ch){case 0:pISR_DMA0 = (int)Dma0Done;rINTMSK &= ~(BIT_DMA0);pDMA = (void *)0x4b000000; //通道0地址break;case 1:pISR_DMA1 = (int)Dma1Done;rINTMSK &= ~(BIT_DMA1);pDMA = (void *)0x4b000040; //通道1地址break;case 2:pISR_DMA2 = (int)Dma2Done;rINTMSK &= ~(BIT_DMA2);pDMA = (void *)0x4b000080; //通道2地址break;case 3:pISR_DMA3 = (int)Dma3Done;rINTMSK &= ~(BIT_DMA3);pDMA = (void *)0x4b0000c0; //通道3地址break;}Uart_Printf("DMA%d %8xh->%8xh,size=%xh(tc=%xh),dsz=%d,burst=%d\n",ch, srcAddr,dstAddr,length,tc,dsz,burst);Uart_Printf("Initialize the src.\n");for(i=srcAddr; i<(srcAddr+length); i+=4){*((U32 *)i) = i^0x55aa5aa5;memSum0 += i^0x55aa5aa5;}Uart_Printf("DMA%d start\n",ch);dmaDone=0;pDMA->DISRC = srcAddr;pDMA->DISRCC = (0<<1)|(0<<0); // inc,AHBpDMA->DIDST = dstAddr;pDMA->DIDSTC = (0<<1)|(0<<0); // inc,AHBpDMA->DCON = tc|(1<<31)|(1<<30)|(1<<29)|(burst<<28)|(1<<27)|\ (0<<23)|(1<<22)|(dsz<<20)|(tc);//HS,AHB,TC interrupt,whole, SW request mode,relaod off pDMA->DMASKTRIG = (1<<1)|1; //DMA on, SW_TRIGTimer_Start(3);//128us resolutionwhile(dmaDone==0);time = Timer_Stop();Uart_Printf("DMA transfer done.time=%f, %fMB/S\n",(float)time/ONESEC3,length/((float)time/ONESEC3)/1000000.);rINTMSK = BIT_ALLMSK;for(i=dstAddr; i<dstAddr+length; i+=4){memSum1 += *((U32 *)i)=i^0x55aa5aa5;}Uart_Printf("memSum0=%x,memSum1=%x\n",memSum0,memSum1);if(memSum0==memSum1)Uart_Printf("DMA test result--------------------------------------O.K.\n");elseUart_Printf("DMA test result--------------------------------------ERROR!!!\n");}A/D与D/A实验代码:#include <string.h>#include "2410addr.h"#include "2410lib.h"#include "adc.h"#include "def.h"#define REQCNT 100 //May 08, 2002 SOP#define ADC_FREQ 2500000//#define ADC_FREQ 1250000//#define LOOP 1#define LOOP 10000void __irq DMA0_Done(void); //Declare Prototype functionvoid Test_Adc(void);int ReadAdc(int ch);void Test_DMA_Adc(void);int ReadAdc(int ch); //Return type is int, Declare Prototype functionvolatile U32 preScaler;//==========================//名称:Test_Adc()//功能:获得A/D输入得电压值//返回值:void//参数: void//=========================void Test_Adc(void){float a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0; //变量初始化Uart_Printf("[ ADC_IN Test ]\n");Uart_Printf("PRESS ANY KEY TO STOP.\n");preScaler = ADC_FREQ;//Uart_Printf("ADC conv. freq. = %dHz\n",preScaler);preScaler = PCLK/ADC_FREQ -1; //PCLK:50.7MHz//ADC变化时间 5CYCLES*(1/(ADC Freq.)), ADC Freq. = PCLK/(ADCPSR+1) Uart_Printf("PCLK/ADC_FREQ - 1 = %d\n",preScaler);while(!Uart_GetKey()){//获得各路输入的值,调用ReadAdc()函数a0=(float)ReadAdc(0)/1024*3.3*1000;//单位为mVa1=(float)ReadAdc(1)/1024*3.3*1000;a2=(float)ReadAdc(2)/1024*3.3*1000;a3=(float)ReadAdc(3)/1024*3.3*1000;a4=(float)ReadAdc(4)/1024*3.3*1000;a5=(float)ReadAdc(5)/1024*3.3*1000;a6=(float)ReadAdc(6)/1024*3.3*1000;a7=(float)ReadAdc(7)/1024*3.3*1000;Uart_Printf("AIN0:%d AIN1:%d AIN2:%d AIN3:%d AIN4:%d AIN5:%d AIN6:%d AIN7:%d\n", (int)a0,(int)a1,(int)a2,(int)a3,(int)a4,(int)a5,(int)a6,(int)a7);Delay(100);}rADCCON=(0<<14)|(19<<6)|(7<<3)|(1<<2); //进入待机模式节约能量消耗Uart_Printf("TEST FINISHED.\n");}//=======================//名称:ReadAdc()//功能:读取各路A/D得数值//返回值:rADCDAT0//参数: ch//=========================int ReadAdc(int ch){int i;static int prevCh=-1;rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //设置采样通道 if(prevCh!=ch){rADCCON = (1<<14)|(preScaler<<6)|(ch<<3); //设置采样通道for(i=0;i<LOOP;i++); //延迟时间以等待下一次采样prevCh=ch;}rADCCON|=0x1; //ADC开始采样while(rADCCON & 0x1); //check if Enable_start is low while(!(rADCCON & 0x8000)); //检测是否完成检测return ( (int)rADCDAT0 & 0x3ff );//返回采到的值}实验二:/******************************************函数名称:Da_Test函数功能:驱动DA芯片返回值:void参数: void*****************************************/void Da_Test (void){unsigned int i,save_E,save_PE;static U8 data[3];int ReadAdc(int ch);float a0=0;Uart_Printf("[ D/A TEST. ]\n");Uart_Printf("PRESS ANY KEY TO STOP.\n");//保护现场save_E = rGPECON;save_PE = rGPEUP;rGPEUP |= 0xc000;rGPECON |= 0xa0000000;rGPECON&= 0xafffffff;rIICCON = (1<<7) | (1<<6) | (1<<5) | (0xf);rIICADD = 0x10;rIICSTAT = 0x10;preScaler = PCLK/ADC_FREQ -1;//读出DA输出的值while(!Uart_GetKey()){for(i=1;i<=255;i++){Da_Out(i);//DA输出电压,1-255对应1-2V//读出DA输出的值a0=(float)ReadAdc(0)/1024*3.3*1000;//单位为mVUart_Printf("AIN0:%d mV \n",a0);}}Uart_Printf("TEST FINISHED.");}结论当程序运行正常时,在PC机上串口DNW上会显示一连串信息。
本科实验报告课程名称:智能仪器设计实验项目:D/A转换实验实验地点:图强机房专业班级:学号:学生姓名:2019年月日实验三:D/A转换实验一、实验目的1.学习D/A转换电路的设计与仿真方法;2.掌握电路的调试方法;3.了解A/D转换和D/A转换的过程;4.学习Multisim 的使用方法二、实验内容1. 将模拟信号转换为数字信号图1 A/D转换器的仿真电路图图1是A/D转换器的仿真电路图。
图中,ADC是将输入的模拟信号转换为8位的数字信号输出。
图1中,XFG1是函数发生器,采用方波信号,5KHz,幅值5V。
ADC的管脚说明如下:VIN:模拟电压输入端子。
VREF+:参考电压“+”端子,要接直流参考源的争端,其大小视用户对量化精度的要求而定。
VREF-:参考电压“-”端子,一般与地连接。
SOC:启动转换信号端子,只有端子电平从低电平变成高电平时,转换才开始,转换时间为1μs,期间EOC为低电平。
EOC:转换结束标志位端子,高电平表示转换结束。
OE:输出允许端子,可以EOC接在一起。
图1中,通过改变电位器R1的大小,就可以达到改变输入模拟量的目的,在仿真电路中可以观察到输出端数字信号的变化。
2.数字信号自动变化通过在图1电路中输入端再接入一个交流信号源(5V,200Hz),可以达到使得图1电路的输出端数字信号自动变化。
3.将数字信号再转换为模拟信号选用电流型DAC:IDAC(8位),将图1的数字信号转换为模拟信号,如图2所示。
图2 A/D、D/A转换电路三、实验结果1. 将模拟信号转换为数字信号的仿真电路图复制粘贴在下面空白处。
(在仿真图中空白处写上自己的名字)2. 将数字信号自动变化的的仿真电路图复制粘贴在下面空白处。
(在仿真图中空白处写上自己的名字)3. 将模拟信号转换为数字信号,再转换为模拟信号的仿真电路图复制粘贴在下面空白处。
(在仿真图中空白处写上自己的名字)4.用示波器显示图2仿真电路图中A/D转换的输入信号和D/A转换的输出信号。
班级:082班座号:姓名:成绩:课程名称:嵌入式Linux应用程序开发标准教程实验项目:A/D接口实验一、实验目的了解在linux 环境下对S3C2410 芯片的8 通道10 位A/D 的操作与控制。
二、实验内容学习A/D 接口原理,了解实现A/D 系统对于系统的软件和硬件要求。
阅读ARM 芯片文档,掌握ARM 的A/D 相关寄存器的功能,熟悉ARM 系统硬件的A/D 相关接口。
利用外部模拟信号编程实现ARM 循环采集全部前4 路通道,并且在超级终端上显示。
三、预备知识1、有C 语言基础。
2、掌握在Linux 下常用编辑器的使用。
3、掌握Makefile 的编写和使用。
4、掌握Linux 下的程序编译与交叉编译过程。
四、实验设备及工具硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机Pentium 500 以上, 硬盘10G 以上。
软件:PC 机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX 开发环境五、实验原理A/D 转换器A/D 转换器是模拟信号源和CPU 之间联系的接口,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。
在工业控制和数据采集及许多其他领域中,A/D 转换是不可缺少的。
A/D 转换器有以下类型:逐位比较型、积分型、计数型、并行比较型、电压-频率型,主要应根据使用场合的具体要求,按照转换速度、精度、价格、功能以及接口条件等因素来决定选择何种类型。
常用的有以下两种:1、双积分型的A/D 转换器双积分式也称二重积分式,其实质是测量和比较两个积分的时间,一个是对模拟输入电压积分的时间T0,此时间往往是固定的;另一个是以充电后的电压为初值,对参考电源Vref 反向积分,积分电容被放电至零所需的时间T1。
模拟输入电压Vi 与参考电压V Ref 之比,等于上述两个时间之比。
由于V Ref 、T0 固定,而放电时间T1 可以测出,因而可计算出模拟输入电压的大小(V Ref 与Vi 符号相反)。
微机原理及接口技术之AD及DA实验一. 实验目的:1. 了解A/D芯片ADC0809和D/A芯片DAC0832的电气性能;外围电路的应用性搭建及有关要点和注意事项;与CPU的接口和控制方式;相关接口参数的确定等;2. 了解数据采集系统中采样保持器的作用和采样频率对拾取信号失真度的影响, 了解香农定理;3.了解定时计数器Intel 8253和中断控制器Intel 8259的原理、工作模式以及控制方式, 训练控制定时器和中断控制器的方法, 并学习如何编写中断程序。
4.熟悉X86汇编语言的程序结构和编程方法, 训练深入芯片编写控制程序的编程能力。
二. 实验项目:1. 完成0~5v的单极性输入信号的A/D转换, 并与实际值(数字电压表的测量值)比较, 确定误差水平。
要求全程至少10个点。
2.完成-5v~+5v的双极性输入信号的A/D转换, 并与实际值(数字电压表的测量值)比较, 确定误差水平。
要求全程至少20个点。
3.把0~FF的数据送入DAC0832并完成D/A转换, 然后用数字电压表测量两个模拟量输出口(OUT1为单极性, OUT2双极性)的输出值, 并与计算值比较, 确定误差水平。
要求全程至少16个点。
三. 仪器设备:Aedk-ACT实验箱1套(附电源线1根、通信线1根、实验插接线若干、跳线子若干);台式多功能数字表1台(附电源线1根、表笔线1付(2根)、);PC机1台;实验用软件: Windows98+LcaACT(IDE)。
四. 实验原理一)ADC0809模块原理1)功能简介A/D转换器芯片●8路模拟信号的分时采集●片内有8路模拟选通开关, 以及相应的通道抵制锁存用译码电路●转换时间为100μs左右2)内部结构ADC0809内部逻辑结构1图中多路开关可选通8个模拟通道, 允许8路模拟量分时输入, 共用一个A/D转换器进行转换, 这是一种经济的多路数据采集方法。
地址锁存与译码电路完成对A.B.C 3个地址位进行锁存和译码, 其译码输出用于通道选择, 其转换结果通过三态输出锁存器存放、输出, 因此可以直接与系统数据总线相连。
AD与DA转换实验报告一.实验目的⑴掌握A/D转换与单片机接口的方法;⑵了解A/D芯片0809转换性能及编程方法;⑶通过实验了解单片机如何进行数据采集。
⑷熟悉DAC0832 内部结构及引脚。
⑸掌握D/A转换与接口电路的方法。
⑹通过实验了解单片机如何进行波形输出。
二.实验设备装有proteus的电脑一台三.实验原理及内容1.数据采集_A/D转换(1)原理①ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
②ADC0809引脚结构:D7 ~ D0:8位数字量输出引脚。
IN0 ~ IN7:8位模拟量输入引脚。
VCC:+5V工作电压。
GND:地。
REF(+):参考电压正端。
REF(-):参考电压负端。
START:A/D转换启动信号输入端。
ALE:地址锁存允许信号输入端。
(以上两种信号用于启动A/D转换).EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。
OE:输出允许控制端,用以打开三态数据输出锁存器。
CLK:时钟信号输入端(一般为500KHz)。
A、B、C:地址输入线。
(2)内容和步骤1.硬件电路设计:设计基于单片机控制的AD转换应用电路。
AD转换芯片采用ADC0809。
ADC0809的通道IN3输入0-5V之间的模拟量,通过ADC0809转换成数字量在数码管上以十进制形成显示出来。
ADC0809的VREF接+5V电压。
2. 软件设计:程序设计内容(1) 进行A/D转换时,采用查询EOC的标志信号来检测A/D转换是否完毕,经过数据处理之后在数码管上显示。
(2) 进行A/D转换之前,要启动转换的方法:ABC=110选择第三通道。
ST=0,ST=1,ST=0产生启动转换的正脉冲信号2.D/A转换及数字式波形发生器(1)原理典型D/A转换DAC0832芯片V cc 芯片电源电压, +5V ~+15V VREF 参考电压, -10V ~+10VRFB 反馈电阻引出端, 此端可接运算放大器输出端 AGND 模拟信号地 DGND 数字信号地DI7~ DI0数字量输入信号。
A/D D/A转换实验一、实验目的1. 学习理解模/数信号转换的基本原理,数/模转换的基本原理;;2. 掌握模/数转换芯片ADC0809 的使用方法。
3. 掌握DAC0832 的使用方法。
二、实验环境1、软件环境要求Windows XP操作系统以及Keil C51 单片机集成开发环境。
2、硬件环境要求电脑一台,TD-51单片机系统,A/D单元,D/A单元。
三、实验内容编写实验程序,将ADC 单元中提供的0V~5V 信号源作为ADC0809 的模拟输入量,进行A/D 转换,转换结果通过变量进行显示。
设计实验电路图实验线路并编写程序,实现D/A 转换,要求产生锯齿波、脉冲波,并用示波器观察电压波形。
四、实验原理分析1.A/D转换实验原理ADC0809 包括一个8 位的逐次逼近型的ADC 部分,并提供一个8 通道的模拟多路开关和联合寻址逻辑。
用它可直接输入8 个单端的模拟信号,分时进行A/D 转换,在多点巡回检测、过程控制等应用领域中使用非常广泛。
ADC0809 的主要技术指标为:·分辨率:8 位·单电源:+5V·总的不可调误差:±1LSB·转换时间:取决于时钟频率·模拟输入范围:单极性0~5V·时钟频率范围:10KHz~1280KHzADC0809 的外部管脚如图1所示,地址信号与选中通道的关系如表1所示。
图1 ADC0809 外部引脚图表1 地址信号与选中通道的关系2.D/A转换实验原理D/A转换器是一种将数字量转换成模拟量的器件,其特点是:接收、保持和转换的数字信息,不存在随温度、时间漂移的问题,其电路抗干扰性较好。
大多数的D/A 转换器接口设计主要围绕D/A 集成芯片的使用及配置响应的外围电路。
DAC0832是8位芯片,采用CMOS 工艺和R-2RT 形电阻解码网络,转换WR1结果为一对差动电流Iout1 和Iout2 输出,其主要性能参数如表2示,引脚如图2所示。
ad与da实验报告AD与DA实验报告一、引言AD(模拟-数字)和DA(数字-模拟)转换技术在现代电子领域中起着重要的作用。
AD转换将连续的模拟信号转换为数字信号,而DA转换则将数字信号转换为模拟信号。
本实验旨在通过AD与DA转换器的实际应用,深入了解其原理和性能。
二、实验目的1. 理解AD转换原理和工作方式;2. 理解DA转换原理和工作方式;3. 学习使用AD和DA转换器进行模拟信号和数字信号的转换;4. 掌握AD转换器和DA转换器的性能评估方法。
三、实验装置1. AD转换器:采用XX型号的AD转换器;2. DA转换器:采用XX型号的DA转换器;3. 信号发生器:用于产生模拟信号;4. 示波器:用于观察和分析信号波形。
四、实验步骤1. 连接实验装置:将信号发生器输出端连接至AD转换器的输入端,将DA转换器的输出端连接至示波器,确保连接正确无误;2. 设置信号发生器:根据实验要求,设置信号发生器的频率、幅度和波形等参数;3. 进行AD转换实验:将信号发生器输出的模拟信号输入AD转换器,观察并记录数字信号的输出结果;4. 进行DA转换实验:将数字信号输入DA转换器,观察并记录模拟信号的输出结果;5. 分析结果:根据实验数据,分析AD和DA转换器的性能,如分辨率、信噪比等。
五、实验结果与分析通过实验,我们观察到AD转换器将连续的模拟信号转换为离散的数字信号。
数字信号的输出结果与信号发生器输入的模拟信号存在一定的误差,这是由于AD转换器的分辨率和量化误差所导致的。
分辨率越高,AD转换器对模拟信号的采样精度越高,输出的数字信号越接近原始模拟信号。
而DA转换器则将数字信号转换为模拟信号。
我们观察到,数字信号经过DA 转换后,输出的模拟信号与原始模拟信号基本一致。
这是因为DA转换器能够根据数字信号的数值精确地还原出模拟信号的波形。
然而,在实际应用中,DA 转换器也存在一定的失真,如量化误差和抖动等。
根据实验数据,我们可以计算AD和DA转换器的性能参数。
试验六AD转换实验和DA转换实验实验目的:本实验旨在通过AD转换实验和DA转换实验,掌握模拟信号和数字信号之间的相互转换原理和步骤,进一步了解AD转换器和DA转换器的工作原理、应用场景以及实验方法。
实验器材:1. 信号发生器:用于产生待转换的模拟信号。
2. 数字存储示波器:用于观测和分析信号的变化情况。
3. AD转换器:用于将模拟信号转换为数字信号。
4. DA转换器:用于将数字信号转换为模拟信号。
实验步骤:AD转换实验:1. 将信号发生器输出的正弦波连接到AD转换器的输入端,调节信号发生器输出的频率和幅度,确保输入信号的稳定性和合适的幅度。
2. 连接数字存储示波器到AD转换器的输出端,观测和记录数字信号的波形。
3. 使用示波器的触发功能,调整触发电平和触发方式,确保观测到的波形满足要求。
4. 改变信号发生器输出的频率和幅度,重复步骤2和3,记录不同条件下的数字信号波形。
DA转换实验:1. 将数字存储示波器输出的数字信号连接到DA转换器的输入端,设置数字信号的幅值和频率。
2. 连接DA转换器的输出端到示波器的输入端,观测和记录模拟信号的波形。
3. 改变数字信号的幅值和频率,重复步骤2,记录不同条件下的模拟信号波形。
实验结果:根据实验步骤进行AD转换实验和DA转换实验后,记录所得的数字信号和模拟信号波形如下:(插入实验得到的数字信号和模拟信号波形图片)实验分析:通过实验结果可以观察到AD转换实验和DA转换实验的转换效果和特点。
在AD转换实验中,输入信号经过AD转换器转换为数字信号后,波形变得离散化,失去了模拟信号的连续性。
而在DA转换实验中,数字信号经过DA转换器转换为模拟信号后,波形逐渐恢复了连续性,与输入信号更加接近。
实验总结:通过本次AD转换实验和DA转换实验,我们深入了解了模拟信号和数字信号之间的相互转换原理和步骤,掌握了AD转换器和DA转换器的工作原理和应用场景。
同时,我们通过实验观察到了数字信号和模拟信号在转换过程中的特点和变化,对信号的采样和恢复有了更深入的认识。
实验报告课程名称:微机原理与接口技术 指导老师:高锋 成绩:__________________ 实验名称: 实验类型:________________同组学生姓名:__________ 一、实验目的和要求(必填) 二、实验内容和原理(必填) 三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理 六、实验结果与分析(必填) 七、讨论、心得一、实验目的1,了解单片微机应用系统设计的基本原理。
2,掌握A/D 转换器的工作原理和编程应用。
3,掌握LCD 模块的工作原理和编程应用。
4,掌握标度变换的工作原理和编程应用。
二、实验内容1.编写程序,采集A/D 转换器输入的8路模拟量,分别定义为温度、转速、…等。
2.编写程序,在LCD 上显示温度为0℃~512℃,转速为0~1024转/分、…等。
3. 可选:编写程序,将采样的温度/转速值保存在串行扩展的AT24C0X 中。
4. 可选:编写程序,将采样的温度值/转速值通过串行口发选至另一采集终端进行显示。
三、实验电路接线图及实验原理实验原理:专业:电子信息工程 姓名:江山学号:3090101193 日期:2011-12-27 地点:教二1)ADC0809的地址为2000H-2007H,芯片一共有8路模拟量输入口,其地址分别为2000H-2007H,分析地址范围:如电路所示,译码器74HC138的使能端受单片机输出地址位A13控制,A13要为高电平,高8位中其余位为低电平,而8路模拟输入的地址则是通过P0口的低三位地址来译码控制,所以芯片的寻址范围为:2000H-2007H。
本实验中采用CH4通道输入电平值视为温度传感输入0-511,CH5通道电平作为转速0-1024,CH4通道得到的转化值通过DA转化后又通过CH0输入,检测整个采样转化过程是否正确。
2)DAC0823的地址范围为:2100H-2200H,我们知道DAC0832为双缓冲结构,其输入缓冲寄存器的使能端cs受74HC138的Y1控制,要求第一级输入锁存使能时Y1使能,而74HC138 3-8译码器由单片机的A8、A9、A10控制所以允许第一级输入缓存时地址为2100H,第二级DAC寄存器的使能端xfer为Y2所以第二级选通的地址为2200H。
练习三A/D、D/A的使用与调试报告苑振涛张博晨闫陶2011年7月21日摘要本设计基于EasyCortex M3-1752系统为核心,主要运用了系统内部A/D、D/A芯片,显示部分采用了12864点阵液晶显示模块。
本系统通过内部A/D、D/A芯片的调用实现直流电压和正弦波的幅值及频率的识别与稳定输出。
目录一.设计要求与任务(系统设计) (4)二.总体方案及论证(系统设计) (4)三.系统硬件设计(单元设计) (4)四.系统测试与测试结果 (8)五.结论 (10)六.参考资料 (11)附录 (11)一.设计要求与任务(系统设计)利用常用A/D、D/A与MCU系统连接及使用(数据采集、显示)二.总体方案及论证(系统设计)本设计使用了EasyCortex M3-1752系统为核心,运用了系统内部A/D、D/A芯片,显示部分采用了12864点阵液晶显示模块。
除此之外,本设计还包括了峰值检波电路。
系统方框图三.系统硬件设计(单元设计)主控部分LPC1700系列ARM是基于第二代ARM Cortex-M3内核的微控制器,是为嵌入式系统应用而设计的高性能、低功耗的32位微处理器,适用于仪器仪表、工业通讯、电机控制、灯光控制、报警系统等领域。
其操作频率高达120MHz,采用3级流水线和哈佛结构,带独立的本地指令和数据总线以及用于外设的低性能的第三条总线,使得代码执行速度高达1.25MIPS/MHz,并包含1个支持随机跳转的内部预取指单元。
LPC1700系列ARM增加了一个专用的Flash存储器加速模块,使得在Flash中运行代码能够达到较理想的性能。
最高配置包括512KB片内Flash程序存储器、96KB片内SRAM、4KB片内EEPROM、8通道GPDMA控制器、4个32位通用定时器、一个8通道12位ADC、1个10位DAC、1路电机控制PWM输出(MCPWM)、1个正交编码器接口、6路通用PWM输出、1个看门狗定时器以及一个独立供电的超低功耗RTC。
ADC部分A/D转换器的基本时钟由APB时钟提供。
A/D转换器包含一个可编程的分频器,它可以将APB时钟调整为主次逼近转换所需的时钟(最大可达13Mhz)。
并且,完全满足精度要求的转换需要65个这样的时钟。
具有掉电模式,测量范围:0~VREFP (通常为3V;不超过VDDA),12位转换时间为200KHz。
一个或多个输入的Burst转换模式,可选择由输入跳变或定时器匹配信号触发转换。
使用以下寄存器来配置ADC:1)功率:在寄存器PCONP中置位PCADC。
注:复位后,ADC被禁能。
若要使能ADC,首先将位PCADC置位然后使能寄存器AD0CR中的ADC(即位PDN,见表29.3)。
若要禁能ADC,必须先将位PDN清零,再将位PCADC清零。
2)时钟:在寄存器PCLK_SEL0中选择PCLK_ADC,若要调节ADC的时钟频率,请参见表29.3中关于位CLKDIV的描述。
3)引脚:通过寄存器PINSEL来使能ADC0引脚。
通过寄存器PINMODE来选择带ADC 功能的引脚的模式(请参考“引脚连接模块”章节的“寄存器描述”小节)。
4)中断:若要使能ADC中断,请参见表29.7。
利用相应的中断置位使能寄存器使能NVIC 中的ADC中断或禁止ADC中断。
DAC部分使用以下寄存器来配置DAC:1)电源:DAC的电源总是开启的。
2)时钟:在寄存器PCLK_SEL0中选择PCLK_DAC。
3)引脚:通过寄存器PINSEL来使能DAC引脚。
通过寄存器PINMODE来选择带DAC功能的引脚的模式(请见“引脚连接模块”章节的“寄存器描述”小节),必须在访问DAC寄存器之前选择好引脚的模式。
4)DMA:DAC可以连接到GPDMA控制器(请见“DMA控制”小节)。
下表对每个DAC相关的引脚进行了简要总结。
峰值滤波部分电路原理图实物电路图四.系统测试与测试结果实物连接图正弦波形识别显示输出波形直流显示直流输出五.结论本设计可识别输入电压范围为0-3V,可识别频率范围为0-7MHz;输出电压范围为0-3V,输出频率范围为0-3.5K,基本满足题目要求。
原有设计中的检波部分功能尚未实现。
六.参考资料附录主程序#include "..\config.h"/***************************************************************** ****************************************宏定义***************************************************************** ****************************************/#define uchar unsigned char#define uint unsigned intuchar Gain=0,lcdflg=0,adflg=0,wavecount=0;INT32U count,pkp;#define initdata 0x00b4#define varydata 0x0022#define KEY1 (1ul << 10) /* P2.10连接KEY1 */#define KEY2 (1ul << 0)/* P2.10连接KEY1 */#define KEY3 (1ul << 1) /* P2.10连接KEY1 */#define KEY4 (1ul << 4) /* P2.10连接KEY1 */#define BIT(x) (1<<(x))////************** 12864 端口定义及控制#define CS 0 //P0.0 RS#define SID 1 //P0.1 RW#define SCLK 2 //P0.2 E#define Set_CS() FIO0SET|=BIT(0); //P0.0置1#define Set_SID() FIO0SET|=BIT(1); //P0.1置1#define Set_SCLK() FIO0SET|=BIT(2); //P0.2置1#define Clr_CS() FIO0CLR|=BIT(0); //P0.0置0#define Clr_SID() FIO0CLR|=BIT(1); //P0.1置0#define Clr_SCLK() FIO0CLR|=BIT(2); //P0.2置0char init1[] = {"基于:LPC175x"};char init2[] = {" LCD测试"};char init3[] = {"峰值:"};char init4[] = {"频率:"};char init8[] = {0,0,0,0,0,0,0};char init9[] = {"Hz"};char init10[] = {"mv"};INT16U const sin_tab[250]={//输出电压从0到最大值(正弦波1/4部分)0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8 ,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0 xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd ,0xfe,0xff,0xff,0xff,//输出电压从最大值到0(正弦波1/4部分)0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0x f6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4, 0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 , 0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,//输出电压从0到最小值(正弦波1/4部分)0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57 ,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02 ,0x02,0x01,0x00,0x00,0x00,//输出电压从最小值到0(正弦波1/4部分)0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x0 7,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2 b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};//***************** 12864 函数声明void nop(void);void Delay(uint a); //延时子程序void Lcd_WriteDat(char RW, char RS,uchar W_data);void Lcd_WriteCmd(uint W_bits);void LCD_Init(void);void Lcd_DispLine(uchar y,uchar x ,char *p);void DIP_Init(void);//**************************************************************** *****************************************//** Function name: Delay()延时ms//** Function name: nop() 延时us//**************************************************************** *****************************************/__inline void Delay(uint a){uint i;while( --a != 0){ for(i = 0; i<5200; i++);}}void nop(){uint i;for(i=1;i<12;i++);}//**************************************************************** ********************************************////////////////// 12864 控制程序/////////////////////**************************************************************** ********************************************/void LCD_Init(void){uchar cmd;cmd=0x30; //功能设置8位数据,基本指令Lcd_WriteDat(0,0,cmd);Delay(2);cmd=0x0C; //显示状态ON,游标OFF,反白OFFLcd_WriteDat(0,0,cmd); //写指令Delay(2);cmd=0x01; //清除显示Lcd_WriteDat(0,0,cmd); //写指令Delay(2);cmd=0x02; //地址归位Lcd_WriteDat(0,0,cmd); //写指令Delay(2);cmd=0x80; //设置DDRAM地址Lcd_WriteDat(0,0,cmd); //写指令Delay(2); //延时}void Lcd_WriteDat(char RW, char RS,uchar W_data) //xie shu ju 函数作用:写一个字节的数据到12864液晶,包括指令和数据{uint H_data,L_data,S_ID = 0xf8; //11111RWRS0if(RW == 0){ S_ID &=~ 0x04; }else //if(RW==1){ S_ID |= 0X04; }if(RS == 0){ S_ID &=~ 0x02; }else //if(RS==1){ S_ID |= 0X02; }H_data = W_data;H_data &= 0xf0; //屏蔽低4位的数据L_data = W_data; //xxxx0000格式L_data &= 0x0f; //屏蔽高4位的数据L_data <<= 4; //xxxx0000格式Set_CS();Lcd_WriteCmd(S_ID); //发送S_IDLcd_WriteCmd(H_data); //发送H_dataLcd_WriteCmd(L_data); //发送L_dataClr_CS();}void Lcd_WriteCmd(uint W_bits) //函数作用:负责串行输出8个bit位xie di zhi{uint i,Temp_data;for(i=0; i<8; i++){Temp_data = W_bits;Temp_data <<= i;if((Temp_data&0x80)==0){ Clr_SID(); }else{ Set_SID(); }nop();Set_SCLK();nop();nop();Clr_SCLK();nop();Clr_SID();}}void Lcd_SetPos(uchar y,uchar x) //设置写入位置{if(y == 0){ Lcd_WriteDat(0,0,(0x80+x)); }if(y == 1){ Lcd_WriteDat(0,0,(0x90+x)); }if(y == 2){ Lcd_WriteDat(0,0,(0x88+x)); }if(y == 3){ Lcd_WriteDat(0,0,(0x98+x)); }}void Lcd_DispLine(uchar y,uchar x ,char *p) //函数作用:写入字符串{Lcd_SetPos(y,x);while(*p != 0){ Lcd_WriteDat(0,1,*p++); //利用指针调用数组里的数据Delay(1); }}void DIP_Init(void) //显示{Lcd_DispLine(0, 0, init1); //第一行Lcd_DispLine(1, 0, init2); //第二行Lcd_DispLine(2, 0, init3);Lcd_DispLine(3, 0, init4);}/***************************************************************** ****************************************** Function name: myDelay** Descriptions: 软件延时** input parameters: ulTime** output parameters: 无** Returned value: 无***************************************************************** ****************************************/void myDelay (INT32U ulTime){INT32U i;i = 0;while (ulTime--) {for (i = 0; i < 5000; i++);}}/***************************************************************** ***************************************** Function name: adcInit* Descriptions: ADC初始化,转换时钟为13MHz,突发模式* input parameters: 无* output parameters: 无* Returned value: 无***************************************************************** ****************************************/void adcInit (void){INT32U ulTemp;PCONP |= 1 << 12;/* 打开ADC的功率控制位*/ulTemp = (24000000 / (13000000));ulTemp = (1 << 2) /* 选择AD0.2为AD输入引脚*/|(( ulTemp) << 8) /* 转换时钟为13MHz */|(1 << 16)/* BURST=1,使用Burst模式,*//* 让硬件不断地进行转换*/|(0 << 17)/* CLKS=0, 使用11clock转换*/|(1 << 21) /* PDN = 1,正常工作模式*/|(0 << 24);/* START=0,在Burst模式下,*//* 起始位(bit24~26)必须为0 */AD0CR = ulTemp;}/***************************************************************** ***************************************** Function Name: timer0Isr* Description: TIMER0 中断处理函数* Input: 无* Output: 无* Return: 无***************************************************************** ****************************************/void timer0Isr (void){T0IR = 0x01;/* 清除中断标志*/if(count==0){DACR = ((pkp/2*1024/3000) << 6);}else{//DACR = ((4*sin_tab[wavecount++]*pkp/3000) << 6);DACR = ((4*sin_tab[wavecount++]) << 6);if(wavecount>=250)wavecount=0;}}/***************************************************************** ***************************************** Function Name: timer2Isr* Description: TIMER2 中断处理函数* Input: 无* Output: 无* Return: 无***************************************************************** ****************************************/void timer3Isr (void){T3IR = 0x01;/* 清除中断标志*/count = T1TC;T1TC = 0;lcdflg=1;adflg=1;T0TCR = 0x02;if(count!=0)T0MR0 = FPCLK/250/count;elseT0MR0 = FPCLK/250;T0TCR = 0x01;}/***************************************************************** ****************************************** Function name: timer0Init** Descriptions: 定时器0初始化程序** input parameters: 无** output parameters: 无** Returned value: da输出数据定时器***************************************************************** ****************************************/void timer0Init (void){PCONP |= 1 << 1;T0TCR = 0x02;T0IR = 1;T0CTCR = 0;T0TC = 0;T0PR = 0;T0MR0 = FPCLK/250; /* 1S中断1次*/T0MCR = 0x03; /* 匹配后产生中断*/zyIsrSet(NVIC_TIMER0, (unsigned long)timer0Isr, PRIO_ONE); /* 设置中断并使能*/T0TCR = 0x01; /* 启动定时器*/}/***************************************************************** ****************************************** Function name: timer1Init** Descriptions: 定时器1初始化函数** input parameters: 无** output parameters: 无** Returned value: 测频计数器***************************************************************** ****************************************/void timer1Init (void){PCONP |= 1 << 2;/* 打开定时器1的功率控制*/T1CTCR = 0x02|(0x00<<2);T1TC = 0;T1TCR = 0x01;/* 启动定时器*/}/***************************************************************** ****************************************** Function name: timer3Init** Descriptions: 定时器3初始化程序** input parameters: 无** output parameters: 无** Returned value: 定时1s,刷新屏幕,计算频率,重新给da输出送参数***************************************************************** ****************************************/void timer3Init (void){PCONP |= 1 << 23;T3TCR = 0x02;T3IR = 0x01;T3CTCR = 0;T3TC = 0;T3PR = 0;T3MR0 = FPCLK; /* 1S中断1次*/T3MCR = 0x03; /* 匹配后产生中断*/zyIsrSet(NVIC_TIMER3, (unsigned long)timer3Isr, PRIO_TWO); /* 设置中断并使能*/T3TCR = 0x01; /* 启动定时器*/}/***************************************************************** ****************************************** Function name: main** Descriptions: AD采集数据例程,需将JP4中的AD0.2与P0.25短接,JP2中的TXD0与P0.2,RXD与P0.3短接。