ADC介绍:
- ADC(Analog-Digital Converter)模拟-数字转换器.
- ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
- 12位逐次逼近型ADC(分辨率0-4095),1us转换时间(开始到产生结果)
- 输入电压范围:0~3.3V,转换结果范围:0~4095(电压和转换结果对应着线性关系)
- 18个输入通道,可测量16个外部(GPIO口)和2个内部信号源(内部温度传感器、内部参考电压)(1.2V左右,不随外部电压变化)
- 规则组和注入组两个转换单元(一次性启动一个组,一个组一个组的转换)
- 模拟看门狗自动监测输入电压范围(可以测量温度,光线等,达到阈值,执行操作)
- STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道(最多外部10个引脚输入)
逐次逼近型ADC:
通道选择开关:可以接入多路信号输入进行转换,不必设计多个ADC转换器,通过三路地址锁存和译码进行选择。选中对应通道进行转换即可
输入端一端是DAC输出已知编码的电压,另一端是未知的电压。同时输入电压比较器进行比较,逐次二分法逼近。最后进行输出。
clock时钟驱动,EOC:end of convert转换结束信号,start:开始信号。Vref+ ,Vref-是DAC的参考电压。(给一个数据255,是对应3.3v还是5v由参考电压决定,也决定了ADC的输入范围,也是ADC的参考电压 vcc,gnd供电,一般和参考电压一起连接。
Stm32的ADC外设:
- 16路输入,2路内部输入,通过多路开关进行选择
- 普通模式:输入数据,进行转换输出
- Stm32采用组模式,一次处理一组数据,分为规则通道和注入通道
- 规则通道一次可以处理16通道数据,然而数据只能保存一通道,会被覆盖,需要配合DMA使用快速转存数据
- 注入通道可以选择4通道数据,同时也能保存住数据。
-
触发Start:
1软件触发:编写代码进行触发
2硬件触发:主要来自定时器,TRGO,也可以选择外部中断引脚来触发转换
-
供电时钟部分:
VDDA,Vssa:内部模拟电路电源
ADC预分频器来自RCC_APB2
完成后:
EOC可以触发中断。
可以部署模拟看门狗监视转换结果的范围,超出可以申请中断
-
3工作流程图:
-
转换模式:分单次转换、连续转换和扫描模式和非扫描模式。
-
-
转换模式:
-
通过序列1进行转换,输入通道数,触发,输出结果,EOC置1,表示转换完成
非扫描模式:仅用第一个
单次转换:仅一次一次来
-
-
-
-
引脚对应图:
-
数据对齐:
ADC是12位的,转换结果就是12位的数据。数据寄存器是16位的,需要对齐数据。
常用数据右对齐。左对齐将数据放大了。可以降低数据分辨率
-
转换时间:
- AD转换的步骤:采样,保持,量化,编码
- STM32 ADC的总转换时间为:
-
TCONV = 采样时间(采样保持花费时间) + 12.5个ADC周期(ADCCLK,最大14mhz)
- 例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期
-
TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs
校准:
- ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差
- 建议在每次上电后执行一次校准
- 启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期
- 通过代码进行配置即可
-
运行流程:
1开启GPIO,AD时钟,配置AD的时钟。
2配置GPIO模拟输入
3配置ADC模块:配置通道,初始化。
4其他需求:中断、看门狗
5开启ADC
6对ADC进行校准while等待
6编写程序触发转换1ADC_SoftwareStartConvCmd
2获取标志位状态,利用while等待
3取结果(会自动清除标志位)
(连续转换不需要在程序中触发转换,在init中触发一次即可,也不需要获取标志位,直接取结果就行。
使用单通道实现多次扫描:在软件触发程序手动更改通道)
-
相关库函数:
RCC_ADCCLKConfig:
ADC_DeInit
ADC_Init
ADC_StructInit
ADC_Cmd
ADC_DMACmd:使用DMA输出数据时需要用这个开启
ADC_ITConfig:通往NVIC
ADC_SoftwareStartConvCmd:软件触发
ADC_GetFlagStatus:检查EOC标志位是否置1了,检查转换是否结束
ADC_RegularChannelConfig:配置通道