这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【ArduinoGIGAR1WiFi-开发板测评】+成果帖:基于AD7606多通

共1条 1/1 1 跳转至

【ArduinoGIGAR1WiFi-开发板测评】+成果帖:基于AD7606多通道数据采集系统

工程师
2026-03-19 20:16:17     打赏
1. 项目概述

本项目利用 Arduino GIGA R1 WiFi 的高性能和丰富连接性,结合 AD7606 系列 8 通道同步采样 ADC,构建一个多通道数据采集系统。系统可实现高速、高精度模拟信号采集,并通过 Wi-Fi 或以太网将数据实时上传至服务器,或存储到本地 SD 卡,适用于工业监测、音频分析、科学实验等场景。

2. 硬件连接2.1 AD7606 与 Arduino GIGA 引脚对应关系

AD7606 需要 SPI 接口及若干控制引脚。建议使用 Arduino GIGA 的 默认 SPI 接口(SPI 引脚映射见下表)和通用数字 I/O 引脚。

AD7606 引脚功能Arduino GIGA 引脚备注
SCLKSPI 时钟D13 (SCK)SPI 默认时钟引脚
MISOSPI 主机输入D12 (MISO)SPI 默认 MISO 引脚
MOSISPI 主机输出D11 (MOSI)SPI 默认 MOSI 引脚
CS片选D10 (SS)可使用其他数字引脚,此处用默认 SS
CONVST转换启动D7可自定义
BUSY忙状态输出D6可自定义
RESET复位D5可自定义
OS0-2过采样控制D2, D3, D4可自定义
RANGE量程选择D8可自定义

注意:若需要更高性能,可使用 Arduino GIGA 的 SPI1(引脚 D35~D38),但需修改代码中的 SPI 对象。

2.2 电源与参考电压
  • AD7606 通常需要 5V 模拟电源 和 3.3V 数字电源(或 5V 兼容)。Arduino GIGA 可提供 5V 和 3.3V 输出。

  • 为减少噪声,建议使用独立的外部基准电压源(如 ADR42x 系列),或利用 AD7606 内部基准(默认 2.5V)。

  • 模拟输入端需根据信号类型配置抗混叠滤波器。

3. 软件设计3.1 驱动移植

将原有的 AD7606C 库(针对 ESP32)移植到 Arduino GIGA 平台。主要修改点:

  • SPI 初始化:使用 Arduino 标准 SPI 库,无需手动创建 SPIClass 对象,直接使用 SPI 对象。

  • 引脚定义:使用宏定义将硬件引脚与代码中的变量关联。

  • 中断处理:BUSY 引脚可通过外部中断监测,本示例采用轮询方式。

简化后的核心驱动类(AD7606C_GIGA.h 和 AD7606C_GIGA.cpp)示例:


// AD7606C_GIGA.h
#ifndef AD7606C_GIGA_H
#define AD7606C_GIGA_H

#include <Arduino.h>
#include <SPI.h>

class AD7606C_GIGA {
public:
    AD7606C_GIGA(int cs, int convst, int busy, int reset, int os0, int os1, int os2, int range);
    void begin();                // 初始化 SPI 和引脚
    void reset();                // 硬件复位
    void setOversampling(uint8_t times); // 过采样设置
    void setRange(bool range);   // 量程设置
    uint8_t readReg(uint8_t reg, uint8_t *val);    // 读寄存器
    uint8_t writeReg(uint8_t reg, uint8_t val);    // 写寄存器
    uint8_t checkID();           // 检查芯片 ID
    void config();               // 默认配置
    int32_t read(int32_t *data); // 触发转换并读取所有通道
private:
    int _cs, _convst, _busy, _reset, _os0, _os1, _os2, _range;
    uint8_t channel_mode[8];     // 存储各通道模式(双极性/单极性)
    void ipulse(int pin);        // 产生短脉冲
    uint8_t dataRead(int32_t *data); // 读取转换结果
    void convert18bitTo32bit(int32_t *unsigned_val, int32_t *pdst);
};

#endif
// AD7606C_GIGA.cpp 部分实现
#include "AD7606C_GIGA.h"

// 寄存器地址定义(同原代码)
#define AD7606_REG_STATUS 0x01
// ... 其他寄存器宏

AD7606C_GIGA::AD7606C_GIGA(int cs, int convst, int busy, int reset, int os0, int os1, int os2, int range) {
    _cs = cs; _convst = convst; _busy = busy; _reset = reset;
    _os0 = os0; _os1 = os1; _os2 = os2; _range = range;
}

void AD7606C_GIGA::begin() {
    pinMode(_cs, OUTPUT); digitalWrite(_cs, HIGH);
    pinMode(_convst, OUTPUT); digitalWrite(_convst, LOW);
    pinMode(_busy, INPUT);
    pinMode(_reset, OUTPUT); digitalWrite(_reset, HIGH);
    pinMode(_os0, OUTPUT); pinMode(_os1, OUTPUT); pinMode(_os2, OUTPUT);
    pinMode(_range, OUTPUT);

    SPI.begin(); // 初始化默认 SPI
    // 可根据需要设置 SPI 频率、模式等,在读写时临时设置
}

void AD7606C_GIGA::reset() {
    digitalWrite(_reset, LOW);
    delayMicroseconds(1);
    digitalWrite(_reset, HIGH);
    delayMicroseconds(1);
}

// 其他函数实现类似原代码,但 SPI 操作需适配
uint8_t AD7606C_GIGA::readReg(uint8_t reg, uint8_t *val) {
    uint16_t data = (0x40 | (reg & 0x3F)) << 8; // 读命令格式
    SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE2));
    digitalWrite(_cs, LOW);
    SPI.transfer16(data); // 第一帧
    digitalWrite(_cs, HIGH);
    delayMicroseconds(1);
    digitalWrite(_cs, LOW);
    *val = SPI.transfer16(data) & 0xFF; // 第二帧
    digitalWrite(_cs, HIGH);
    SPI.endTransaction();
    return 0;
}

uint8_t AD7606C_GIGA::writeReg(uint8_t reg, uint8_t val) {
    // 先进行一次虚读,使芯片进入寄存器模式
    uint8_t dummy;
    readReg(reg, &dummy);
    uint16_t data = ((reg & 0x3F) << 8) | val; // 写命令格式
    SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE2));
    digitalWrite(_cs, LOW);
    SPI.transfer16(data);
    digitalWrite(_cs, HIGH);
    SPI.endTransaction();
    return 0;
}

// 其余功能(checkID, config, read 等)按原逻辑实现
3.2 系统软件架构
  • 初始化:在 setup() 中调用 begin()、reset()、config() 完成 AD7606 配置。

  • 数据采集:可采用 定时器中断 或 轮询 方式定期触发转换。每触发一次 read(),获取 8 个通道的 18 位数据(已转换为 32 位整数)。

  • 数据处理:可将原始数据转换为电压值(根据量程和参考电压计算),并添加时间戳。

  • 数据输出:通过 串口 打印,或通过 Wi-Fi 发送至 MQTT 服务器 / TCP 客户端,或写入 SD 卡

  • 网络功能:利用 Arduino GIGA 的 WiFi 库连接网络,实现远程监控。

采集数据进行串口输出

#include "AD7606C_GIGA.h"

// 引脚定义(根据实际连接修改)
#define PIN_CS     10
#define PIN_CONVST 7
#define PIN_BUSY   6
#define PIN_RESET  5
#define PIN_OS0    2
#define PIN_OS1    3
#define PIN_OS2    4
#define PIN_RANGE  8

AD7606C_GIGA adc(PIN_CS, PIN_CONVST, PIN_BUSY, PIN_RESET, PIN_OS0, PIN_OS1, PIN_OS2, PIN_RANGE);

void setup() {
    Serial.begin(115200);
    adc.begin();
    adc.reset();
    if (adc.checkID() != 0) {
        Serial.println("AD7606 not detected!");
        while(1);
    }
    adc.config();  // 默认配置:各通道量程自定义
    Serial.println("ADC initialized.");
}

void loop() {
    int32_t rawData[8];
    if (adc.read(rawData) == 0) {
        Serial.print(millis());
        for (int i = 0; i < 8; i++) {
            // 转换为电压(示例:双极性±10V量程,18位,参考2.5V)
            // 实际需根据量程调整公式
            float voltage = rawData[i] * 20.0 / 131072; // 假设±10V,2^17=131072
            Serial.print(",");
            Serial.print(voltage, 4);
        }
        Serial.println();
    }
    delay(100); // 10Hz采样
}
3.4 数据电压换算

AD7606 输出为二进制补码格式,具体换算公式与量程有关:

  • 双极性 ±10V:电压 = (rawData * 20.0) / 131072(18位有效位,最大值 0x1FFFF 对应 +10V,0x20000 对应 -10V)

  • 双极性 ±5V:电压 = (rawData * 10.0) / 131072

  • 单极性 0~10V:电压 = (rawData * 10.0) / 262144(无符号,最大值 0x3FFFF 对应 10V)

4. 高级功能扩展4.1 数据存储到 SD 卡

Arduino GIGA 板载 SD 卡插槽(使用 SPI 或 SDMMC 接口)。可在采集循环中将数据以 CSV 格式写入文件。

4.2 Wi-Fi 实时传输

使用 WiFiNINA 库连接网络,通过 MQTT 发布数据,或建立 TCP 服务器等待客户端连接。

#include <WiFi.h>
#include <PubSubClient.h>

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

void setup_wifi() { /* 连接 WiFi */ }
void reconnect() { /* 连接 MQTT */ }

void loop() {
    if (!mqttClient.connected()) reconnect();
    mqttClient.loop();

    int32_t rawData[8];
    if (adc.read(rawData) == 0) {
        char payload[100];
        sprintf(payload, "{\"t\":%lu,\"ch0\":%ld,\"ch1\":%ld,...}", millis(), rawData[0], rawData[1], ...);
        mqttClient.publish("adc/data", payload);
    }
    delay(100);
}
4.3 定时精确采样

使用 Arduino GIGA 的 定时器(如 Ticker 库)实现精确采样间隔,避免 delay 带来的误差。

5. 注意事项
  • 电平兼容:AD7606 的数字 I/O 可接受 3.3V 或 5V,Arduino GIGA 的 I/O 为 3.3V,可直接连接。

  • 电源去耦:在 AD7606 电源引脚附近放置 10μF 和 0.1μF 电容。

  • 模拟输入保护:若输入电压超出范围,需加保护电路。

  • SPI 速度:寄存器读写使用较低速度(如 1MHz),数据读取可使用更高速度(如 20MHz),需根据布线调整。

6. 总结

本设计方案充分利用 Arduino GIGA R1 WiFi 的处理能力和 AD7606 的多通道同步采样特性,构建了一个灵活、可扩展的数据采集系统。通过简单的软件适配,即可实现数据采集、本地存储和远程传输,适用于多种工业和科研应用。



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]