A40I平台与ADS1015 ADC芯片的工业数据采集方案

📅 2026/7/17 18:40:39 👁️ 阅读次数 📝 编程学习
A40I平台与ADS1015 ADC芯片的工业数据采集方案

1. A40I平台与ADS1015 ADC芯片概述

TQA40I_CoreB核心板作为一款集成Mali400 MP2 GPU图形处理器的嵌入式平台,其多显示接口特性(RGB/双LVDS/HDMI/MIPI)使其在工业HMI领域广泛应用。而ADS1015作为TI推出的12位精度、3.3kSPS采样率的低功耗ADC芯片,通过I2C接口可实现四路单端或两路差分信号采集,两者结合可满足多数工业传感器数据采集需求。

在实际项目中,将ADS1015移植到A40I平台主要面临三个技术挑战:

  1. I2C总线时序适配:A40I的I2C控制器时钟配置需匹配ADS1015的400kHz标准模式
  2. 电压基准校准:需根据A40I的3.3V供电设计分压电路
  3. 数据格式转换:处理ADS1015的二进制补码输出到实际电压值的映射

2. 硬件连接与电路设计要点

2.1 引脚定义与物理连接

ADS1015与A40I的典型连接方式如下表所示:

ADS1015引脚A40I对应引脚备注
VDD3.3V需加10μF去耦电容
GNDGND共地连接
SCLGPIOX_19需配置为上拉模式
SDAGPIOX_20需配置为上拉模式
ADDRGND地址引脚接地表示0x48
A0-A3传感器信号建议加RC滤波(1kΩ+0.1μF)

注意:A40I的I2C引脚内部上拉电阻通常为10kΩ,若线缆较长需外接4.7kΩ强上拉

2.2 基准电压电路设计

ADS1015的FSR(满量程范围)由基准电压决定,推荐电路设计:

// 基准电压生成方案 3.3V ──┬── 2.5kΩ ──┬── VREF │ │ 4.7μF 4.7kΩ │ │ GND GND

此分压电路可提供2.048V基准电压,对应±2.048V量程。若需要更高精度,可采用REF5025基准源芯片。

3. 驱动移植与内核配置

3.1 I2C总线设备树配置

在A40I的DTS文件中添加以下节点:

&i2c2 { status = "okay"; clock-frequency = <400000>; ads1015: adc@48 { compatible = "ti,ads1015"; reg = <0x48>; #address-cells = <1>; #size-cells = <0>; channel@4 { reg = <4>; ti,gain = <2>; ti,datarate = <4>; }; }; };

关键参数说明:

  • clock-frequency:必须设为400kHz(标准模式)
  • ti,gain:PGA增益设置,2对应±2.048V
  • ti,datarate:采样率设置,4表示1600SPS

3.2 内核驱动移植步骤

  1. 确认内核已启用CONFIG_IIO_TI_ADS1015选项
  2. 若使用旧内核需手动移植驱动:
# 从TI官网下载驱动源码 wget https://www.ti.com/lit/zip/sbac123 unzip sbac123 -d drivers/iio/adc/
  1. 修改Makefile:
obj-$(CONFIG_IIO_TI_ADS1015) += ti-ads1015.o
  1. 编译并加载模块:
make -j8 M=drivers/iio/adc/ insmod ti-ads1015.ko

4. 应用层数据采集实现

4.1 通过sysfs接口读取数据

ADS1015驱动注册后会在/sys/bus/iio/devices/下生成设备节点:

# 查看可用通道 ls /sys/bus/iio/devices/iio:device0/ # 读取通道4数据 cat /sys/bus/iio/devices/iio:device0/in_voltage4_raw

4.2 使用libiio库的示例代码

#include <iio.h> #include <stdio.h> int main() { struct iio_context *ctx = iio_create_local_context(); struct iio_device *dev = iio_context_find_device(ctx, "ads1015"); struct iio_channel *chan = iio_device_find_channel(dev, "voltage4", false); float voltage; iio_channel_attr_read(chan, "scale", &voltage, sizeof(voltage)); iio_channel_enable(chan); while(1) { short raw; iio_channel_read(chan, &raw, sizeof(raw)); printf("Voltage: %.3fV\n", raw * voltage / 32767.0); usleep(100000); } iio_context_destroy(ctx); return 0; }

编译命令:

gcc adc_read.c -liio -o adc_read

5. 调试过程中的典型问题排查

5.1 I2C通信失败排查流程

  1. 确认设备地址:
i2cdetect -y 2 # 检测I2C2总线设备
  1. 检查信号质量:
# 需要逻辑分析仪观察SCL/SDA波形 # 正常波形应满足: # - 上升时间 < 300ns # - 下降时间 < 300ns # - 时钟占空比45%~55%
  1. 验证上拉电阻:
# 测量SCL/SDA线电压 # 高电平应 > 0.7VDD (2.31V@3.3V)

5.2 数据异常处理方案

当采集值出现跳变或归零时,按以下步骤排查:

  1. 电源干扰检测:
# 用示波器观察VDD纹波 # 正常应 < 50mVpp
  1. 基准电压验证:
# 测量VREF引脚电压 # 偏差应 < ±1%
  1. 输入保护检查:
# 确认输入信号不超过(VDD+0.3V) # 过压时需增加TVS二极管

6. 性能优化与进阶应用

6.1 多通道轮询方案

通过配置config寄存器的MUX字段实现自动通道切换:

// 设置连续转换模式 uint16_t config = 0x8583; // AIN0-AIN1差分, 1600SPS, 连续转换 i2c_smbus_write_word_data(client, 0x01, __swab16(config));

6.2 硬件触发同步采集

利用A40I的GPIO中断实现硬件同步:

  1. 连接ADS1015的ALERT引脚到A40I的中断引脚
  2. 配置比较器阈值寄存器:
# 设置高阈值寄存器 echo 32760 > /sys/bus/iio/.../events/in_voltage4_thresh_rising_value # 启用中断 echo 1 > /sys/bus/iio/.../events/in_voltage4_thresh_rising_en
  1. 在中断服务程序中读取数据

6.3 温度补偿实现

针对高精度需求,需补偿ADS1015的增益误差(典型值±0.15%):

def temp_compensation(raw, temp): # -0.0005V/°C的温度系数 return raw * (1 + 0.0015 * (25 - temp))

在完成基础功能移植后,建议通过IIO Scope工具进行实时波形观测,该工具可通过以下命令安装:

apt install iio-oscilloscope

实际项目中遇到的典型问题往往是电源噪声引起的采样值波动,这时需要在PCB布局时注意:

  1. 将ADC的电源与数字电源用磁珠隔离
  2. 在VDD引脚就近放置10μF+0.1μF去耦电容
  3. 模拟地平面与数字地平面单点连接