侧边栏壁纸
  • 累计撰写 125 篇文章
  • 累计创建 16 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录
ESP32   

ESP32-DAC学习

概述

ESP32 具有两个8位数模转换器通道(DAC),其中 GPIO25 为通道1 、GPIO26为通道2。

DAC驱动器允许将这些通道设置为任意电压。

当使用“内置DAC模式”时,还可以通过I2S驱动器以DMA风格的写入采样数据来驱动DAC通道。

有关其他模拟输出选项,请参见Sigma-delta调制模块和LED控制模块。这两个模块均产生高频PWM输出,可以对其进行硬件低通滤波,以生成低频任意电压模拟输出。

Arduino层编程

极为简单,就只需调用一个函数:void dacWrite(uint8_t pin, uint8_t value) 即可。
其中 pin 只能为 25 与 26 号引脚。由于是8位转换器,所以可知value的范围:0-255。
而底层则是直接调用寄存器,可以提高程序的执行效率。

void IRAM_ATTR __dacWrite(uint8_t pin, uint8_t value)
{
    if(pin < 25 || pin > 26){
        return;//not dac pin
    }
    pinMode(pin, ANALOG);
    uint8_t channel = pin - 25;


    //Disable Tone
    CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL1_REG, SENS_SW_TONE_EN);

    if (channel) {
        //Disable Channel Tone
        CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_CW_EN2_M);
        //Set the Dac value
        SET_PERI_REG_BITS(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_DAC, value, RTC_IO_PDAC2_DAC_S);   //dac_output
        //Channel output enable
        SET_PERI_REG_MASK(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_XPD_DAC | RTC_IO_PDAC2_DAC_XPD_FORCE);
    } else {
        //Disable Channel Tone
        CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_CW_EN1_M);
        //Set the Dac value
        SET_PERI_REG_BITS(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_DAC, value, RTC_IO_PDAC1_DAC_S);   //dac_output
        //Channel output enable
        SET_PERI_REG_MASK(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_XPD_DAC | RTC_IO_PDAC1_DAC_XPD_FORCE);
    }
}

例子(ADC与DAC)

#include <Arduino.h>

uint8_t val;

void setup() {
  Serial.begin(9600);
  dacWrite(25,0);
  delay(500);
}

void loop() {
  Serial.printf("the ADC value=%u\n",map(analogRead(36),0,4095,0,255));
  delay(1000);
  val+=20;
  if(val>200) val=0;
  dacWrite(25,val);
}
0

评论区