打印
[STM32F1]

stm32F103——ADC与DMA(按键与光敏电阻)

[复制链接]
1638|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AD, ADC, DM, DMA, ST
ADC的基本介绍
ADC的基本定义
Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。

典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。

我们先来看ADC的工作原理:




使用特权

评论回复
沙发
我爱台妹mmd|  楼主 | 2023-11-25 15:19 | 只看该作者
  通道选择:1个ADC模块具有多个通道,不同的通道在不同的引脚上。所以,我们要采集哪个引脚上面的模拟量,需要我们去选择对应ADC通道。

        采保电容:采样保持电容。当开关闭合的时候,给采保电容进行充电,然后在规定的时间内断开开关,然后将采保电容上面的模拟量电压进行转换为数字量。这个就是ADC的采集原理。

        采样时间:当开关闭合的时候,给采保电容进行充电,然后在规定的时间内断开开关,然后将采保电容上面的电压进行转换。这个规定时间就是采样时间。采样时间是会变化的。

        转换时间:对采保电容中的存的电压进行转换,转换模块会花费一定的时间,这个就是转换时间。然后把转换的结果存入缓冲器,供程序员读取使用。转换时间是固定不可变的。

        注意:采样时间并不是固定不变的,采样时间需要做实验,根据实验结果来调整采样时间。

使用特权

评论回复
板凳
我爱台妹mmd|  楼主 | 2023-11-25 15:22 | 只看该作者
采样时间不能过长,也不能过短。当采样数据过长,由于输入量是一直在变化的,所以就会导致采保电容上面的电压也是一直在变化的,如果电压值一直在变化我们采集出来的值也不是一个真实反映情况的值。我们采集出来的值,是需要有代表性作用的。

使用特权

评论回复
地板
我爱台妹mmd|  楼主 | 2023-11-25 15:22 | 只看该作者
  当采样时间过短,假如输入电压是3V,那么当给采保电容充电到1.5V的时候,开关就断开了,此时就不能正确的反应输入的电压了。而且还有采样信号源内阻的问题,说白了就是对这个采保电容充电的电流够不够大,只有充电的电流大了,才能在最短的时间内充满,由于电容充满电后相当于开路,此时ADC内阻无穷大。如果充电的电流非常小,那么充电时间长,电容在充电的时候阻抗非常小,此时ADC内阻就非常小。如果此时恰恰配置的采样时间又很小,结果只有一个,采样不准确。我们经常看到,有的设计方案,做电压采样,分压电阻设计的阻值非常大,当这样的大阻抗遇到高速采样的时候,小电阻钳位大电阻,此时R1、R2电阻的分压就不准确了,那么采样就有可能会不准确。

使用特权

评论回复
5
我爱台妹mmd|  楼主 | 2023-11-25 15:22 | 只看该作者
如下图:   大家看上面的R1、R2设置大了,那么充电电流就小了,那么R1、R2的阻值设计小了,充电电流大了,那么带来的问题功耗就大了,当需要高速采样的时候,就需要注意这个阻值分配的问题,对功耗要求比较高的产品,如可穿戴产品,蓝牙耳机,智能手表等,这个就需要大的阻值了,一般情况下功耗要求不高的场合,我们基本上设计在1-2mA,所以从此可以得出一个结论,采样时间不是越快越好,也不是越慢越好,恰到好处即可,需要你去实际调试。

使用特权

评论回复
6
我爱台妹mmd|  楼主 | 2023-11-25 15:22 | 只看该作者
如何从带有干扰杂波的信号中提取到有用的信号呢,一般情况下,我们会根据系统的特性进行定点采样,即避开干扰区来采样提取有用的信号,再配软件或者硬件滤波手段来提取有用信号。

        所以采集一个信号就有2个时间了:采集时间 + 转换时间,这两个时间也就反应了采集速度有多快,能不能快。这两个时间决定了ADC采样的速度问题,当需要高速AD采样的时候,这两个时间尤为重要,因为它决定了采样速度。

使用特权

评论回复
7
我爱台妹mmd|  楼主 | 2023-11-25 15:23 | 只看该作者
采保电容得到了准确的采样信号,就一定意味着转换结果准确吗?
        答案肯定是NO,这个和ADC模块的参考电压也有关系,参考电压就像一标准样品一样,举例来讲:老板说照着这个样品给我做100个,那首先前提是你的样品得准确,如果样品都不准确,那做出来的东西也必然会有偏差。

使用特权

评论回复
8
我爱台妹mmd|  楼主 | 2023-11-25 15:23 | 只看该作者
ADC的转换原理
逐次比较型ADC
        一般单片机里面都是用逐次比较型ADC转换。其基本原理是从高位到低位逐位试探比较,好像用天平称物体,从重到轻逐级增减砝码进行试探。逐次逼近法转换过程是:初始化时将逐次逼近寄存器各位清零;转换开始时,先将逐次逼近寄存器最高位置1,送入D/A转换器,经D/A转换后生成的模拟量送入比较器,称为 Vo,与送入比较器的待转换的模拟量Vi进行比较,若Vo<Vi,该位1被保留,否则被清除。然后再置逐次逼近寄存器次高位为1,将寄存器中新的数字量送D/A转换器,输出的 Vo再与Vi比较,若Vo<Vi,该位1被保留,否则被清除。重复此过程,直至逼近寄存器最低位。转换结束后,将逐次逼近寄存器中的数字量送入缓冲寄存器,得到数字量的输出。

使用特权

评论回复
9
我爱台妹mmd|  楼主 | 2023-11-25 15:23 | 只看该作者

    上图是一个8位逐次逼近型ADC的框图,“输入的模拟量”是输入电压信号,“START”用来控制ADC启动转换,“CLOCK”是ADC模块的输入时钟,“EOC”是ADC转换结束信号,“OE”是ADC转换结果输出允许信号,“VREF”是参考电压。

使用特权

评论回复
10
我爱台妹mmd|  楼主 | 2023-11-25 15:23 | 只看该作者
随着时钟信号的输入,启动信号的开始,控制模块会逐次控制逐次比较寄存器产生不同的数据,数据产生后会送给D/A转换器(即DAC),D/A转换器会依据参考电压,把这个数字量转化为模拟量送给比较器,比较器比较D/A转换器送出来的模拟量和输入模拟量的大小,产生的结果给控制单元电路,控制单元电路根据上一次的结果再次控制产生不同的数据,让D/A变成模拟量,再去比较,以此这样循环,每次比较,比较器会得出一个结果高或者低,根据这个结果决定当前产生的数字量是大了还是小了,一次一次的比较,找到那个和输入模拟量最接近的数字量,最后把这个数字量控制送到输出缓冲器,并且控制送出EOC输出转换完成信号,这就是一个大致的逐次逼近工作原理。

使用特权

评论回复
11
我爱台妹mmd|  楼主 | 2023-11-26 00:55 | 只看该作者
从上面的描述中,我们抓住一个重点是:D/A转换器会依据参考电,把生成的数字量变为模拟量,在转换的时候必须需要有一个参考电压,这个电压就是我们AD模块的参考电压,那么大家试想,如果参考电压都不稳定的话,转出来的模拟量是不是也不会稳定,那么和输入模拟量比较的时候,比较的结果也就可能会发生偏差,造成错误的比较结果。

      

         那怎么来保证这个参考电压比较稳定呢?

        1.我们可以在参考电压引脚附近就近放置电容(一大一小,大的储能,小的滤波);

        2.可以在参考电源前端串一个小电感再加电容。如图所示,这两种方法比较常见,也比较便宜,大家可以参考.

使用特权

评论回复
12
我爱台妹mmd|  楼主 | 2023-11-26 00:55 | 只看该作者
总结,ADC的参考电压是非常重要的,所以参考电压精确度不容忽略,要尽可能地使参考电压稳定,不受干扰。

使用特权

评论回复
13
我爱台妹mmd|  楼主 | 2023-11-26 00:58 | 只看该作者
分辨率
         分辨率有8位、10位、12位、16位。那么这到底是什么意思呢?

        假设是12位的分辨率,其对应3.3V。那么就是将3.3V分割成2^12份,最小的电压就是\frac{3.3V}{2^1^2}
\frac{3.3V}{2^1^2}
(即:0.0008057V),它用0000 0000 0000 0001来表示(因为是12位)。\frac{3.3V}{2^1^2}
\frac{3.3V}{2^1^2}
*  2  = \frac{3.3V}{2^1^1}
\frac{3.3V}{2^1^1}
,它用0000 0000 0000 0010来表示(因为左移1位相当于乘以2)。所以1000 0000 0000 0000就表示电压值,\frac{3.3V}{2^1^2}
\frac{3.3V}{2^1^2}
  *  2^11 = ,即表示1.65V电压。110 0000 0000 0001 就表示电压值  +  。由此可知,12位的分辨率可以表示0 ~ 3.3V之间的很多电压值。所以,分辨率越高,表达的电压就越精确。

        单片机中通常是10位、12位分辨率的比较多,如果我们需要更精确的ADC,那么就要使用外挂的ADC芯片了。

使用特权

评论回复
14
我爱台妹mmd|  楼主 | 2023-11-26 01:01 | 只看该作者
电路:

使用特权

评论回复
15
我爱台妹mmd|  楼主 | 2023-11-26 01:01 | 只看该作者
    按下不同按键后,由于分压电阻并联,导致分压改变,ADkey的电压改变,经过ADC转换后,将模拟电压值转换成数字量。如下图

使用特权

评论回复
16
我爱台妹mmd|  楼主 | 2023-11-26 01:01 | 只看该作者
ADkey引脚的模拟电压值转换为数字量(十进制)的计算方法:

                                                (ADkey电压值 / 3.3v) *  4095

例如:AD_K2的引脚电压值为0.396v(模拟量),那么(0.396 / 3.3) * 4095 = 491.4(数字量)

           如果引脚电压值为3.3v(模拟量),那么(3.3 / 3.3) * 4095 = 4095(数字量)

注意:表格中只是理论计算值,实际上电阻阻值存在1%~5%的误差。所以,实际上分得的电压与计算值也就存在误差。

使用特权

评论回复
17
我爱台妹mmd|  楼主 | 2023-11-26 01:01 | 只看该作者

使用特权

评论回复
18
我爱台妹mmd|  楼主 | 2023-11-26 01:01 | 只看该作者
单次扫描:只转换一次模拟量。

连续扫描:连续循环的转换各个通道的模拟量。

左右对齐:ADC是12位的,但是由于内存是以字节(8位)来存储的,所以保持ADC数值的寄存器是16个位。ADC的数值只有12个位,所以还剩下4个位空着。右对齐:从寄存器的第0位开始放数据。最后一个数据放在第11位。左对齐:从寄存器的第4位开始放数据。最后一个数据放在第15位。

使用特权

评论回复
19
我爱台妹mmd|  楼主 | 2023-11-26 01:02 | 只看该作者
如下图:



所以,在左对齐中把寄存器中的值右移四位就得到右对齐的数据了。我们一般用的是右对齐数据。

通道之间的采样间隔(可编程):我们可以自己去设置,采样的间隔时间。

使用特权

评论回复
20
我爱台妹mmd|  楼主 | 2023-11-26 01:02 | 只看该作者
采样时间和转换时间的计算:


         我们可以看到,ADC时钟频率为56Mhz的时候,是1us,但是,ADC时钟频率为72Mhz的时候,却是1.17us。频率增加了,转换时间反而变成了。这是为什么?

         

         实际上,ADC模块的最大频率只有14Mhz,当ADC外设的时钟线的频率为72Mhz的时候,只能6分频,频率才能小于14Mhz(即:72/6 = 12Mhz),此时ADC模块才能正常工作。但是,ADC模块的却只在12Mhz下工作。而当ADC外设的时钟线的频率为56Mhz的时候,56/4 = 14Mhz。此时ADC模块的在14Mhz下工作,因为14Mhz > 12Mhz,所以,转换时间比较快。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

517

帖子

0

粉丝