ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量。(读取电压值就必须用到AD)
- 12 位逐次逼近型 ADC,1us 转换时间
- 输入电压范围:0~3.3V,转换结果范围:0~4095
- 18 个输入通道,可测量 16 个外部和 2 个内部信号源
- 规则组和注入组两个转换单元
- ADC 采集引脚电压,将其转换为数字量并存储至寄存器,CPU 可从寄存器读取该转换结果。
逐次逼近型ADC:

下面的地址锁存译码模块,输出信号去控制上面的多路模拟通道选择开关。
并且如果想转换多路信号,不必设计多个AD转换器,只需设计一个AD转换器再加一个多路选择开关即可。
在电压比较器中通路中的待测电压与DAC的电压输出端进行比较,这个DAC输出的电压用二分法不断变大变小,直到与输入电压相等。
这个电压数据将锁存到寄存器中。
ADC基本结构:

16个外部通道与两个内部通道,AD转换器中存在两个组(注入组一次选中4个通道,规则组一次选中16个通道。),转换结果存到数据寄存器中。
RCC提供的clock推动完成逐次逼近。
看门狗检测,如果超过了设定的阈值,就通过中断输出控制,想NVIC申请中断。
ADC转换模式:
- 单次转换:触发一次,只转换 1 个通道,转换完成就停下。
- 连续转换:触发一次之后,自动反复不停转换同一个通道。
- 扫描转换:预先配置好一组通道序列,触发后自动按顺序逐个切换通道完成转换。
AD单通道代码:
(只用来检测PA0口处的电压数据)
第一步:开启RCC时钟,包括ADC和GPIO的时钟。
第二步:配置GPIO,将需要用到的GPIO配置成模拟输入模式
第三步:配置多路开关,把左边通道接入到右边的规则组列表里。
第四步:配置ADC转换器(是用结构体,和库函数)
第五步:开启ADC。
AD模块代码:


主函数代码:

AD多通道代码:
还是用单次转换,非扫描模式(必须手动(软件)修改通道)
- GPIO 要初始化所有用到的引脚(PA0~PA3)
- 每次采集前都执行
ADC_RegularChannelConfig,动态修改当前转换通道 - 函数入参传入通道号,软件手动切换通道
- 其余 ADC 底层配置(单次、非扫描、校准、等待 EOC)逻辑和单通道完全一样

