ESP32基于DAC输出的呼吸灯例程

根据数据手册描述,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起航,好了,内容比较简单,打完收工!

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据