打印
[其他ST产品]

怎样用STM32 ADC测量电压(中断方式)

[复制链接]
677|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

ADC 概述

ADC是模数转换的缩写,是将连续的模拟信号转换为离散的数字信号,在通信,自动控制等多个领域有着广泛的应用,利用各种传感器,能将现实世界中的模拟量转换为机器能够识别的数字量,机器有了ADC,就像人有了各种感官,能够感知周围的世界并做出反应。


使用特权

评论回复
评论
是你的乱码 2023-1-15 19:12 回复TA
———————————————— 版权声明:本文为CSDN博主「rannar」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/rannar/article/details/81154765 
沙发
是你的乱码|  楼主 | 2023-1-15 19:11 | 只看该作者
STM32F10x  ADC特点

l 12位逐次逼近型的模拟数字转换器。

l 最多带3个ADC控制器

l 最多支持18个通道,可最多测量16个外部和2个内部信号源。

l 支持单次和连续转换模式

l  转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。

l  通道0到通道n的自动扫描模式

l  自动校准

l  采样间隔可以按通道编程

l  规则通道和注入通道均有外部触发选项

l  转换结果支持左对齐或右对齐方式存储在16位数据寄存器

l  ADC转换时间:最大转换速率 1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)

l  ADC供电要求:2.4V-3.6V

l  ADC输入范围:VREF- ≤  VIN  ≤  VREF+

使用特权

评论回复
板凳
是你的乱码|  楼主 | 2023-1-15 19:15 | 只看该作者
所谓逐次逼近型ADC,其工作原理可用天平秤重过程作比喻来说明。若有四个砝码共重15克,每个重量分别为8、4、2、1克。设待秤重量Wx = 13克,可以用下表步骤来秤量:
  首先把待称重的重物放在托盘上,在另外一边的托盘上首先放上8克的砝码,8克砝码小于待测物体总重13克,所以保留该砝码;

使用特权

评论回复
地板
是你的乱码|  楼主 | 2023-1-15 19:17 | 只看该作者
第二步将4克砝码放在托盘上,砝码总重为8+4=12克,小于待测物体总重,所以也保留;
  第三步将2克砝码放在托盘上,砝码总重为8+4+2=14克,大于待测物体总重,所以将2克砝码撤除;
  第四步将1克砝码放在托盘上,砝码总重为13克,等于待测物体总重,所以保留;

使用特权

评论回复
5
是你的乱码|  楼主 | 2023-1-15 19:17 | 只看该作者
 最后得到待测物体为13克。

在逐次逼近型ADC中,一定要保证参考电压的稳定。尽量不要有波动

使用特权

评论回复
6
是你的乱码|  楼主 | 2023-1-15 19:20 | 只看该作者
ADC功能框图

使用特权

评论回复
7
是你的乱码|  楼主 | 2023-1-15 19:23 | 只看该作者
关于注入通道和规则通道

使用特权

评论回复
8
是你的乱码|  楼主 | 2023-1-15 19:23 | 只看该作者
在规则通道轮询的过程中,可以插入注入通道的转换,就像中断一样,注入通道转换完成后,继续转换规则通道,比如汽车里面的自动空调,可能有多个传感器在检测汽车内部各个区域的温度,这些就是规则ADC通道,这时你想知道车外的温度,可以按一个按钮,这时设计在外部的注入通道将汽车外部的温度采集回来显示在屏幕上,然后规则通道继续监测汽车内部的温度。

使用特权

评论回复
9
是你的乱码|  楼主 | 2023-1-15 19:24 | 只看该作者
输入电压范围

输入电压:VREF- ≤ VIN ≤ VREF+
决定输入电压的引脚: VREF-、 VREF+ 、 VDDA 、 VSSA
如果VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,
得到ADC 的输入电压范围为: 0~3.3V。

使用特权

评论回复
10
是你的乱码|  楼主 | 2023-1-15 19:26 | 只看该作者
那如果输入电压大于3.3V,该如何测量呢?看下图

使用特权

评论回复
11
是你的乱码|  楼主 | 2023-1-15 19:27 | 只看该作者
根据基尔霍夫定律(KCL),节点流入的电流等于流出的电流
(Vin – Vout)/R2 + (3V3-Vout)/R1 = Vout / R3

由上式可以得出

Vin=6Vout-10

如果此时ADC测的的Vout为3v的,则实际的电压是Vin=6*3-10=8v。

使用特权

评论回复
12
是你的乱码|  楼主 | 2023-1-15 19:28 | 只看该作者
触发源
1、软件触发:ADC_CR2 :ADON/SWST
ART/JSWSTART
2、外部事件触发:内部定时器/外部IO
选择:ADC_CR2 :EXTSEL[2:0]和 JEXTSEL[2:0]
激活:ADC_CR2 :EXTEN 和 JEXTEN

使用特权

评论回复
13
是你的乱码|  楼主 | 2023-1-15 19:29 | 只看该作者
ADC设备时钟

ADC_CLK:ADC模拟电路时钟,最大值为14M,由
PCLK2提供,还可分频,2/4/6/8,RCC_CFGR 的
ADCPRE[1:0]设置。PCLK2=72M。
数字时钟:RCC_APB2ENR,用于访问寄存器

使用特权

评论回复
14
是你的乱码|  楼主 | 2023-1-15 19:29 | 只看该作者
ADC转换时间

转换时间:Tconv = 采样时间 + 12.5 个周期

采样时间: ADC 需要若干个 ADC_CLK 周期完成对输入的
模拟量迚行采样,采样的周期数可通过ADC 采样时间寄存器
ADC_SMPR1 和 ADC_SMPR2 中的 SMPx[2:0]位设置,
ADC_SMPR2控制的是通道 0~9, ADC_SMPR1 控制的是通
道 10~17。每个通道可以分别用不同的时间采样。其中采样
周期最小是 1.5 个,即如果我们要达到最快的采样,那么应该
设置采样周期为 1.5个周期,这里说的周期就是 1/ADC_CLK。

使用特权

评论回复
15
是你的乱码|  楼主 | 2023-1-15 19:30 | 只看该作者
    000:1.5周期

        100:41.5周期

        001:7.5周期

        101:55.5周期

        010:13.5周期

        110:71.5周期

        011:28.5周期

        111:239.5周期

PCLK2 = 72M,如果采取6分频,ADC_CLK = 72/6 = 12M
Tconv = 1.5+12.5 = 14周期 = 14/12M=1.17us

使用特权

评论回复
16
是你的乱码|  楼主 | 2023-1-15 19:31 | 只看该作者
理论上的最快转换时间是1us,当我们把系统时钟设置为56MHz的时候,经过4div正好为14MHz,此时就能达到1us的采样。但是测试发现如果按照最快速度转换ADC结果不是很准确。

使用特权

评论回复
17
是你的乱码|  楼主 | 2023-1-15 19:31 | 只看该作者
代码实现

在这里以ADC2为例,用中断的方式读取ADC数据。选取ADC2的通道11(PC1)作为电压数据采集通道。

使用特权

评论回复
18
是你的乱码|  楼主 | 2023-1-15 19:32 | 只看该作者

使用特权

评论回复
19
是你的乱码|  楼主 | 2023-1-15 19:33 | 只看该作者

使用特权

评论回复
20
是你的乱码|  楼主 | 2023-1-15 19:33 | 只看该作者

使用特权

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

本版积分规则

33

主题

392

帖子

1

粉丝