Após dominar aquisição (ADC), controle (GPIO/PWM), comunicação (UART, I2C, SPI, Wi-Fi) e persistência, o último elemento da cadeia embarcada é a geração de sinais analógicos reais.
Isso é feito com DAC (Digital-to-Analog Converter) — fechando o ciclo completo entre o domínio digital e o físico.
O que é um DAC
DAC converte valores digitais em tensão analógica contínua.
Aplicações diretas
- Geração de sinais (formas de onda)
- Áudio
- Controle de dispositivos analógicos
- Testes e instrumentação
Limitação do Raspberry Pi Pico
O RP2040 não possui DAC interno.
Solução prática
Uso de DAC externo via SPI:
- MCP4921 (12 bits)
Características do MCP4921
- Resolução: 12 bits (0–4095)
- Interface: SPI
- Saída: até 3.3V
- Alta taxa de atualização
Estrutura de Dados
[HIGH BYTE][LOW BYTE]
Formatação do Dado
buff[0] = (data >> 8) & 0x0F
buff[0] += 0x30
buff[1] = data & 0xFF
Configuração SPI
from machine import Pin, SPI
spi = SPI(0,
sck=Pin(2),
mosi=Pin(3),
miso=Pin(0),
baudrate=100000)
CS = Pin(16, Pin.OUT)
CS.value(1)
Função Base do DAC
def DAC(data):
buff = [0, 0]
buff[0] = (data >> 8) & 0x0F
buff[0] += 0x30
buff[1] = data & 0xFF
CS.value(0)
spi.write(bytearray(buff))
CS.value(1)
Projeto 1: Onda Quadrada
import utime
ON = int(2000 * 4095 / 3300)
OFF = 0
while True:
DAC(ON)
utime.sleep_ms(1)
DAC(OFF)
utime.sleep_ms(1)
Resultado:
- Sinal digital convertido em onda analógica
- Frequência aproximada de 500 Hz
Versão com Timer
from machine import Timer
flag = 0
def callback(timer):
global flag
if flag == 0:
DAC(ON)
flag = 1
else:
DAC(OFF)
flag = 0
tim = Timer()
tim.init(freq=1000, mode=Timer.PERIODIC, callback=callback)
Projeto 2: Níveis de Tensão
def Voltage(v):
return int(v * 4095 / 3300)
while True:
DAC(Voltage(0))
utime.sleep_ms(100)
DAC(Voltage(1000))
utime.sleep_ms(100)
DAC(Voltage(2000))
utime.sleep_ms(100)
DAC(Voltage(3000))
utime.sleep_ms(100)
Projeto 3: Onda Dente de Serra
k = 0.0
while True:
DAC(int(Voltage(k * 3300)))
utime.sleep_ms(2)
k += 0.1
if k >= 1.0:
k = 0.0
Projeto 4: Onda Triangular
while True:
k = 0.0
while k < 1.0:
DAC(int(Voltage(k * 3300)))
utime.sleep_ms(1)
k += 0.1
k = 1.0
while k > 0.0:
DAC(int(Voltage(k * 3300)))
utime.sleep_ms(1)
k -= 0.1
Projeto 5: Onda Arbitrária
wave = [0.0,0.2,0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.6,
1.6,1.6,1.6,1.4,1.2,1.0,0.8,0.6,0.4,0.2,0.0]
while True:
for v in wave:
DAC(int(4095 * v / 3.3))
utime.sleep_ms(1)
Projeto 6: Onda Senoidal
import math
samples = [0]*101
for i in range(101):
samples[i] = 1.0 + 0.7 * math.sin(0.0628 * i)
while True:
for v in samples:
DAC(int(v * 4095 / 3.3))
utime.sleep_us(200)
Versão com Timer
from machine import Timer
k = 0
def callback(timer):
global k
DAC(int(samples[k] * 4095 / 3.3))
k = (k + 1) % 50
tim.init(freq=2500, mode=Timer.PERIODIC, callback=callback)
Conceitos Fundamentais
Resolução
4096 níveis → ~0.8 mV por passo
Conversão
digital = V * 4095 / 3.3
Limitação
- Faixa: 0 a 3.3V
- Não gera sinais negativos diretamente
Boas Práticas
- Usar Timer para sinais precisos
- Precalcular tabelas (performance)
- Minimizar delays em loops críticos
Arquitetura Completa
Com DAC, o sistema passa a cobrir:
- Entrada → sensores (ADC)
- Processamento → lógica
- Saída digital → GPIO/PWM
- Comunicação → UART/I2C/SPI/Wi-Fi
- Persistência → arquivos
- Saída analógica → DAC
Insight Técnico Final
DAC fecha o ciclo completo da engenharia embarcada:
Digital → Processamento → Analógico → Mundo físico
Encerramento Definitivo
Com este capítulo, o conjunto está completo:
- Entrada (ADC)
- Processamento (lógica)
- Saída digital (GPIO, PWM)
- Comunicação (UART, I2C, SPI, Wi-Fi)
- Persistência (data logging)
- Saída analógica (DAC)
Isso constitui uma base profissional completa para desenvolvimento de sistemas embarcados com Raspberry Pi Pico.
Base técnica do conteúdo:
