Presentation is loading. Please wait.

Presentation is loading. Please wait.

第9章 模数转换器与数模转换器.

Similar presentations


Presentation on theme: "第9章 模数转换器与数模转换器."— Presentation transcript:

1 第9章 模数转换器与数模转换器

2 任课教师:刘忠国 山东大学课程中心网站: 宏晶官方网站: STC单片机编译(汇编)/编程(烧录)/仿真工具说 明书; stc15系列单片机器件手册等 keil μvision软件下载及指导手册(Help→μvision Help) Keil Software –Cx51 编译器用户手册: Cx51编译 器--对传统和扩展的8051微处理器的优化的C 编译器和库参考

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

4 第9章 模数转换器与数模转换器 9.1 模数转换器的工作原理及性能指标 模数转换器的工作原理 模数转换器的性能指标 9.2 IAP15W4K58S4单片机片内集成的模拟量模块 IAP15W4K58S4集成的A/D模块的结构及其使用 IAP15W4K58S4集成的比较器模块及其使用 9.3 数模转换器及其应用 数模转换器的工作原理及性能指标 位D/A转换器TLV5616及其接口技术

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

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

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

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

9 Vx >Vc?输出为逻辑1?(或0) No Yes 1→0 保留1
1、逐次逼近式模数转换器的工作原理 逐次逼近式模数转换器主要由逐次逼近寄存器SAR, 数 字/电压转换器, 比较器, 时序及控制逻辑等部分组成。 Vx >Vc?输出为逻辑1?(或0) 3.8V No Yes 1→0 保留1 1 1 C2H (Successive  Approximation Register) SAR 图9-2 逐次逼近式模数转换器的工作原理

10 2、双积分式模数转换器的工作原理 双积分模数转换器的组成框图如图所示。 ①S闭合放电后再打开 S ②K向上闭合 充电电流: ③电容充电 正
R K + ⑤K向下闭合 + ⑥电容放电 ⑦又从0计数到N 定斜率 ⑧计数停止 固定时间: ④从0计数到2n溢出 放电电流: 图9-3 双积分式模数转换器的组成框图

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

12 2、双积分式模数转换器的工作原理 双积分式模数转换器优点是精度高、抗干扰能力强, 在实际工程中得到了使用, 缺点是转换速度慢。
双积分式模数转换器优点是精度高、抗干扰能力强, 在实际工程中得到了使用, 缺点是转换速度慢。 由于逐次逼近式模数转换器能很好的兼顾速度和精度, 故在16位以下的模数转换器中得到了广泛应用。 还有并联比较型ADC采用各量级同时并行比较, 各位 输出码同时并行产生, 转换速度快是它的突出优点。 并联比较型ADC的缺点是成本高、功耗大。 因为n位输出的ADC, 需要2n个电阻, (2n-1) 个比较 器和D触发器, 以及复杂的编码网络, 其元件数量随位 数的增加, 以几何级数上升。所以这种ADC适用于要 求高速、低分辩率的场合。

13 9.1.2模数转换器的性能指标 A/D转换器是实现单片机数据采集的常用外围器件。
A/D转换器的品种繁多, 性能各异, 设计数据采集系统 时, 需选择合适的A/D转换器以满足系统设计要求。 选择A/D转换器需要综合考虑系统技术指标、成本、 功耗、安装等因素。 1、分辨率 分辨率是A/D转换器能分辨最小信号的能力, 表示数 字量变化一个相邻数码所需输入模拟电压的变化量。 分辨率越高,转换时对输入模拟信号变化的反应就 越灵敏。

14 1、分辨率 例如,8位A/D转换器能够分辨出满刻度的1/256, 若满刻度输入电压为5V,则该8位A/D转换器能够 分辨出输入电压变化的最小值为19.5mV。 分辨率常用A/D转换器输出的二进制位数表示。常 见的A/D转换器有8位、10位、12位、14位和16位 等。 一般称8位以下的ADC器件为低分辨率ADC器件; 9~12位的ADC器件称为中分辨率ADC器件; 13位以上的ADC器件称为高分辨率ADC器件。

15 如何选择ADC器件的分辨率 10位以下ADC器件误差较大,11位以上对减小误差 并无太大贡献,但对ADC器件的要求却提得过高。 因此,取10位或11位是合适的。 由于模拟信号先经过测量装置,再经A/D转换器转 换后才进行处理,因此,总的误差是由测量误差和 量化误差共同构成的。 A/D转换器的精度应与测量装置的精度相匹配。 一方面要求量化误差在总误差中所占的比重要小, 使它不显著地扩大测量误差; 另一方面必须根据目前测量装置的精度水平,对 A/D转换器的位数提出恰当的要求。

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

17 9.1.2模数转换器的性能指标 4、转换速率 转换时间:A/D转换器从启动转换到转换结束,输出 稳定的数字量,需要的一定的转换时间。
转换速率:转换时间的倒数即每秒钟完成的转换次数。 A/D转换器的型号不同,转换时间不同。逐次逼近式 单片A/D转换器转换时间的典型值为1.0~200μs。 ADS7852: 12位逐次逼近式A/D转换器转换速率 500kHz ICL7109: 12位双积分式A/D转换器转换速率30次/s 应根据输入信号的最高频率来确定ADC转换速度, 保证转换器的转换速率要高于系统要求的采样频率。

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

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

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

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

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

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

24 §9.2 IAP15W4K58S4单片机片内集成的模拟量模块
本节首先介绍IAP15W4K58S4单片机片内集成的 ADC模块的结构和使用方法,然后介绍 IAP15W4K58S4单片机片内集成的比较器及其 使用。

25 9.2.1 IAP15W4K58S4集成A/D模块的结构及其使用
IAP15W4K58S4单片机集成有8路10位高速电压输入 型模数转换器(ADC), 速度可达300KHz(30万次/秒), 可做温度检测、压力检测、电池电压检测、按键扫 描、频谱检测等。 1、模数转换器的结构及相关寄存器 IAP15W4K58S4集成8通道10位模数转换器(ADC) 。 ADC输入通道与P1口复用,上电复位后P1口为弱上 拉型I/O口,用户可通过软件设置将8路中的任何一 路设置为ADC功能,不作为ADC使用的口可继续作 为I/O口使用。

26 (1)模数转换器的结构 结构如图所示。 ADC控制寄存器ADC_CONTR 开关电源 选择通道 转换完标志 启动转换 控制时钟速度
图9-4 IAP15W4K58S4单片机ADC结构图 P1ASF寄存器控制P1口的模拟功能 位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF

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

28 (1)模数转换器的结构 IAP15W4K58S4的ADC转换原理 IAP15W4K58S4的ADC是逐次比较型模数转换器。
逐次比较型ADC由一个比较器和D/A转换器构成, 对每一输入电压(AD0~AD7), 通过逐次比较逻辑, 从SAR的最高位(MSB)开始, 顺序预设置1, 然后将 内置D/A转换器相应的输出与输入电压进行比较, 根据比较结果决定置1的预设是否保留。 经多次比较,使转换所得的数字量逐次逼近输入 模拟量对应值。

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

30 表9-1 新出现的与ADC模块有关的特殊功能寄存器
地址 D7 D6 D5 D4 D3 D2 D1 D0 复位值 P1ASF 9DH P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF B ADC_ CONTR BCH POWER SPEED1 SPEED0 FLAG START CHS2 CHS1 CHS0 RES BDH RESL BEH CLK_ DIV 97H MCKO_S1 MCKO_S0 ADRJ Tx_Rx - CLKS2 CLKS1 CLKS0 0000x000B

31 (3)与ADC有关的特殊功能寄存器 1)P1口模拟功能控制寄存器P1ASF P1ASF (地址为9DH, 复位值为00H)各位定义如下:
P1 Analog Special Function Configure register 位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF 若要用P1相应口P1.x的模拟功能, 需将P1ASF特殊功能 寄存器中的相应位置为1。 如, 若要用P1.6的模拟量功能, 则需将P16ASF置为1。 注意: P1ASF寄存器不能位寻址, 可用汇编语言指令 ORL P1ASF, #40H, 也可用C语言语句P1ASF |= 0x40; (该寄存器是只写寄存器,读无效)

32 (3)与ADC有关的特殊功能寄存器 2)ADC控制寄存器ADC_CONTR ADC_CONTR(地址为BCH,复位值为00H)各位定义:
位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 ADC_ POWER SPEED1 SPEED0 FLAG START CHS2 CHS1 CHS0 ①ADC_POWER:ADC电源控制位。 0:关闭ADC电源。 1:打开ADC电源。

33 2)ADC控制寄存器ADC_CONTR ②SPEED1, SPEED0:ADC转换速度控制位。 表9-2 ADC转换速度控制
位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 ADC_ POWER SPEED1 SPEED0 FLAG START CHS2 CHS1 CHS0 ②SPEED1, SPEED0:ADC转换速度控制位。 表9-2 ADC转换速度控制 SPEED1 SPEED0 A/D转换所需时间 1 90个时钟周期转换一次, CPU工作频率217M Hz时, A/D转换速度约300KHz, 9位精度 27MHz/90=300KHz 1 180个时钟周期转换一次,可达到10位精度 360个时钟周期转换一次,可达到10位精度 540个时钟周期转换一次,可达到10位精度

34 STC12C5A60S2.pdf说明书有此叙述, STC15系列无。
2)ADC控制寄存器ADC_CONTR IAP15W4K58S4单片机A/D转换模块的时钟 使用外部晶体时钟或内部R/C振荡器所产生的系统 主时钟,不使用时钟分频寄存器CLK_DIV对系统 时钟分频后所产生的供给CPU工作所使用的时钟 (系统时钟)。 优点:不仅可以让ADC用较高的频率工作,提高 A/D的转换速度;而且可以让CPU用较低的频率工 作,降低系统的功耗。 STC12C5A60S2.pdf说明书有此叙述, STC15系列无。 IAP15W4K58S4单片机A/D转换模块的时钟就是CPU工作所使用的时钟(系统时钟)。

35 2)ADC控制寄存器ADC_CONTR ③ADC_FLAG:A/D转换结束标志位。
位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 ADC_ POWER SPEED1 SPEED0 FLAG START CHS2 CHS1 CHS0 ③ADC_FLAG:A/D转换结束标志位。 A/D转换完成后,ADC_FLAG = 1,要由软件清零。 不管A/D转换完成后由该位申请产生中断, 还是由软 件查询该标志位判断A/D转换是否结束, 当A/D转换 完成后, ADC_FLAG = 1, 取数据后, 一定要软件清0。 用MOV 语句对ADC_CONTR寄存器进行赋值。

36 2)ADC控制寄存器ADC_CONTR ④ADC_START: ADC转换启动控制位, 设置为“1”时, 开始转换,转换结束后为0。
位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 ADC_ POWER SPEED1 SPEED0 FLAG START CHS2 CHS1 CHS0 ④ADC_START: ADC转换启动控制位, 设置为“1”时, 开始转换,转换结束后为0。 用MOV 语句对ADC_CONTR寄存器进行赋值。 ⑤ CHS2、CHS1、CHS0:模拟输入通道选择, 具体选择情况见表9-3 。

37 ⑤ CHS2、CHS1、CHS0:模拟输入通道选择,见下表。
ADC_CONTR 控制寄存器 ⑤ CHS2、CHS1、CHS0:模拟输入通道选择,见下表。 位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 ADC_ POWER SPEED1 SPEED0 FLAG START CHS2 CHS1 CHS0 表9-3 模拟输入通道选择 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输入来用

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

39 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)中, 其各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 MCKO_S1 MCKO_S0 ADRJ Tx_Rx - CLKS2 CLKS1 CLKS0 ADRJ: ADC转换结果调整寄存器位 the adjustment bit of ADC result

40 3)A/D转换结果存储格式控制及A/D转换结果寄存器
ADRJ=0时, ADC_RES[7:0]存放高8位ADC结果, ADC_RESL[1:0]存放低2位ADC结果; 位名称 寄存器 D7 D6 D5 D4 D3 D2 D1 D0 ADC_ RES RES9 RES8 RES7 RES6 RES5 RES4 RES3 RES2 RESL RES1 RES0 CLK_ DIV ADRJ =0 ADRJ=1时,ADC_RES[1:0]存放高2位ADC结果, ADC_RESL[7:0]存放低8位ADC结果。

41 3)A/D转换结果存储格式控制及A/D转换结果寄存器
ADRJ=1时,ADC_RES[1:0]存放高2位ADC结果, ADC_RESL[7:0]存放低8位ADC结果。 位名称 寄存器 D7 D6 D5 D4 D3 D2 D1 D0 ADC_ RES ADC_RES9 ADC_RES8 RESL ADC_RES7 ADC_RES6 ADC_RES5 ADC_RES4 ADC_RES3 ADC_RES2 ADC_RES1 ADC_RES0 CLK_ DIV ADRJ=1

42 3)A/D转换结果存储格式控制及A/D转换结果寄存器
如果IAP15W4K58S4单片机的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为单片机实际工 作电压,用单片机工作电压作为模拟参考电压。

43 4)与A/D转换中断有关的寄存器 在中断服务程序中, 要用软件将A/D中断标志位 ADC_FLAG (也是A/D转换结束标志位)清0。
中断允许控制寄存器IE中的EADC位 (D5位) 用于开放 ADC中断; EA位 (D7位) 用于开放CPU中断。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 EA ELVD EADC ES ET1 EX1 ET0 EX0 中断优先级寄存器IP中的PADC位(D5位)用于设置A/D 中断的优先级 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 PPCA PLVD PADC PS PT1 PX1 PT0 PX0 在中断服务程序中, 要用软件将A/D中断标志位 ADC_FLAG (也是A/D转换结束标志位)清0。

44 9.2.1 IAP15W4K58S4集成A/D模块的结构及其使用
2、IAP15W4K58S4单片机ADC模块的使用 编程要点 打开ADC电源,第一次使用时要打开内部模拟电源 (设置ADC_CONTR . ADC_POWER =1)。 适当延时,等内部模拟电源稳定。一般延时1ms以 内即可。 设置P1口中的相应口线作为A/D转换通道 (设置 P1ASF寄存器)。(也可在打开ADC电源前设置) (在此可设置CLK_DIV中的ADRJ位: 转换结果存储格式) 位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 ADC_ POWER SPEED1 SPEED0 FLAG START CHS2 CHS1 CHS0

45 (根据需要设置CLK_DIV中的ADRJ位: 转换结果存储格式)
2、IAP15W4K58S4单片机ADC模块的使用 (根据需要设置CLK_DIV中的ADRJ位: 转换结果存储格式) 选择ADC通道(设置ADC_CONTR中CHS2~CHS0 位)。 延时(若切换了通道, 延时20μs~200μs, 否则略)。 ⑤′启动ADC转换(ADC_CONTR中ADC_START位置1)。 (ADC_CONTR的各位设置可一次完成) ⑥查询A/D转换结束标志ADC_FLAG,判断A/D转换是 否完成,若完成,则读出结果(结果保存在ADC_RES 和ADC_RESL寄存器中),并进行数据处理。

46 2、IAP15W4K58S4单片机ADC模块的使用 ⑦若采用中断方式,还需进行中断设置 (EADC置1,EA置1)。 ⑧在中断服务程序中读取ADC转换结果,并 将ADC中断请求标志ADC_FLAG清零。

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

48 【例9-1】 ADC通道2采集电压, 8位精度,结果存30H
位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 ADC_ POWER SPEED1 SPEED0 FLAG START CHS2 CHS1 CHS0 【例9-1】 ADC通道2采集电压, 8位精度,结果存30H C语言程序代码如下: #include “stc15.h” //包含STC15单片机寄存器定义文件 unsigned char data adc_dat _at_ 0x30; //A/D转换结果变量 void main(void) { unsigned long i; //i用于for循环 unsigned char status; //status用来存储ADC_CONTR 的ADC_FLAG ADC_CONTR|=0x80; //开A/D转换电源 for (i=0; i<10000; i++); //适当延时 P1ASF=0x04; //选择P1.2作为A/D转换通道 ADC_CONTR=0xE2; // B, P1.2为A/D通道 for (i=0;i<10000;i++); //适当延时 转换周期: 90个时钟 位号 D7 D6 D5 D4 D3 D2 D1 D0 P1ASF P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF

49 ADC_START: 置 “1”时, 开始转换, 转换结束后为0。
while(1) //循环进行A/D 转换 { ADC_CONTR |=0x08; //(重新)启动 A/D 转换 status=0; //status用来存储ADC_CONTR 的ADC_FLAG while(status==0) //等待A/D转换结束, 即ADC_FLAG=1 status=ADC_CONTR&0x10; } ADC_CONTR&=0xE7; //将ADC_FLAG清零 adc_dat=ADC_RES; //保存A/D转换结果,高8位 ADC_START: 置 “1”时, 开始转换, 转换结束后为0。 位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 ADC_ POWER SPEED1 SPEED0 FLAG START CHS2 CHS1 CHS0

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

51 [例9-2] ADC通道2采集电压, 10位精度, 结果存30H, 31H
位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 ADC_ POWER SPEED1 SPEED0 FLAG START CHS2 CHS1 CHS0 [例9-2] ADC通道2采集电压, 10位精度, 结果存30H, 31H C语言程序代码如下: #include “stc15.h” //包含STC15F单片机寄存器定义文件 unsigned char data adc_hi _at_ 0x31; //A/D转换结果变量高8位 unsigned char data adc_low _at_ 0x30; //A/D转换结果变量低2位 void main(void) { unsigned long i; //i用于for循环 ADC_CONTR |=0x80; //开A/D转换电源 for (i=0;i<10000;i++); //适当延时 P1ASF=0x04; //设置P1.2的模拟量功能 ADC_CONTR=0xC2; //选择P1.2作为A/D转换通道 for (i=0;i<10000;i++); //适当延时 ADC_CONTR |=0x08; //启动 A/D 转换 EADC=1; //EADC=1, 开放ADC的中断控制位 EA=1; //开放CPU总中断 while(1); //循环等待ADC中断 } 转换周期: 180个时钟 位号 D7 D6 D5 D4 D3 D2 D1 D0 P1ASF P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF

52 [例9-2] ADC通道2采集电压, 10位精度, 结果存30H, 31H
void ADC_ISR (void) interrupt 5 // ADC中断函数 { ADC_CONTR &=0xE7; //将ADC_FLAG清0 adc_hi=ADC_RES; //保存A/D转换结果高8位 adc_low=ADC_RESL&0x03; //保存A/D转换结果低2位 ADC_CONTR |=0x08; //重新启动A/D转换 } ADC_START: 置 “1”时, 开始转换, 转换结束后为0。 位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 ADC_ POWER SPEED1 SPEED0 FLAG START CHS2 CHS1 CHS0

53 [例9-3] 【例9-3】 利用IAP15W4K58S4单片机的ADC2对外接 可控精密稳压源器件TL431(可以作为参考电压源 器件)的输出进行转换,将转换后的电压值在数码 LED上显示(LED驱动电路参考第8章[例8-7] )。 (请同学们自行实验,程序参考第8章[例8-7] )

54 [例8-7]编程实现在学习平台的数码LED上显示"01234567"
硬件连接如图所示 SI SI 9 QH’ 图8-36 数码LED显示电路原理图

55 [例9-3]用ADC2对TL431输出进行转换后电压值在数码LED上显示。
#include "stc15.h“ //包含IAP15W4K58S4寄存器定义文件 #include <intrins.h> //_nop_()函数在此库文件中 unsigned char code t_display[]={ //标准字模库 //0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0 x77,0x7C,0x39,0x5E,0x79,0x71, //black,-,H,J,K,L,N,o,P,U,t,G,Q,r,M,y 0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x 78,0x3d,0x67,0x50,0x37,0x6e, //0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,-1 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF, 0x46}; unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码

56 [例9-3]用ADC2对TL431输出进行转换后电压值在数码LED上显示。
sbit HC595_RCK = P5^4; //74HC595的12脚控制(存储或锁存时钟) unsigned char display_index; //显示位索引(指示8个LED管的其一显示) unsigned char LED8[8]; //显示缓冲 void Timer0Init(void); void Send_595(unsigned char spidata); void DisplayScan(void); #define DIS_DOT x20 //’0.’ 字模0xBF在字模库中的序号 #define DIS_BLACK 0x10 //全黑消隐不显示字模0x00在字模库中序号 #define DIS_ x11 //’-’字符字模0x40在字模库中的序号 unsigned int msecond; unsigned int Get_ADC10bitResult(void); void main(void) { unsigned char i; unsigned int adc_data; unsigned char volt0,volt1,volt2; display_index=0; LED8的值是t_display字模库序号值

57 [例9-3]用ADC2对TL431输出进行转换后电压值在数码LED上显示。
位号 D7 D6 D5 D4 D3 D2 D1 D0 P1ASF P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF [例9-3]用ADC2对TL431输出进行转换后电压值在数码LED上显示。 // main( ) 函数[续上页] Timer0Init(); //T0初始化 msecond=0; // ADC初始化 P1ASF = 4; //P1.2做ADC P1M1 |= 0x40; //P1.2设置成高阻, 应该为0x04 P1M0 &= ~0x40; //P1.2设置成高阻, 应该为0x04 ADC_CONTR = 0xc2; //180T, 给ADC上电 // 初始化SPI AUXR1=0x08; //将SPI切换到[P5.4,P4.0,P4.1,P4.3] SPCTL=0xde; SPSTAT=0xc0; ET0=1; //开T0中断 EA=1; //开总中断 for(i=0; i<8; i++) LED8[i] = 0x10; //上电消隐DIS_BLACK

58 [例9-3]用ADC2对TL431输出进行转换后电压值在数码LED上显示。
// main( ) 函数内容[续上页] while(1) {if(msecond >= 500) //500ms到,每隔500ms读一次转换结果 {msecond = 0; Get_ADC10bitResult(); //先读一次并丢弃结果, 让采样电压等于输入值 adc_data = Get_ADC10bitResult(); //读外部基准TL431对应ADC adc_data*=5; //在此假设电源电压是5V //如果显示结果不是2.50, 则说明电源电压有偏差 volt0=(unsigned char)(adc_data/1024); //商是显示整数电压值 volt1=(unsigned char)((adc_data-volt0*1024)/100); //十分位小数点 volt2=(unsigned char)((adc_data-volt0*1024-volt1*100+5)/10); //百分位小数点 LED8[5] = volt0 + DIS_DOT; //显示整数电压值+小数点 LED8[6] = volt1; //显示小数点后十分位电压值 LED8[7] = volt2; //显示小数点后百分位电压值 } // [续上页] DIS_DOT=20H (是’0.’ 字模0xBF在字模库中的序号值) + n 是’n.’字模的序号值

59 [例9-3]用ADC2对TL431输出进行转换后电压值在数码LED上显示。
unsigned int Get_ADC10bitResult(void) { ADC_RES = 0; ADC_RESL = 0; ADC_CONTR |= 0x88; //start the ADC _nop_(); while((ADC_CONTR & 0x10) == 0); //等待ADC转换完 ADC_CONTR &= ~0x18; //清除ADC结束标志 return (((unsigned int)ADC_RES << 2) | (ADC_RESL & 3)); }

60 [例9-3]用ADC2对TL431输出进行转换后电压值在数码LED上显示。
// 显示数据发送 void Send_595 (unsigned char spidata) { unsigned char spi_status=0; SPDAT=spidata; while(spi_status==0) //等传输完毕 spi_status=SPSTAT; spi_status=spi_status&0x80; } SPSTAT=0xc0; //写1清SPIF标志位

61 [例9-3]用ADC2对TL431输出进行转换后电压值在数码LED上显示。
// 显示扫描函数 void DisplayScan(void) { Send_595(~T_COM[display_index]); //输出位码 Send_595(t_display[LED8[display_index]]); //输出段码 HC595_RCK = 1; HC595_RCK = 0; //锁存输出数据 display_index++; if(display_index >= 8) display_index = 0; //8位结束回0 }

62 [例9-3]用ADC2对TL431输出进行转换后电压值在数码LED上显示。
void Timer0Init(void) { AUXR |= 0x80; //T0工作于1T模式 TMOD &= 0xF0; //设置T0模式0 TL0 = 0xcd; //设置定时初值 TH0 = 0xd4; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //T0开始计时 } // Timer0 1ms中断函数 void T0_ISR (void) interrupt T0_VECTOR { DisplayScan(); //1ms扫描显示一位 msecond++;

63 改变持续至少bbbbbb个时钟 , 判为电平改变
§9.2.2 IAP15W4K58S4的比较器模块及其使用 1、IAP15W4K58S4单片机集成的比较器简介 IAP15W4K58S4单片机集成了1路比较器, 可用于系统的 掉电检测等功能。其内部结构图如图9-6所示。 ENLCCTL(ENABLE Level-Change Control) 改变持续至少bbbbbb个时钟 , 判为电平改变 ADCIN /CMPO CMPRES 内部BandGap参考电压BGV(约1.27V) (内部带隙电压基准) 图9-6 IAP15W4K58S4内部集成的比较器结构图

64 §9.2.2 IAP15W4K58S4的比较器模块及其使用 2、与比较器相关的特殊功能寄存器 (1)比较器控制寄存器1:CMPCR1
表9-4 与比较器模块有关的特殊功能寄存器 寄存器 地址 D7 D6 D5 D4 D3 D2 D1 D0 复位值 CMPCR1 E6H CMPEN CMPIF PIE NIE PIS NIS CMPOE CMPRES B CMPCR2 E7H INVCMPO DISFLT LCDTY[5:0] B (1)比较器控制寄存器1:CMPCR1 1)CMPEN:比较器模块使能位 CMPEN=1,使能比较器模块; CMPEN=0,禁用比较器模块, 比较器的电源关闭。

65 (1)比较器控制寄存器1: CMPCR1 寄存器 地址 D7 D6 D5 D4 D3 D2 D1 D0 E6H CMPEN CMPIF
复位值 CMPCR1 E6H CMPEN CMPIF PIE NIE PIS NIS CMPOE CMPRES B 2)CMPIF:比较器中断标志位  在 CMPEN为1的情况下:  当比较器的比较结果由LOW变成HIGH时, 若是PIE被设置成1, 那 么内建的某一个叫做CMPIF_p的寄存器会被设置成1; 当比较器的比较结果由HIGH变成LOW时, 若是NIE被设置成1, 那 么内建的某一个叫做CMPIF_n的寄存器会被设置成1; 当CPU去读取CMPIF的数值时, 会读到 (CMPIF_p || CMPIF_n); 当CPU对CMPIF写0后, CMPIF_p以及CMPIF_n都会被清除为0。  而中断产生的条件是[ (EA==1) && (((PIE==1)&&(CMPIF_p==1)) || ((NIE==1)&&(CMPIF_n==1))) ], CPU接受中断后, 并不会自动清 除CMPIF标志, 用户必须用软件写 “0” 清除。

66 PIE = 1: 使能比较器由LOW变HIGH的事件, 设定 CMPIF_p/产生中断;
(1)比较器控制寄存器1: CMPCR1 寄存器 地址 D7 D6 D5 D4 D3 D2 D1 D0 复位值 CMPCR1 E6H CMPEN CMPIF PIE NIE PIS NIS CMPOE CMPRES B 3)PIE:比较器上升沿中断使能位 PIE = 1: 使能比较器由LOW变HIGH的事件, 设定 CMPIF_p/产生中断; PIE = 0: 禁用比较器由LOW变HIGH的事件。 4)NIE:比较器下降沿中断使能位 NIE = 1: 使能比较器由HIGH变LOW的事件,设定 CMPIF_n/产生中断; NIE = 0: 禁用比较器由HIGH变LOW的事件。

67 PIS = 1,选择ADCIS _CONTR[2:0]所选择到的ADCIN 做为比较器的正极输入源;
(1)比较器控制寄存器1: CMPCR1 寄存器 地址 D7 D6 D5 D4 D3 D2 D1 D0 复位值 CMPCR1 E6H CMPEN CMPIF PIE NIE PIS NIS CMPOE CMPRES B 5)PIS:比较器正极选择位 PIS = 1,选择ADCIS _CONTR[2:0]所选择到的ADCIN 做为比较器的正极输入源; PIS = 0,选择外部P5.5为比较器的正极输入源。 6)NIS:比较器负极选择位 NIS = 1,选择外部管脚P5.4为比较器的负极输入源; NIS = 0,选择内部BandGap电压BGV为比较器的负极 输入源。

68 ENABLE Level-Change Control
(1)比较器控制寄存器1: CMPCR1 寄存器 地址 D7 D6 D5 D4 D3 D2 D1 D0 复位值 CMPCR1 E6H CMPEN CMPIF PIE NIE PIS NIS CMPOE CMPRES B 7) CMPOE:比较结果输出控制位 CMPOE = 1,使能比较器的比较结果输出到P1.2; CMPOE = 0,禁止比较器的比较结果输出。 8) CMPRES: 比较器比较结果标志位 CMPRES = 1,CMP+的电平高于CMP-的电平(或内部 BandGap参考电压的电平); CMPRES = 0,CMP+的电平低于CMP-的电平(或内部 BandGap参考电压的电平)。 此位 “只读(read-only)” 此位 “只读(read-only)”; 软件对它做写入的动作没有任何意义。 软件所读到的结果 是“经过ENLCCTL控制后的结果”, 而非模拟 比较器的直接输出结果。 ENABLE Level-Change Control

69 INVCMPO = 1: 比较器取反后再输出到P1.2;
(2)比较器控制寄存器2: CMPCR2 寄存器 地址 D7 D6 D5 D4 D3 D2 D1 D0 复位值 CMPCR2 E7H INVCMPO DISFLT LCDTY[5:0] B 1)INVCMPO:比较器输出取反控制位 INVCMPO = 1: 比较器取反后再输出到P1.2; INVCMPO =0: 比较器正常输出。比较器的输出采用 “经过ENLCCTL控制后的结果”, 而非模拟比较器的直接 输出结果。 2)DISFLT:去除比较器输出的 0.1μS滤波器 DISFLT = 1,关掉比较器输出的0.1μS滤波器(可以让比 较器速度有少许提升);  DISFLT = 0,比较器的输出有0.1μS滤波器。

70 Level-Change control 的filter 长度(Duty)选择
(2)比较器控制寄存器2: CMPCR2 寄存器 地址 D7 D6 D5 D4 D3 D2 D1 D0 复位值 CMPCR2 E7H INVCMPO DISFLT LCDTY[5:0] B 3) LCDTY[5:0]:比较器输出去抖动滤波器时间长度 (bbbbbb为长度选择) 当比较器由LOW变HIGH, 须侦测到该HIGH持续至少 bbbbbb个时钟, 才认定比较器输出是由LOW转成HIGH; 若在bbbbbb个时钟内, 模拟比较器输出又回到LOW, 则 认为什么都没发生, 视同比较器输出一直维持在LOW。  当比较器由HIGH变LOW, 须侦测到该LOW持续至少 bbbbbb个时钟, 才认定比较器输出是由HIGH转成LOW; 若在bbbbbb个时钟内, 模拟比较器输出又回到HIGH, 则 认为什么都没发生, 视同比较器输出一直维持在HIGH。 Level-Change control 的filter 长度(Duty)选择

71 (2)比较器控制寄存器2: CMPCR2 CMPRES CMPRES
若LCDTY[5:0]设定成 , 代表不用比较器输出去抖动滤波器。 比较器输出去抖动滤波器的作用如图9-7所示。 Analog 比较器读输出 CMPRES 用以产生Interrupt以及 输出到GPIO的信号 (After LCCTL Analog 比较器读输出 用以产生Interrupt以及 输出到GPIO的信号 (After LCCTL CMPRES 图9-7 比较器输出去抖动滤波器的作用

72 #define CMPEN 0x80 //CMPCR1.7 : 比较器模块使能位
3、比较器的使用 【例9-4】比较器的使用。(自行验证) #include "stc15.h" #define CMPEN 0x //CMPCR1.7 : 比较器模块使能位 #define CMPIF 0x //CMPCR1.6 : 比较器中断标志位 #define PIE 0x //CMPCR1.5 : 比较器上升沿中断使能位 #define NIE 0x //CMPCR1.4 : 比较器下降沿中断使能位 #define PIS 0x //CMPCR1.3 : 比较器正极选择位 #define NIS 0x //CMPCR1.2 : 比较器负极选择位 #define CMPOE 0x02 //CMPCR1.1 : 比较结果输出控制位 #define CMPRES 0x01 //CMPCR1.0 : 比较器比较结果标志位 #define INVCMPO 0x80 //CMPCR2.7 : 比较结果反向输出控制位 #define DISFLT 0x40 //CMPCR2.6 : 比较器输出端虑波使能控制位 #define LCDTY 0x3F //CMPCR2.[5:0] : 比较器输出的去抖时间控制 sbit LED = P2^7; //测试脚 void CMP_ISR(void) interrupt 21 //比较器中断向量入口 { CMPCR1 &= ~CMPIF; //清除完成标志 LED = !(CMPCR1 & CMPRES); //将比较器结果CMPRES输出到 测试口显示 } void main(void) CMPCR1 = 0; //初始化比较器控制寄存器1 CMPCR2 = 0; //初始化比较器控制寄存器2 CMPCR1 &= ~PIS; //选择外部管脚P5.5(CMP+)为比较器的正 极输入源 // CMPCR1 |= PIS; //选择ADCIS[2:0]所选的ADCIN为比较器的正 极输入源 CMPCR1 &= ~NIS; //选择内部BandGap电压BGV为比较器的负 极输入源 // CMPCR1 |= NIS; //选择外部管脚P5.4(CMP-)为比较器的负 极输入源 CMPCR1 &= ~CMPOE; //禁用比较器的比较结果输出 // CMPCR1 |= CMPOE; //使能比较器的比较结果输出到P1.2 CMPCR2 &= ~INVCMPO; //比较器的比较结果正常输出到P1.2 // CMPCR2 |= INVCMPO; //比较器的比较结果取反后输出到 P1.2 CMPCR2 &= ~DISFLT; //不禁用(使能)比较器输出端的0.1uS虑 波电路 // CMPCR2 |= DISFLT; //禁用比较器输出端的0.1uS虑波电路 CMPCR2 &= ~LCDTY; //比较器结果不去抖动,直接输出 // CMPCR2 |= (DISFLT & 0x10); //比较器结果在经过16个时钟后再 输出 CMPCR1 |= PIE; //使能比较器的上升沿中断 // CMPCR1 |= NIE; //使能比较器的下降沿中断 CMPCR1 |= CMPEN; //使能比较器 EA = 1; while (1);

73 void CMP_ISR(void) interrupt 21 //比较器中断向量入口 {
3、比较器的使用 【例9-4】比较器的使用。(自行验证) void CMP_ISR(void) interrupt 21 //比较器中断向量入口 { CMPCR1 &= ~CMPIF; //清除完成标志 LED = !(CMPCR1 & CMPRES); //将比较器结果CMPRES输 出到测试口显示 } void main(void) CMPCR1 = 0; //初始化比较器控制寄存器1 CMPCR2 = 0; //初始化比较器控制寄存器2 CMPCR1 &= ~PIS; //选择外部管脚P5.5(CMP+)为比较器的正极输入源 // CMPCR1 |= PIS; //用ADCIS_CONTRL[2:0]所选的ADCIN为 比较器的正极输入源 CMPCR1 &= ~NIS; //用内部BandGap电压BGV为比较器的负极输入源 // CMPCR1 |= NIS; //选择外部管脚P5.4(CMP-)为比较器的负极输入源 CMPCR1 &= ~CMPOE; //禁用比较器的比较结果输出 // CMPCR1 |= CMPOE; //使能比较器的比较结果输出到P1.2 CMPCR2 &= ~INVCMPO; //比较器的比较结果正常输出到 P1.2 // CMPCR2 |= INVCMPO; //比较器的比较结果取反后输出到 P1.2 CMPCR2 &= ~DISFLT; //不禁用(使能)比较器输出端的0.1uS 虑波电路 // CMPCR2 |= DISFLT; //禁用比较器输出端的0.1uS虑波电路 CMPCR2 &= ~LCDTY; //比较器结果不去抖动,直接输出 // CMPCR2 |= (DISFLT & 0x10); //比较器结果在经过16个时钟后 再输出 CMPCR1 |= PIE; //使能比较器的上升沿中断 // CMPCR1 |= NIE; //使能比较器的下降沿中断 CMPCR1 |= CMPEN; //使能比较器 EA = 1; while (1);

74 CMPCR1 &= ~CMPOE; //禁用比较器的比较结果输出
3、比较器的使用 【例9-4】比较器的使用。(自行验证) CMPCR1 &= ~CMPOE; //禁用比较器的比较结果输出 // CMPCR1 |= CMPOE; //使能比较器的比较结果输出到P1.2 CMPCR2 &= ~INVCMPO; //比较器的比较结果正常输出到P1.2 // CMPCR2 |= INVCMPO; //比较器的比较结果取反后输出到P1.2 CMPCR2 &= ~DISFLT; //不禁用(使能)比较器输出端的0.1uS虑波电路 // CMPCR2 |= DISFLT; //禁用比较器输出端的0.1uS虑波电路 CMPCR2 &= ~LCDTY; //比较器结果不去抖动, 直接输出 // CMPCR2 |= (DISFLT & 0x10); //比较器结果在经过16个时钟后再输出 CMPCR1 |= PIE; //使能比较器的上升沿中断 // CMPCR1 |= NIE; //使能比较器的下降沿中断 CMPCR1 |= CMPEN; //使能比较器 EA = 1; while (1); }

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

76 ECL (Emitter Coupled Logic发射极耦合逻辑电路)
9.3.1 数模转换器的工作原理及性能指标 1、数模转换器的分类 根据解码网络结构不同,D/A转换器可分为T型、倒T 型、权电阻和权电流等类型。 根据模拟电子开关种类不同, D/A转换器可分为CMOS 型和双极型。双极型又分为电流开关型和ECL电流开 关型。 ECL (Emitter Coupled Logic发射极耦合逻辑电路) D/A转换器选择 转换速度要求不高时, 可选CMOS开关型D/A转换器; 若对速度要求较高, 则应选双极型电流开关D/A转换 器或转换速度更高的ECL电流开关型D/A转换器。

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

78 8位权电阻D/A转换器的原理框图如图所示。
Di=0时, Si向上合,接地; Di=1时, Si向下合,接VB电源。 ( i=0, 1, …,7 ) S7 8位 权 电 阻 D/A 转 换 器 的 原 理 图 S6 S5 S4 S3 S2 S1 图9-8 权电阻型D/A转换器 S0

79 权电阻D/A转换器的简化电路 ai=Di a7 a6 a5 a4 a3 当R=2Rf时, a2 a1 a0
D7•VB a7 a6 a5 a4 a3 a2 a1 a0 Di=0时, Si接地。Di=1时, Si接VB电源 (i=0, 1,…,7), 或用Vi=D(7-i)•VB表示: D6•VB 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。 D5•VB D4•VB D3•VB 当R=2Rf时, D2•VB D1•VB D0•VB 图9-9 权电阻D/A转换器简化电路 VB是电源电压

80 3、D/A转换器的性能指标 (1)分辨率 (2)稳定时间 (3)转换精度
转换精度是转换后所得的实际值对于理想值的接近程度。

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

82 9.3.2 12位D/A转换器TLV5616及其接口技术 1、TLV5616简介
TLV5616是一个带有灵活的4线串行接口的12位电压 输出数/模转换器(DAC)。 4线串行接口可以与SPI、QSPI和Microwire串行口接 口。TLV5616可以用一个包括4个控制位和12个数据 位的16位串行字符串来编程 TLV5616采用CMOS工艺, 设计成2.7V至5.5V单电源 工作。 UART串口工作于方式0 D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 X SPD PWR DAC新值

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

84 1、TLV5616简介 各引脚功能介绍如下: VDD: 正电源 OUT: DAC模拟电压输出 REFIN: 基准模拟电压输入
AGND: 模拟地 DIN:串行数字数据输入 SCLK:串行数字时钟输入 :芯片选择,低有效 FS:帧同步, 数字输入, 用于4线串行接口。 图9-10 TLV5616引脚图

85 2、TLV5616 内部结构 如图所示。 16位数据已传送后或当FS升高时, 移位寄存器中内容被移到DAC锁存器, 它将输出电压更新为新的电平。 DAC锁存器 SPD: 速度控制位 ; PWR: 功率控制位 ; 掉电方式时, 所有放大器被禁止 图9-11 TLV5616的内部结构

86 16位已传送后或当FS升高时, 移位寄存器中内容被移到DAC锁存器, 它将输出电压更新为新的电平。
3、数据传输时序图 图9-12 TLC5616的数据传输时序图 16位已传送后或当FS升高时, 移位寄存器中内容被移到DAC锁存器, 它将输出电压更新为新的电平。 在SCLK下降沿, 数据一位接一位传入移位寄存器。 首先器件必须使能 /CS。 然后在FS的下降沿启动数据的移位,

87 4、数据格式 TLV5616的16位数据字包括两部分: 控制位: D15-D12 DAC新值: D11-D0 D15 D14 D13 D12
X SPD PWR DAC新值 X: 任意值 SPD: 速度控制位 ; 1→快速方式 , 0→慢速方式 PWR: 功率电源控制位 ; 1→掉电方式 , 0→正常工作 注: 在掉电方式时, TLV5616中所有放大器都被禁止。

88 9.3.2 12位D/A转换器TLV5616及其接口技术 5、TLV5616与单片机的接口电路及应用编程
TLV5616与单片机的接口连接相对简单, 注意应在VDD 和AGND之间应当连接一个0.1μF的陶瓷旁路电容,且应 当用短引线安装在尽可能靠近器件的地。 使用缺铁氧体磁环(ferrite beads)可以进一步隔离系 统模拟电源与数字电源。 抑制电磁干扰 铁氧体磁环 去掉塑料线皮 USB接口线末端 夹子型式铁氧体磁环

89 5、TLV5616与单片机的接口电路及应用编程 【例9-5】用IAP15W4K58S4控制TLV5616输出正弦波。

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

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

92 [例9-5]用IAP15W4K58S4控制TLV5616输出正弦波
汇编语言程序代码如下: ROLL_PTR EQU 30H ;定义循环计数器单元30H ORG 0000H LJMP START ORG 000BH LJMP T0_SER ORG 0100H START: MOV SP, #0F60H ; 堆栈区不用特殊功能寄存器区 MOV DPTR, # SINEVALS ;设置数据常数表格首地址 CLR A MOV SCON, A ;设置串口1工作模式0(同步移位器输出) MOV TMOD, #00H ;设置定时器0工作方式2 ROLL_PTR记录输出到DAC的一个正弦波波形数据(32字, 64字节)的字节偏移地址。 ROLL_PTR存储单元内的值就是输出到DAC的字节数个数 - 1。

93 [例9-5]用IAP15W4K58S4控制TLV5616输出正弦波
MOV TH0, #0EEH 12T MOV TL0, #00H SETB T1 ;置FS=1, P3.5 SETB T0 ;置/CS=1, P3.4 SETB ET0 ;允许定时器0中断 SETB EA ;允许CPU中断 MOV ROLL_PTR, A ;循环计数器清“0” SETB TR0 ;启动定时器0 SJMP $ ;等待中断发生 头文件有定义: P3 DATA 0B0H ;P3口寄存器 T1 BIT 0B5H ;计数器1外输入端P3.5 T0 BIT 0B4H ;计数器0外输入端P3.4 还没传输数据到DAC转换 ROLL_PTR存储单元(地址30H)内记录着输出到DAC的一个正弦波波形数据(32字, 64字节)的字节偏移地址。

94 [例9-5]用IAP15W4K58S4控制TLV5616输出正弦波
ROLL_PTR存着正弦波数据的偏移地址或本次中断时输出到DAC的一个正弦波数据(字)的偏移地址(上次中断结束时更新)。 ;定时器0中断服务程序 T0_SER: PUSH PSW PUSH ACC CLR T0 ;将/CS置为低电平 CLR T1 ;将FS置为低电平 MOV A, ROLL_PTR ;将循环计数值装入累加器A MOVC ;从数据表格中读高位字节 ORL A, #00H ;设置数据控制位(这里选择慢速正常非掉电方式) MOV SBUF, A ;送出高位字节 JNB TI, $ ;等待高位传输结束 CLR TI MOV A, ROLL_PTR ;将循环计数值装入累加器A INC A ;拟指向正弦波数据(字)的低位字节地址 MOVC ;读取低位字节 MOV SBUF, A ;送出低位字节 启动数据传输过程 若设置高速ORL A, #40H

95 [例9-5]用IAP15W4K58S4控制TLV5616输出正弦波
JNB TI, $ ;等待低位传输结束 CLR TI SETB T ;置FS=1,将输出电压更新为新的电平 MOV A, ROLL_PTR ;获取当前数据样本地址 INC A ;修正计数, 以得到下一个数据样本 INC A ; 一个数据样本有2个字节 ANL A, #03FH ;若超出64字节范围, 则重新赋值为0 MOV ROLL_PTR, A SETB T ;置/CS=1, 停止输出DAC POP ACC POP PSW RETI ; 中断返回到主程序等待 03EH+2=40H B B B

96 [例9-5]用IAP15W4K58S4控制TLV5616输出正弦波
;正弦常数表格 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


Download ppt "第9章 模数转换器与数模转换器."

Similar presentations


Ads by Google