任务介绍
设计一款基于普及型ADC芯片的电压采集模块,作为各类测量系统的入门基础。
1、核心设计要求
芯片选型:选用ADS1115或同类入门级ADC芯片
功能目标:将外部0-5V或0-12V的模拟电压信号转换为数字量,通过I2C或SPI数字接口输出给MCU读取处理
量程适配:设计分压电阻网络,解决ADC芯片仅支持低电压输入的量程转换需求
2、PCB设计规范
电源处理:在芯片电源引脚旁紧贴放置去耦电容,保障供电稳定
外设配置:板上配备接线端子,方便外部模拟信号接入
接口配置:预留MCU专用接口,方便与主控板快速连接
制作出可稳定采集外部电压、并将数字量传输给单片机的功能模块,作为学习模拟信号数字化处理的入门实践载体。
设计方案介绍
本次选用的ADS1115是一个四通道的ADC采集芯片,我们需要对输入通道进行划分,比如对于高压信号的数据如何分配,这样实现支持大量程采集。本次的设计主要包含硬件模块如下:
模块介绍
本次选用TI的ADS1115作为核心器件,设计多通道数据采集模块。这款16位Δ-Σ架构ADC采用超小封装,仅2mm×1.5mm,适配空间受限的嵌入式与便携设备。它支持2.0V-5.5V宽压供电,可直接对接3.3V/5V MCU,无需额外电平转换。芯片高度集成内置低漂移基准源、PGA与精密振荡器,无需外挂周边电路,大幅简化设计、降低BOM成本。它支持4路模拟输入,可切换单端/差分采集模式,通过I2C接口通信,最多可挂载4片实现16通道扩展,采样速率8-860SPS可调,功耗低至0.5μA,还自带阈值比较中断功能,是传感器采集、便携仪表、环境监测等场景的高性价比入门ADC方案。
原理图和PCB模块介绍

原理图
PCB
3D效果图
实物图
调试记录
我们这次设计的是一个4通道的ADC采集模块,最多支持四路的ADC采集,,通过I2C接口进行配置和通信,这次我们使arduino R4开发板进行基本控制和通信,使用便携调试装备输出1.67V,基本连接如下:
这里我们找到了一个arduino库进行快速验证,注意addr引脚的连接要对应上,具体代码如下:
#include <Wire.h>
#include <DFRobot_ADS1115.h>
DFRobot_ADS1115 ads(&Wire);
void setup(void)
{
Serial.begin(115200);
ads.setAddr_ADS1115(ADS1115_IIC_ADDRESS1); // 0x48
ads.setGain(eGAIN_TWO); // 2x gain
ads.setMode(eMODE_SINGLE); // single-shot mode
ads.setRate(eRATE_128); // 128SPS (default)
ads.setOSMode(eOSMODE_SINGLE); // Start a single-conversion (default)
ads.setCompMode(eCOMPMODE_TRAD); // Traditional comparator with hysteresis (default)
ads.setCompPol(eCOMPPOL_LOW); // Comparator polarity: Active low (default)
ads.setCompLat(eCOMPLAT_LATCH); // Latching comparator
ads.setCompQue(eCOMPQUE_ONE); // Comparator queue: Assert after one conversion
// ADC Range: 2x gain (1 bit = 0.0625mV)");
// Serial.println("Comparator High Threshold: 32000 (2.000V)");
ads.setHighThreshold(32000);
ads.init();
delay(1000);
}
void loop(void)
{
if (ads.checkADS1115())
{
int16_t result01, result03, result13, result23;
Serial.println("Get the voltage difference between two channels");
Serial.println(" ");
result01 = ads.comparatorVoltage(01);
Serial.print("The voltage difference between A0 and A1 ");
Serial.print(result01);
Serial.println("mV");
result03 = ads.comparatorVoltage(03);
Serial.print("The voltage difference between A0 and A3 ");
Serial.print(result03);
Serial.println("mV");
result13 = ads.comparatorVoltage(13);
Serial.print("The voltage difference between A1 and A3 ");
Serial.print(result13);
Serial.println("mV");
result23 = ads.comparatorVoltage(23);
Serial.print("The voltage difference between A2 and A3 ");
Serial.print(result23);
Serial.println("mV ");
}else
{
Serial.println("ADS1115 Disconnected!");
}
delay(1000);
}
注意地址的选择以及基本的配置。
串口打印效果,可以看到我们连接的通道可以采集正确的电压,但是悬空的通道也有居然有输出啊,后续设计可以注意,不要悬空:

心得体会
本次设计的核心是做一块功能完整的ADC电压采集模块,最大的亮点是同时提供4路独立的模拟输入通道,用户可以一次性接入4个不同的电压信号进行采集,灵活性远超单通道方案,能很好地应对多传感器同时测量的实际场景。我们使用arduino进行代码配置和通信可以看到对于正常连接外部信号的通道,采集的数据非常的准确,说明精度还是挺不错的。