当前课程知识点:ARM微控制器与嵌入式系统 > 第五章 ARM微控制器的各种外设 > 5.8.2 ARM微控制器外设:ADC基础 > 5.8.2 ARM微控制器外设:ADC基础
各位同学大家好
我是清华大学工程物理系的曾鸣老师
欢迎大家继续回到我们的MOOC课堂
进行我们的ARM微控制器与嵌入式系统之旅
那么在这个单元里呢
我们继续进行ADC的学习
在上一个单元的学习里
我相信大家都建立了这样一种概念
ADC和DAC为代表的Data Converter
是我们嵌入式计算机系统
连接物理世界的桥梁
那么ADC的世界博大精深又丰富多彩
大家对这样一张图留下了印象
从不同的速度到不同的精度
我们有很多很多种ADC的选择
而我想说的是ADC的精彩
不仅仅在于它有很多种
而在于每一种ADC的背后
是过去几十年里人类智慧的结晶
用各种各样的巧妙方法
来设计出各种各样结构
很精妙像艺术一样的电子学
来实现高精度的物理量的测量
那么我们在微控制器里头上节课已经讲过
主要都是SA型的ADC
那么SA型的ADC
也就是说每当我们用它来对一个物理的量
一个模拟电压值进行采集的时候
微控制器在以非常快的速度
进行猜数字的游戏
猜的次数越多
获得的比特数越多
然后拿到了一个0和1的序列
给我们的微控制器
给我们C语言程序算法来进行使用
所以在我们的微控制器里头
一般来讲都会有一个模块
是ADC而且是用SA工艺实现的
往往它的精度在8到12个比特之间
而且为了设计和使用的方便
我们当代的微控制器
往往不仅带ADC
而且这个ADC往往是多通道的
可能会有多个ADC模块在微控制器片内
而每个模块又会在前头
接着多个输入引脚的Channel
可以对多个物理量
进行交替的轮次的测量和量化
那么我们在这节课里
再来学习一下更加通常意义上
我们的微控制器
我们的ARM微控制器里头
ADC是怎样的
以及ADC的一些基本概念
那么通过刚才的语言描述
我们已经隐隐约约建立了一些初步的概念
我们拎出来看一看
无论是DAC从数字变成一个模拟电压值
还是ADC从一个输入的模拟电压值
变成我们微控制器可以处理的
0和1序列的数字值
那么它都会有这样一些共同的概念
比如说我们的数字量可能是N个比特
就是N比特的DAC或者N比特的ADC
那么大家可以想如果这个N是8
比如说我们有个8比特的ADC
就意味着我们对于输入的电压值
能够转换成从0000八个0
到1111八个1的之间的二进制数
也就是16进制的00到FF
就意味着我们对于输入的电压值
实现了二百五十六分之一
这样一个精度的分辨和测量
那么对于输入或者输出的模拟电压值呢
跟这样一个数据从00到FF的
动态范围相对应的
也有一个模拟的range
或者叫span
就我们所说的动态范围
所以一个ADC工作的时候
我们其实会给它设定
不同的输入电压的动态范围
如果我们测量的物理量
传感器的输出电压范围
超过这样ADC的范围怎么办呢
我们要通过模拟电路的设计
把它调整到ADC适宜的范围内进行测量
那么这是模拟电路
此外还有很重要的参考量
就是无论是ADC系统还是DAC系统
我们涉及到跟模拟的电压值打交道的时候
量这个电压值用一把尺子量
这个尺子一定要有一个准确的刻度
那么在ADC和DAC里都会有一个参考电压
那么这个参考电压得很准
大家想想是不是
如果我们希望对一个电压
以千分之一的精度进行量化
那么我们就应该把它不停地
跟一些参考电压比
而这个基准的参考电压
无论是哪个值
它一定也要有不低于这个千分之一的精度
这个测量结果才有意义
所以说我们拿着一把尺子的时候
我们要测一个毫米
这个尺子上的刻度可能有大有小
略有误差
但这个误差应该远小于一个毫米
我们这把尺子才是准的
否则测出来的结果我们就会认为有问题
或者需要校正
那么另外一个概念
就是有了这么一个N比特的ADC、DAC的概念
我们再来回过头来看我们微控制器的
电子学系统
你会发现
除了我们熟悉的通讯
除了我们做简单IO时序中断
我们更多更多的应用
是要跟物理世界发生关联
我们可能会有一个传感器把信号变成电信号
我们通过一个N比特的ADC
把它变成0和1的序列
以一定量的时间间隔采集进来
给我们的微处理器
或者我们数字信号处理
然后把我们处理的结果
又通过一个N比特的DAC变成模拟电压值
反馈给物理世界
当然我们可能会有效应期
把这样一个模拟的电压值
变成一个加热的功率
电机的转速
舵机旋转的角度等等这样一些控制量
大家想想是不是这么一个道理
所以大家会发现一个微控制器
仅仅靠通讯和数字手段
能做的事情还是有限
有了ADC 有了DAC
我们才能在一定的精度上
一定的速度上
来与物理世界的物理量发生关联
也就是ADC和DAC很大程度上
可能决定了我们的嵌入式系统的
能力 准确度 精度等等
那么小结一下
如果我们要用起一个ADC来
我们肯定会去琢磨一下它有多少位
也就是它的resolution分辨率是多少
那么N比特的ADC
我们就说它的分辨率
resolution是2的N次方
所以8比特就意味着
我们对于一个物理量
单就ADC这个部分而言
我们的分辨能力好于1%
另外一个就是它的速度
我们的ADC能在怎样的
速度的时钟驱动下
来进行模拟电压值到数据量的转化
是一秒钟能完成一次
是一赫兹
还是一秒钟能完成一百万次
是一兆赫兹
这是有差异的对吧
比如我们的声音信号
人说话的声音从几十赫兹到两万赫兹不等
所以如果我们一秒钟才采样一次
你采到那一些电压伏值
是无法有效重建出
一个人说话或者唱歌的声音来的
那么你需要一定的速度
那么第三个就刚才提到这个动态范围
我们一个ADC是对0到5伏内的电压
能够进行量化
还是对0到3.3伏范围内的电压进行量化
这是ADC在设计
或者我们在电路设计中决定的
那么我们模拟电路要帮助我们
把不同的传感器放大调整到合适的范围
给ADC来使用
并且尽可能保持它的信噪比
那么最后呢
还会有通道的概念
那么我们一个微控制器
可能有不同的ADC模块
每个ADC模块可能有多个通道
我们会对不同通道上的信号加以转换
那么多说一点拔高的内容呢
还会有一些
比如说ADC不是理想的
我们可能要较准
即使一个ADC的每一个输出值
和每个输入电压值
严格地遵循线性
但是它也许在很多时候
不像我们想象的从00这个数字值
一直到FFF的这个数字值
跟我们的电压范围的
0伏、5伏这个动态范围一一对应
有可能输入电压的时候
我们拿到的数据量已经有了一个最小值
也许我们的电压到了最大动态范围的时候
我们得到的数字量仍然不是FFF
于是我们需要用至少两个点
在这样一个数字与模拟电压的对应关系里
进行线性的一个校准
那么当然如果我们更精密地
去考虑一个ADC的性能
还会涉及到这根线是否直
在什么程度上弯
最大弯多少
那会涉及到ADC的
积分非线性和微分非线性等等
那么一个测量系统比如测一个温度
测一个物理量
它能够实现的精度
又远远不止是取决于ADC的
这有多少个比特这个精度
还取决于我们传感器自身固有的分辨能力
我们的模拟电路的放大电路的信噪比
那么这一系列因素的约束
我们可能在一个ADC的采样系统里
会讨论它的真正的有效位是多少位
包括我们提到的参考电压
也是一门高深的学问
大家如果拿着一个尺子去量东西
比如我要测一个电压测到1%
那么用来给ADC这个参考电压
不管是5伏还是3.3伏
它如果在比一个1%精度更差的程度上
自己在波动
是不是意味着我们用来量东西这把尺子
就不停的在晃
它就不准
所以我们要的测量精度越高
我们需要的参考电压源也就越好
所以高精度的到十几比特
乃至二十几比特的参考电压源设计
绝对是一个模拟电路的挑战
比如有这么一本特别经典的书
就专门讨论各种电压电流的参考源
那么限于本门课程的范畴呢
我们只是简单地介绍了ADC
这样一个有意思的世界的全貌
和我们怎么把它用起来
而如果大家有志于设计特别棒
特别牛的电子产品
有志于设计真正的高科技的
高精度的相关电子学系统
那么一定要深入学习
传感器模拟电路的相关知识
特别是在数字领域学习信号与系统的知识
那么信号与系统的知识
是一门专门的课程
在我们这门课里给大家简单提一提的
一个一定不能错过的基本概念
就是奈奎斯特采样定理
也就是当我们采样一个固有频率最大频率
是比如说fa的一个信号的时候
我们至少要使用
是这个频率两倍的采样系统来进行采集
才能做到信号的不失真
那么这是奈奎斯特采样定理告诉我们的结论
相关的推导和原理
大家可以在信号与系统里加以学习
那么这样一个原理决定了我们为什么
听音乐的时候所谓的高保真音乐
一般是40K赫兹或者是44K赫兹 比如CD
因为我们人类发音的
声音的主要信号频率波段
在几百赫兹到两万赫兹这个范围内
所以两万赫兹再高一倍
根据奈奎斯特采样定理
对于人发出来的声音
不管是唱歌还是说话 做到不失真
或者叫我们人的耳朵
能够听到的声音范围内做到不失真
40K赫兹就够了
那就是4万赫兹 对吧
跟奈奎斯特采样定理相关的
另外一个知识呢是抗混叠
如果我们采集的这个系统里头
有信号比我们采样率频率的一半还要高
就会出现一个很有意思的混叠现象
混叠现象用电子学知识
可能用信号与系统大家很难理解
我只举两个例子
比如说我们在计算机上
特别高分辨率的字体
切换到了低分辨率显示的时候
会发现会有奇怪的模糊
这个时候是一种空间上的混叠
那么从视觉空间上的混叠一个更
大家有体验的现象
就是大家如果盯着那个自行车的轮子看
当自行车骑得非常快的时候
会有一些瞬间
你觉得这个轮子的辐条不是在向前转
而是变成了向后转
这就是一种视觉上的混叠
所以说举这些例子是告诉大家
ADC采样实际上是进入了信号的领域
如何让一个数字采样系统
对信号能够充分还原不失真
大家其实还要学的知识有很多很多
那么在我们学习这样一个ARM微控制器里头
抛开这些很高深的知识
现在学不完的知识
说老师我们还是先把它用起来吧
模拟部分
ADC、DAC有哪些呢
大家看看这张图
左下角这个咖啡色的
就都是模拟器件
ARM的微控制器特别是Freescale NXP的微控制器
我们用的这个系列
有个非常厉害的一点
就是它有非常好的数模集成
一个数字的微控制芯片里
集成了非常棒的模拟器件
它有16比特的ADC也有12比特的DAC
还有高速的比较器
这些模块都在微控制器里设计好了
所以大家在后面的实验我告诉大家
如果你要测一些简单的物理量
温度 湿度 转速等等
这个微控制器不需要设计
太复杂的外扩电路
只需要把传感器的电信号
调整到合适的动态范围
捅到微控制器上很可能就够用了
这就是高度集成的微控制器
给我们带来的好处
那么在我们这样一个电子学系统里头
我们这节课比如说举一个例子
我们要把一个ADC用起来涉及到什么呢
会用刚才讲的知识
我们在这个芯片上
是有独立的参考电压引脚
我们称为Reference Voltage
在这个芯片封装里是有的
那么在我们这电路设计里
把它比较简单的
通过一个电感电容的滤波
跟我们芯片供电的3.3伏接到了一起
那么日后大家做高精度的
电子学系统设计的时候会知道
如果你需要的测量精度很高的时候
数字系统的这个3.3伏电压
它受数字电路的干扰
对于我们的模拟电路是不够干净的
也许你需要像我刚才提到的
更高精度 更干净 更准确的电压
来给这两个引脚作为参考电压源
让你的尺子变得更准
这是大家日后记住的
然后在我们要学习的电路里
我们有很多个引脚
都可以工作为ADC模块的Channel
可以测量电压值
那么我们把PORTC的D0引脚引出来
接在了一个可调电位器
也就是一个可调电阻的分压电路上
这样我们可以通过PTC0这个引脚
也就是ADC0的单端输入第14个通道
来对我们电位器上分到的电压进行测量
那么PTC0这样一个引脚呢
是接到我们这样一个电位器
在后面我们还会学习
这样一个ADC模块还有很多别的通道
接在了比如说温度
比如说光线这样一个传感器上
我们如何让微控制器拿到
或者测量到一个片外的模拟电压值
而反映出一个外部的物理量的变化
这是在后面的章节单元学习和实验里
我会教会大家的
那么学习用ADC
我没有特别在我们这个部分
给大家展开涉及的内容
是微控制器自身的ADC它的精度是多少
它的速度是多少
那么这些信息大家在我们芯片手册里
是可以查得到的
比如说像这样一张表格
我们可以看到我们的ADC
可以工作在14比特以下的
一个低分辨率的状态
也可以工作在相对高分辨率的状态
它们各自可以配置的这个时钟信号
也就是ADC转化的时钟频率
从一兆到十几兆是有一个范围的
而在不同的时钟频率下
下面我没打红框的那一列
又给出了对应时钟下
它真正对于物理量的最快采样间隔
或者叫采样率
那么大约在几K到几百K的这个范围
所以这样一些性能就决定了我们ADC
究竟能以怎样的精度
怎样的速度去采集物理量
等学完这个章节大家如果觉得它不够用
大家可以再来学习
如何外扩更高性能的ADC
来扩充你的嵌入式系统
-1.1 课程概览
--1.1 课程概览
-1.2 如何学好嵌入式系统
-2.1 计算机的基本概念、发展历史
-2.2 从晶体管到CPU
-2.3 概念CPU、微控制器MCU和嵌入式系统
-2.4 八卦计算机史
-2.5 不同领域、不同系列的嵌入式系统
-2.6 ARM历史与MKL25Z128 MCU
--2.6 ARM历史与MKL25Z128 MCU【习题】
-3.1 CPU的基本结构和运行机制
-3.2.1 堆栈的概念
--3.2.1 堆栈的概念【习题】
-3.2.2 堆栈的概念-头脑体操
-3.3.1 ARM的体系结构
--3.3.1 ARM的体系结构【习题】
-3.3.2 ARM的体系结构-头脑体操
-3.4.1 中断的概念和机制
-3.4.2 中断子程的概念和编程
-3.5 复位、时钟、存储器和总线
--3.5 复位、时钟、存储器和总线【习题】
-3.6 小结:MCU的总体结构和程序运行机制
--3.6 小结:MCU的总体结构和程序运行机制【习题】
-4.1 第一种外设:IO
-4.2 IO外设的编程实操-点亮LED
-4.3 IO外设的进阶知识
-4.4 嵌入式开发的基本概念与工具链
-4.5 嵌入式开发的进阶知识
-4.6 嵌入式开发中的C语言(上)
--4.6 嵌入式开发中的C语言(上)【习题】
-4.7 嵌入式开发中的C语言(下)
--4.7 嵌入式开发中的C语言(下)【习题】
-E0.1 实验零 开发板的初步认识与工具链的安装
-E0.2 实验零 体验一个例程的编译与下载
-E0.3 实验零 编写第一个程序:点亮核心板LED
-E1 实验一 点灯秘籍
-5.1 ARM微控制器外设学习概述
-5.2.1 ARM微控制器外设:通讯
-5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)【习题】
-5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器的外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)【习题】
-5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
--5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
-5.2.5 ARM微控制器外设:UART的寄存器编程(上)
--5.2.5 ARM微控制器外设:UART的寄存器编程(上)
-5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)【习题】
-E2 实验二 UART编程实操
-5.3.1 ARM微控制器外设:IO的中断编程(上)
-5.3.2 ARM微控制器外设:IO的中断编程(下)
-5.4.1 ARM微控制器外设:定时器的原理
-5.4.2 ARM微控制器外设:定时器的编程
--5.4.2 ARM微控制器外设:定时器的编程【习题】
-E3 实验三 定时器中断编程实操
-5.5.1 ARM微控制器外设:PWM的原理
-5.5.2 ARM微控制器外设:PWM寄存器与编程
-5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
--5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
-E4 实验四 数码管显示编程实操
-5.6.1 ARM微控制器外设:SPI通讯简介
--5.6.1 ARM微控制器外设:SPI通讯简介【习题】
-5.6.2 ARM微控制器外设:SPI寄存器与编程
-5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
--5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
-5.7.1 ARM微控制器外设:I2C通讯简介
-5.7.2 ARM微控制器外设:I2C的通讯协议
-5.7.3 ARM微控制器外设:I2C寄存器与编程
--5.7.3 ARM微控制器外设:I2C寄存器与编程【习题】
-5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
--5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
-5.8.1 ARM微控制器外设:ADC简介
-5.8.2 ARM微控制器外设:ADC基础
-5.8.3 ARM微控制器外设:ADC寄存器与编程
-E5 实验五 ADC编程实操
-E6 挑战实验
--E6 挑战实验
-6.1 嵌入式系统的接口与设计
-6.2 嵌入式系统的实例



