单片机_ADC详解
之前有说到,计算机世界里,只有数字量0和1,那你有没有想过一个问题,那要不是数字量怎么表示。
比如这样。
他在单片机中是怎样存储及传输的呢?
数字量:在时间上和数量上都是离散的物理量称为数字量。把表示数字量的信号叫数字信号。把工作在数字信号下的电子电路叫数字电路。数字量由多个开关量组成。如三个开关量可以组成表示八个状态的数字量。
例如:
用电子电路记录从自动生产线上输出的零件数目时,每送出一个零件便给电子电路一个信号,使之记1,而平时没有零件送出时加给电子电路的信号是0,所在为记数。可见,零件数目这个信号无论在时间上还是在数量上都是不连续的,因此他是一个数字信号。最小的数量单位就是1个。
模拟量:在时间上或数值上都是连续的物理量称为模拟量。把表示模拟量的信号叫模拟信号。把工作在模拟信号下的电子电路叫模拟电路。模拟量是连续的量,数字量是不连续的。反映的是电量测量数值(如电流、电压)。
例如:
热电偶在工作时输出的电压信号就属于模拟信号,因为在任何情况下被测温度都不可能发生突跳,所以测得的电压信号无论在时间上还是在数量上都是连续的。而且,这个电压信号在连续变化过程中的任何一个取值都是具体的物理意义,即表示一个相应的温度。
所以为了方便存储、分析和传输,我们常常把模拟信号转化成数字信号,像这样。
是不是明白了呢?
我们知道,模拟信号在时间上和数值上都是连续的,这个在计算机中是不能实现的,所以把时间离散化,把一段时间分成n等分,记住每个时间段的数值大小就能表示出原始模拟信号变化。当然,这里时间段划分的越小,数值的精度越高,模数转化的精度就越高。
这------在单片机的世界里是有专门的模块完成的,或者单独的芯片,或是电路直接集成在单片机里面,所以,就是ADC
ADC
ADC是模数转换器,转换器 的供应商的英文简称,是一种能将模拟信号转变为数字信号的电子元件。通常是将信号采样并保持以后,再进行量化和编码,这两个过程是在转化的同时实现的。
具体的转化步骤在这里就不展开说了,如果是开发者使用,我们应该关注哪些参数
1.分辨率-说明AD对输入信号的分辨能力,及数值部分的精度。一般模拟采样中使用16位还是24位的AD芯片说的就是分辨率.
例如:输入模拟电压的变化范围为0~3.3 V,输出16位二进制数可以分辨的最小模拟电压为3.3V / 216=0.05 mV;
2 .转化误差-表示AD实际电压与理论电压的偏差,一般用最低有效位来表示,单位LSB,通常以相对误差的形式出现,比如相对误差≤±LSB/2,表明实际输出的数字量和理论量误差小于最低位的一半。
3.转换精度-这里一般用转化误差和分辨率来表述,具体就是AD最大量化过程中采用了四舍五入的方法及模拟处理部分的精度问题。
4.转化时间-即从信号输入开始到输出稳定的信号所经过的时间。不同的AD准换的速度不同,根据实际要求来选型。
5.工作电压和基准电压(内部或者外部基准):工作电压是AD芯片工作的额定电压,关键的是基准电压,又叫参考电压,可以来之芯片内部又或者外部接入,其决定了AD的分辨率,所有基准电压一定要稳。
图位NI数据采集入门可以参考
到这里,是不是关于AD的所有内容都懂了呢,另外还有DA-即数字量转模拟量,DA转换的基本原理就是先把数字量每一位代码按其“权”的大小转换成相应的模拟量,然后将各分量相加,其总和就是与数字量相应的模拟量。
实战篇
这里使用STMF103配置为例,简述整个配置流程。
1)开启 PA 口时钟,设置 PA1 为模拟输入。
STM32F103ZET6 的 ADC 通道 1 在 PA1 上,所以,我们先要使能 PORTA 的时钟,然后设置 PA1 为模拟输入。
2)使能 ADC1 时钟,并设置分频因子。
要使用 ADC1,第一步就是要使能 ADC1 的时钟,在使能完时钟之后,进行一次 ADC1 的复位。接着我们就可以通过 RCC_CFGR 设置 ADC1 的分频因子。分频因子要确保 ADC1 的时钟( ADCCLK)不要超过 14Mhz。
3)设置 ADC1 的工作模式。
在设置完分频因子之后,我们就可以开始 ADC1 的模式配置了,设置单次转换模式、触发方式选择、数据对齐方式等都在这一步实现。
4)设置 ADC1 规则序列的相关信息。
接下来我们要设置规则序列的相关信息,我们这里只有一个通道,并且是单次转换的,所以设置规则序列中通道数为 1,然后设置通道 1 的采样周期。
5)开启 AD 转换器,并校准。
在设置完了以上信息后,我们就开启 AD 转换器,执行复位校准和 AD 校准,注意这两步是必须的!不校准将导致结果很不准确。
6)读取 ADC 值。
在上面的校准完成之后, ADC 就算准备好了。接下来我们要做的就是设置规则序列 1 里面的通道,然后启动 ADC 转换。在转换结束后,读取 ADC1_DR 里面的值就是了。(摘自正点原子STM32F1开发指南)