首页/外设速查/ADC
🎚️

ADC 模数转换

基础外设
把模拟电压量化成数字值,是传感器采集的核心入口,逐次逼近型最常见。
🧩 核心原理
📈 时序 / 工作过程图
ADC 采样-保持-转换时序模拟电压 → 采样保持电容 → 逐次逼近寄存器 → 数字值通道电压Vin采样保持采样保持采样逐次逼近:每通道需 采样时间(>最小tS) + 转换时间(12位≈12个ADC时钟)。多通道+DMA可连续扫描数字值 = Vin / Vref × 4095(12位)
⚙️ 配置 / 使用要点
  1. 使能 ADC/GPIO 时钟,引脚配模拟输入
  2. 配置分辨率/对齐/扫描/连续模式
  3. 配置规则组通道与采样时间
  4. 配置 DMA(多通道)+ 使能转换完成中断
🛠️ 项目示例
多通道 ADC + DMA 连续采样(温度/电压监测)
// ADC1 扫描 CH0(CH1:PA1 电压) CH1(PA2 温度) → DMA 到数组
ADC_HandleTypeDef hadc1 = {0};
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ENABLE;       // 扫描多通道
hadc1.Init.ContinuousConvMode = ENABLE; // 连续转换
hadc1.Init.NbrOfConversion = 2;
HAL_ADC_Init(&hadc1);

ADC_ChannelConfTypeDef cc = {0};
cc.Channel = ADC_CHANNEL_0; cc.Rank = 1; cc.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
HAL_ADC_ConfigChannel(&hadc1, &cc);
cc.Channel = ADC_CHANNEL_1; cc.Rank = 2;
HAL_ADC_ConfigChannel(&hadc1, &cc);

uint16_t buf[2] = {0};
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)buf, 2);
// 电压 = buf[0] * 3.3f / 4095.0f
❓ 面试高频
12位ADC分辨率和1LSB怎么算?
分辨率=2^12=4096级;1LSB = Vref/4096,Vref=3.3V 时约 0.806mV
为什么需要采样保持?
转换期间输入电压必须稳定,采样电容充电后与输入断开,保证转换精度
采样时间太短会怎样?
电容充不满,高阻源会采不准——高阻抗信号源需更长采样时间或加缓冲
怎么提高ADC精度?
PCB走线远离开关电源、加RC滤波、软件多次采样取平均、校准
✅ 自查清单 (点击勾选,本地保存)
0/0
会算ADC换算公式
理解采样-保持-转换三阶段
知道采样时间与阻抗关系
会用DMA多通道扫描
知道Vref对精度的影响