根据数据手册描述,ESP32片上有两路8位的DAC输出通道,可以把数字量转换为模拟量。主要特性如下(从手册拷贝的):
DAC 的主要特性包括:
• 2 个 8 位 DAC 通道
• 支持双通道的独立/同时转换
• 可从 VDD3P3_RTC 引脚获得电压参考
• 含有余弦波型发生器
• 支持 DMA 功能
• 可通过软件或 SAR ADC FSM 开始转换。更多信息,请见 SAR ADC 章节。
• 可由 ULP 协处理器通过控制寄存器来实现完全控制。
在最小系统板上,GPIO26(也就是DAC2)接到了一个LED上面,我们可以通过DAC输出变化的电压值,从而实现一个呼吸灯的效果。
程序的话,在adc2的例程上做修改。因为adc2的例程是DAC输出电压,然后ADC采集,然后通过串口打印信息。现在我们去掉AD采样部分,修改DAC输出的通道,其它部分不变。编译一下:
#include <stdio.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "driver/adc.h"
#include "driver/dac.h"
#include "esp_system.h"
#include "esp_adc_cal.h"
#define DAC_EXAMPLE_CHANNEL DAC_CHANNEL_2
void app_main(void)
{
uint8_t output_data=0;
int read_raw;
esp_err_t r;
gpio_num_t dac_gpio_num;
r = dac_pad_get_io_num( DAC_EXAMPLE_CHANNEL, &dac_gpio_num );
assert( r == ESP_OK );
printf("DAC channel %d @ GPIO %d.\n",DAC_EXAMPLE_CHANNEL, dac_gpio_num );
dac_output_enable( DAC_EXAMPLE_CHANNEL );
vTaskDelay(2 * portTICK_PERIOD_MS);
printf("start conversion.\n");
while(1) {
dac_output_voltage( DAC_EXAMPLE_CHANNEL, output_data++ );
vTaskDelay( 2 * portTICK_PERIOD_MS );
}
}
注意事项:下载完成以后,重新上一下电,或者复位一下,否则程序不执行。效果如下:
串口打印的信息比较少,因为主要是输出。我们看下面的视频,可以知道LED的亮度在随着时间变化。速度有些慢,没关系,可以修改时间。
我是单片机爱好者MCU起航,好了,内容比较简单,打完收工!