AI视觉手势/人脸跟踪传感器

产品简介

这是一款16bit高分辨率DAC模块,满量程误差仅±0.2%,支持I2C或PWM信号驱动,可灵活配置为±10V、0-5V、0-10V电压信号,或4-20mA电流信号输出,适配多场景控制需求。

相较于常规0-10V信号,±10V模拟电压是本模块的核心特点——输出范围覆盖-10V至+10V,新增反向电压输出能力,可直接实现设备的反向控制。这类对称电压信号是诸多设备的刚需,比如小型电机控制:+10V驱动电机正向转,-10V驱动反向转,0V则停机,无需额外电路改造。

模块兼容Arduino编程环境,广泛适配ESP32、树莓派等主控,可直接驱动灯光、水泵、伺服电机等需上述信号控制的设备,简单易用。

本产品属于DAC系列模块,该系列模块都能通过 I2C 或 PWM 信号控制,输出电压或电流,且提供丰富选型:分辨率涵盖8bit、12bit、15bit、16bit,通道可选1通道/ 2通道,还支持多模块级联,可灵活组合为多通道输出方案。

产品特性

  • 支持3.3V-5V电源供电,标准Gravity接口。
  • 支持I2C/PWM信号输入,适配广泛。
  • 16bit分辨率、满量程误差小于0.2% 。
  • 支持输出±10V对称模拟电压信号。
  • 支持输出0-5V、0-10V模拟电压信号。
  • 支持输出4-20mA模拟电流信号。
  • 支持1.2倍超量程电压电流信号输出。
  • 支持Arduino编程,适配ESP32、Arduino等主控。
  • 8路I2C地址可调,最多可同时控制8路设备。

应用场景

  • 电机正反向控制
  • 灯光亮度控制
  • 阀门水泵控制
  • 信号发生器
  • 小型设备的自动化改造

产品参数

基本参数

  • 芯片型号:GP8630N
  • 工作电压:3.3V-5V
  • 供电/通讯接口:PH2.0-4P/3P
  • 输入信号:I2C/PWM
  • 输出信号:
    • 电流输出范围:0-24mA
    • 电压输出范围:±12V/0-6V/0-12V
  • 通道数:1通道
  • 分辨率:16bit(I2C)/8bit、10bit(PWM:可根据主控选择)
  • 满量程误差:±0.2%(拟合校准后实测误差)
  • 数值范围:
    • I2C模式:0-65535对应±12V或0-6V或0-12V或0-24mA
    • PWM模式:
      • 0-255对应±12V或0-6V或0-12V或0-24mA
      • 0-1023对应±12V或0-6V或0-12V或0-24mA

物理尺寸

  • PCB尺寸:42×32×12.39 mm
  • 安装孔间距:25 mm
  • 安装孔直径:3.0 mm

功能示意图

DFR1230-功能图

硬件接口说明

模块接口分为I2C 接口、PWM 接口与输出接口三类,各引脚功能定义如下表所示:

接口类型 引脚丝印 功能描述
I2C接口 + 电源正极(3.3V-5V)
- 电源负极
SCL I2C时钟线SCL
SDA I2C数据线SDA
PWM接口 - 电源负极
+ 电源正极(3.3V-5V)
D PWM信号输入引脚
输出接口 OUT 输出信号正极(电压/电流)范围:0-10V 0-12V 10-0V -12-0V 0-24mA 4-20mA
GND 输出信号负极

拨码开关配置逻辑

拨码开关(A0、A1、A2)用于切换I2C 地址与PWM 输出范围,需根据控制方式选择对应配置,不可混用。

I2C 模式:配置模块 I2C 地址

通过 A0、A1、A2 的 “0(断开)/1(闭合)” 组合,定义模块的 I2C 通信地址,默认地址为0x58(A0/A1/A2 均为 0)。

I2C模式
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 控制下的输出类型(电压 / 电流)及范围。

A2 A1 A0 OUT
0 1 0 -12-0V
0 1 1 0-12V
1 0 0 0-24mA

Arduino IDE 使用教程

例程1:I2C 模式下 0-10V 量程输出 10V

目标

通过 ESP32-E 主控上的 I2C 通信控制模块 0-10V 量程输出 10V 电压,并用万用表验证结果。

步骤 1:接线配置

DFR1230-I2C接线图

  • 按图示连接模块与 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

// 创建I2C通信对象
DFRobot_GP8630N_I2C GP8630N(&Wire, MODULE_I2C_ADDRESS);

void setup() {
  // 初始化串口通信
  Serial.begin(9600);
  
  // 初始化DAC模块
  while (GP8630N.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!");
  
  // 设置输出范围为0-10V
  GP8630N.setDACOutRange(GP8630N.eOutputRange10V);
  
  // 输出10V(65535对应10V满量程)
  GP8630N.setDACOutData(65535);
}

void loop() {
  // 无需循环操作,设置一次即可保持输出
}

结果验证:

  1. 万用表调至 “DC V” 档;
  2. 红表笔接模块“OUT”端,黑表笔接模块“GND”端;
  3. 正常情况测得电压接近 10V,此示例中测得实际输出电压为 10.04V。

DFR1230-I2C结果图

例程2:PWM 模式下 4-20mA 量程输出 20mA

目标

通过 ESP32-E 主控上的 PWM 通信控制模块 4-20mA 量程输出 20mA,并用万用表验证结果。

步骤 1:接线配置

DFR1230-PWM接线图

按图示连接模块与 ESP32-E,核心对应关系:

  • 模块 PWM 接口 “+” → ESP32-E 3.3V
  • 模块 PWM 接口 “-” → ESP32-E GND
  • 模块 PWM 接口 “D” → ESP32-E GPIO13(PWM 输出引脚)
  • 拨码开关配置:A0=0、A1=0、A2=1(输出范围 = 4-20mA)

步骤 2:代码上传

打开 Arduino IDE,复制以下代码并上传至 ESP32-E:

#include <DFRobot_GP8XXX.h>

// 定义PWM引脚为13(适用于ESP32)
const int pwmPin = 13;
DFRobot_GP8630N_PWM GP8630N(pwmPin);

void setup() {
  // 初始化传感器
  GP8630N.begin();
  
  // 设置输出数据(ESP32在PWM模式下范围为0-1023)
  uint16_t data = 1023;  // 最大输出值
  GP8630N.setDACOutData(max(data*0.83, 170.5));
}

void loop() {

}

结果验证:

  1. 万用表调至 “DC A” 档;
  2. 红表笔接模块“IOUT”端,黑表笔接模块“GND”端
  3. 正常情况测得电流接近 20mA,此示例中测得实际输出电流为 20.24mA

DFR1230-PWM结果图

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-12V 量程)

本教程以 PWM 模式 “0-12V 量程(程序参数范围 0-1023)” 为例,采用线性拟合算法,通过 Excel 快速计算校准参数,步骤简洁易懂,无需复杂编程。

校准前提

硬件准备:

  • DAC 模块(PWM 模式)
  • ESP32-E 主控
  • 万用表

软件准备:

  • Excel 表格(用于计算校准参数)
  • DAC 控制程序

环境要求:

  • 环境温度稳定(避免温漂影响测量)
  • 电源电压无明显波动

数据采集与准备

采集要求

  • 选取 5 组及以上中间值程序参数(不可选量程端点 0 或 1023):端点数据易受硬件极限特性影响,可能导致拟合曲线偏离实际工作区间,中间值可保证拟合精度;
  • 程序参数均匀分布:覆盖 0-1023 全范围,确保拟合曲线覆盖整个量程。

步骤 1:原始数据记录

按选定的程序参数配置 DAC,用万用表测量实际输出电压,记录如下表格(示例数据):

程序参数(x) 理论输出电压(V) 实际输出电压(V) 绝对误差(V) 相对误差
0 0 0.0052 0.0052 0.0433%
85 1 1.002 0.0020 0.0167%
171 2 1.9961 -0.0039 -0.0325%
256 3 2.9926 -0.0074 -0.0617%
341 4 4.0012 0.0012 0.0100%
426 5 4.9951 -0.0049 -0.0408%
512 6 5.9924 -0.0076 -0.0633%
597 7 6.9846 -0.0154 -0.1283%
682 8 7.9912 -0.0088 -0.0733%
767 9 8.9891 -0.0109 -0.0908%
853 10 9.9868 -0.0132 -0.1100%
938 11 10.9826 -0.0174 -0.1450%
1023 12 12.0060 0.0060 0.0500%

注:表格中 0 和 1023 仅用于展示满量程误差,拟合计算时需排除端点数据(0、1023),仅用中间 11 组。

校准参数计算(Excel 工具)

通过 Excel 表格的线性拟合函数,计算校准所需的变换系数 c变换偏移 o,核心逻辑是修正原始 “程序参数 - 实际输出” 的线性偏差。

步骤 2:输入数据到 Excel

在 Excel 中按如下格式输入中间 11 组数据(示例单元格范围):

单元格 内容(程序参数 x) 单元格 内容(实际输出电压 y)
B11 85 D11 1.002
B12 171 D12 1.9961
B13 256 D13 2.9926
B14 341 D14 4.0012
B15 426 D15 4.9951
B16 512 D16 5.9924
B17 597 D17 6.9846
B18 682 D18 7.9912
B19 767 D19 8.9891
B20 853 D20 9.9868
B21 938 D21 10.9826

步骤 3:计算原始斜率 k

斜率 k 表示原始状态下 “程序参数变化” 与 “实际输出变化” 的线性关系,excel表格公式如下:

=SLOPE(D11:D21, B11:B21)
  • 含义:D11:D21 为实际输出电压范围,B11:B21 为对应程序参数范围,计算两者的线性斜率。

步骤 4:计算原始截距 b

截距 b 表示程序参数为 0 时的实际输出偏移,excel表格公式如下:

=INTERCEPT(D11:D21, B11:B21)
  • 含义:基于线性方程 y = k*x + b,计算截距 b。

步骤 5:计算变换系数 c

系数 c 用于修正原始斜率偏差,使输出符合理论量程,excel表格公式如下:

=(理论最大电压 / 最大程序参数) / k
  • 示例代入:理论最大电压 = 12V,最大程序参数 = 1023,因此excel表格公式为:
=(12/1023)/k
  • 含义:将原始斜率 k 修正为符合理论量程的理想斜率。

步骤 6:计算变换偏移 o

偏移 o 用于抵消原始截距偏差,excel表格公式:

=-b/k
  • 含义:通过偏移补偿,消除程序参数为 0 时的固有输出偏差。

步骤 7:代码集成与生效

将 Excel 计算得到的c(变换系数)o(变换偏移) 代入 DAC 控制程序,通过校准公式实时修正程序参数,确保实际输出接近理论值。

校准公式:

y = c * x0 + o
  • 说明:y = 校准后程序参数(最终写入 DAC 的控制值);x0 = 原始目标程序参数(未校准,由理论输出电压计算得出)。
  • 带入上述计算的变换系数及变换偏移值得到的完整校准公式为:y=1.0018 * x0 - 0.0924

代码示例

将获得的c(变换系数) 和o(变换偏移)值填入下方代码

DFR1230-校准程序图

然后就能根据拟合校准算法得到更准确的数据了,完整代码如下:

#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() {

}

更多资料下载