描述
很多开发者在嵌入式项目中都会用到传感器采集信号,无论是温度、光照,还是电压电流测量,都离不开 ADC(模数转换器)。但是,很多人对 ADC 的使用仍停留在“能读就行”的层面,忽略了精度、采样率、参考电压等关键因素。今天,我们就从原理到实战,带你搞懂 ADC,帮你精准读取传感器信号。
一、ADC 基础回顾
ADC(Analog-to-Digital Converter)是将连续的模拟信号转换为数字信号的模块,便于 MCU 处理。
- 分辨率:ADC 能输出的数字位数。比如 12 位 ADC 的输出范围是 0~4095,对应参考电压范围。
- 采样率:ADC 每秒能读取多少次信号,单位 Hz。
- 参考电压(Vref):ADC 将模拟信号映射到数字值的参考电压。
二、如何选择 ADC 通道
STM32 等 MCU 的 ADC 通常带多个通道,用于采集不同的传感器信号。选择时要注意:
- 信号源的电压范围:确保传感器输出在 Vref 范围内。
- 通道干扰:避免高频信号或噪声信号靠近 ADC 引脚。
- 引脚复用:一些 ADC 引脚可能同时有其他外设功能,需要查看手册。
三、ADC 精度优化技巧
- 稳定参考电压:使用 LDO 或参考芯片,减少 Vref 波动。
- 信号滤波:在 ADC 输入端加 RC 滤波或低通滤波,降低高频干扰。
- 多次采样平均:通过软件对多次采样结果取平均,提高测量精度。
- 降低采样速率:在允许情况下,适当降低 ADC 采样率,减小噪声影响。
四、STM32 ADC 使用实战
假设我们要读取一个光敏电阻的电压值:
- #include"stm32f1xx.h"
-
- void ADC_Config(void){
- RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;// GPIOA 时钟
- RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;// ADC1 时钟
-
- GPIOA->CRL &=~GPIO_CRL_CNF1;// PA1 模拟输入
- GPIOA->CRL &=~GPIO_CRL_MODE1;
-
- ADC1->SQR3 =1;// 第1个通道
- ADC1->SMPR2 |= ADC_SMPR2_SMP1;// 采样时间
- ADC1->CR2 |= ADC_CR2_ADON;// 开启 ADC
- }
-
- uint16_t ADC_Read(void){
- ADC1->CR2 |= ADC_CR2_ADON;// 启动转换
- while(!(ADC1->SR & ADC_SR_EOC));
- return ADC1->DR;
- }
-
- int main(void){
- ADC_Config();
- while(1){
- uint16_t value = ADC_Read();
- // 处理采样值,例如转换为电压或亮度
- }
- }
五、多通道采样与 DMA
当你需要同时读取多个传感器信号时,单次轮询效率低,容易拖慢 MCU 主循环。此时可以使用 ADC 的扫描模式 + DMA:
- 配置 ADC 扫描模式,依次采集多个通道。
- 配置 DMA,将采样结果自动存储到内存数组中。
- MCU 只需在数据更新后处理数组,无需频繁轮询。
六、ADC 与实际传感器匹配
不同传感器信号特点不同,需要匹配 ADC 参数:
- 高阻抗传感器(如光敏电阻、电位器):需要合适的采样电阻或缓冲电路。
- 低幅值信号(如温度传感器):可通过运放放大,提高 ADC 精度。
- 快速变化信号(如加速度计):需要更高采样率或使用 DMA 结合中断。
七、常见坑点
- 忽略 Vref 稳定性:参考电压波动会直接影响采样精度。
- 采样时间太短:高阻抗输入在短采样时间下可能不稳定。
- 引脚干扰:ADC 输入邻近高频信号会引入噪声。
- 单次采样依赖性高:未做多次平均,导致测量抖动明显。
八、小结
通过今天的学习,你应该掌握了:
- ADC 的基本原理、分辨率和采样率
- 如何选择 ADC 通道并减少干扰
- 软件与硬件结合提高 ADC 精度的方法
- STM32 下 ADC 实战代码示例
- 多通道采样与 DMA 使用
- 不同传感器信号与 ADC 匹配策略
掌握这些内容后,你就能在嵌入式项目中精准读取各种传感器信号,为数据处理和控制算法提供可靠输入。
打开APP阅读更多精彩内容