嵌入式AD实验
嵌入式实验报告2

嵌入式系统设计实验报告1 问题描述在Linux操作系统和ARM嵌入式实验系统环境下,分析linux下的键盘、数码管驱动程序,编写一个应用程序,实现以下功能:在ARM开发板上按下数字键1、2、3、4时,对应启动模拟量开发板上的模拟量输入端AIN0、AIN1、AIN2、AIN3采样,并把模数转换的结果从终端输出和数码管显示。
数码管显示格式:通道号转换的电压值;例如:2灭灭3.251.1设计目标在ARM开发板上按下数字键1、2、3、4时,对应启动模拟量AIN0、AIN1、AIN2、AIN3采样,并把A/D转换的结果从终端输出和LED显示。
显示格式:通道号转换的电压值。
1.2设计思路根据设计目标,该问题可分为六个模块进行设计,分别为驱动程序加载、打开设备、键盘扫描、A/D转换、数码管显示,总体设计方案如图1所示。
图1 总体设计方案(1)驱动程序加载用户的应用程序以设备文件方式访问驱动程序,即Linux把设备当文件,通过文件系统对设备进行访问。
针对这个实验,需要用到ADC0809芯片,LED显示数码管,小键盘。
为此,用lsmod命令加载这三个对应的驱动程序adc0809.c、led.c和keybd.c,再以insmod的方式加入内核。
驱动程序主要是设置一些寄存器的内容来确定端口的引脚输入输出方式以及键盘的扫描部分代码,LED控制显示函数等。
(2)打开各个设备在Linux系统下,各个设备都是通过文件来进行描述的,因此用open函数打开需要用到的LED、键盘、ADC0809芯片。
并且要有对应的出错处理。
(3)键盘扫描驱动程序加载进去以后,运行可执行文件,代码就进入到了按键按下等待的代码中了。
对于用户而言,只是在键盘中按下了某个键,在计算机里,通过驱动得到按下的键值并通过read(fd_kb,&result_kb,1)函数把值赋给变量result_kb中(其中fd_kb为键盘的文件描述符)。
(4)A/D转换启动ADC0809芯片对应的通道进行数据转换,这里主要通过iotcl和read 这两个函数实现,并把转化后的结果赋给result_ad这个变量。
南昌大学 嵌入式 实验报告 实验三

学生姓名: xx 学号: x3 专业班级:xx班实验类型:□验证 综合□设计□创新实验日期:实验成绩:综合实验三触摸屏控制一、实验项目名称触摸屏控制二、实验目的了解触摸屏的基本工作原理,学会s3c2410ADC的配置三、实验基本原理:通过设置GPIO口及液晶触摸屏控制器等相关寄存器来达触摸相应菜单键来控制直流步进电机的转动,加速减速和改变方向,并同步超级终端。
程序思路和部分代码:1. 本次实验主要是设置触摸屏中断和ADC转换中断来实现将触摸屏触点转换成坐标。
在写下笔中断和抬笔中断时一定要在最开始写rINTSUBMSK |= (BIT_SUB_ADC|BIT_SUB_TC);来禁止ADC中断和触摸屏中断,否则按下一次有可能会多次中断,这是不允许的。
2. 实验通过在中断中处理AD转换后的坐标值,并设置了一个全局变量,通过改变这个全局变量的值达到不同的效果。
通过比较液晶屏上规划好的各个触摸范围,来跳转到相应的功能。
其具体函数如下://左上角按钮表示步进电机加速if(point_adcx>=0&&point_adcx<=500&&point_adcy>=0&&point_a dcy<=300){step_delay=step_delay-1;学生姓名: xx 学号: x3 专业班级:xx班实验类型:□验证 综合□设计□创新实验日期:实验成绩:UART_SendStr("电机加速");sprintf(disp_buf, "delay is %d \n", step_delay);UART_SendStr(disp_buf);if(step_delay<=1)step_delay=1;}//上中角按钮表示步进电机减速if(point_adcx>=0&&point_adcx<=500&&point_adcy>=300&&point _adcy<=600){step_delay=step_delay+1;UART_SendStr("电机减速");sprintf(disp_buf, "delay is %d \n", step_delay);UART_SendStr(disp_buf);if(step_delay>=10)step_delay=10;}//右上角按钮表示步进电机正反转if(point_adcx>=0&&point_adcx<=500&&point_adcy>=600){sprintf(disp_buf, "STEP_Motoflag is %d \n", STEP_Motoflag);UART_SendStr(disp_buf);学生姓名: xx 学号: x3 专业班级:xx班实验类型:□验证 综合□设计□创新实验日期:实验成绩:if(STEP_Motoflag==0)STEP_Motoflag=1;else STEP_Motoflag=0;DelayNS(50); // 停止步进电机,延时UART_SendStr("步进电机正反转\n");sprintf(disp_buf, "STEP_Motoflag is %d \n", STEP_Motoflag);UART_SendStr(disp_buf);//左下角按钮表示直流电机加速if(point_adcx>=500&&point_adcy>=0&&point_adcy<=300){pwm_duty= pwm_duty + 255/6; // 改变当前电机的速度if(pwm_duty>255){pwm_duty = 255/6;}rTCMPB0 = pwm_duty;UART_SendStr("直流电机加速");}//下中角按钮表示直流电机减速if(point_adcx>=500&&point_adcy>=300&&point_adcy<=600)学生姓名: xx 学号: x3 专业班级:xx班实验类型:□验证 综合□设计□创新实验日期:实验成绩:{pwm_duty= pwm_duty - 255/6; // 改变当前电机的速度级别if(pwm_duty<10){ pwm_duty = 255;}rTCMPB0 = pwm_duty;UART_SendStr("直流电机减速");}//右下角按钮表示直流电机正反转if(point_adcx>=500&&point_adcy>=600){if(DC_Motoflag==0)DC_Motoflag=1;else DC_Motoflag=0;UART_SendStr("直流电机正反转");}四、主要仪器设备及耗材实验箱一台,PC机一台,JTAG一个。
嵌入式ad转换实验报告

嵌入式ad转换实验报告嵌入式AD转换实验报告摘要:本实验报告旨在探究嵌入式AD转换器的工作原理和性能特点。
通过对嵌入式AD转换器的实验研究,我们对其转换精度、速度和功耗等方面进行了评估和分析。
实验结果表明,嵌入式AD转换器具有较高的转换精度和速度,且功耗较低,适用于各种嵌入式系统中的数据采集和处理应用。
引言:嵌入式系统在现代科技应用中扮演着越来越重要的角色,而嵌入式AD转换器作为嵌入式系统中的重要组成部分,其性能对整个系统的稳定性和可靠性有着重要影响。
因此,对嵌入式AD转换器进行深入的研究和分析,对于提高嵌入式系统的性能和应用效果具有重要意义。
实验目的:本实验旨在通过对嵌入式AD转换器的实验研究,探究其工作原理和性能特点,评估其转换精度、速度和功耗等指标,为嵌入式系统中AD转换器的选型和应用提供参考和指导。
实验过程:1. 实验平台:使用一款嵌入式开发板作为实验平台,搭建实验环境。
2. 实验方法:通过输入不同幅度和频率的模拟信号,对嵌入式AD转换器进行采样和转换,记录并分析转换结果。
3. 实验数据处理:对实验采集的数据进行处理和分析,计算转换精度、速度和功耗等指标。
实验结果与分析:经过实验研究和数据处理分析,我们得出以下结论:1. 转换精度:嵌入式AD转换器具有较高的转换精度,能够准确地将模拟信号转换为数字信号,满足实际应用需求。
2. 转换速度:嵌入式AD转换器具有较快的转换速度,能够实时采集和转换模拟信号,适用于高速数据采集和处理应用。
3. 功耗:嵌入式AD转换器功耗较低,能够在嵌入式系统中实现低功耗运行,提高系统的能效性。
结论与展望:通过本实验的研究和分析,我们对嵌入式AD转换器的性能特点有了更深入的了解,为嵌入式系统中AD转换器的选型和应用提供了参考和指导。
未来,我们将继续深入研究嵌入式AD转换器的优化和应用,进一步提高嵌入式系统的性能和应用效果。
嵌入式AD实验

5.8 A/D 实验5.8.1 实验目的1. 了解模数转换的基本原理;2. 掌握模数转换的编程方法。
5.8.2 实验内容1. 编写程序对模拟输入进行采集和转换,并将结果显示在LED 上;2. 通过可变电阻改变模拟量输入,观查显示结果;5.8.3 预备知识1. 了解A/D 采样的原理;2. 了解采样频率的设置;5.8.4 实验设备1. 硬件:JX44B0教学实验箱、PC 机;2. 软件:PC 机操作系统 Windows 98(2000、XP) + ADT IDE 集成开发环境。
5.8.5 基础知识1. A/D 转换的基本原理 1) 采样和量化作用:我们经常遇到的物理参数,如电流、电压、温度、压力、速度……电量或非电量都是模拟量。
模拟量的大小是连续分布的,且经常也是时间上的连续函数。
因此要将模拟量转换成数字信号需经采样——>量化——>编码三个基本过程(数字化过程)。
1Q2Q 3Q 4Q 5Q 6Q 7Q图5-14 A/D 采样示意图采样:按采样定理对模拟信号进行等时间间隔采样,将得到的一系列时域上的样值去代替u=f(t),即用u0、u1、…un 代替u=f(t)。
这些样值在时间上是离散的值,但在幅度上仍然是连续模拟量。
量化:在幅值上再用离散值来表示。
方法是用一个量化因子Q 去度量;u0、u1、…,得到取整后的数字量。
u0=2.4Q ⇒2Q 010 u1=4.0Q ⇒4Q 100 u2=5.2Q ⇒5Q 101 u3=5.8Q ⇒5Q 101编码:将整量化后的数字量进行编码,以便读入和识别; 编码仅是对数字量的一种处理方法。
例如:Q=0.5V/格,设用三位(二进编码)u0=2.4Q −−→−整量化2Q −−→−编码(010)V V u 15.0)202120(0120=⨯⨯+⨯+⨯=2) 分类按被转换的模拟量类型可分为时间/数字、电压/数字、机械变量/数字等。
应用最多的是电压/数字转换器。
AD实验报告

实验二A/D实验一,实验目的1.熟悉ARM本身自带的八路十位A/D控制器及相应寄存器。
2.编程实现ARM系统的A/D功能。
3.掌握带有A/D的CPU编程实现A/D功能的主要方法。
二,实验内容学习A/D接口原理,了解实现A/D系统对于系统的软件和硬件要求。
阅读ARM芯片文档,掌握ARM的A/D相关寄存器的功能,熟悉ARM系统硬件的A/D相关接口。
利用外部模拟信号编程实现ARM循环采集全部前3路通道,并且在超级终端上显示。
三,实验设备1,硬件:ARM嵌入式开发平台、PC机Pentium100以上、用于ARM920T的JTAG仿真器、模拟电压信号源。
2,软件:PC机操作系统Win2000或WinXP、ARM ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。
四,实验原理1,模/数转换我们经常遇到的物理参数,如电流、电压、温度、压力、速度……电量或非电量都是模拟量。
模拟量的大小是连续分布的,且经常也是时间上的连续函数。
要将模拟量转换成数字信号需经采样——>量化——>编码三个基本过程(数字化过程)2,A/D转换的重要指标(1)分辨率(Resolution):分辨率反映A/D转换器对输入微小变化响应的能力,通常用数字输出最低位(LSB)所对应的模拟输入的电平值表示。
n位A/D能反应1/2n满量程的模拟输入电平。
由于分辨率直接与转换器的位数有关,所以一般也可简单地用数字量的位数来表示分辨率,即n位二进制数,最低位所具有的权值,就是它的分辨率。
值得注意的是,分辨率与精度是两个不同的概念,不要把两者相混淆。
即使分辨率很高,也可能由于温度漂移、线性度等原因,而使其精度不够高。
(2)精度(Accuracy)精度有绝对精度(Absolute Accuracy)和相对精度(Relative Accuracy)两种表示方法。
(3)转换时间(Conversion Time)转换时间是指完成一次A/D转换所需的时间,即由发出启动转换命令信号到转换结束信号开始有效的时间间隔。
嵌入式操作系统实验报告华中科技大学

本科实验报告课程名称:嵌入式操作系统实验报告姓名:学院:计算机科学与技术专业:计算机科学与技术年级:学号:指导教师:2007年12月2日试验一ADS、中断、串口通讯一实验目的1、熟悉ADS 1.2开发工具--创建、编译、下载、调试工程2、中断--中断响应、分发、处理3、串口通讯--串口控制器初始化、收/发数据二实验内容1 修改uC/OS-II的main函数2编写串口消息接受任务函数3编写串口中断处理函数三参考代码int main(void){ARMTargetInit(); //硬件初始化OSInit(); //操作系统初始化LCD_Init(); //LCD初始化LCD_Refresh();clearscreen(); //清屏OSTaskCreate(Task1, (void *)0,(OS_STK *)&task1_Stack[STACKSIZE-1], Task1_Prio);//创建串口数据接收进程message=OSMboxCreate((void*)NULL); //创建消息队列OSAddTask_Init(0); //创建idle进程,设置时钟中断OSStart(); //操作系统开始运行,开始调度return 0;}//mainvoid Task1(void *Id){U8 *c1, err;U16 timeout=0;InitUart(); //串口初始化;while(1) //循环接收串口数据并打印到LCD{c1 = OSMboxPend(message, timeout,&err); //等待串口数据,进入等待状态if(*c1=='\r') {WrUTXH0(‘\r’); WrUTXH0(‘\n’);//如果是换行符,打印换行给串口}else { //否则回传数据给串口并在LCD上显示数据WrUTXH0(*c1); WrUTXH0('\r'); WrUTXH0('\n');drawchar(*c1,0x7e0); drawstring("\n",0xffe0);} //if} //while} //Task1void irq_RevUart(int vector, int ndev){*c=RdURXH0(); // 从串口读数据OSMboxPost(message,&c); // 发消息给接收进程}四. 附件说明关于ADS工具的使用,每次必须关闭再重新开,这个软件bug应该说相当严重,希望以后的版本中可以修正.试验二进程通讯一实验目的1、中断处理与进程之间的同步--消息、信号灯、共享内存2、进程通讯--消息,信号灯二实验内容1修改uC/OS-II的main函数2创建两个任务函数3创建消息队列和信号灯4实现两个任务的同步三参考代码int main(void){ARMTargetInit(); //硬件初始化OSInit(); //操作系统初始化LCD_Init();LCD_Refresh();clearscreen(); //清屏OSTaskCreate(Task1, (void *)0, //创建串口数据接收进程(OS_STK *)&task1_Stack[STACKSIZE-1], Task1_Prio); OSTaskCreate(Task2, (void *)0, //创建串口数据显示进程(OS_STK *)&task2_Stack[STACKSIZE-1], Task2_Prio); message=OSMboxCreate((void*)NULL); //创建消息队列point=OSSemCreate(0); //创建信号灯,初值为0OSAddTask_Init(0); //创建idle进程,设置时钟中断OSStart(); //操作系统开始运行,开始调度return 0;}//mainvoid Task1(void *Id){U8 *c1, err;U16 timeout=0;InitUart(); //串口初始化;while(1) //循环接收串口数据并打印到LCD{ printf(“run task1”);drawStrong(waiting message from task2);OSMboxPend(message, timeout,&err); //等待串口数据,进入等待状态c1 = message->OSEventPtr; //串口收到数据,被唤醒,取得数据的指针if(*c1=='\r') {WrUTXH0(‘\r’); WrUTXH0(‘\n’);//如果是换行符,打印换行给串口}else { //否则回传数据给串口并在LCD上显示数据WrUTXH0(*c1); WrUTXH0('\r'); WrUTXH0('\n');UartChar = *c1; //将全局量UartChar赋值OSSemPost(point); //信号灯V()操作,通知显示进程} //if} //while} //Task1void Task2(void *Id){U8 err;for(;;){printf(“run task2”);drawStrong(waiting message from task1);OSSemPend(point,timeouts,&error); //信号灯P()drawstring("the char from uart is:\n",0x7ff);if(c1=‘\r’)//显示串口数据{drawchar(UartChar,0xffff);drawstring("\n",0xffe0);}elsedrawstring("\n",0xffe0);} //for} //Task2试验三LCD驱动、图形系统入门一实验目的1、LCD驱动--LCD初始化,FrameBuffer显示控制2、图形系统入门--点、线,简单几何形状二实验内容1 .初始化GPIO(通用输入/输出):rGPCUP=0xffffffff;rGPCCON=0xaaaaaaaa;rGPDUP=0xffffffff;rGPDCON=0xaaaaaaaa2.初始化LCD控制寄存器:rLCDCON1=0x00000178; //配置成为16位颜色,TFT(真彩)模式;rLCDCON2= 0x2077c241; //行数为480;rLCDCON3=0x017A7F0F; //行宽为640;3.设置LCD在内存中的起始地址:rLCDADDR1=0x1904b000; //FrameBuffer的首地址;rLCDADDR2=0x00096000; // FrameBuffer的尾地址;rLCDADDR3= 0x00000300; //虚屏行宽为640;rLCDCON1 += 1; //使能LCD,开始显示;4.绘画函数a. 画像素函数void drawpixel(int x, int y, unsigned short color_mask){unsigned int bits =(SCREEN_WIDTH*y+x)*BITS_PER_PIXEL;unsigned short *tmp;tmp = (unsigned short *)LCD_MEM_BASE+bits/16;//计算像素在内存中的地址;*tmp = color_mask; //给象素填充颜色;return ;}b.画线函数void drawline(int x, int y, int length,int flag, unsigned short color_mask){int i;if (flag==0)//画横线;for (i=0;i<length;i++)drawpixel(x+i,y,color_mask);if (flag==1)//画竖线;for (i=0;i<length;i++)drawpixel(x,y+i,color_mask);}c.画字符函数void draw_char(int x,int y, //字符在屏幕上的坐标unsigned char c, //字符值unsigned short color_mask) //字符的颜色5.绘制的效果图试验四触摸屏驱动一实验目的1、触摸屏驱动--初始化,坐标值的生成2、触摸屏、图形系统协调工作--触摸屏校准,拨号键盘二实验内容int main(void){drawgra();ARMTargetInit();OSInit();LCD_Init(); clearscreen();draw_keyboard();TchScr_init1(); //初始化触摸屏,非中断模式;;//校准触摸屏,在每次启动触摸屏时都运行该程序;OSTaskCreate(Task1,(void *)0,(OS_STK *)&task1_Stack[STACKSIZE-1],Task1_Prio);pevent=OSMboxCreate((void*)NULL);OSAddTask_Init(1);OSStart();return 0;}//main三. 附加说明可能是实验仪器的原因,屏幕矫正这一块总是很难做到,哪怕是你很仔细地去按键,两次得到的结果可能差别很大.这给后来的按键带来不少麻烦.我们按照说明做了,但是还是无法矫正,不知道这个该怎么处理.试验五、六GPRS综合试验一实验目的1、GPRS模块控制试验--串口控制GPRS模块,AT命令集2、综合试验--电话拨号,短消息发送二实验内容寄存器定义:#define OSULCON2 (*(volatile unsigned char *)0x)#define OSUCON2 (*(volatile unsigned char *)0x)#define OSUFCON2 (*(volatile unsigned char *)0x)#define OSUMCON2 (*(volatile unsigned char *)0x5000800C)#define OSUBRDIV2 (*(volatile unsigned short *)0x)初始化:OSULCON0=0x03; //设置串口数据长度、停止位、奇偶校验OSUCON0=0x85; //设置串口时钟频率、中断类型等OSUFCON0=0x01; //设置串口FIFO工作模式OSUMCON0=0x00; //设置流量控制等OSUBRDIV0=0x149; //设置串口波特率为9600bps寄存器定义:#define RdURXH2() (*(volatile unsigned char *)0x)#define RdUTRSTAT2() (*(volatile unsigned char *)0x)void irq_RevUart2(int vector, int ndev){int flag;flag = RdUTRSTA T2(); //读状态寄存器的值;while (flag&0x1) //判断FIFO里是否有接收到的数据;{ //有数据;c=RdURXH2(); // read the char from Uart2;flag = RdUTRSTA T2(); //读状态寄存器的值;draw_charline(c,0x7e0);//将读到的字符在LCD上最后一行显示出来;}}心得体会及建议觉得这几次实验,还是有点收获,起码对嵌入式操作系统有了一定认识,同时也会了一些基本的操作,比如熟悉了软件环境和编程环境,对于linux和arm9也了解了大概.特别是最后实现了打电话和发短信,感受到了嵌入式操作系统的独特魅力.但是总是觉得这几次的实验多多少少还是基本在抄袭已有的代码然后稍加修改就完成了,有时候时间紧根本就没看懂代码直接提交了.我觉得以后的实验要加强独立书写代码的能力,只有这样才能真正锻炼一个人的能力,也才能深刻理解并学习到东西.。
嵌入式实验报告(电子表流水灯设计)

山西大学计算机组装与维护论文题目电子表设计学院计算机与信息技术学院专业软件工程指导教师李月香学生姓名曹艳艳学号 2008242001 日期 2010-12-10电子表设计内容提要:LCD 电视是 Liquid Crystal Display 的简称,是液晶显示屏的全称:它包括了TFT,UFB,TFD,STN等类型的液晶显示屏。
LCD 的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。
1888年奥地利植物学家发现了一种白浊有粘性的液体,后来,德国物理学家发现了这种白浊物质具有多种弯曲性质,认为这种物质是流动性结晶的一种,由此而取名为Liquid Crystal即液晶LCD显示器是智能仪器仪表中最常用的显示器件。
近年来一些单片机内部也集成了LCD控制级驱动电路,更方便了单片机在嵌入式系统中的应用,特别是微功耗智能化仪器仪表上的应用。
关键词:LCD 工作原理应用发展参考文献:1.《嵌入式系统应用基础》。
2. 百度百科。
一、实验目的1.熟练掌握单片机控制系统硬件电路的设计、测试;单片机监控程序的编写、调试及运行。
2.学习使用单片机设计出简单的应用系统。
二、实验设备1.PC计算机;2.NEC全系列微控制器(单片机)开发工具EM/EZ-1系统;3.实验系统。
三、实验内容及要求1.设计方案本次使用主要使用了LCD,做了一个电子表。
主函数显示电子表。
P3.0按键中断用来测温度并在LCD上显示。
P4.0按键中断用来进入更改时间的中断。
P4.1按键中断用来进入设置闹钟的中断。
P4.2用来在进入更改时间中断和设置闹钟中断时进行小时的设置。
P4.3用来在进入更改时间中断和设置闹钟中断时进行分钟的十位设置。
P4.4用来在进入更改时间中断和设置闹钟中断时进行分钟的个位设置。
P4.5是一个流水灯和蜂鸣器中断。
2.结构图3.实现的功能1.实现了利用LCD 动态的显示秒数的走动。
嵌入式A D接口实验

2.4 A/D 接口实验一、实验目的了解在l inux 环境下对S3C2410 芯片的8通道10 位A/D 的操作与控制。
二、实验内容学习A/D 接口原理,了解实现A/D 系统对于系统的软件和硬件要求。
阅读A RM 芯片文档,掌握A RM 的A/D 相关寄存器的功能,熟悉A RM 系统硬件的A/D 相关接口。
利用外部模拟信号编程实现A RM 循环采集全部前4路通道,并且在超级终端上显示。
三、预备知识¾有C 语言基础。
¾掌握在Linux 下常用编辑器的使用。
¾掌握Makefile 的编写和使用。
¾掌握Linux 下的程序编译与交叉编译过程。
四、实验设备及工具硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机P entium 500 以上, 硬盘10G 以上。
软件:PC 机操作系统R EDHAT LINUX 9.0+MINICOM+ARM-LINUX 开发环境五、实验原理1、A/D 转换器A/D 转换器是模拟信号源和C PU 之间联系的接口,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。
在工业控制和数据采集及许多其他领域中,A/D 转换是不可缺少的。
A/D 转换器有以下类型:逐位比较型、积分型、计数型、并行比较型、电压-频率型,主要应根据使用场合的具体要求,按照转换速度、精度、价格、功能以及接口条件等因素来决定选择何种类型。
常用的有以下两种:¾双积分型的A/D 转换器双积分式也称二重积分式,其实质是测量和比较两个积分的时间,一个是对模拟输入电压积分的时间T0,此时间往往是固定的;另一个是以充电后的电压为初值,对参考电源V ref 反向积分,积分电容被放电至零所需的时间T1。
模拟输入电压V i 与参考电压V Ref 之比,等于上述两个时间之比。
由于V Ref 、T0 固定,而放电时间T1 可以测出,因而可计算出模拟输入电压的大小(V Ref 与V i 符号相反)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.8 A/D 实验5.8.1 实验目的1. 了解模数转换的基本原理;2. 掌握模数转换的编程方法。
5.8.2 实验内容1. 编写程序对模拟输入进行采集和转换,并将结果显示在LED 上;2. 通过可变电阻改变模拟量输入,观查显示结果;5.8.3 预备知识1. 了解A/D 采样的原理;2. 了解采样频率的设置;5.8.4 实验设备1. 硬件:JX44B0教学实验箱、PC 机;2. 软件:PC 机操作系统 Windows 98(2000、XP) + ADT IDE 集成开发环境。
5.8.5 基础知识1. A/D 转换的基本原理 1) 采样和量化作用:我们经常遇到的物理参数,如电流、电压、温度、压力、速度……电量或非电量都是模拟量。
模拟量的大小是连续分布的,且经常也是时间上的连续函数。
因此要将模拟量转换成数字信号需经采样——>量化——>编码三个基本过程(数字化过程)。
1Q2Q 3Q 4Q 5Q 6Q 7Q图5-14 A/D 采样示意图采样:按采样定理对模拟信号进行等时间间隔采样,将得到的一系列时域上的样值去代替u=f(t),即用u0、u1、…un 代替u=f(t)。
这些样值在时间上是离散的值,但在幅度上仍然是连续模拟量。
量化:在幅值上再用离散值来表示。
方法是用一个量化因子Q 去度量;u0、u1、…,得到取整后的数字量。
u0=2.4Q ⇒2Q 010 u1=4.0Q ⇒4Q 100 u2=5.2Q ⇒5Q 101 u3=5.8Q ⇒5Q 101编码:将整量化后的数字量进行编码,以便读入和识别; 编码仅是对数字量的一种处理方法。
例如:Q=0.5V/格,设用三位(二进编码)u0=2.4Q −−→−整量化2Q −−→−编码(010)V V u 15.0)202120(0120=⨯⨯+⨯+⨯=2) 分类按被转换的模拟量类型可分为时间/数字、电压/数字、机械变量/数字等。
应用最多的是电压/数字转换器。
电压/数字转换器又可分为多种类型:按转换方式可分为:直接转换、间接转换。
按输出方式分可分为:并行、串行、串并行。
按转换原理可分为:计数式、比较式。
按转换速度可分为:低速、中速、高速。
按转换精度和分辨率可分为:3位、4位、8位、10位、12位、14位、16位等等。
3) 工作原理类似于用天平称物体重量,设有一待测物为4.42g ;满度测量量程为gR NFS 12.5=,砝码种类有四种:)56.2(21g R NFS 、)28.1(41g R NFS 、)64.0(81g R NFS 、)32.0(161g R NFS 。
测量方法:先大砝码,后小砝码,依次比较(累计比较),要的记“1”,不要的记“0”。
实测物重G 为:留四次为去三次为留二次为留一次为g g g g g g g g g g g g R R R R G NFSNFS NFS NFS 42.416.432.084.3:42.444.464.084.3:42.484.328.156.2:42.456.2:1611810411211<=+>=+<=+<⨯+⨯+⨯+⨯=误差:g g g g G G 32.026.042.416.4<-=-=-=∆实际测误差<最小砝码(最小分辨砝码)以上过程:①通过4次比较后,得出结果;②误差<最小砝码值; 4) 逐次逼近式ADC 工作原理原理结构框图:)22(11n n R f d d V V --⋅++⋅⋅=图5-15 逐次逼近式A/D 转换器原理框图图5-16 逐次逼近式A/D 转换器原理框图工作过程: *环形计数器; *去码/留码控制逻辑;*逐次比较过程(完成一个A/D 转换)。
设V V R 24.10=,VV i 305.8=(n=8)表5-24 逐次逼近式ADC 去码/留码控制逻辑2. S3C44B0X的A/D转换器S3C44B0X集成了8路10位A/D转换器,其分辨率为10比特,该转换器可以通过软件设置为Sleep摸式,可以节电减少功率损失,最大转换速率为100K,非线性度为正负1位。
1) A/D转换有关寄存器表5-25 A/D转换控制寄存器表5-26 A/D转换预分频寄存器表5-27 A/D转换数据寄存器5. 实验参考代码及说明JX44B0实验箱中通过AIN2和AIN3可调电阻改变通道2和通道3的输入信号,本实验就是采集通道2和通道3的信号,并通过可调电阻,改变其输入模拟信号,以观察A/D采样效果。
/* 包含文件 */#include "44b.h"/* defines */#define MAX_VALUE 0x3ff#define MIN_VALUE 0x0typedef (*ISR_ROUTINE_ENTRY)(void);void Test_Adc(void);char trans_input(int value);void init_interrupt_handler(unsigned int irq_handler);void install_isr_handler(int irq_no, void* irq_routine);void timer0_isr(void);void IsrIRQ() __attribute__ ((interrupt("IRQ")));char display_buffer[6];int refresh_index = 0;unsigned char seg7table[16] ={/* 0 1 2 3 4 5 6 7*/0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,};/********************************************************************// Function name : Main// Description : AD采样主函数// Return type : void// Argument : void*********************************************************************/ void Main(void){rTCFG0=0x0; // prescaler=0,means "1" devider the same as timer0 rTCNTB0=0x2000; //10msrTCON= 0x00000202;rTCON= 0x00000009; //T0,auto reload and startrINTCON=0x7; /* Non-vect,IRQ disable,FIQ disable */init_interrupt_handler((unsigned int)IsrIRQ);install_isr_handler(HandleTIMER0, (void*)timer0_isr);rINTMOD=0x0;rINTMSK=0x07ffffff &~(BIT_GLOBAL|BIT_TIMER0);rINTCON=0x5;Test_Adc();}/********************************************************************// Function name : Test_Adc// Description : test adc// Return type : void// Argument : void*********************************************************************/ void Test_Adc(void){int loop_delay;int data = 0;int get_index;rCLKCON=0x7ff8;while(1){char value;int rADCDAT_TEMP0,rADCDAT_TEMP1,rADCDAT_TEMP2,rADCDAT_TEMP3,rADCDAT_TEMP4,rADCDAT_TEMP5,rADCDAT_TEMP6,rADCDAT_TEMP7;rADCPSR=0x0;data = 0;for(get_index = 0; get_index < 16; get_index++){rADCCON=0x1|(0x2<<2); // AIN2while(!(rADCCON & 0x40));data+=rADCDAT;for(loop_delay=1000; loop_delay; loop_delay--);}data /= 32;value = trans_input(data);display_buffer[0] = value / 10;display_buffer[1] = value % 10;data = 0;for(get_index = 0; get_index < 16; get_index++){rADCCON=0x1|(0x3<<2); // AIN3while(!(rADCCON & 0x40));data+=rADCDAT;for(loop_delay=1000; loop_delay; loop_delay--);}data /= 32;value = trans_input(data);display_buffer[3] = value / 10;display_buffer[4] = value % 10;for(loop_delay=100000; loop_delay; loop_delay--);}}char trans_input(int value){if(value == MAX_VALUE) return 50;return (char)(value * 50 / (MAX_VALUE-MIN_VALUE));}/***************************************************************************** // Function name : rtc_tick_isr// Description : TICK中断处理程序// Return type : int// Argument : void*****************************************************************************/ void timer0_isr(void){rI_ISPC=BIT_TIMER0;if(refresh_index==2) refresh_index++;if(refresh_index==5) refresh_index = 0;/* 设置数码管段选 */*((unsigned char*) 0x02000006) = 0x3f & ~(0x01 << refresh_index);*((unsigned char*) 0x02000004) = seg7table[display_buffer[refresh_index]];refresh_index++;}1) 设置A/D采样的时钟频率A/D采样频率取决于ADCPSR寄存器。