dac

[English]

简介

dac 外设类型用于描述片上 DAC 通道。BMGR 据此生成 periph_dac_config_t,并在初始化阶段创建 ESP-IDF DAC 驱动句柄。该类型覆盖 driver/dac_oneshot.hdriver/dac_continuous.hdriver/dac_cosine.h 中的三类 DAC 驱动入口。

board_peripherals.yaml 中配置 dac 时,需通过 role 选择工作模式。BMGR 初始化后,应用通过 esp_board_manager_get_periph_handle() 获取 periph_dac_handle_t,再调用对应的 ESP-IDF DAC API 输出电压、电压序列或余弦波。

支持的工作模式

dac 的分类轴是 role。每个外设实例仅能选择一种 role,运行时句柄也仅对应该模式。

最小配置

oneshot

board_peripherals.yaml

peripherals:
  - name: dac_channel_0
    type: dac
    role: oneshot
    config:
      channel: 0

continuous

board_peripherals.yaml

peripherals:
  - name: dac_continuous
    type: dac
    role: continuous
    config:
      chan_mask: DAC_CHANNEL_MASK_CH0
      desc_num: 8
      buf_size: 2048
      freq_hz: 1000000
      offset: 0
      clk_src: DAC_DIGI_CLK_SRC_DEFAULT
      chan_mode: DAC_CHANNEL_MODE_SIMUL

cosine

board_peripherals.yaml

peripherals:
  - name: dac_cosine
    type: dac
    role: cosine
    config:
      channel: 0
      freq_hz: 1000
      clk_src: DAC_COSINE_CLK_SRC_DEFAULT
      atten: DAC_COSINE_ATTEN_DEFAULT
      phase: DAC_COSINE_PHASE_0
      offset: 0
      force_set_freq: false

模式说明

oneshot 创建单个 DAC 通道,用于应用主动调用 dac_oneshot_output_voltage 输出离散电压值。continuous 创建连续模式通道,适合应用启用通道后写入循环或流式数据。cosine 创建余弦波发生器通道,适合由 DAC 驱动输出指定频率的余弦波。

BMGR 按 role 填充 periph_dac_config_t 的联合体成员。应用获取句柄后,需要根据配置中的 role 访问 periph_dac_handle_t 中对应的 oneshotcontinuouscosine 成员。

完整字段

oneshot 完整字段

# DAC oneshot mode example
- name: dac_oneshot
  type: dac
  role: oneshot
  config:
    # DAC channel number (default: 0)
    channel: 0                       # [TO_BE_CONFIRMED] DAC channel number
    # Valid values: 0, 1
    # Channel 0: GPIO25 on ESP32, GPIO17 on ESP32S2
    # Channel 1: GPIO26 on ESP32, GPIO18 on ESP32S2

continuous 完整字段

# DAC continuous mode example
- name: dac_continuous
  type: dac
  role: continuous
  config:
    # DAC channels' mask (default: DAC_CHANNEL_MASK_CH0)
    chan_mask: DAC_CHANNEL_MASK_CH0  # [TO_BE_CONFIRMED] DAC channels' mask
    # Valid values:
    # - DAC_CHANNEL_MASK_CH0
    # - DAC_CHANNEL_MASK_CH1
    # - DAC_CHANNEL_MASK_ALL

    # Number of DMA descriptors (default: 8)
    desc_num: 8
    # At least 2 descriptors are required, suggest >5

    # DMA buffer size (default: 2048)
    buf_size: 2048
    # Should be within 32~4092 bytes, typically multiple of 4

    # DAC conversion frequency (default: 1000000 Hz)
    freq_hz: 1000000                 # [TO_BE_CONFIRMED] DAC conversion frequency
    # Range depends on target and clock source

    # Data offset (default: 0)
    offset: 0
    # Range: -128~127

    # Clock source (default: DAC_DIGI_CLK_SRC_DEFAULT)
    # Valid values depend on the selected chip,
    # please refer to the enum 'soc_periph_dac_digi_clk_src_t' in 'soc/clk_tree_defs.h'
    clk_src: DAC_DIGI_CLK_SRC_DEFAULT

    # Assume the data in buffer is 'A B C D E F'
    # DAC_CHANNEL_MODE_SIMUL:
    #     channel 0: A B C D E F
    #     channel 1: A B C D E F
    # DAC_CHANNEL_MODE_ALTER:
    #     channel 0: A C E
    #     channel 1: B D F
    # Channel mode (default: DAC_CHANNEL_MODE_SIMUL)
    chan_mode: DAC_CHANNEL_MODE_SIMUL
    # Valid values:
    # - DAC_CHANNEL_MODE_SIMUL
    # - DAC_CHANNEL_MODE_ALTER

cosine 完整字段

# DAC cosine mode example
- name: dac_cosine
  type: dac
  role: cosine
  config:
    # DAC channel number (default: 0)
    channel: 0                       # [TO_BE_CONFIRMED] DAC channel number
    # Valid values: 0, 1
    # On ESP32: Channel 0: GPIO25, Channel 1: GPIO26
    # On ESP32S2: Channel 0: GPIO17, Channel 1: GPIO18

    # Cosine wave frequency (default: 1000 Hz)
    freq_hz: 1000                    # [TO_BE_CONFIRMED] Cosine wave frequency

    # Clock source (default: DAC_COSINE_CLK_SRC_DEFAULT)
    # Valid values depend on the selected chip,
    # please refer to the enum 'soc_periph_dac_cosine_clk_src_t' in 'soc/clk_tree_defs.h'
    clk_src: DAC_COSINE_CLK_SRC_DEFAULT

    # Attenuation (default: DAC_COSINE_ATTEN_DEFAULT)
    atten: DAC_COSINE_ATTEN_DEFAULT
    # Valid values:
    # - DAC_COSINE_ATTEN_DEFAULT
    # - DAC_COSINE_ATTEN_DB_0
    # - DAC_COSINE_ATTEN_DB_6
    # - DAC_COSINE_ATTEN_DB_12
    # - DAC_COSINE_ATTEN_DB_18

    # Phase (default: DAC_COSINE_PHASE_0)
    phase: DAC_COSINE_PHASE_0
    # Valid values:
    # - DAC_COSINE_PHASE_0
    # - DAC_COSINE_PHASE_180

    # DC offset (default: 0)
    offset: 0
    # Range: -128~127

    # Force set frequency (default: false)
    # Set true to force update frequency when multiple channels are used
    force_set_freq: false

字段来源:

  • YAML 模板:esp_board_manager/peripherals/periph_dac/periph_dac.yml

  • 头文件:esp_board_manager/peripherals/periph_dac/periph_dac.h

适用设备

device type

使用方式

说明

直接由应用使用

应用通过 esp_board_manager_get_periph_handle 获取 DAC 外设句柄

当前仓库未提供引用 dac 外设的 device 类型;输出数据和启停动作由应用或测试代码完成

参考代码

  • esp_board_manager/test_apps/main/periph/test_periph_dac.c

板级参考

  • esp_board_manager/test_apps/components/board_customer/boards/esp32_devkitc/board_peripherals.yamloneshot 示例和注释形式的 continuous / cosine 示例。

注意事项

  • role 必须是 oneshotcontinuouscosine;缺少或写成其他值会导致 YAML 解析失败。

  • channel 只接受 01,BMGR parser 会映射为 DAC_CHAN_0DAC_CHAN_1

  • continuouschan_mask 只接受 DAC_CHANNEL_MASK_CH0DAC_CHANNEL_MASK_CH1DAC_CHANNEL_MASK_ALL

  • cosineattenphase 需要使用模板列出的枚举值。

  • 修改 DAC 外设配置后,需要重新执行 idf.py bmgr -b <board>

调试技巧

API 参考

使用 esp_board_manager_get_periph_handle() 获取 DAC 外设句柄,句柄类型为 periph_dac_handle_t

typedef union {
    dac_oneshot_handle_t     oneshot;     /*!< Oneshot mode handle */
    dac_continuous_handle_t  continuous;  /*!< Continuous mode handle */
    dac_cosine_handle_t      cosine;      /*!< Cosine wave mode handle */
} periph_dac_handle_t;

三个成员互斥,具体哪个有效取决于 board_peripherals.yaml 中配置的 role 字段(oneshotcontinuouscosine)。

相关声明位于 esp_board_manager/peripherals/periph_dac/periph_dac.h

底层 ESP-IDF 驱动文档:数模转换器 (DAC)


此文档对您有帮助吗?