【嵌入式外设精学】Day16|ADC:分辨率、采样时间、平均滤波 【嵌入式外设精学】Day16ADC分辨率、采样时间、平均滤波今天解决读数抖、通道串扰、静态值偏分别怎么处理目录问题 2. 原理 3. 代码 4. 误区 5. 自测 6. 答案1. 问题同一电压码字乱跳多通道轮流读时互相影响2. 原理2.1 分辨率12bit 表示把参考电压分成约 4096 档。档数不等于“一点不抖”噪声、参考电压不稳都会让码字跳。2.2 采样时间ADC 内部先给一个采样电容充电再转换。信号源内阻大、采样时间太短 → 电容没充够 → 读数偏、通道之间“残留”上一通道的电压。多通道轮流扫时更要把采样时间留够。2.3 平均滤波多次采样求平均能压噪声但会变“钝”有滞后。现场常用“连续 N 次平均”或“滑动平均”。2.4 电压换算12bit、参考 3.3V 时一码约 3.3/4095 ≈ 0.8mV。以实际参考电压和校准为准。3. 代码示例#includestm32f4xx.h#includestdint.huint16_tadc_read_once(uint8_tchannel){ADC_RegularChannelConfig(ADC1,channel,1,ADC_SampleTime_84Cycles);ADC_SoftwareStartConv(ADC1);while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)RESET){}returnADC_GetConversionValue(ADC1);}uint16_tadc_read_avg(uint8_tchannel,intn){uint32_ts0;inti;for(i0;in;i){sadc_read_once(channel);}return(uint16_t)(s/(uint32_t)n);}floatadc_to_volt(uint16_tx,floatvref){return(float)x*vref/4095.0f;}滑动平均1ms 调一次窗口 8staticuint16_thist[8];staticuint8_tidx;staticuint32_tsum;uint16_tadc_slide_push(uint16_tx){sumsum-hist[idx]x;hist[idx]x;idx(uint8_t)((idx1u)7u);return(uint16_t)(sum3);}4. 常见误区误区正解12bit 就是绝对准有噪声和误差看有效位采样时间越短越好源阻抗大时会测不准平均点数无限大滞后变大动态信号失真不必看参考电压换算必须用真实 Vref5. 自测12bit码 2048Vref3.0V电压约多通道串扰优先改什么6. 答案约1.5V。加长该通道采样时间或通道间加缓冲/延时硬件上降低源阻抗。作者shuifanyu标签ADC采样滤波