DAC (数模转换器)

简介

DAC用于将12bit的数字码值通过模拟电路转换为模拟电压。输出电压范围为0~Vref(此处的Vref可以选择内部参考电压和外部参考电压,内部参考电压可以选择2.5V和1.65V,外部参考电压来自引脚VDAC输入电压,输入电压一般与芯片电压VDD一致)。 DAC模块包含2个物理通道DAC0和DAC1。 DAC支持立即加载和影子加载模式,可以产生静态波、方波、三角波、正弦波等波形,既可以通过配置DAC发送寄存 器产生,又可以通过WAG外设产生。

功能概述

  • 支持2个独立通道,有不同的输出电压和中断

  • 支持配置为静态输出特定值

  • 支持产生静态波、方波、三角波、正弦波等波形,既可以通过配置 DAC 发数寄存器产生,又可以通过 WAG 外设产生

  • 支持事件触发影子加载模式和软件配置寄存器立即加载模式

  • 支持 7 个不同的触发源选择

  • 支持选择外灌基准或内部带隙基准电压

  • 支持通过 CPU 和 DMA 握手配置发波数据

  • 支持补码和偏移码输出选择

  • 支持对 2 个独立通道的 DAC 上电校准

  • 支持软件配置输出保持功能

电压直接输出

电压直接输出模式下,用户可以直接通过配置 DAC TDAT寄存器来输出指定的电压值。这种需要软件对TDAT 寄存器进行写入:

1. 只输出固定电压值,不产生波形,软件单次对寄存器进行写入即可,输出电压通过以下方式进行计算: \(Vout = TDAT * Vref / 4096\)

DAC连续波输出

连续波输出共有 3 种模式:中断方式、DMA模式、WAG 输入。

  • 中断方式

中断方式下,用户可以通过配置触发事件和触发源,在固定时刻对寄存器进行写入,从而产生连续波。可以提前准备好波形数据,在DAC输出完成中断中更新DAC TDAT寄存器,等待下一次触发事件来之后生效。

  • DMA模式

DMA模式分两种方式:

  1. 常规使用是使用DMA传输数据输入对DAC.TDAT写入,但是DAC输出触发源使用SRPWM/ETIMER等事件,此时DAC输出波形值也需要提前准备好,方便DMA写入。这种方式的写入较中断方式省掉了CPU资源,并且也能做到输出波形频率可控。

  2. DAC触发源选择DMA加载完成事件作为触发源,并且也通过DMA传输对DAC.TDAT写入,每次DMA传输完成后就会重新加载新的值,此时在使用DMA作为触发并且同时作为传输完成加载信号的输出方式时,一定需要配置触发延迟时间,将触发信号与传输加载信号错开。

  • WAG输入

WAG生成波形输出,DAC的输出数据选择来自WAG模块,WAG模块用于生成各种波形进行输出,此时DAC的输出完全来自WAG模块,不需要提前准备好波形数据,并且不需要单独的DMA通路,不需要外部触发。

DAC数据输出格式

DAC数据输出格式分为补码、偏移码、取反输出格式,三种输出模式下,输入数据和实际输出值和电压值的对应关系。

  • 偏移码输出:

DAC原始码值输出
  • 补码输出:

DAC补码输出
  • 取反输出:

DAC取反输出

软件配置流程

基础发波配置流程如下:

  1. 配置触发模式 调用 DAC_configTriggerMode() 传入通道和触发配置结构体

  2. 设置参考电压 调用 DAC_setReferenceVoltage() 传入通道和参考电压引用

  3. 选择触发源 调用 DAC_setTriggerSource() 传入通道和触发源

  4. 配置输出 调用 DAC_configOutput() 传入通道和输出配置结构体

  5. 使能输出 调用 DAC_enableOutput() 传入通道

  6. 设置输出电压值 调用 DAC_setValue() 传入通道和输出电压值

应用示例

API Reference

Header File

Functions

void DAC_configTriggerMode(DAC_Type *DACx, DAC_TriggerConfig *config)

Config trigger mode.

参数:
  • DACx – select DAC device [DAC0 ~ DAC1]

  • config – DAC initial structure pointer

void DAC_configOutput(DAC_Type *DACx, DAC_OutputConfig *config)

Config output.

参数:
  • DACx – DAC peripheral [DAC0~DAC1]

  • config

void DAC_setReferenceVoltage(DAC_Type *DACx, DAC_ReferenceVoltage source)

Sets the DAC Reference Voltage.

Attention

if reference voltage select VREF, should call SYSCTRL_enableAnalogReferenceInternal enable VREF

参数:
  • DACx – DAC peripheral [DAC0~DAC1]

  • source – Reference voltage select, VDAC or VREF

void DAC_setTriggerSource(DAC_Type *DACx, DAC_TriggerSel source)

Sets DAC trigger source.

参数:
  • DACx – DAC peripheral [DAC0~DAC1]

  • source – trigger source ref to DAC_TRIGGER_SEL_xxxx

void DAC_setValue(DAC_Type *DACx, uint16_t value)

Set the DAC Shadow Output Value.

参数:
  • DACx – DAC peripheral [DAC0~DAC1]

  • value – 12-bit code to be loaded into the active value register

uint16_t DAC_getValue(DAC_Type *DACx)

Get the DAC Shadow Output Value.

参数:

DACx – DAC peripheral [DAC0~DAC1]

返回:

uint16_t Returns the DAC shadow output value.

void DAC_enableOutput(DAC_Type *DACx)

Enable the DAC Output.

参数:

DACx – DAC peripheral [DAC0~DAC1]

void DAC_disableOutput(DAC_Type *DACx)

Disable the DAC Output.

参数:

DACx – DAC peripheral [DAC0~DAC1]

void DAC_SWTrigger(DAC_Type *DACx)

Software trigger the specified DAC.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

FlagStatus DAC_getTrigRepeatStatus(DAC_Type *DACx)

Get trigger signal repeat report status.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

返回:

FlagStatus SET: DAC trigger repeat occurs RESET: DAC trigger repeat does not occur

void DAC_clearTrigRepeatStatus(DAC_Type *DACx)

Clear the specified DAC repeat status.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

FlagStatus DAC_getTransferStatus(DAC_Type *DACx)

Get the specified DAC txd end report.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

返回:

FlagStatus if SET, DAC is Transferred Done

void DAC_clearTransferStatus(DAC_Type *DACx)

Clear the specified DAC txd end report.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

void DAC_enableInterrupt(DAC_Type *DACx)

Enable the specified DAC interrupt.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

void DAC_disableInterrupt(DAC_Type *DACx)

Disable the specified DAC interrupt.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

void DAC_clearInterruptStatus(DAC_Type *DACx)

Enable or disable the specified DAC interrupt.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

ITStatus DAC_getInterruptStatus(DAC_Type *DACx)

Get the specified DAC interrupt status.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

返回:

ITStatus SET: DAC interrupt occurs RESET: DAC interrupt does not occur

void DAC_enableDMA(DAC_Type *DACx)

Enable the specified DAC DMA handshake.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

void DAC_disableDMA(DAC_Type *DACx)

Disable the specified DAC DMA handshake.

备注

Calling this function only when DMA channel is in idle state.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

void DAC_enableSWHold(DAC_Type *DACx)

Enable dac output software hold functionality.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

void DAC_disableSWHold(DAC_Type *DACx)

Disable dac output software hold functionality.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

void DAC_enableHWHold(DAC_Type *DACx)

Enable dac output software hold functionality.

参数:

DACx

void DAC_disableHWHold(DAC_Type *DACx)

Disable dac output hardware hold functionality.

参数:

DACx

void DAC_setOffsetTrim(DAC_Type *DACx, uint16_t nValue)

Set the spedified DAC os adjust value.

参数:
  • DACx – select DAC device [DAC0 ~ DAC1]

  • value – offset value for DAC calibration

uint16_t DAC_getOffsetTrim(DAC_Type *DACx)

Get the specified DAC os adjust value.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

返回:

uint16_t offset adjust value

void DAC_setGainADJ(DAC_Type *DACx, uint16_t value)

Set the specified DAC gain adjust value.

参数:
  • DACx – select DAC device [DAC0 ~ DAC1]

  • value – gain value for DAC calibration

uint16_t DAC_getGainADJ(DAC_Type *DACx)

Get the specified DAC gain adjust value.

参数:

DACx – select DAC device [DAC0 ~ DAC1]

返回:

uint16_t gain adjust value

Structures

struct DAC_TriggerConfig

DAC Init structure definition.

struct DAC_OutputConfig

Enumerations

enum DAC_ReferenceVoltage

DAC Ref Source enumeration.

Values:

enumerator DAC_REFSEL_PAD

DAC Reference to IOPAD

enumerator DAC_REFSEL_INNER_LDO

DAC Reference to inner Vref

enum DAC_OutputFormat

DAC Trigger Source enumeration.

备注

when dac trigger source selected as follow: DAC_TRIGGER_SEL_STIM DAC_TRIGGER_SEL_ETIM DAC_TRIGGER_SEL_SPWM DAC_TRIGGER_SEL_SELF_TX_DONE DAC_TRIGGER_SEL_ACOMP DAC load mode should select [DAC_LOAD_MODE_SHADOW]

Values:

enumerator DAC_OUTPUT_DIRECT
enumerator DAC_OUTPUT_INVERTED
enum DAC_SrcSel

Values:

enumerator DAC_SRC_SEL_REG

DAC data load from register

enumerator DAC_SRC_SEL_WAG

DAC data load from WAG module

enum DAC_TriggerSel

Values that can be passed to DAC_setTriggerSource() as the mode parameter.

Values:

enumerator DAC_TRIGGER_SEL_SW

DAC trigger Source Software

enumerator DAC_TRIGGER_SEL_STIMER

DAC trigger Source PIT Timer

enumerator DAC_TRIGGER_SEL_ETIM

DAC trigger Source ETimer

enumerator DAC_TRIGGER_SEL_SRPWM

DAC trigger Source SrPWM Sync Signal to DAC

enumerator DAC_TRIGGER_SEL_SELF_TX_DONE

DAC trigger Source by self tx done

enumerator DAC_TRIGGER_SEL_DMA

DAC trigger Source DMA