Bastidores de projeto · CH1

Por que migrei do Arduino Due para o RP2040 + MCP4822

ELETROHEURO — Bastidores do CH1 (Emulador de Rede Monofásica)

O projeto fundacional do ELETROHEURO — o emulador de rede elétrica monofásica que hoje é o CH1 — começou sendo desenvolvido sobre Arduino Due. Fazia sentido na época: era uma das poucas placas Arduino "oficiais" com DAC embutido, ARM Cortex-M3, e clock suficiente para gerar as formas de onda de tensão e corrente por DDS com boa resolução temporal.

O problema só apareceu depois de horas de operação contínua — e quando apareceu, foi definitivo.

O sintoma

Em sessões de uso contínuo, o DAC0 do Due simplesmente parava de funcionar. Não era um travamento de firmware nem um bug de código — o canal analógico entrava em colapso e não voltava, mesmo com reset de software. A única forma de recuperar era desligar e religar a placa fisicamente, e em alguns casos nem isso resolvia de forma permanente.

O que descartou a hipótese de "placa defeituosa" O mesmo colapso do DAC0 aconteceu em três placas Due diferentes, todas após uso contínuo prolongado. Isso tirou da mesa a explicação mais confortável — "peguei uma unidade com defeito" — e apontou para uma limitação estrutural do próprio DAC do Due sob operação contínua.

Para um projeto que depende de gerar sinais de referência de forma estável e ininterrupta — justamente o caso de um emulador de rede elétrica, que precisa ficar horas ligado alimentando os instrumentos de medição a jusante — um DAC que degrada com o tempo de uso não é uma limitação contornável. É um problema de confiabilidade que compromete o propósito central do equipamento.

A decisão de migrar

Com o padrão se repetindo de forma consistente entre placas, ficou claro que a solução não estava em trocar de unidade Due de novo, e sim em tirar a geração analógica de dentro do microcontrolador e delegar essa função a um DAC externo dedicado, feito especificamente para esse tipo de carga de trabalho.

CritérioArduino Due (DAC interno)RP2040 + MCP4822
Confiabilidade em uso contínuoColapso do DAC0 após operação prolongadaDAC externo dedicado, sem esse histórico de falha
Canais analógicos2 canais, mas com o problema relatado2 canais (dual-channel), 12 bits, via SPI
Arquitetura de processamentoNúcleo únicoDual-core, permitindo separar geração de sinal e outras tarefas
Ecossistema / toolchainArduino IDE padrãoArduino IDE + core RP2040 (Earle Philhower), mesma familiaridade

O RP2040 resolveu o problema pela raiz: como a geração de tensão e corrente passou a ser feita pelo MCP4822 — um DAC dual-channel de 12 bits, comunicando via SPI — o microcontrolador deixou de ter qualquer responsabilidade analógica direta. Ele só calcula os valores da LUT de seno de 256 pontos e envia via SPI; quem gera o sinal analógico de fato é um chip dedicado e especificado para justamente esse tipo de operação contínua.

Ganho colateral A arquitetura dual-core do RP2040 também abriu espaço para separar responsabilidades — um núcleo cuidando da geração DDS via timer de hardware, outro livre para lógica de controle e interface — algo que o Due, com núcleo único, não oferecia da mesma forma.
observação

Fica o aprendizado para quem estiver decidindo entre usar o DAC interno de um microcontrolador ou delegar a um chip externo: quando o projeto depende de operação contínua e prolongada — não só de gerar um sinal correto uma vez —, vale testar esse cenário de estresse cedo. Um DAC pode funcionar perfeitamente em testes curtos e ainda assim não ser confiável para uso real de longa duração. No caso do CH1, foram três placas para eu ter certeza de que não era acaso — e a migração para um DAC externo dedicado acabou sendo, também, a decisão que deu ao projeto uma arquitetura mais robusta no fim das contas.

Do blog para o artigo completo

Veja a arquitetura completa do CH1

Geração DDS com LUT de seno de 256 pontos, split Core 0/Core 1, ISR de hardware e o dimensionamento do MCP4822 no artigo técnico do Emulador de Rede Monofásica.

Ler artigo 2 →