跳转至

DAC 数模转换器

概要

本文讲解了ESP32中的DAC资源的使用

keywords dac micropython-esp32

DAC是什么

DAC 英文全称为Digital Analog Converter,是将数字信号转换为模拟信号的转换器。 这里主要对比DAC与PWM,DAC输出的是模拟信号,PWM输出的是数字信号。 DAC也可以控制LED亮度,而且亮度范围更精细,因为DAC的输出电压是连续可变的,DAC控制LED也不存在PWM控制LED亮度那样的频闪问题,DAC可以实现比PWM更高精度的控制。另外PWM可以通过滤波器实现低精度的DAC功能。

DAC-常用API

DAC硬件资源

DAC在专用引脚上可用,可用的DAC引脚只有两个。 可用引脚有:GPIO25, GPIO26,输出的电压模拟值范围为0~3.3V

导入DAC类

导入DAC类与Pin类

from machine import DAC,Pin

DAC构造器

创建一个DAC的管脚Pin对象(声明为输出),然后传入到DAC的构造器里面

dac_pin = Pin(26, Pin.OUT)
dac = DAC(dac_pin)

ESP32的DAC分辨率只有8位,在MicroPython固件中12位的精度还未实现。

dac = DAC(Pin(26)) 

默认bits=8 ,则dac的数值范围为0-255

实际输出电压值为0-3.3v,数值范围映射到电压范围上。

DAC输出

DAC输出使用write函数。 根据bits的不同,写入value值的范围也不同。

dac.write(value)

DAC资源的释放

dac.deinit()

DAC实现呼吸灯效果

由于DAC只支持25,26两个引脚,所以我们就无法继续使用板载的蓝色LED了,所以笔者使用了一个新的led模块来演示以下的示例:

from machine import DAC
from machine import Pin
import utime, math


dac = DAC(Pin(26,Pin.OUT), bits=12)

def pulse(dac, period, gears):
    """呼吸灯函数

    Arguments:
        dac {[DAC]} -- [DAC对象]
        period {[type]} -- [周期 ms]
        gears {[type]} -- [亮度档位]
    """

    for i in range(2 * gears):
        dac.write(int(math.sin(i / gears * math.pi) * 2000) + 2048)
        # 延时
        utime.sleep_ms(int(period / (2 * gears)))

# 呼吸十次
for i in range(10):
    pulse(dac, 2000, 100)

思考题

为什么不对比对比DAC和PWM这两种方式实现的呼吸灯的效果有什么区别呢?

试着写写代码,比较比较吧。