Raspberry Pi Pico com DAC: Geração de Sinais Analógicos em Sistemas Embarcados

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: