【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。

| 衰减等级 | 宏定义 | 可测量电压范围 |
|---|---|---|
| 0dB | ADC_0db | 0~1.1V |
| 2.5dB | ADC_2_5db | 0~1.5V |
| 6dB | ADC_6db | 0~2.2V |
| 11dB | ADC_11db | 0~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);
}

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);
}

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);
}

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