跳到主要内容

【ADC&DAC】模拟转化实验

  • 模拟信号:模拟信号变化是 连续 的,温度变化,声音等等
  • 数字信号:数字信号是 离散 的信号,只有数字信号才能被计算机所处理
  • 模拟信号转化成数字信号需要借助ADC,数字信号转化成为模拟信号需要借助DAC
提示

以参考电压3.3v为例子,12位ADC举例子,12位的数字最多能表示4096个数字,所以他的精度是3.3 / 4096 = 0.8mv 精度

  • 数字量0 对应 0V
  • 数字量4095对应 3.3v

ESP32 ADC

ESP32 内置了 2 个 12 位的 ADC,可测量来自 18 个管脚的模拟信号,具体引脚可以参考手册。

并且可以支持配置增益,默认增益为11dB

1
衰减等级宏定义可测量电压范围
0dBADC_0db0~1.1V
2.5dBADC_2_5db0~1.5V
6dBADC_6db0~2.2V
11dBADC_11db0~3.3V

常用函数

uint16_t analogRead(uint8_t pin); //读取某个引脚的电压,返回数字量

uint32_t analogReadMilliVolts(uint_t pin); //直接得到电压指,单位mV

void analogSetAttenuation(adc_attenuation_t attenuation); //设置ADC增益

void analogSetPinAttenuation(uint8_t pin, adc_attenuation attenuation); //设置某一个引脚的adc增益

ADC 实验1 手动转化

读取一个引脚的电压,并通过串口输出

  • 代码
#define ADC_PIN 0

void setup() {
Serial.begin(9600);
pinMode(ADC_PIN, INPUT);
}

void loop() {
int data = analogRead(ADC_PIN);
Serial.print("通道的电压值是:");
Serial.println(data * (3.3/4096.0f));
delay(50);
}
1

ADC 实验2 设置增益 自动转化

  • 代码
#define ADC_PIN 0

void setup() {
Serial.begin(9600);
pinMode(ADC_PIN, INPUT);
analogSetAttenuation(ADC_11db);
}

void loop() {
int data = analogReadMilliVolts(ADC_PIN);
Serial.print("通道的电压值是:");
Serial.println(data);
delay(50);
}
1

ESP32 DAC

DAC就是数字量转化成为模拟量

  • 重要函数:

void dacWrite(uint8_t pin, uint8_t value);

  • 代码
提示

烧录代码前,使用杜邦线连接25和26引脚

#define ADC_PIN 25 // 25号引脚

void setup()
{
Serial.begin(9600);
pinMode(ADC_PIN, INPUT);
pinMode(26, OUTPUT); // 26号引脚输出
analogSetAttenuation(ADC_11db);
}

void loop()
{
int value = analogReadMilliVolts(ADC_PIN);
Serial.print("通道的电压值是");
Serial.println(value);
delay(50);
dacWrite(26, 0);
}
1
提示

插拔26引脚,可以看到DAC的输出电压变化