ADC模数转换器

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)逻辑和单通道完全一样
相关推荐
我叫洋洋2 小时前
I2C 为什么必须用开漏输出?从推挽短路、线与,到上拉电阻取值
单片机·嵌入式硬件
无敌贵点大王2 小时前
从寄存器层面重学STM32(5)——串口USART理论部分
stm32·单片机·嵌入式硬件
女神下凡2 小时前
芯参谋(83):AliOS Things_驱动开发指南
arm开发·驱动开发·单片机·嵌入式硬件·设计规范·1024程序员节
女神下凡2 小时前
芯参谋(84):Linux eMMC 驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件
szxinmai主板定制专家14 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
HQB202617 小时前
屹晶微电子 EG1130|2‑24V 输入 / 最高 28V 输出 内置 MOS 异步升压 DC‑DC|SOT23‑6|摄像头 / 车充 / 电池充电电源
嵌入式硬件·硬件工程
泛凡(Linyongui)18 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
十年磨一剑~19 小时前
Linux 内核中断处理机制与软硬件协同流程
linux·嵌入式硬件
糖糖单片机设计20 小时前
基于单片机的热水器节能控制系统
单片机·嵌入式硬件