第9章 数模转换器与模数转换器 本章学习目标 了解数模转换器的工作原理及性能指标 掌握模数转换器的应用 掌握数模转换器的应用.

Slides:



Advertisements
Similar presentations
第7章 AT89S51单片机的 串行口 1.
Advertisements

项目二 中断应用系统设计 本项目学习目标: (1)制作一个单片机控制的彩灯电路。 (2) 理解中断的基本概念;
第三章 计算机系统 的组成与工作原理 本章学习目标 理解模型机的结构及工作过程 掌握单片机的结构 掌握单片机I/O口的使用
第5章 中断系统 5.1 中断的概念 5.2 MCS-51单片机的中断流程 5.3 MCS-51的中断响应条件和中断处理
本章内容: 中断的概念 MCS-51单片机中断系统 外部事件中断及应用
第四章 指令系统及汇编语言程序设计.
8051 指令.
第四章 指令系统及汇编语言程序设计.
本章分为四节,主要介绍: 4.1 程序编制的方法和技巧 4.2 源程序的编辑和汇编 4.3 基本程序结构 4.4 常用程序举例.
项目2 2个LED发光二极管控制 知识与能力目标 熟悉单片机的I/O口功能与特性。
得技通电子 问题 1 右何者非為假指令 (1) XRL (2) EQU (3) MACRO (4) ORG.
本章小结 C51单片机指令系统概述 C51单片机寻址方式 C51单片机指令系统
单片机原理与应用.
第9章 串行扩展技术 (课时:6学时).
第2章 MCS-51单片机指令系统与汇编语言程序设计
報告者:朱耿育 紀翔舜 組員:詹以群 張永傑 指導老師:梁新潁
复 习 一. 计算机中的数和编码 1. 2,10,16进制数及其之间的转换(整数) 按权展开,除x取余 2
本章内容: 中断的概念 MCS-51单片机中断系统 外部事件中断及应用
6.3 定时器/计数器的应用 初始化 初始化的内容如下:
第8章 模拟接口 8.1 模拟接口概述 8.2 DAC及其接口 8.3 ADC及其接口.
第二部分 微机原理 第3章 MCS-51的 指令系统 主讲教师:喻红.
一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置. 一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置.
第14章 单片机应用系统抗干扰 与可靠性设计 1.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月10日.
第二部分 微机原理 第8章 单片机的 定时/计数器 主讲教师:喻红.
第6章 MCS - 51单片机内部定时器/ 计数器 及串行接口 6.1 定时器/计数器的结构及工作原理 6.2 方式和控制寄存器
單晶片微電腦控制實習 使用計時中斷作走馬燈 計時器的基礎實習 國立大甲高工 電機科 2018年11月21日
本章分为三节,主要介绍: 6.1 计算机串行通信基础 C51的串行口 6.3 单片机串行口应用举例.
第十一章 复位、时钟和省电方式控制.
单片机原理及应用 MCS-51系列单片机的基本硬件结构 MCS-51指令系统 MCS-51单片机的系统扩展与应用.
第十章 D/A、A/D转换接口(6学时) 现代计算机接口技术  知 识 概 述  第一节 D/A转换(2学时)
关于PCF8591 MCU起航 QQ:
第8章 PCH中的常规接口.
单片机原理及应用 ——基于Proteus与Keil C 哈工大出版社
4.A/D与D/A转换器 1).DAC0832与MCS-51接口
第2章 单片机的结构原理与 简单应用 (课时:10学时).
本 章 重 点 单片机的简单I/O扩展 8255A可编程并口芯片 8279可编程键盘/显示器接口芯片 单片机键盘接口技术
单片机原理 单 片 机 单片机接口技术 单片机应用技术.
第七章 定时/计数器.
第八章 数据通信.
第三章 指令系统.
第十章 人机交互接口 本章学习目标 掌握键盘接口技术 掌握数码、液晶显示技术 了解数码管显示驱动和键盘扫描控制专用芯片.
第10章 综合实训 课题一 水温控制系统设计 一、实训目的 二、课题要求 熟悉常用温度传感器AD590的特性及接口电路的设计方法;
第8章 MCS-51串行口 8.1 串行口及其通信方式 8.2 IBM-PC系列机与 单片机 的通信技术.
第2章 单片机系统组成原理 2.1 MCS-51单片机组成原理 2.2 单片机复位电路设计 2.3 MCS-51存储器配置
6.1 输入/输出 6.2 CPU与外设数据传送方式 6. 3 MCS-51中断系统 6. 4 中断应用举例
单元五 MCS-51单片机内部资源 5.1 任务九 单片机计数并显示 5.2 任务十 单片机流水灯控制 5.3 任务十一 两台单片机数据互传
本 章 重 点 单片机的结构特点 单片机的存储器特点 I/O端口的特点 CPU时序 课时安排:3个课时.
一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置. 一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置.
第四章 指令系统及汇编语言程序设计.
第4章 中断技术 一个完整的微机系统是由硬件和软件共同构成的。微机系统的硬件有CPU、存储器和I/O口,外设组成。CPU与存储器之间的信息交换比较简单,而CPU与外设之间进行信息交换之前必须确定外设是否准备好,即选择I/O传送方式。I/O传送方式有4种:无条件、查询、中断和DMA。本章学习中断传送方式的有关内容。
单片机系统设计 教师:朱华贵 2016年03月01日
数码管数字时钟电路的设计 1. 系统硬件电路的设计
第3章 MCS-51指令系统 介绍MCS—51系列单片机的寻址方式 介绍MCS—51系列单片机的指令系统
第4章 80C51系列指令系统 教学目的:熟悉80C51系列单片机的寻址方式及 每一种寻址方式对应的寻址空间;掌 握每一条指令功能。
本章内容 MCS-51单片机指令系统的格式 MCS-51单片机寻址方式 指令系统的分析
5-6 串列埠模式0輸出埠擴充實習.
单片机原理与应用 主讲人:张荣刚 福建师范大学福清分校.
第三章 计算机系统的组成与工作原理.
汽车单片机应用技术 学习情景1: 汽车空调系统的单片机控制 主讲:向楠.
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
单片机原理与应用.
单片机原理及应用 (C语言版) 第8章 单片机系统扩展
简单芯片扩展I/O接口 8155可编程接口芯片及其使用 键盘及显示器接口设计 A/D和D/A转换接口技术
第8章 应用系统配置及接口技术 ● 教学目标 ● 学习要求
单片机应用技术 (C语言版) 第3章 MCS-51指令系统及 汇编程序设计
第4章 MCS-51汇编语言程序设计 教学基本要求: (1)、了解MCS-51汇编语言程序设计的特点;
第2章 80C51单片机的硬件结构 教学基本要求: (1)、熟悉单片机的定义、名称、分类方法;
第1章 微型计算机基础.
Presentation transcript:

第9章 数模转换器与模数转换器 本章学习目标 了解数模转换器的工作原理及性能指标 掌握模数转换器的应用 掌握数模转换器的应用

随着数字电子技术及计算机技术的广泛普及与应用,数字信号的传输与处理日趋普遍。 自然形态下的物理量多以模拟量的形式存在的,如温度、湿度、压力、流量、速度等,实际生产、生活和科学实验中还会遇到化学量、生物量(包括医学)等。 从信号工程的角度来看,要进行信号的计算机处理,上述所有的物理量、化学量和生物量等都需要使用相应的传感器,将其转换成电信号(称之为模拟量) 将模拟量转换为计算机能够识别处理的数字量,而后再进行信号的传输、处理、存储、显示和控制。

同样,计算机控制外部设备时,如电动调节阀、调速系统等,需要将计算机输出的数字信号变换成外设能够接受的模拟信号。 将模拟量转换成数字量的器件称为模数转换器(Analog to Digital Converter,ADC),也称为A/D转换器或者ADC器件; 将数字量转换成模拟量的器件称为数模转换器(Digital to Analog Converter,DAC),也称为D/A转换器。

以单片机为核心,具有模拟量输入和输出的应用系统结构如图所示。 图9-1 具有模拟量输入输出的单片机系统

传感器和变送器的区别 检测仪表在模拟电子技术条件下,一般是包括传感器、检测点取样设备及放大器(进行抗干扰处理及信号传输),当然还有电源及现场显示部分(可选择)。 传感器是一种把非电量转变成电信号的器件。 电信号一般分为连续量、离散量两种,实际上还可分成模拟量、开关量、脉冲量等。

模拟信号一般采用4-20mA DC的标准信号传输。数字化过程中,常常把传感器和微处理器及通信网络接口封装在一个器件(称为检测仪表)中,完成信息获取、处理、传输、存贮等功能。 在自动化仪表中经常把检测仪表称为变送器,如温度变送器、压力变送器等。

本章内容安排 本章首先介绍模数转换器的工作原理及性能指标; 然后介绍模数转换器ADS7852与单片机的接口方法及编程应用,介绍STC15F2K60S2单片机片内集成模数转换模块的使用; 最后介绍数模转换器TLV5616与单片机的接口方法及编程应用。

§9.1模数转换器的工作原理及性能指标 一、模数转换器的工作原理 根据转换的工作原理不同,模数转换器可以分为计数-比较式、逐次逼近式和双斜率积分式。 计数-比较式模数转换器结构简单,价格便宜,转换速度慢,较少采用。 下面主要介绍逐次逼近式和双斜率积分式模数转换器的工作原理。

1、逐次逼近式模数转换器的工作原理 逐次逼近式模数转换器电路框图如图所示。 图9-2 逐次逼近式模数转换器的工作原理

逐次逼近式模数转换器主要由逐次逼近寄存器SAR、数字/电压转换器、比较器、时序及控制逻辑等部分组成。

工作过程 当模数转换器收到“转换命令”并清除SAR寄存器后,控制电路先设定SAR中的最高位为“1”,其余位为“0”,此预测数据被送至D/A转换器,转换成电压Vc。 然后将Vc与输入模拟电压Vx在高增益的比较器中进行比较,比较器的的输出为逻辑0或逻辑1。 如果Vx≥Vc,说明此位置“1”是对的,应予保留;如果Vx<Vc,说明此位置“1”不合适,应予清除。 按该方法继续对次高位进行转换、比较和判断,决定次高位应取“1”还是取“0”。 重复上述过程,直至确定SAR最低位为止。 该过程完成后,状态线改变状态,表示已完成一次完整的转换,SAR中的内容就是与输入的模拟电压对应的二进制数字代码。

双积分式模数转换器转换方法的抗干扰能力比逐次逼近式模数转换器强。 该方法的基础是测量两个时间: 2、双积分式模数转换器的工作原理 双积分式模数转换器转换方法的抗干扰能力比逐次逼近式模数转换器强。 该方法的基础是测量两个时间: 一个是模拟输入电压向电容充电的固定时间 另一个是在已知参考电压下放电所需的时间 模拟输入电压与参考电压的比值就等于上述两个时间值之比。

双积分模数转换器的组成框图如图所示。 图9-3 双积分式模数转换器的组成框图

双积分式模数转换器优点 具有精度高、抗干扰能力强的特点,在实际工程中得到了使用。 由于逐次逼近式模数转换技术能很好的兼顾速度和精度,故在16位以下的模数转换器中得到了广泛应用。

二、模数转换器的性能指标 A/D转换器是实现单片机数据采集的常用外围器件。A/D转换器的品种繁多,性能各异,在设计数据采集系统时,首先碰到的问题就是如何选择合适的A/D转换器以满足系统设计的要求。 选择A/D转换器需要综合考虑多项因素,如系统技术指标、成本、功耗、安装等。

1、分辨率 分辨率是A/D转换器能够分辨最小信号的能力,表示数字量变化一个相邻数码所需输入模拟电压的变化量。 分辨率越高,转换时对输入模拟信号变化的反应就越灵敏。

例如,8位A/D转换器能够分辨出满刻度的1/256,若满刻度输入电压为5V,则该8位A/D转换器能够分辨出输入电压变化的最小值为19 例如,8位A/D转换器能够分辨出满刻度的1/256,若满刻度输入电压为5V,则该8位A/D转换器能够分辨出输入电压变化的最小值为19.5mV。 分辨率常用A/D转换器输出的二进制位数表示。常见的A/D转换器有8位、10位、12位、14位和16位等。

一般把8位以下的ADC器件归为低分辨率ADC器件; 如何选择 10位以下的ADC器件误差较大,11位以上对减小误差并无太大贡献,但对ADC器件的要求却提得过高。因此,取10位或11位是合适的。由于模拟信号先经过测量装置,再经A/D转换器转换后才进行处理,因此,总的误差是由测量误差和量化误差共同构成的。

A/D转换器的精度应与测量装置的精度相匹配。 一方面要求量化误差在总误差中所占的比重要小,使它不显著地扩大测量误差; 另一方面必须根据目前测量装置的精度水平,对A/D转换器的位数提出恰当的要求。

2、通道 有的单芯片内部含有多个ADC模块,可同时实现多路信号的转换; 常见的多路ADC器件只有一个公共的ADC模块,由一个多路转换开关实现分时转换。 3、基准电压 基准电压有内、外基准和单、双基准之分。

4、转换速率 转换时间:A/D转换器从启动转换到转换结束,输出稳定的数字量,需要的一定的转换时间。 转换速率:转换时间的倒数就是每秒钟能完成的转换次数。 A/D转换器的型号不同,转换时间不同。逐次逼近式单片A/D转换器转换时间的典型值为1.0~200μs。

应根据输入信号的最高频率来确定ADC转换速度,保证转换器的转换速率要高于系统要求的采样频率。 例如,如果用转换时间为100μs的A/D转换器,则其转换速率为10KHz。根据采样定理和实际需要,一个周期的波形需采10个样点,那么这样的A/D转换器最高也只有处理频率为1KHz的模拟信号。对一般的单片机而言,在如此高的采样频率下,要在采样时间内完成A/D转换以外的工作,如读取数据、再启动、保存数据、循环计数等已经比较困难了。

5、采样/保持器 采样/保持也称为跟踪/保持(Track/Hold缩写T/H)。 原则上采集直流和变化非常缓慢的模拟信号时可不用采样保持器。 对于其他模拟信号一般都要加采样保持器。如果信号频率不高,A/D转换器的转换时间短,即使用高速A/D转换器时,也可不用采样/保持器。

6、量程 量程即所能转换的电压范围,如2.5V、5V和10V。 7、满刻度误差 满度输出时对应的输入信号与理想输入信号值之差称为满刻度误差。 8、线性度 实际转换器的转移函数与理想直线的最大偏移称为线性度。

根据转换的数据输出接口方式,A/D转换器可以分为并行接口和串行接口两种方式。 9、数字接口方式 根据转换的数据输出接口方式,A/D转换器可以分为并行接口和串行接口两种方式。 并行方式一般在转换后可直接接收,但芯片的引脚比较多; 串行方式所用芯片引脚少,封装小,但需要软件处理才能得到所需要的数据。 在单片机I/O引脚不多的情况下,使用串行器件可以节省I/O资源。 但是并行器件具有明显的转换速度优势。在转换速度要求较高的情况下应选用并行器件。

10、模拟信号类型 通常ADC器件的模拟输入信号都是电压信号。同时根据信号是否过零,还分成单极性(Unipolar)信号和双极性(Bipolar)信号。 11、电源电压 电源电压有单电源,双电源和不同电压范围之分,早期的ADC器件要有+15V/-15V,如果选用单+5V电源的芯片则可以使用单片机系统电源。

12、功耗 一般CMOS工艺的芯片功耗较低,对于电池供电的手持系统对功耗要求比较高的场合一定要注意功耗指标。 13、封装 常见的封装有双列直插封装(Dual In-line Package, DIP)和表贴型(Surface Mount Devices, SMD)封装。

§9.2模数转换器的应用 本节首先分别介绍德州仪器公司生产的A/D 转换器ADS7852的应用方法,然后介绍 STC15F2K60S2单片机片内集成的ADC模块的 使用。

一、12位并行A/D转换器ADS7852及其应用 1、ADS7852简介 ADS7852是德州仪器公司(Texas Instruments,TI)生产的一款高速逐次逼近式A/D转换器。

具有以下主要特点: 带有采样保持器 具有8路模拟量输入、并行12位输出 内部带有2.5V的参考电压源,输入的采样电压可以从0V到2倍的参考电压值 500kHz的采样频率,转换时间最大只需1.75μs 单极性5V工作电压 低功耗:13mW 封装形式为TQFP 工作温度为-40℃到+80℃

ADS7852的引脚图如图9-4所示。 图9-4 ADS7852的引脚图

各引脚的功能介绍如下: AIN0~AIN7:8路模拟量输入引脚。 DB0~DB11:12位数字量输出,其中DB0为最低位,DB11为最高位。 A0~A2:8路模拟输入的地址选择。 Vss:电源电压,正常接+5V。 VREF:外接参考电压。若不用外接参考电压,可在此引脚和电源地之间接2.2μF和0.1μF去耦电容各一个。 AGND和DGND:分别为模拟地和数字地。 CLK:外部时钟输入(200KHz~8MHz),时钟的选择取决于采样速度fCLK=16*fSAMPLE。

:忙指示输出,低电平有效。转换期间保持低电平,转换结束后变为高电平。 :片选信号,输入,低电平有效。/CS和/WR变低时,开始一次新的转换。 :读信号,输入,低电平有效。/RD和/CS一起有效时用来读取转换后的数据。也用来设置使芯片工作于省电模式。 :写信号,输入,低电平有效。/WR与/CS同时有效时开始一次新的转换,也用来选择模拟量输入通道。

2、ADS7852的内部结构 ADS7852的内部结构如图所示。 图9-5 ADS7852的内部结构图

ADS7852是逐次逼近型A/D转换器 转换结果通过三态并行数据总线输出。 一个8通道模拟开关 通信双向存取控制器(CDAC) 比较器(Comparator) 逐次比较逻辑寄存器(SAR) 内部基准电压源 参考电压缓冲器 输出锁存和三态驱动器等。 转换结果通过三态并行数据总线输出。

首先置低引脚,然后通过设置A2、A1和A0的值来选择输入通道(000~111分别对应0~7通道),置低/WR引脚开始启动A/D转换。 工作过程 首先置低引脚,然后通过设置A2、A1和A0的值来选择输入通道(000~111分别对应0~7通道),置低/WR引脚开始启动A/D转换。 在A/D转换期间,/BUSY引脚输出低电平并保持到转换结束。转换完成后, /BUSY引脚输出变为高电平,在DB11~DB0上输出12位有效数据,等待处理器读取,一次转换完成。 /BUSY引脚的上升沿可以锁存12位转换数据。 需要注意的是,在A/D转换之后,当/RD和/CS变为高电平时,A1和A0脚应保持低电平,否则ADS7852将进入掉电模式。

ADS7852有8路输入,通过设置A0、A1、A2来选择哪一路输入,具体的选择控制字如表所示。 3、通道选择 ADS7852有8路输入,通过设置A0、A1、A2来选择哪一路输入,具体的选择控制字如表所示。 A2 A1 A0 通道号 通道0 1 通道1 通道2 通道3 通道4 通道5 通道6 通道7 表9-1 ADS7852的通道选择控制字

【例9-1】ADS78752与STC15F2K60S2单片机的接口电路如图所示。

硬件电路说明 由于ADS7852是12位输出,而STC15F2K60S2单片机的数据线只有8位,所以使用STC15F2K60S2的P0口与ADS7852的低8位数据(DB0~DB7)相连。 ADS7852的高4位(DB8~DB11)通过锁存器74LS573与STC15F2K60S2的Pl口低4位(P1.0~P1.3)相连。

当A/D转换结束STC15F2K60S2读取转换结果时,数据的低8位(DB0~DB7)被直接读入STC15F2K60S2内部,而在/RD信号的上升沿,数据的高4位(DB8~DB11)被74HC573锁存在STC15F2K60S2的Pl口低4位(P1.0~P1.3),等待被读取。 STC15F2K60S2单片机的时钟输出CLKOUT0作为ADS7852的时钟,频率设置为250KHz。

ADS7852的/BUSY信号与STC15F2K60S2的P3.2连接。在A/D转换结束后,通知STC15F2K60S2及时读取数据。 在电路设计中,一般在Vss和地之间接一个0.1uF的瓷片电容和10uF的钽电容,起滤波和解耦的作用。

示例程序代码如下: #include "stc15.h" //包含STC15F2K60S2单片机寄存器定义文件 //P2.7 为片选信号; P3.5/T0CLK0为提供AD转换时钟 sbit busy=P3^2; //P3.2 为AD转换状态检测位 sbit A0=P1^5; //P1.5,P1.6,P1.7为通道选择位 sbit A1=P1^6; sbit A2=P1^7; void main(void) { int ADdata; char highdata,lowdata; char xdata *ADS7852; ADS7852=0x7fff; //AD7852的地址 TMOD=0x02; //T0工作在方式2,8位自动重装 TH0=254; //12/12/2/2=0.25MHZ INT_CLKO=INT_CLKO|0x1; //T0输出时钟 TR0=1; //启动T0 A0=0; A1=0; A2=0; //选择通道0 *ADS7852=0x00; //写操作,开始AD转换

while(1) { if(busy==1) //判断是否转换完毕 lowdata=*ADS7852; ADdata=P1; ADdata= (ADdata<<8) +lowdata; //数据处理 *ADS7852=0x00; //开始下一次AD转换 }

二、STC15F2K60S2集成的A/D模块的结构及其使用 STC15F2K60S2单片机集成有8路10位高速电压输入型模数转换器(ADC),速度可达到300KHz(30万次/秒),可做温度检测、压力检测、电池电压检测、按键扫描、频谱检测等。

1、模数转换器的结构及相关寄存器 STC15F2K60S2单片机片内集成8通道10位模数转换器(ADC)。 ADC输入通道与P1口复用,上电复位后P1口为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为ADC功能,不作为ADC使用的口可继续作为I/O口使用。

STC15F2K60S2单片机ADC的结构如图所示。 (1)模数转换器的结构 STC15F2K60S2单片机ADC的结构如图所示。 图9-7 STC15F2K60S2单片机ADC结构图

STC15F2K60S2的ADC组成 多路选择开关 比较器 逐次比较寄存器 10位DAC 转换结果寄存器(ADC_RES和ADC_RESL) ADC控制寄存器ADC_CONTR

STC15F2K60S2的ADC转换原理 STC15F2K60S2的ADC是逐次比较型模数转换器。 逐次比较型ADC由一个比较器和D/A转换器构成,通过逐次比较逻辑,从最高位(MSB)开始,顺序地对每一输入电压与内置D/A转换器输出进行比较,经多次比较,使转换所得的数字量逐次逼近输入模拟量对应值。

(2)参考电压源 STC15F2K60S2单片机ADC模块的参考电压源是输入工作电压Vcc,一般不用外接参考电压源。 如果Vcc不稳定(例如电池供电的系统中,电池电压常常在5.3V-4.2V之间漂移), 则可以在8路A/D转换的一个通道外接一个稳定的参考电压源,计算出此时的工作电压Vcc,再计算出其他几路A/D转换通道的电压。

P1ASF(地址为9DH,复位值为00H)各位的定义如下: (3)与ADC有关的特殊功能寄存器 1)P1口模拟功能控制寄存器P1ASF P1ASF(地址为9DH,复位值为00H)各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF

如果要使用相应口的模拟功能,需将P1ASF特殊功能寄存器中的相应位置为1。 如,若要使用P1.6的模拟量功能,则需要将P16ASF设置为1。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF 如果要使用相应口的模拟功能,需将P1ASF特殊功能寄存器中的相应位置为1。 如,若要使用P1.6的模拟量功能,则需要将P16ASF设置为1。 注意,P1ASF寄存器不能位寻址,可以使用汇编语言指令ORL P1ASF, #40H,也可以使用C语言语句P1ASF |= 0x40;

ADC_CONTR(地址为BCH,复位值为00H)各位的定义如下: 2)ADC控制寄存器ADC_CONTR ADC_CONTR(地址为BCH,复位值为00H)各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 ①ADC_POWER:ADC电源控制位。 0:关闭ADC电源。 1:打开ADC电源。

说明 建议进入空闲模式前,将ADC电源关闭,即ADC_POWER =0。 启动A/D转换前一定要确认ADC电源已打开,A/D转换结束后关闭ADC电源可降低功耗,也可不关闭。 初次打开内部ADC转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换。 建议启动A/D转换后,在A/D转换结束之前,不改变任何I/O口的状态,有利于提高A/D转换的精度。

②SPEED1、SPEED0:ADC转换速度控制位。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 ②SPEED1、SPEED0:ADC转换速度控制位。 表9-2 ADC转换速度控制 SPEED1 SPEED0 A/D转换所需时间 1 90个时钟周期转换一次 ,CPU工作频率21MHz时, A/D转换速度约300KHz,9位精度 180个时钟周期转换一次,可达到10位精度 360个时钟周期转换一次,可达到10位精度 540个时钟周期转换一次,可达到10位精度

STC15F2K60S2单片机A/D转换模块的时钟 外部晶体时钟或内部R/C振荡器所产生的系统时钟,不使用时钟分频寄存器CLK_DIV对系统时钟分频后所产生的供给CPU工作所使用的时钟。 优点:不仅可以让ADC用较高的频率工作,提高A/D的转换速度;而且可以让CPU用较低的频率工作,降低系统的功耗。

需要注意 设置ADC_CONTR控制寄存器的语句执行后,要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR控制寄存器。 典型代码如下: MOV ADC_CONTR, #DATA NOP MOV A, ADC_CONTR ;经过4个时钟延时,才能正确读到ADC_CONTR控制寄存器的值

③ADC_FLAG:A/D转换结束标志位。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 ③ADC_FLAG:A/D转换结束标志位。 A/D转换完成后,ADC_FLAG = 1,要由软件清零。不管A/D转换完成后由该位申请产生中断,还是由软件查询该标志位判断A/D转换是否结束,当A/D转换完成后,ADC_FLAG = 1,一定要软件清0。

⑤CHS2、CHS1、CHS0:模拟输入通道选择,如表所示。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 ⑤CHS2、CHS1、CHS0:模拟输入通道选择,如表所示。 用MOV 语句对 ADC_CONTR 寄存器进行赋值。 CHS2 CHS1 CHS0 模拟输入通道选择 选择P1.0作为A/D输入来用 1 选择P1.1作为A/D输入来用 选择P1.2作为A/D输入来用 选择P1.3作为A/D输入来用 选择P1.4作为A/D输入来用 选择P1.5作为A/D输入来用 选择P1.6作为A/D输入来用 选择P1.7作为A/D输入来用 表9-3 模拟输入通道选择

3)A/D转换结果存储格式控制及A/D转换结果寄存器ADC_RES、ADC_RESL 特殊功能寄存器ADC_RES(地址为BDH,复位值为00H)和ADC_RESL(地址为BEH,复位值为00H)用于保存A/D转换结果。 特殊功能寄存器CLK_DIV中的ADRJ位用于设置A/D转换结果的存储格式。 ADRJ位在时钟分频寄存器CLK_DIV (也称为PCON2,地址为97H,复位值为0000 x000B)中,其各位的定义如下: 位号00 D7 D6 D5 D4 D3 D2 D1 D0 位名称 MCKO_S1 MCKO_S0 ADRJ Tx_Rx - CLKS2 CLKS1 CLKS0

ADRJ=0时,ADC_RES[7:0]存放高8位ADC结果,ADC_RESL[1:0]存放低2位ADC结果; 位名称 寄存器 D7 D6 D5 D4 D3 D2 D1 D0 ADC_RES ADC_RES9 ADC_RES8 ADC_RES7 ADC_RES6 ADC_RES5 ADC_RES4 ADC_RES3 ADC_RES2 ADC_RESL ADC_RES1 ADC_RES0 AUXR1 ADRJ=0 位名称 寄存器 D7 D6 D5 D4 D3 D2 D1 D0 ADC_RES ADC_RES9 ADC_RES8 ADC_RESL ADC_RES7 ADC_RES6 ADC_RES5 ADC_RES4 ADC_RES3 ADC_RES2 ADC_RES1 ADC_RES0 AUXR1 ADRJ=1

如果STC15F2K60S2单片机的10位A/D转换结果的高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2位中,模/数转换结果计算公式如下: 取10位结果 (ADC_RES[7:0],ADC_RESL[1:0]) = 1024×Vin/Vcc 取8位结果 ADC_RES[7:0] = 256×Vin / Vcc Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。

在中断服务程序中,要使用软件将A/D中断 标志位ADC_FLAG(也是A/D转换结束标志 位)清0。 中断允许控制寄存器IE中的EADC位(D5位)用于开放ADC中断 EA位(D7位)用于开放CPU中断 中断优先级寄存器IP中的PADC位(D5位)用于设置A/D中断的优先级 在中断服务程序中,要使用软件将A/D中断 标志位ADC_FLAG(也是A/D转换结束标志 位)清0。

2、STC15F2K60S2单片机ADC模块的使用 编程要点 打开ADC电源,第一次使用时要打开内部模拟电源(设置ADC_CONTR)。 适当延时,等内部模拟电源稳定。一般延时1ms以内即可。 设置P1口中的相应口线作为A/D转换通道(设置P1ASF寄存器)。

选择ADC通道(设置ADC_CONTR中的CHS2~CHS0)。 根据需要设置转换结果存储格式(设置AUXR1中的ADRJ位)。 查询A/D转换结束标志ADC_FLAG,判断A/D转换是否完成,若完成,则读出结果(结果保存在ADC_RES和ADC_RESL寄存器中),并进行数据处理。

读取转换结果注意: 如果是多通道模拟量进行转换,则更换A/D转换通道后要适当延时,使输入电压稳定,延时量取20μs~200μs即可,与输入电压源的内阻有关。 如果输入电压信号源的内阻在10K以下,可不加延时。 如果是单通道模拟量转换,则不需要更换A/D转换通道,也就不需要加延时。

若采用中断方式,还需进行中断设置(EADC置1,EA置1)。 在中断服务程序中读取ADC转换结果,并将ADC中断请求标志ADC_FLAG清零。

【例9-2】 编程实现利用STC15F2K60S2单片机ADC通道2采集外部模拟电压信号,8位精度,采用查询方式循环进行转换,并将转换结果保存于30H单元中。假设时钟频率为18.432MHz。 解:取8位精度时,若ADRJ-0,则可直接使用转换结果寄存器ADC_RES的值。由于复位后,ADRJ=0,因此,按照ADC的编程要点进行初始化后,直接判断ADC_FLAG标志是否为1,若为1,则读出ADC_RES寄存器的值,并存入30H即可;若为0,则继续等待。

汇编语言程序代码如下: $INCLUDE (STC15.INC) ;包含STC15单片机寄存器定义文件 ADC_DAT EQU 30H ;A/D转换结果 ORG 0000H LJMP MAIN ORG 0050H MAIN: MOV SP, #70H ;设置堆栈 ORL ADC_CONTR, #80H ;开A/D转换电源 MOV A, #20H LCALL DELAY ;开电源后加适当延时,1ms以内即可 MOV P1ASF,#04H ;设置P1.2的模拟量功能 MOV ADC_CONTR,#11100010B ;选择P1.2作为A/D转换通道 MOV A, #05H LCALL DELAY ;如果切换A/D转换通道,则需要加延时

WAIT_AD: ORL ADC_CONTR, #00001000B ;启动A/D转换 MOV A, #00010000B ;判断A/D转换是否完成 ANL A, ADC_CONTR JZ WAIT_AD ;A/D 转换尚未完成, 继续等待 ANL ADC_CONTR, #11100111B ;将ADC_FLAG清零 MOV A, ADC_RES ;读取A/D转换结果 MOV ADC_DAT, A ;保存A/D转换结果 LJMP WAIT_AD ;等待下一次转换完成

DELAY: ;延时子程序 PUSH 02 ;将寄存器组0 的 R2 入栈 PUSH 03 ;将寄存器组0 的 R3 入栈 PUSH 04 ;将寄存器组0 的 R4 入栈 MOV R4, A DELAY_LOOP0: MOV R3, #200 ;2个时钟周期 Delay_LOOP1: MOV R2, #249 ;2个时钟周期 DELAY_LOOP: DJNZ R2, DELAY_LOOP ;4个时钟周期 DJNZ R3, DELAY_LOOP1 ;4个时钟周期 DJNZ R4, DELAY_LOOP0 ;4个时钟周期 POP 04 POP 03 POP 02 RET END

C语言程序代码如下: #include “stc15.h” //包含STC15单片机寄存器定义文件 unsigned char data adc_dat _at_ 0x30; //A/D转换结果变量 void main(void) { unsigned long i; unsigned char status; ADC_CONTR|=0x80; //开A/D转换电源 for (i=0;i<10000;i++); //适当延时 P1ASF=0x04; //选择P1.2作为A/D转换通道 ADC_CONTR=0xE2; for (i=0;i<10000;i++); //适当延时 while(1) //循环进行A/D 转换 ADC_CONTR|=0x08; //重新启动 A/D 转换 status=0; while(status==0) //等待A/D转换结束 status=ADC_CONTR&0x10; } ADC_CONTR&=0xE7; //将ADC_FLAG清零 adc_dat=ADC_RES; //保存A/D转换结果

【例9-3】 编程实现利用STC15F2K60S2单片机ADC通道2采集外部模拟电压信号,10位精度,采用中断方式进行转换,并将转换结果保存于30H和31H单元中。假设时钟频率为18.432MHz。 解:ADRJ=0时,ADC结果的高8位在ADC_RES中,低2位在ADC_RESL的低2位。因此,可以在中断服务程序中读出ADC_RESL寄存器的值,屏蔽高6位后存入30H单元,读出ADC_RES寄存器的值,存入31H单元。

汇编语言程序代码如下: $INCLUDE (STC15.INC) ;包含STC15F2K60S2单片机寄存器定义文件 ADC_HI EQU 31H ;A/D转换结果高2位 ADC_LOW EQU 30H ;A/D转换结果低8位 ORG 0000H LJMP MAIN ORG 002BH LJMP ADC_ISR ;ADC中断服务程序入口 ORG 0050H MAIN: MOV SP, #70H ;设置堆栈 ORL ADC_CONTR, #80H ;开A/D转换电源 MOV A, #20H LCALL DELAY ;开电源后要加适当延时,1ms以内即可 MOV P1ASF,#04H ;设置P1.2的模拟量功能 MOV ADC_CONTR,#11100010B ;选择P1.2作为A/D转换通道 MOV A, #05H LCALL DELAY ;如果切换A/D转换通道,则需要加延时 ORL AUXR1,#04H ;设置ADC转换结果存储格式(ADRJ=1) ORL ADC_CONTR, #00001000B ;启动A/D转换 SETB EADC ;EADC=1, 开放ADC的中断控制位 SETB EA ;开放CPU总中断 SJMP $ ;循环等待中断

ADC_ISR: ;ADC中断服务程序入口 ANL ADC_CONTR, #11100111B ;将ADC_FLAG清0 MOV A, ADC_RES ;读取A/D转换结果高2位 ANL A,#03H ;屏蔽高6位 MOV ADC_HI, A ;保存A/D转换结果高2位 MOV A, ADC_RESL ;读取A/D转换结果低8位 MOV ADC_LOW, A ;保存A/D转换结果低8位 ORL ADC_CONTR, #00001000B ;重新启动A/D转换 RETI

DELAY: ;延时子程序 PUSH 02 ;将寄存器组0 的 R2 入栈 PUSH 03 ;将寄存器组0 的 R3 入栈 PUSH 04 ;将寄存器组0 的 R4 入栈 MOV R4, A DELAY_LOOP0: MOV R3, #200 ;2个时钟周期 Delay_LOOP1: MOV R2, #249 ;2个时钟周期 DELAY_LOOP: DJNZ R2, DELAY_LOOP ;4个时钟周期 DJNZ R3, DELAY_LOOP1 ;4个时钟周期 DJNZ R4, DELAY_LOOP0 ;4个时钟周期 POP 04 POP 03 POP 02 RET END

C语言程序代码如下: #include “stc15.h” //包含STC15F2K60S2单片机寄存器定义文件 unsigned char data adc_hi _at_ 0x31; //A/D转换结果变量高2位 unsigned char data adc_low _at_ 0x30;//A/D转换结果变量低8位 void main(void) { unsigned long i; ADC_CONTR|=0x80; //开A/D转换电源 for (i=0;i<10000;i++); //适当延时 P1ASF=0x04; //选择P1.2作为A/D转换通道 ADC_CONTR=0xE2; for (i=0;i<10000;i++); //适当延时 AUXR1 |=0x04; //ADRJ=1 ADC_CONTR|=0x08; //启动 A/D 转换 EADC=1; //EADC=1, 开放ADC的中断控制位 EA=1; //开放CPU总中断 while(1); //循环等待ADC中断 }

void ADC_ISR (void) interrupt 5 // ADC中断函数 { ADC_CONTR&=0xE7; //将ADC_FLAG清0 adc_hi=ADC_RES&0x03; //保存A/D转换结果高2位 adc_low=ADC_RESL; //保存A/D转换结果低8位 ADC_CONTR|=0x08; //重新启动A/D转换 }

§9.3 数模转换器的应用 单片机处理后的数字信号要转换成模拟信号才能控制相关对象。 实现数字量转换成模拟量的器件称为数模转换器(DAC),简称为D/A转换器 。 本节主要介绍D/A转换的原理及性能指标、数模转换器TLV5616与单片机的接口及编程方法。

一、 模数转换器的工作原理及性能指标 1、数模转换器的分类 根据解码网络结构的不同,D/A转换器可以分为T型、倒T型、权电阻和权电流等类型。 根据模拟电子开关的种类不同,D/A转换器可以分为CMOS型和双极型。双极型又分为电流开关型和ECL电流开关型。

D/A转换器选择 在速度要求不高的情况下,可选用CMOS开关型D/A转换器; 如对转换速度要求较高,则应选用双极型电流开关D/A转换器或转换速度更高的ECL电流开关型D/A转换器。

2、D/A转换器的工作原理 根据分类不同,D/A转换器的工作原理也不尽相同。下面只介绍权电阻型数模转换器的工作原理,其余类型数模转换器的工作原理请读者自行查阅资料学习。 权电阻型数/模转换:就是将某一数字量的二进制代码各位按它的“权”的数值转换成相应的电流,然后再把代表各位数值的电流加起来。

一个8位的权电阻D/A转换器的原理框图如图所示。

工作原理 线性电阻网络,可以应用叠加原理分析网络的输出电压 先逐个求出每个开关单独接通标准电压,而其余开关均接地时网络的输出电压分量,然后将所有接标准电压开关的输出分量相加,就可以得到总的输出电压。

权电阻D/A转换器的简化电路如图所示。 Di=0时,Si接地。 Di=1时,Si接VB (i=0,1,…,7)

图中 V0=a7•VB,V1=a6•VB,V2=a5•VB,V3=a4•VB,V4=a3•VB,V5=a2•VB,V6=a1•VB,V7=a0•VB,a0,a1,…,a7=0或1。 图9-9 权电阻D/A转换器简化电路

当R=2Rf时,代入上式得: 由此得到:

3、D/A转换器的性能指标 (1)分辨率 分辨率是D/A转换器对输入量变化敏感程度的描述,与输入数字量的位数有关。 (2)稳定时间 指D/A转换器中代码有满度值的变化时,其输出达到稳定(一般稳定到与±1/2最低位值相当的模拟量范围内)所需的时间。一般为几十毫秒到几微秒。

(3)输出电平 不同型号的D/A转换器的输出电平相差较大,一般为5~10V,也有一些高压输出型的为24~30V。还有一些电流输出型,低的为20mA,高的可达3A。 (4)转换精度 转换精度是转换后所得的实际值对于理想值的接近程度。 (5)输入编码 如二进制、BCD码、双极性时的符号-数值码、补码、偏移二进制码等。必要时可在D/A转换前用计算机进行代码转换。

二、12位D/A转换器TLV5616及其接口技术 1、TLV5616简介 TLV5616是一个带有灵活的4线串行接口的12位电压输出数/模转换器(DAC)。 4线串行接口可以与SPI、QSPI和Microwire串行口接口。TLV5616可以用一个包括4个控制位和12个数据位的16位串行字符串来编程 TLV5616采用CMOS工艺,设计成2.7V至5.5V单电源工作。

器件用8引脚封装,工业级芯片的工作温度范围从-40℃至85℃。输出电压(由外部基准决定满度电压)由下式给出: 其中REF是基准电压,而CODE是数字输入值,范围从0x000至0xFFF。 上电复位将内部锁存为一个规定的初始状态(所有各位为零)。

各引脚功能介绍如下: DIN:串行数字数据输入 SCLK:串行数字时钟输入 :芯片选择,低有效 FS:帧同步,数字输入,用于4线串行接口。 图9-10 TLV5616引脚图

AGND:模拟地 REFIN:基准模拟电压输入 OUT: DAC模拟电压输出 VDD:正电源 图9-10 TLV5616引脚图

2、内部结构 TLV5616的内部结构如图所示。 图9-11 TLV5616的内部结构

TLV5616是一个基于一个电阻串结构的12位、单电源DAC。 一个并行接口 速度和掉电控制逻辑 一个基准输入缓冲器 电阻串 一个轨到轨(rail-to-rail)输出缓冲器

3、数据传输时序图 TLC5616的数据传输时序图如图所示。 图9-12 TLC5616的数据传输时序图

数据传输过程 首先器件必须使能CS。 然后在FS的下降沿启动数据的移位,在SCLK的下降沿一位接一位地传入内部寄存器。 在16位已传送后或者当FS升高时,移位寄存器中的内容被移到DAC锁存器,它将输出电压更新为新的电平。

TLV5616的串行接口可以用于两种基本的方式: 4线(带片选) 3线(不带片选) 4、数据格式 TLV5616的16位数据字包括两部分: 控制位 D15-D12 DAC新值 D11-D0

注:在掉电方式时,TLV5616中的所有放大器都被禁止。 D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 X SPD PWR DAC新值 X:任意值 SPD:速度控制位 1→快速方式 0→慢速方式 PWR:功率控制位 1→掉电方式 0→正常工作 注:在掉电方式时,TLV5616中的所有放大器都被禁止。

4、TLV5616与单片机的接口电路及应用编程 TLV5616与单片机的接口连接相对简单,注意应在VDD和AGND之间应当连接一个0.1μF的陶瓷旁路电容,且应当用短引线安装在尽可能靠近器件的地。 使用缺氧体环(ferrite beads)可以进一步隔离系统模拟电源与数字电源。

【例9-4】使用STC15F2K60S2控制TLV5616输出正弦波。 解:TLV5616与STC15F2K60S2接口的电路图如图所示。

串行的DAC输入数据和外部控制信号由单片机的P3口完成:串行数据由RxD引脚送出,串行时钟由TxD引脚送出。P3. 4和P3 串行的DAC输入数据和外部控制信号由单片机的P3口完成:串行数据由RxD引脚送出,串行时钟由TxD引脚送出。P3.4和P3.5分别向TLV5616提供片选和帧同步信号。 使用定时器以固定的频率产生中断。在中断服务子程序中提取和写入下一个数据样本(两个字节)到DAC中。数据样本储存在常数表格中,描述了一个正弦波的全周期。

单片机的串行口工作于方式0,在RxD脚发送8位数据,同时TxD脚上送出同步时钟。需要连续两次写入才能写一个完整的字到TLV5616。 输出DAC的数据是正弦波数据,一个周期的32个正弦波数据(双字节数)保存在SINEVALS为首地址的单元中(共64个字节)。

汇编语言程序代码如下: ROLL_PTR EQU 30H ORG 0000H LJMP START ORG 000BH LJMP INT_T0 ORG 0100H START: MOV SP,#0F0H MOV DPTR,# SINEVALS ;设置数据常数表格的首地址 CLR A MOV SCON,A ;设置串口1工作与模式0 MOV TMOD,#02H ;设置定时器0工作方式2 MOV TH0,#0C8H SETB T1 ;置FS = 1 SETB T0 ;置= 1 SETB ET0 ;允许定时器0中断 SETB EA ;允许CPU中断 MOV ROLL_PTR,A ;循环计数清“0” SETB TR0 ;启动定时器0 SJMP $

;定时器0中断服务程序 INT_T0: PUSH PSW PUSH ACC CLR T0 ;将CS置为低电平 CLR T1 ;将FS置为低电平 MOV A, ROLL_PTR ;将循环计数装入累加器A MOVC A,@A+DPTR ;从数据表格中读取高位字节 ORL A, #00H ;设置控制位 MOV SBUF,A ;送出高位字节 INC A MOVC A,@A+DPTR ;读取低位字节

MSB_TX: JNB TI, MSB_TX ;等待高位传输结束 CLR TI MOV SBUF,A ;送出低位字节 LSB_TX: JNB TI, LSB_TX ;等待低位传输结束 SETB T1 ;置 FS = 1 MOV A, ROLL_PTR INC A ;修正计数,以得到下一个数据样本 INC A ANL A,#03FH ;如果大于64,则重新赋值为0 MOV ROLL_PTR,A SETB T0 ;置=1 POP ACC POP PSW RETI

;正弦常数表格 SINEVALS: DW 01000H DW 0903EH DW 05097H DW 0305CH DW 0B086H DW 070CAH DW 0F0E0H DW 0F06EH DW 0F039H DW 05097H DW 0903EH DW 01000H DW 06021H DW 0A0E8H DW 0C063H DW 040F9H DW 080B5H DW 0009FH DW 00051H DW 00026H DW 080B5H DW 040F9H DW 0C063H DW 0A0E8H DW 06021H END