今天梳理下ARM学习里的ADC相关内容,都是嵌入式入门的基础点。
ADC即模数转换器,核心作用是把温度、压力这类连续的模拟信号,转换成处理器可识别的数字电压值。像LM75温度传感器采集的温度信号就是模拟量,必须经过ADC转换,单片机才能读取处理。
逐次逼近型ADC是最常用的一类,核心逻辑就是逐次逼近法,本质是二分查找。以5V基准电压为例,把电压区间不断对半拆分,让待测电压和区间中间值逐一比较,大于中间值记1,小于则记0,一步步缩小范围,最终逼近真实电压值。
比如待测3.2V、基准5V的场景:第一次和2.5V比较,3.2V更高,最高位记1;接着在上半区间和3.75V比较,3.2V更低,下一位记0;再和3.125V比较......以此类推,数次比较后就能得到对应的数字量。
完整的ADC转换流程分几步:先按设定的采样频率对模拟信号采样,再通过逐次逼近的方式完成量化,把连续的模拟电压映射到离散的数字刻度上,最后编码输出二进制数字结果。采样率也就是每秒采样的次数,单位Hz,按需选择即可。
再说说ADC分辨率,指的是用多少位二进制数来表示转换结果,位数越高,能划分的电压等级越精细,最小可识别的电压变化就越小。常见的有8位(对应256级)、10位(1024级)、12位(4096级),16位的一般多用于DSP场景。
实际电压换算很简单,拿10位ADC、5V基准举个例子:
uint16_t adc_raw = 650; // ADC采样原始值
float vref = 5.0f; // 基准电压
float voltage = (float)adc_raw / 1023 * vref;
采样得到的原始数据通常存在误差,一般都会做滤波处理,常用的滤波算法有均值滤波、高通滤波、低通滤波,对精度要求高的场景还会用到带预测性的卡尔曼滤波。
顺带提两个常用的I2C外设,一个是AT24C02型EEPROM,容量2Kbit即256字节,设备地址0x50;另一个是LM75温度传感器,工作电压2.7V~5.5V,测温范围-55℃~125℃,精度±2~±3℃,9位分辨率对应0.5℃步进,设备地址0x48,温度寄存器地址0x00,读取2字节数据后舍弃低7位,就能得到当前温度值,都是入门常练的器件。
都是很基础的概念,但做嵌入式开发这些都是底层根基,先吃透没坏处。