3. DAC输出准确性验证

DAC输出准确性验证 学习卡片

任务目标

本案例要求通过ESP32内置DAC输出一组已知电压值,使用万用表测量实际输出电压,从而验证DAC的精度与线性度。你需要完成:编写DAC输出电压设置代码、记录理论值与实测值、计算误差并判断是否满足规格要求。

硬件准备

  • ESP32开发板(含DAC功能的型号,如ESP32-WROOM-32)
  • 万用表(推荐精度不低于0.01V)
  • 杜邦线若干

关键实现

ESP32的DAC为8位分辨率,输出电压范围0~3.3V。核心逻辑是:将目标电压值转换为对应的DAC寄存器值(0~255),通过dac_output_voltage()函数输出,并在每个电压点保持足够时间以便万用表稳定读数。

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/dac.h"
#include "esp_log.h"

#define DAC_CHANNEL DAC_CHANNEL_1  // GPIO25

// 目标电压表(单位:V)
float target_voltages[] = {0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f, 3.0f, 3.3f};
#define NUM_POINTS (sizeof(target_voltages) / sizeof(target_voltages[0]))

// 将电压转换为DAC寄存器值(0~255)
uint8_t voltage_to_dac(float voltage) {
    if (voltage <= 0.0f) return 0;
    if (voltage >= 3.3f) return 255;
    return (uint8_t)((voltage / 3.3f) * 255.0f + 0.5f);
}

void dac_test_task(void *arg) {
    // 初始化DAC通道
    dac_output_enable(DAC_CHANNEL);

    for (int i = 0; i < NUM_POINTS; i++) {
        float target = target_voltages[i];
        uint8_t dac_val = voltage_to_dac(target);

        // 设置DAC输出
        dac_output_voltage(DAC_CHANNEL, dac_val);

        // 计算实际理论电压(由DAC值反推)
        float actual_theory = (float)dac_val * 3.3f / 255.0f;

        printf("Point %d: target=%.2fV, DAC=%d, theory=%.3fV\n",
               i + 1, target, dac_val, actual_theory);

        // 保持2秒供万用表读数
        vTaskDelay(pdMS_TO_TICKS(2000));
    }

    // 测试结束,输出低电平
    dac_output_voltage(DAC_CHANNEL, 0);
    printf("DAC test completed.\n");

    vTaskDelete(NULL);
}

void app_main(void) {
    xTaskCreate(dac_test_task, "dac_test", 2048, NULL, 5, NULL);
}

编译与烧录

idf.py set-target esp32
idf.py build
idf.py -p /dev/ttyUSB0 flash monitor

验证方法

  1. 将万用表红表笔接ESP32的GPIO25,黑表笔接GND。
  2. 将万用表调至直流电压档(DCV,量程20V或2V)。
  3. 烧录并运行程序,观察串口输出中每个测试点的目标电压与理论电压。
  4. 在每个测试点保持的2秒内,记录万用表显示的实测电压值。
  5. 对比实测值与理论值,计算误差:误差 = |实测值 - 理论值|。

判定标准

  • ESP32数据手册标称DAC精度约为±0.12V(典型值)。若所有测试点误差均在±0.15V以内,判定DAC精度合格。
  • 线性度验证:将各点实测电压与理论电压绘制散点图,若各点基本落在直线y=x附近(最大偏差不超过0.15V),判定线性度良好。
  • 若某个点误差超过±0.15V,需检查:供电电压是否稳定为3.3V、万用表表笔接触是否可靠、GPIO25是否被其他外设占用。

预期输出示例

Point 1: target=0.00V, DAC=0, theory=0.000V
Point 2: target=0.50V, DAC=39, theory=0.505V
Point 3: target=1.00V, DAC=77, theory=0.997V
Point 4: target=1.50V, DAC=116, theory=1.502V
Point 5: target=2.00V, DAC=155, theory=2.006V
Point 6: target=2.50V, DAC=193, theory=2.498V
Point 7: target=3.00V, DAC=232, theory=3.003V
Point 8: target=3.30V, DAC=255, theory=3.300V
DAC输出线性度验证示意 理论电压 (V) 实测电压 (V) 0 1.0 2.0 3.0 3.3 0 1.0 2.0 3.0 理想 y=x +0.15V误差带 实测数据点 理想直线

上图展示了理想情况下实测电压与理论电压的关系。实际测试时,将万用表读数记录后,与理论值对比即可判断DAC是否满足精度要求。若所有数据点均落在±0.15V误差带内,则判定该ESP32的DAC输出准确性和线性度合格。