个人技术分享

文章目录

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. 引脚定义

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

通道编号 ADC1 ADC2 ADC3
通道0 PA0 PA0 PA0
通道1 PA1 PA1 PA1
通道2 PA2 PA2 PA2
通道3 PA3 PA3 PA3
通道4 PA4 PA4 PF6
通道5 PA5 PA5 PF7
通道6 PA6 PA6 PF8
通道7 PA7 PA7 PF9
通道8 PB0 PB0 PF10
通道9 PB1 PB1
通道10 PC0 PC0 PC0
通道11 PC1 PC1 PC1
通道12 PC2 PC2 PC2
通道13 PC3 PC3 PC3
通道14 PC4 PC4
通道15 PC5 PC5
通道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单通道检测数据

STM32通过ADC多通道检测数据