产品简介
这是一款16bit高分辨率DAC模块,满量程误差仅±0.2%,支持I2C或PWM信号驱动,可灵活配置为0-5V、0-10V电压信号,或4-20mA电流信号输出,适配多场景控制需求。
模块兼容Arduino编程环境,广泛适配ESP32、树莓派、STM32等主控,可直接驱动灯光、水泵、伺服电机等需上述信号控制的设备,简单易用。
本产品属于DAC系列模块,该系列模块都能通过 I2C 或 PWM 信号控制,输出电压或电流,且提供丰富选型:分辨率涵盖8bit、12bit、15bit、16bit,通道可选1通道/ 2通道,还支持多模块级联,可灵活组合为多通道输出方案。
产品特性
- 支持3.3V-5V电源供电,标准Gravity接口。
- 支持I2C/PWM信号输入,适配广泛。
- 16bit分辨率、满量程误差为0.2% 。
- 支持输出0-5V、0-10V模拟电压信号。
- 支持输出4-20mA模拟电流信号。
- 支持1.2倍超量程电压信号输出。
- 支持Arduino编程,适配ESP32、Arduino等主控。
- 8路I2C地址可调,最多可同时控制8路设备。
应用场景
- 电机控制
- 灯光亮度控制
- 阀门水泵控制
- 信号发生器
- 小型设备的自动化改造
产品参数
基本参数
- 芯片型号:GP8600
- 工作电压:3.3V-5V
- 供电/通讯接口:PH2.0-4P/3P
- 输入信号:I2C/PWM
- 输出信号:
- 电流输出范围:0-20mA
- 电压输出范围:0-6V/0-12V
- 通道数:1通道
- 分辨率:16bit(I2C)/8bit、10bit(PWM:可根据主控选择)
- 满量程误差:±0.2%(拟合校准后实测误差)
- 数值范围:
- I2C模式:0-65535对应0-6V或0-12V或0-20mA
- PWM模式:
- 0 - 255对应0-6V或0-12V或0-20mA
- 0 - 1023对应0-6V或0-12V或0-20mA
物理尺寸
- PCB尺寸:38×32×12.39 mm
- 安装孔间距:25 mm
- 安装孔直径:3.0 mm
功能示意图

硬件接口说明
模块接口分为 I2C 输入接口、PWM 输入接口与输出接口三类,各引脚功能定义如下表所示:
| 接口类型 | 引脚丝印 | 功能描述 |
|---|---|---|
| I2C 输入接口 | + | 电源正极(供电输入3.3V-5V) |
| - | 电源负极(接地) | |
| SCL | I2C 时钟线 SCL | |
| SDA | I2C 数据线 SDA | |
| PWM 输入接口 | - | 电源负极(接地) |
| + | 电源正极(供电输入3.3V-5V) | |
| D | PWM 信号输入引脚 | |
| 输出接口 | OUT | 输出信号正极(电压/电流)范围:0-5V 0-6V 0-10V 0-12V 0-20mA 4-20mA |
| GND | 输出信号负极 |
拨码开关配置逻辑
拨码开关(A0、A1、A2)用于切换I2C 地址与PWM 输出范围,需根据控制方式选择对应配置,不可混用。
I2C 模式:配置模块 I2C 地址
通过 A0、A1、A2 的 “0(断开)/1(闭合)” 组合,定义模块的 I2C 通信地址,默认地址为0x58(A0/A1/A2 均为 0)。
| A2 | A1 | A0 | ADDR |
|---|---|---|---|
| 0 | 0 | 0 | 0x58 |
| 0 | 0 | 1 | 0x59 |
| 0 | 1 | 0 | 0x5A |
| 0 | 1 | 1 | 0x5B |
| 1 | 0 | 0 | 0x5C |
| 1 | 0 | 1 | 0x5D |
| 1 | 1 | 0 | 0x5E |
| 1 | 1 | 1 | 0x5F |
PWM模式:配置输出信号范围
仅需关注 A0、A1、A2 的特定组合,即可定义 PWM 控制下的输出类型(电压 / 电流)及范围。
在PWM模式下,A0不能为1,否则可能损坏器件。
| A2 | A1 | A0 | OUT |
|---|---|---|---|
| 1 | 1 | 0 | 0-20mA |
| 0 | 0 | 0 | 0-6V |
| 0 | 1 | 0 | 0-12V |
Arduino IDE 使用教程
- 硬件准备
- DFR1229 GP8600: I2C&PWM转0-5V&0-10V&4-20mA ×1
- DFR0654 FireBeetle 2 ESP32-E ×1
- 万用表 ×1
- 若干杜邦线
- 软件准备
例程1:I2C 模式下 0-5V 量程输出 5V
目标
通过 ESP32-E 主控上的 I2C 接口与 GP8600 模块通信,控制模块 0-5V 量程输出 5V 电压,并用万用表验证结果。
步骤 1:接线配置

按图示连接 GP8600 模块与 ESP32-E,核心对应关系:
- 模块 I2C 引脚 “+” → ESP32-E 3.3V
- 模块 I2C 引脚 “-” → ESP32-E GND
- 模块 I2C 引脚 “SCL” → ESP32-E SCL(默认 GPIO22)
- 模块 I2C 引脚 “SDA” → ESP32-E SDA(默认 GPIO21)
- 拨码开关配置:A0=0、A1=0、A2=0(I2C 地址 = 0x58)
步骤 2:代码上传
打开 Arduino IDE,复制以下代码并上传至 ESP32-E:
#include <DFRobot_GP8XXX.h>
// 启用I2C通信模式
#define I2C_COMMUNICATION
// I2C地址(根据模块背面设置修改,默认0x58)
#define MODULE_I2C_ADDRESS 0x58
DFRobot_GP8600_I2C GP8600(&Wire, MODULE_I2C_ADDRESS);
void setup() {
// 初始化串口通信
Serial.begin(9600);
// 初始化传感器,失败则持续重试
while(GP8600.begin() != 0) {
Serial.println("Communication with the device failed. Please check if the connection is normal or if the device address is set correctly.");
delay(1000);
}
Serial.println("Successful connection!");
// 设置DAC输出量程为0-5V
GP8600.setDACOutRange(GP8600.eOutputRange5V);
// 设置输出数据(0-65535对应0-5V)
uint16_t data = 65535;
GP8600.setDACOutData(data);
}
void loop() {
// 循环中无需执行操作
}
步骤 3:结果验证
- 万用表调至 “DC V” 档;
- 红表笔接模块“OUT”端,黑表笔接模块“GND”端;
- 正常情况测得电压接近 5V,此示例中测得实际输出电压为 5.009V。

例程2:PWM 模式下 4-20mA 量程输出 20mA
目标
通过 ESP32-E 主控上的 PWM 接口与 GP8600 模块通信,控制模块 4-20mA 量程输出 20mA,并用万用表验证结果。
步骤 1:接线配置

按图示连接模块与 ESP32-E,核心对应关系:
- 模块 PWM 接口 “+” → ESP32-E 3.3V
- 模块 PWM 接口 “-” → ESP32-E GND
- 模块 PWM 接口 “D” → ESP32-E GPIO13(PWM 输出引脚)
- 拨码开关配置:A0=0、A1=1、A2=1(输出范围 = 4-20mA)
步骤 2:代码上传
打开 Arduino IDE,复制以下代码并上传至 ESP32-E:
#include <DFRobot_GP8XXX.h>
// 定义PWM引脚为13(适用于ESP32)
const int pwmPin = 13;
DFRobot_GP8600_PWM GP8600(pwmPin);
void setup() {
// 初始化传感器
GP8600.begin();
// 设置输出数据(ESP32在PWM模式下范围为0-1023)
double data = 1023; // 最大输出值
GP8600.setDACOutData(max(data, 42.5));
}
void loop() {
}
步骤 3:结果验证
- 万用表调至 “DC A” 档;
- 红表笔接模块“OUT”端,黑表笔接模块“GND”端
- 正常情况测得电流接近 20mA,此示例中测得实际输出电流为20.12mA

API函数
/**************************************************************************
I2C & PWM 系列
**************************************************************************/
/**
* @fn begin
* @brief 初始化函数
* @return 返回0表示成功,其他值表示失败
*/
int begin(void);
/**
* @fn setDACOutRange
* @brief 设置DAC输出范围(仅I2C模式下有效)
* @param range DAC输出范围
* @n eOutputRange5V(0-5V)
* @n eOutputRange6V(0-6V) GP8630N、GP8600
* @n eOutputRange10V(0-10V)
* @n eOutputRange_10V(-10-0V) GP8630N
* @n eOutputRange_12V(-12-0V) GP8630N
* @n eOutputRange12V(0-12V) GP8630N、GP8600
* @n eOutputRange20MA(0-20mA)
* @n eOutputRange24MA(0-24mA) GP8630N、GP210
* @return NONE
*/
void setDACOutRange(eOutPutRange_t range);
/**
* @fn setDACOutData
* @brief 设置单通道模块输出DAC值
* @param data DAC值
* @note PWM模式下根据PWM脉宽输出电流/电压值,根据模块背面的丝印,拨码选择电流/电压输出范围
* @note I2C模式下根据setDACOutRange()设置的输出范围输出电流/电压值
* @return NONE
*/
void setDACOutData(uint16_t data);
DAC 精度及校准教程
DAC 精度及校准概述
DAC(数模转换器)的精度是指其实际输出值与理想输出值之间的接近程度。精度越高,偏差越小。
校准的目的:
DAC模块因内部元器件差异或使⽤环境影响,其输出可能存在“偏移”和“增益”误差。拟合校准的核心是通过数学拟合算法修正原始输出偏差,建立 “程序控制参数” 与 “实际输出值” 的精准映射关系,从而大幅提升精度。
DAC 校准实操教程(PWM 模式・0-6V 量程)
本教程以 PWM 模式 “0-6V 量程(程序参数范围 0-1023)” 为例,采用线性拟合算法,通过 Excel 表格快速计算校准参数,步骤简洁易懂,无需复杂编程。
校准前提
硬件准备:
- DFR1229 GP8600: I2C&PWM转0-5V&0-10V&4-20mA ×1
- DFR0654 FireBeetle 2 ESP32-E ×1
- 万用表
软件准备:
- Excel 表格(用于计算校准参数)
- DAC 控制程序
环境要求:
- 环境温度稳定(避免温漂影响测量)
- 电源电压无明显波动
数据采集与准备
采集要求
- 选取 5 组及以上中间值程序参数(不可选量程端点 0 或 1023):端点数据易受硬件极限特性影响,可能导致拟合曲线偏离实际工作区间,中间值可保证拟合精度;
- 程序参数均匀分布:覆盖 0-1023 全范围(如示例中的 171、341、512、682、853,对应理论输出 1-5V),确保拟合曲线覆盖整个量程。
步骤 1:原始数据记录
按选定的程序参数配置 DAC,用万用表测量实际输出电压,记录如下表格(示例数据):
| 程序参数(x) | 理论输出电压(V) | 实际输出电压(V) | 绝对误差(V) | 满量程误差 |
|---|---|---|---|---|
| 0 | 0 | 0.0014 | 0.0014 | 0.0233% |
| 171 | 1 | 0.9928 | -0.0072 | -0.1200% |
| 341 | 2 | 1.9923 | -0.0077 | -0.1283% |
| 512 | 3 | 2.9867 | -0.0133 | -0.2217% |
| 682 | 4 | 3.9882 | -0.0118 | -0.1967% |
| 853 | 5 | 4.9848 | -0.0152 | -0.2533% |
| 1023 | 6 | 5.9942 | -0.0058 | -0.0967% |
注:表格中 0 和 1023 仅用于展示满量程误差,拟合计算时需排除端点数据,仅用中间 5 组(171、341、512、682、853)。
校准参数计算(Excel 工具)
通过 Excel 表格的线性拟合函数,计算校准所需的变换系数 c和变换偏移 o,核心逻辑是修正原始 “程序参数 - 实际输出” 的线性偏差。
步骤 2:输入数据到 Excel
在 Excel 中按如下格式输入中间 5 组数据(示例单元格范围):
| 单元格 | 内容(程序参数 x) | 单元格 | 内容(实际输出电压 y) |
|---|---|---|---|
| B11 | 171 | D11 | 0.9928 |
| B12 | 341 | D12 | 1.9923 |
| B13 | 512 | D13 | 2.9867 |
| B14 | 682 | D14 | 3.9882 |
| B15 | 853 | D15 | 4.9848 |
步骤 3:计算原始斜率k
斜率 k 表示原始状态下 “程序参数变化” 与 “实际输出变化” 的线性关系,excel表格公式如下:
=SLOPE(D11:D15, B11:B15)
- 含义:D11:D15 为实际输出电压范围,B11:B15 为对应程序参数范围,计算两者的线性斜率。
步骤 4:计算原始截距b
截距 b 表示程序参数为 0 时的实际输出偏移,excel表格公式如下:
=INTERCEPT(D11:D15, B11:B15)
- 含义:基于线性方程 y = k*x + b,计算截距 b。
步骤 5:计算变换系数 c
系数 c 用于修正原始斜率偏差,使输出符合理论量程,excel表格公式如下:
=(理论最大电压 / 最大程序参数) / k
- 示例代入:理论最大电压 = 6V,最大程序参数 = 1023,因此excel表格公式为:
=(6/1023)/k
- 含义:将原始斜率 k 修正为符合理论量程的理想斜率。
步骤 6:计算变换偏移 o
偏移 o 用于抵消原始截距偏差,excel表格公式:
=-b/k
- 含义:通过偏移补偿,消除程序参数为 0 时的固有输出偏差。
步骤 7:代码集成与生效
将 Excel 计算得到的c(变换系数) 和o(变换偏移) 代入 DAC 控制程序,通过校准公式实时修正程序参数,确保实际输出接近理论值。
校准公式:
y = c * x0 + o
- 说明:y = 校准后程序参数(最终写入 DAC 的控制值);x0 = 原始目标程序参数(未校准,由理论输出电压计算得出)。
- 带入上述计算的变换系数及变换偏移值得到的完整校准公式为:y=1.0020 * x0 + 1.1550
代码示例
将获得的c(变换系数) 和o(变换偏移)值填入下方代码

然后就能根据拟合校准算法得到更准确的数据了,完整代码如下:
#include <DFRobot_GP8XXX.h>
// 固定ESP32平台PWM引脚为13,无需多平台适配
const int pwmPin = 13;
DFRobot_GP8600_PWM GP8600(pwmPin);
/**
* @brief 校准函数(ESP32专用,匹配0-6V量程)
* @param data 原始未校准程序参数(0-1023)
* @param coefficient 拟合校准系数c(Excel计算得出)
* @param offset 拟合校准偏移量o(Excel计算得出)
* @return 校准后PWM控制参数(0-1023)
*/
uint16_t calibrationFun(uint16_t data ,double coefficient ,double offset)
{
double tempdata = data * coefficient + offset;
// ESP32平台PWM参数范围固定为0-1023(对应0-6V),直接限幅
if(tempdata > 1023) tempdata = 1023;
if(tempdata < 0) tempdata = 0;
Serial.print("校准后PWM参数:");
Serial.println((uint16_t)tempdata);
return (uint16_t)tempdata;
}
void setup() {
// 初始化串口(用于调试查看校准参数)
Serial.begin(115200);
// 初始化GP8600模块(PWM模式)
GP8600.begin();
/**
* @brief 0-6V量程输出配置(ESP32专用)
* @note 1. 模块拨码开关需配置为0-6V输出(参考模块背面说明)
* @note 2. ESP32平台PWM参数范围0-1023,对应输出0-6V
* @note 3. 如需启用校准,将下方data传入calibrationFun即可
*/
uint16_t data = 1023; // 原始目标程序参数(未校准,由理论输出电压计算得出)
//启用校准(替换为实际计算的coefficient和offset)
GP8600.setDACOutData(calibrationFun(data, caliCoeff, caliOffset));
}
void loop() {
}