文章目录
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转换所需要的时间,它由两部分组成:
- 采样时间:ADC模块在将模拟信号转换成数字信号前,需要一定的时间来采样模拟信号。这段时间是可编程的,可以根据信号的性质和需要的精度来调整。
- 转换时间:这是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多通道检测数据