English Version

Escolhendo a MCU e Atribuindo Pinos

Rec 22-jan-2008 23:04

Em posts anteriores, esbocei os conceitos iniciais para o meu dispositivo monitorador de energia elétrica. Hoje é hora de aprofundar algumas coisas e fazer algumas escolhas.

Primeiro: eu tenho vários microcontroladores AVR aqui, mas qual devo adotar? Isso depende de quais recursos e periféricos precisaremos e quantos pinos eles vão requerer. Vamos tentar enumerá-los, começando pelo mínimo absoluto:

Qtd Pra que Onde conecta
2 VCC e GND Fonte de Alimentação
1 Medição de Freqüência Unidade de Condicionamento do Sinal
1 Pino do ADC para Medição da Voltagem Unidade de Condicionamento do Sinal
2 TXD e RXD da serial Conversor de Nível RS232 Isolado
2 Gerador do Clock da MCU Cristal
8 Subtotal

Ha vários AVRs de 8 pinos que eu poderia usar, tais como o ATtiny13, 45 e o 85. Creio que o primeiro claramente está fora porque só tem 1KiB de memória de programa e, intuitivamente, chuto que o firmware vai ficar maior do que isso. Esses chips não têm UARTs, mas a porta USI pode emulá-las perfeitamente bem a baixas velocidades -- e, lembremos, nosso conversor de nível nos limita a 9,600 bps.

Os AVRs têm osciladores RC internos para geração do clock, mas eles não são muito precisos --2% na melhor das hipóteses. Usá-los tornaria a precisão das medidas de freqüência dependentes demais da temperatura. Então, precisamos mesmo de um cristal de quartzo para sermos capazes de obter medidas precisas. E é trivial usá-los, basta ligar o cristal e os dois capacitores de carga direto nos pinos apropriados do AVR, pois ele já vem com o circuito gerador de clock embutido.

Agora, se quisermos LCD e armazenamento, precisaremos de mais pinos:

Qtd Pra que Onde conecta
7 Mostrador LCD compatível com o HD-44780
1 Turn LCD on and off Ativação do suprimento de energia para o LCD
2 EEPROM I2C 24C512 (64KiB)
10 Subtotal

Os LCDs compatíveis com o HD 44780 operam podem operar em dois modos, usando um barramento de dados de 4 ou 8 bits. Além diss, eles têm três pinos de controle: E, RS e RW. Então, em modo de 8 bits precisaremos de 11 pinos, e em modo de 4 bits precisaremos de 7. Na Internet pode-se encontrar implementações que usam apenas 6 pinos, aterrando o sinal RW e escrevendo na memória do LCD às cegas, sem aguardar confirmação, mas tomando o cuidado de mandar os dados devagar.

Precisamos ter a capacidade de desligar o LCD para economizar energia quando operando a partir das baterias. Ouço dizer que há LCDs que requerem meros 1mA para funcionar. Se você for usar um desses, pode até deixá-lo ligado o tempo todo. Mas como não tenho muita certeza de quanta corrente o meu LCD vai requerer, vou deixar essa opção na mesa.

A EEPROM I2C (também chamada de "TWI", na literatura da Atmel) requer apenas dois pinos. Assim, nosso total até o momento é 18 pinos, o que nos coloca fora do alcance dos ATtiny861s dos quais tenho alguns. Com efeito, o ATtiny2313 é o único AVR de 20 pinos cujos 18 são usáveis por software, mas ele não tem um conversor analógico-digital.

Pelo jeito então parece que vai ser mesmo o venerável ATmega8, que tem a vantagem de ser razoavelmente fácil de achar até mesmo aqui no Brasil. Ele provê 23 pinos usáveis (22 se você usar Programação no Próprio Circuito ou "ISP", da sigla em inlgês "In-System Programming"). Podemos usar os 4 pinos restantes para outras funções, tais como botões de controle (+1 pino) ou para um medidor de voltagem da bateria (+1 pino) para nos avisar quando a bateria ficar fraca. Falando nisso, podemos também adicionar um buzzer para fazer o dispositivo apitar quando faltar energia e vermos se condiz com os bipes do meu no-break.

Uma alternativa seria substituir a EEPROM por um cartão SD. Esses cartões têm uma interface SPI que combina perfeitamente com a porta SPI do ATmega8. Isso aumentaria nossa necessidade para 20 pinos: as portas SPI precisam de 4 sinais: SCK (serial clock), MISO (Master-In, Slave-Out), MOSI (Master-Out, Slave in) e CS (chip select). Esta última poderia até ser omitida, mas talvez isso impeça que usemos ISP -- o ISP usa a porta SPI e o pino CS do cartão SD é usado para dizer-lhe "ei, tou falando com você", de sorte que se o fixarmos, o cartão vai achar que toda atividade no barramento SPI é direcionada a ele, quando na verdade poderia ser para o subsistema ISP.

Os cartões SD também acrescentariam outras complicações. Precisaríamos de 512 bytes para enfileirar as escritas ao SD porque esse é o tamanho do setor, que é a menor unidade endereçável no SD. Os 1KiB de RAM que o ATmega8 possui deveriam comportar isso, mas certamente complica um pouco o software porque poderemos precisar ler do cartão (quando, logo após a energia voltar depois de uma queda, o computador principal pede para puxar as medidas que perdeu) sem interromper as medições em andamento. Em contraste, a EEPROM é endereçável byte a byte.

Além disso, os cartões SD requerem alimentação de 3,3V e podem consumir até 60mA quando escrevendo. Teoricamente eles têm um "modo de espera" que consome menos de 1mA quando ociosos. Mas não tenho lá muita certeza de que isso funcione bem, especialmente nesses cartões genéricos. O regulador de voltagem de baixa queda LM2931 que usaremos pode até prover (meio apertado) essa corrente, mas se o tal "modo de espera" não funcionar confiavelmente, vai arruinar a autonomia da bateria. Em contraste, a EEPROM consome microampères quando lendo ou em espera e poucos miliampères quando escrevendo (e por apenas alguns milissegundos).

A grande vantagem dos cartões SD é o tamanho: eles provêm centenas de megabytes de armazenamento a preços incrivelmente baixos, de sorte que poderíamos registrar não só o histórico de faltas de luz, mas também as medidas individuais de freqüência e voltagem durante anos.

Acho que deveria resistir à tentação de tornar esse dispositivo um registrador de parâmetros da linha elétrica. O que ele deve ser é um registrador de histórico de falhas: o que realmente me interessa é saber os horários e durações das falhas do suprimento de energia elétrica. As medidas de freqüência e voltagem são só os insumos para se chegar a isso. Então, por ora, vou ficar com a EEPROM I2C 24C512 de 64KiB como a escolha mais simples e segura.

Se usarmos blocos de 16 bytes para registrar um evento (mais do que suficiente para "ano-mês-dia hora:minuto:secundo.décimos" mais identificador do evento e outros parâmetros), poderíamos armazenar 4096 eventos nos 64KiB. Apesar de eu não ter definido exatamente muito bem o que venha a ser uma "falha na linha", intuitivamente duvido que teremos muito mais mais do que 10 eventos por dia em média. Então, teríamos espaço para uns 400 dias de eventos -- mais do que um ano, o que me parece bem razoável.

Mesmo se decidíssemos voltar atrás e registrar as voltagens e freqüências médias a cada 5 minutos (digamos, para fazer um gráfico com o MRTG ou RRDtool) e usássemos o mesmo formato de 16 bytes (que poderia ser muito menor), teríamos 4096 eventos / 288 (quantidade de blocos de 5 minutos em um dia) = 14,2 dias até que a memória enchesse -- o que também me parece bem decente. Além disso, podemos expandir para até quatro 24C512s usando apenas os mesmos dois pinos.

Resumindo: vamos usar um ATmega8 e as atribuições preliminares dos pinos serão:

Pino do AVR  
# Nome Conectado a
1 /RESET Linha /RESET do conector ISP
2 RXD/PD0 Linha RXD do conversor de nível RS232
3 TXD/PD1 Linha RXD do conversor de nível RS232
4 INT0/PD2 Linha E do LCD
5 INT1/PD3 Linha RS do LCD
6 XCK/T0/PD4 Linha D4 do LCD
7 VCC Saído do Regulador de Voltagem
8 GND Terra
9 XTAL1/TOSC1/PB6 Cristal
10 XTAL2/TOSC2/PB7 Cristal
11 T1/PD5 Linha D5 do LCD
12 AIN0/PD6 Linha D6 do LCD
13 AIN1/PD7 Linha D7 do LCD
14 ICP1/PB0 Onda senoidal vindo da unidade de condicionamento do sinal
15 OC1A/PB1 Buzzer
16 /SS/OC1B/PB2 Linha RW do LCD (talvez dispensável)
17 MOSI/OC2/PB3 Linha MOSI do conector ISP
18 MISO/PB4 Linha MISO do conector ISP
19 SCK/PB5 Linha SCK do conector ISP
20 AVCC Desacoplamento
21 AREF AVCC
22 GND Terra
23 ADC0/PC0 Onda senoidal vindo da unidade de condicionamento do sinal
24 ADC1/PC1 Voltagem da bateria (após divisor de voltagem)
25 ADC2/PC2 Botões
26 ADC3/PC3 Energia do LCD
27 ADC4/SDA/PC4 Linha SDA da EEPROM I2C
28 ADC5/SCL/PC5 Linha SDA da EEPROM I2C

O próximo passo será considerar exatamente como realizaremos as medições. Isso influenciará na escolha da freqüência do clock e na alocação dos recursos do microcontrolador.


Próximos posts sobre esse assunto:

Kiko > PostsEmPortugues > PtBrBlogEntry2008Jan21A
Creative Commons License   The content of this site is made available under the terms of a Creative Commons License, except where otherwise noted.
  O conteúdo deste site está disponibilizado nos termos de uma Licença Creative Commons, exceto onde dito em contrário.