乐于分享
好东西不私藏

ADC模数转换:硬件设计与软件开发要点

ADC模数转换:硬件设计与软件开发要点

ADC模拟/数字转换器作为嵌入式系统的核心部件,承担着将连续模拟信号转换为可处理的离散数字信号的关键任务。

在合宙的硬件产品中,ADC接口广泛应用于各类模拟电压信号的检测,典型场景包括电池电压检测、温湿度传感、TDS水质检测等。

以Air780EPM系列低功耗模组为例:

模组内部ADC精度12bits,足以满足多数常见应用场景的需求,如温湿度传感器、压力传感器、音频信号处理等;对于需要更高精度的应用,也可以外挂更高精度的ADC,如16位、24位等。使用过程中需注意量程范围,避免因输入电压超限导致测量失效或硬件损坏。

本文将分享硬件参考设计及LuatOS开发相关API,带你快速了解ADC的软硬件实现要点。

01. 模组相关管脚

Air780EPM系列模组与ADC相关的管脚,包括:

  • ADC0,PIN9;

  • ADC1,PIN96;

  • ADC2,PIN77;

  • ADC3,PIN76;

02. 主要功能说明

虽然我们在沟通和交流中习惯称为ADC,但更为准确的称呼应该是AUXADC,AUXADC是芯片内部的辅助ADC通道,主要用于温度监测、电池电量检测等。

Air780EPM系列模组共有4个AUXADC通道,包含以下三个主要功能:

1)外接模拟电压信号检测通路

  • 选择内部分压电路,适用于外接信号电压范围为0~3.3V;

  • 选择直通AUXADC输入端的通路,适用于电压范围0~1.6V;或经外部分压后在1.6V,分压后电压范围需控制 0~1.6V。

2)VBAT电压检测通路

VBAT电压经过分压电路到达AUXADC输入口。

3)温度传感器检测通路

模组芯片内部温度检测:芯片温度发生变化时,片内Thermal Sensor的电压信号也会随之变化,将THM_VBE信号送至AUXADC测试。

▼  ADC内部框图  ▼


相关注意事项如下:

  • 图中用AIO表示从外部输入到模组内部AUXADC的部分,可以理解为直接连接到模组ADC管脚的电平;

  • 片内电阻绝对偏差:MAX= ±8.5%(-40~85 ℃);

    片内电阻的相对偏差,阻值比误差:MAX=+/-0.15%(-40~85 ℃);

  • AUXADC可以选择内部分压,也可以选择外部分压,不管选择外部分压还是内部分压,都需要调整合适的分压比,保证AUXADC输入端电压在0~1.6V范围;

  • 当被测电压低于1.6V时:外部无需分压,内部也无需分压;

    LuatOS ADC函数对应选择:

    adc.ADC_RANGE_MIN

  • 当被测电压低于3.3V时:外部无需分压,内部需要分压至1.6V以内,LuatOS已将该部分在底层做好,ADC函数对应选择:

    adc.ADC_RANGE_MAX

  • 当被测电压大于3.3V时:内部无需分压,外部需要分压至1.6V以内,LuatOS已将该部分在底层做好,ADC函数对应选择:

    adc.ADC_RANGE_MIN

  • 读取模组芯片温度的常量为:

    adc.CH_CPU可检测温度范围为-40 °C~85 °C ,外部硬件电路上无需任何操作;

  • 读取VBAT电压的常量为:

    adc.CH_VBAT电压范围为2.2~4.8V;在VBAT输入电压范围3.3~4.35V之内,外部硬件电路上无需任何操作。

03. ADC性能参数

  • 分辨率:12bit

  • 时钟频率(Fc):1.625MHz~6.5MHz

  • 采样频率:Fc/16

  • 典型功耗:500μA

更多参数说明,详见下方图表:

04. 注意事项及硬件参考设计

AUXADC的有效输入范围为0.1~1.5V,在0~0.1V和1.5~1.6V范围可能存在较大误差,不建议使用; 

外部分压时,如果AUXADC输入电压无法满足低于1.6V,以NTC电阻为例,可使用如下图右侧所示电路进行分压设计

如果不希望ADC变化太快,可以通过软件算法处理,过滤掉变化较大的数值,也可以在硬件电路上增加滤波电路; 

比如,外部分压时,可以增加滤波电容增加ADC输入稳定性,但缺点是ADC的细微变化会被过滤掉,请根据实际需要谨慎选择。

特别说明:R300可以增加ESD能力,阻值建议为510Ω,不建议使用K级阻值的电阻。

参考设计如下图示:

05. 与ADC相关的LuatOS API

关于LuatOS中ADC相关API的介绍,详见:

https://docs.openluat.com/osapi/core/adc/

特别说明:

  • 所有ADC共用一个通道,同时只能调用一路ADC采样,包括芯片温度、VBAT电压;

  • ADC打开( adc.open() )后,会产生约500μA的功耗,如需低功耗控制,请将ADC关闭( adc.close() ); 

示例代码:

合宙LuatOS提供一站式物联网高效解决方案,集成高速通信、外设驱动、UI交互及视觉处理,助力行业客户快速落地产品,同时实现极致低功耗——相较于传统的“串口屏+DTU方案”或安卓方案,功耗减半,成本不足三分之一。

更多开发资料,详见合宙资料中心:

docs.openluat.com