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这两种方式实现的呼吸灯的效果有什么区别呢?
试着写写代码,比较比较吧。