单片机如何通过ADC模块采集模拟信号?

战马童


单片机的ADC可以将模拟量转化为数字量

不同品牌的单片机ADC的配置方法有一定的差异,但基本方法和原理是一样的,启动ADC转换后,可以等待转换完成然后读取数据,或者设置为转换完成产生中断然后读取数据。

因为不同的单片机的ADC配置是不一样的,本文给大家分享一下单片机ADC的一些通用原理和注意事项。

单片机ADC的工作原理

ADC其实就是就是一个将摸拟电压进行数字化的过程。需要事先定义好量程和分辨率。量程其实就是电压基准,也就是最大值,假如以5V电压为基准,那么测量的范围就是0V~5V;分辨率就是测量的精度了,假如12位,12位二进制最大值为4095;这时候就可以知道0V=0,5V=4095了,把5V分为4095份就可以了,由此可见,单片机ADC的分辨率越高,测量出来的结果就越精确了。

ADC只能测量电压,那么我们需要测电流、测温度怎么办?可以根据欧姆定律进行计算。以测量负载电流为分例,我们只需要给负载串联一个小阻值的高精度电阻,因为串联电路中的电流是相同的,当测量出串联的小电阻的压降,根据I=U/R,就可以计算出电流值了哦。

测温和测光强度也是一样的,温度变化时,温度传感器的电阻会发生变化,光强度变化时,光敏电阻的阻值也会变化,变化的阻值就会引起电压降的变化,根据这种变化关系就要以计算出温度和光强度了。

单片机ADC转换注意事项

  • ADC转换需要电压基准,没有基准的电压就没有准确的数值。ADC的转换结果是根据基准电压得到的,得到的满量程数据就是基准电压值。单片机的ADC参考电压可以是电源电压或者单独输入的参考电压,也可以是单片机内部产生的参考电压。
  • 假如基准电压为5V,单片机的分辨率为12位(111111111111),那么ADC数据寄存器最大的结果是4095,当输入的电压大于等于基准电压5V后,结果都是4095了。
  • 我们用ADC测量电压时需要设置合适的分压电阻,避免输入的模似电压信号超过基准电压。我们一般尽量让需要测量的数据处于基准电压的中间值,以获理更准确的数据。
  • 以NTC测温为例,假如25℃时,NTC的阻值为10K,如果主要测温的范围在是25℃左右的环境温度,我们一般会使用10的固定电阻进行分压,就会得到围绕中间值变化的摸拟电压数据。

  • 当然,输入的摸拟数据是变化的,除了硬件电路需要做好滤波,减少输入数据的波动;我们还可以进行软件滤波,比如进行多次数据采集,然后进行平均。软件滤波的算法有很多种,我们可以针对应用场合选择适合的软件滤波算法。

  • 因为一般单片机的ADC精度不会太高,微弱的摸拟信号需先进行放大才可以测量。比如热电偶,相差100℃的温度,才有一两毫伏的电热差变化,即使24位精度的ADC也难精准测量。

欢迎关注@电子产品设计方案,一起享受分享与学习的乐趣!关注我,成为朋友,一起交流一起学习


电子产品设计方案


作为单片机开发的工程师都知道,ADC采集是非常常用,而且也是很基础的一个外设。常常被工程师用于采集模拟信号。

那么很多初学者一般怎么在使用ADC应用时,怎么编写代码呢?

我将以STM32F103RCT6单片机,作为本文参考芯片,此芯片有3个12位的ADC,我选择其中一个ADC,实现采集电池供电电压功能的过程。


第一步,配置对应的引脚, ADC功能属于IO端口的复用,所以需要选择对应的IO进行初始化(此处前提条件硬件设计端口分配正确)

如上图所示,我们选用pc0引脚作为采集端口,先需要使能GPIOC的时钟,然后根据设计手册对GPIOC->CRL寄存器描述,对应PC0地址位置赋值为0,配置为模拟输入。如下图所示

第二步,配置ADC初始化函数

STM32F103RCT6有3个ADC,可以选择其中的任何一个作为采集ADC,但通道是已经规定好了,不能更改。

根据如上图的官方技术手册所示,PC0是ADC的第10个通道,所以在配置参数时候,我们选择ADC1,并将ADC1->SQR3寄存器设置为10通道。

如下图所示,首先需要对ADC的时钟进行使能,接着配置ADC控制寄存器,配置ADC通道,规则等,配置我已对每个寄存器配置赋值进行备注说明。

第三步,ADC扫描函数,获取ADC采集的电压值。

电池电压采集,因为电池电压信号是一个变化较慢的模拟量,所以为了获得采集数据的稳定性,减少误差和误判,需要对1000次采集的数据求平均值。

再结合电路中匹配的分压电阻,200K+100K分压,所以计算部分如下图所示,最终计算出Bat_Vol的电压值,单位是mV。


延伸说明

1 ,ADC与DMA结合使用采集数据,每次ADC转换完成的数据,直接转到DMA的设定的地址当中,单片机只需要对设定地址的变量进行操作,在ADC初始化当中需要对ADC1->CR1,ADC1->CR2两个寄存器进行操作,如下图所示:

同时还需要配置对应的DMA初始化函数和ADC处理函数,此函数不再这里表述。大家可以查阅技术资料,试着去完成剩余的代码。

2,外挂ADC芯片,有些项目中,为了能够实现高精度的模拟信号采集,单片机会使用外部的ADC芯片。如ADS1294等芯片。此芯片为24位高精度ADC芯片,采用spi通信接口,实现过程比单片机ADC芯片稍显复杂。

总结

在单片机系统当中,ADC的使用非常普遍,也非常重要,各种模拟量的采集离不开它,所以作为从事单片机开发的工程师,是必须掌握这些知识点。





科技电小二


ADC是将模拟信号转化数字信号,转化基准可以基于ADC内部参考电压或外部提供(如果想要更精确的精度)。

不管什么样的ADC芯片都需要将转化后的数据发送出去以及通过单片机来配置ADC一些寄存器,比如采样速率,是否开启采样等。

通常低速ADC采用iic协议,而中高速ADC多采用spi或并行驱动。其中iic和spi能够节省不少io资源,而并行驱动用io资源换取了速度



嵌入式笔记v


朋友们好,我是电子及工控技术,我来回答这个问题。众所周知单片机是一种超大规模的集成电路,它只能“读懂”并处理数字信号,对于连续量的模拟信号则无能为力。单片机通过ADC(模数转换)芯片实现对模拟量的处理是单片机处理模拟信号的一种最常见的办法。下面和朋友们聊一聊单片机是如何通过ADC(模数转换)模块去采集模拟信号的。

无ADC采集模块的单片机对模拟信号的处理

早期的单片机内部没有带ADC(模数转换)模块,比如我们以前常用的AT89C51/S51系列的8位单片机,在使用这种单片机进行模拟信号的处理时通常要在单片机外部增设ADC(模数转换)芯片比如常用的有ADC0809、ADC0832和PCF8591等芯片,它的主要作用是能够把连续的模拟量变化为离散的数字信号,然后再把这个数字信号通过排线送入到单片机中进行读取处理。这种处理的方法是通过软件与硬件相结合的方法实现了对模拟信号的采集处理的。

1、第一步是对模拟量的采样

我们先说说ADC(模数转换)芯片转换的过程,对于连续的模拟量比如温度、压力、速度等要通过一定的感应器先把这些物理量转换成电压信号,这个电压信号就是模拟信号,它通入到ADC芯片的输入端口时,ADC芯片内部的电路首先要做的事情就是把这个连续变化的模拟信号转变为离散的模拟量,有点类似把一根曲线在一定间隔的时间内把它分切成一段一段的,如下图所示的那样。这个过程就是对模拟量进行“采样”的过程。

2、第二步是对离散过后的模拟量进行“取样”

ADC(模数转换)电路中的取样就是对采集到的离散的模拟量进行取样保持,以便能为后续的电路“捕捉”到所采集的信号,否则的话由于速度过快不能够完全取出所采样的信号就会造成采样信号的缺失,造成转换误差过大。一般ADC中都有取样保持电路用来完成这项“任务”。

3、第三步是对取样的电压量进行量化与编码

为了说明量化与编码的方法我们来举个例子,例如把0V到1V的模拟电压分成8份,每一份只占其中的八分之一,这样就把1V的电压量进行了量化,然后把每一份的电压值在用一个二进制的代码表示出来。这样在ADC(模数转换)芯片中大体经过这几个步骤就完成了从模拟量到数字量的转换任务。

4、软件的处理

以上是用硬件来完成从模拟量到数字量的转换,那么剩下的任务就应该交给单片机里的软件来完成了。首先要把单片机与ADC芯片设置好接口电路,为它们进行数据流通做好准备,进入单片机内部后就开始有软件接手处理发送来的数据了。根据ADC不同的特性有的采用并口线,有的采用串口线,比如PCF8591模数转换芯片就采用了IIC方式与单片机进行“交流”的。

在软件上的程序除了主程序外还要有对送入单片机里的数据进行转换处理的子程序,显示数值的子程序等,如果用IIC进行与单片机“交流”的话还需要IIC通信协议程序。所以用内部不带ADC模块的单片实现单片机对模拟信号的处理比较繁琐一些。

有ADC采集模块的单片机对模拟信号的处理

随着技术的发展,现在很多兼容C51单片机的芯片内部都设置了ADC转换模块,对于一些16位和32位高端单片机都设置了不止一路ADC模块,比如STM32系列的单片机,不仅有ADC模块还有DCA模块等用起来十分方便。用这类单片机处理模拟量只要对GPIO口进行配置和调用相应的ADC库函数就可以了,使用起来比较方便。


以上就是我对这个问题的回答,欢迎朋友们参与讨论,敬请关注电子及工控技术,感谢点赞。


分享到:


相關文章: