STM32单片机ADC功能详解

embedded/2024/12/22 9:17:28/

文章目录

1. ADC概述

2. ADC结构图

3. 引脚定义

4. 转换模式

5. 数据对齐

6. 转换时间

7. 硬件电路

8. STM32使用ADC单/多通道检测数据


1. ADC概述

  • 功能:ADC是一个将模拟信号(如电压)转换为数字信号的设备。在微控制器中,它允许模拟信号如传感器输出或其他电压形式被数字化,进而可以由数字系统处理。
  • 分辨率:12位,这意味着ADC输出的数字可以在0到4095之间变化。更高的分辨率意味着更精确的输入信号量化。
  • 转换速度:1μs转换时间指每个ADC样本的获取和转换仅需1微秒。
  • 输入电压范围:0至3.3V,这是微控制器能够安全处理的电压范围,超过此范围可能导致硬件损伤或数据不准确。
  • 多通道输入:STM32F103C8T6具备10个外部和2个内部的ADC通道,使得可以同时从多个源获取数据,非常适合复杂或多变量的监测任务。
  • 18个触发输入:这些触发输入支持从10个外部源和2个内部源触发ADC,允许在特定事件发生时自动启动ADC转换,增强了系统的自动化和响应速度。

对于将数字信号转为模拟信号的功能称为DAC,和PWM相似,PWM只有导通和断开两种状态。这两种状态都没有功率损耗,所以适用于直流电机这种大功率场景。而DAC主要应用于波形生产:比如信号发射器。

2. ADC结构图

从结构图中可以看出,有18个输入通道(C8T6只有10个),到达模拟多路开关,可以指定想要选择的通道,再往右边是多路开关的输出,进入到模数转换器,这里的转换器采用逐次比较的方法,也就是二进制从高位到地位依次比较,转换的结果会存放到数据寄存器中,读取寄存器就可以得到数据。

对于普通的ADC,多路开关一般只选择一个,也就是选择其中一个通道,然后转换,转换完成后取出结果,但在这里可以选择多个通道,并且stm32还有分组的功能,规则组和注入组。

规则组可以一次性选择16个通道,注入组可以选择4个通道。但是由于数据寄存器只能存放一个数据,所以选择多个通道会导致前面的数据被覆盖,这时就需要使用到DMA,它可以将每个数据进行转移。

对于注入组,不用担心数据覆盖的问题,因为注入通道有4个寄存器,可以同时储存4个通道的数据。

并且还可以在模拟看门狗中设置阈值,例如如果超出阈值,就会触发中断。

3. 引脚定义

引脚定义也可以在数据手册中查到:

通道编号ADC1ADC2ADC3
通道0PA0PA0PA0
通道1PA1PA1PA1
通道2PA2PA2PA2
通道3PA3PA3PA3
通道4PA4PA4PF6
通道5PA5PA5PF7
通道6PA6PA6PF8
通道7PA7PA7PF9
通道8PB0PB0PF10
通道9PB1PB1
通道10PC0PC0PC0
通道11PC1PC1PC1
通道12PC2PC2PC2
通道13PC3PC3PC3
通道14PC4PC4
通道15PC5PC5
通道16温度传感器
通道17内部参考电压

4. 转换模式

在ADC初始化的结构体中有两个参数,单词转换/连续转换,扫描模式/非扫描模式,这两个参数组成了不同的转换模式。

  • 单次转换,非扫描模式

在这个模式下只有序列1有效(非扫描模式),如果想转换某一个通道,例如选择通道2,这时就会转换通道2的数据并将数据存入寄存器,如果想换一个通道就需要将选择的新通道替换掉原来的通道2.

  • 连续转换,非扫描模式

非扫描模式,所以还是序列1有效,和单次转换不同的是,连续模式代表转换一次后,不需要等待,会自动进行下一轮的转换。

  • 单次转换,扫描模式

依然是单次转换,所以只触发一次,转换结束后会停止。扫描模式代表可以使用菜单,也就是使用多个序列,多个通道。比如这里指定通道数目为7,代表会依次扫描前7个通道,转换结果放到寄存器中,为了防止数据被覆盖,需要用DMA及时将数据转移走。七个通道转换完成后,产生ECO信号,代表转换结束。

  • 连续转换,扫描模式

相对于单次转换,扫描模式,这个模式在转换完成后,立刻开始下一次的转换。也就是转换一次后,不需要等待,会自动进行下一轮的转换。

5. 数据对齐

在ADC中,转换结果为12位的数据,但是数据寄存器是16位的,这就存在一个数据对齐的问题。有两种方式,数据右对齐和数据左对齐。

数据右对齐:

12位的数据向右靠,高位多出来的几位就补0,这个方式读取寄存器,直接得到的就是转换结果。

数据左对齐:

12位的数据向左靠,低位补0,这个方式直接读取的话数据会较大,因为二进制左移一次相当于把这个数据乘以2,下面的例子相当于把结果乘以16倍。

6. 转换时间

AD转换的步骤位:采样,保持,量化,编码

采样保持的作用:因为AD转换时,量化和编码需要一段时间,如果在这段时间中,输入电压依然不断变化,就无法准确判断电压的数据,所以就需要用到采样开关,先打开开关收集外部电压,然后断开采样开关,再进行量化和编码,这个过程所用的时间就是采样时间。

  • STM32 ADC的总转换时间​:

总转换时间是进行一次完整AD转换所需要的时间,它由两部分组成:

  1. 采样时间:ADC模块在将模拟信号转换成数字信号前,需要一定的时间来采样模拟信号。这段时间是可编程的,可以根据信号的性质和需要的精度来调整。
  2. 转换时间:这是ADC完成实际的模数转换过程所需的固定时间,通常由内部时钟频率决定。
  • 公式说明:

总转换时间的计算公式为: T(CONV) = 采样时间 + 12.5个ADC周期

其中T(CONV) 是ADC模块的时钟周期,这取决于ADC时钟(ADC Clk)的频率。

  • 示例:

假设 ADC Clk 的频率是14MHz,则每个时钟周期T(ADC)是 1/114MHz,1/14MHz​ 约为 71.4ns。因此,如果采样时间设置为1.5个ADC时钟周期(通常是最小设置),转换时间计算如下: T(CONV) = 1.5×71.4ns+12.5×71.4nsTCONV​=1.5×71.4ns+12.5×71.4ns

T(CONV) = 1.071ns + 892.5ns

T(CONV) = 893.571ns 即转换时间大约是893.571纳秒,接近1微秒。

7. 硬件电路

ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差,所以建议在每次上电后执行一次校准,启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期,这些都会在初始化代码中设置。

下面三种电路就是常见的ADC的外围输入电路。

第一个是电位器产生可调电压,中间的PA0,也就是滑动端可以输出一个0-3.3v可调的电压输出,当滑动端向上时,电压增大,往下滑时,电压减少,另外这里电阻的阻值不能太小,太小可能会损坏,至少要接千欧的电阻。

第二个是传感器输出电压的电路,它们都可以等效为一个可变电阻,因为电阻阻值无法直接测量,所以这里可以通过和一个固定电阻串联分压,来得到一个反应电阻值电压的电路,这里传感器阻值变小时,下拉作用变强,输入端电压就下降。传感器阻值变大时,下拉作用变弱,输出端收上拉电阻的作用,电压就会升高,固定电阻一般可以选择和传感器阻值相近的电阻。

第三个是电压转换电路,比如测量一个5v电池输入电压,但ADC只能测量不超过3.3v的电压,就可以使用电阻进行分压,上面加下面的阻值一共50K,根据分压公式,中间的电压为VIN/50K*33K,最后得到的电压就是0-3.3V.

8. STM32使用ADC单/多通道检测数据

正在写,明天发布

完整工程文件:

STM32通过ADC单通道检测数据

STM32通过ADC多通道检测数据


http://www.ppmy.cn/embedded/37326.html

相关文章

小说阅读网站的设计与实现(论文+源码)_kaic

小说阅读网站的设计与实现 摘 要 伴随着网络技术的不断创新及电子商务的飞速发展,网上阅读的方式日益发挥出其不可替代的优越性,不同的阅读网站也随之蓬勃发展,网上阅读形式以独特的优势,发展蓄势蓬勃。在线阅读作为一种全新的阅…

软考中级-软件设计师(十)网络与信息安全基础知识

一、网络概述 1.1计算机网络的概念 计算机网络的发展:具有通信功能的单机系统->具有通信功能的多机系统->以共享资源为目的的计算机网络->以局域网及因特网为支撑环境的分布式计算机系统 计算机网络的功能:数据通信、资源共享、负载均衡、高…

在Unity中实现分页数据显示和分页控制

参考:用两种简单的方式实现unity的分页效果 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Rendering.VirtualTexturing; using UnityEngine.TerrainUtils;public class PageControll…

python 使用 MQTT

目录结构 1、py代码 offRelay12-yixing.py # _*_ coding: utf-8 _*_ # 须用到第三方库:paho-mqtt # 安装命令 python3 -m pip install paho-mqttimport time import json import paho.mqtt.client as mqtt# 函数:关闭所有房间的12路继电器模块上指定的…

matlab中syms用法

syms x; f sin(x); f是syms类型: 这个代码将创建一个名为 x 的符号变量。现在,可以使用 x 进行代数运算,比如求导、积分、解方程等。 用法: 1.求导: syms x f x^2 2*x 1; df diff(f, x);2阶求导: df…

N7552A是德科技N7552A电子校准件

181/2461/8938产品概述: 更小巧轻便的 2 端口模块,支持 3.5 mm 或 N 型 50 Ω 连接器,能够将校准时间缩短一半 特点 频率范围:直流至 9 GHz 使用 N 型或 3.5 mm 连接器 更小巧轻便的 2 端口电子校准件(ECal&#xff…

[Linux] GDB使用指南----包含CentOS7下安装以及使用

什么是GDB? GDB 是由 GUN 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境,GDB 是 Linux 和许多 类Unix系统的标准开发环境。可以用来调试C、C、Go、java、 objective-c、PHP等语言。 GDB的作用 程序启动时,可…

Mybatis-Plus大批量插入数据到MySQL

MyBatis-Plus的saveBatch方法 GetMapping("/save1") public void save1() {// 数据准备List<MallOrder> orderList getMallOrderList();// mybatis-pluslong start System.currentTimeMillis();mallOrderService.saveBatch(orderList);System.out.println(&…