Quais são as implicações da execução de um ATmega328P a 8 MHz e 3,3 V com o sistema Arduino?


8

Estou trabalhando em um arduino personalizado que funcionará a 3,3 V sem reguladores ou chips USB (para consumo de energia). Ouvi dizer que fazer overclock no chip em 16 MHz / 3,3 V geralmente é bom, mas eu gostaria de permanecer dentro das especificações de qualquer maneira.

Primeiro: para rodar em 8 MHz, só preciso substituir o cristal? Ou há mais alguma coisa que eu tenho que fazer?

Segundo: preciso fazer alterações no código para refletir a nova velocidade? Estou usando conexões seriais, SPI e I2C neste projeto, juntamente com o sistema operacional NilRTOS e funções millis / delay. Alguma dessas coisas será quebrada? O código funcionará visivelmente mais devagar?

Terceiro: como posso programar o chip? É possível programá-lo em um Arduino Uno a 16 MHz e depois transplantá-lo para o arduino personalizado?

Quarto: o consumo de energia mudará em 8 MHz?

Obrigado!


2
Existem muitas placas compatíveis com Arduino de 3.3V, sendo o Sparkfun Pro mini um exemplo. Ele é suportado pelo IDE, de modo que todos os ajustes específicos do relógio serão feitos para você quando você o selecionar no menu suspenso 'boards'.
Oleg Mazurov

A 8MHz, você provavelmente ficará bem usando o oscilador interno em vez de um cristal. Cuidado ao compilar código e, quando você escolhe, por exemplo, "Pro Mini 328p a 8MHz" que 8 é aplicado ao código, por isso não sugeriria a compilação para 16MHz e o transplante, ou você pode achar que um atraso (1000) leva dois segundos como um exemplo simples. E confira economia de energia / suspensão no código H2OhNo. (Outro momento em que eu sugiro que você obter qualquer programador em tudo, em vez de limitar-se a envios de série, procure Tindie para "ISP".)
Patrick Tudor

Respostas:


7

A fórmula parece ser volt * 5.9-6.6 = mhz (válida entre 1.8v e 4.5v), então em 3.3v, isso daria 12.8mhz. Esteja ciente de que, se você estiver rodando a 12,8 mhz, QUALQUER queda abaixo de 3,3 v PODE causar problemas (e muito difícil de diagnosticar também!) Ou PODE se safar.

No entanto, os chips Arduino Atmega328p têm uma detecção de "escurecimento" definida em 4,3v - qualquer queda abaixo disso, o chip é desligado. Você pode solicitar a um provedor de serviços de Internet (AKA ICSP) que troque os fusíveis - vá para http://www.engbedded.com/fusecalc/ para descobrir como definir os fusíveis. Você também pode usar o ISP para ler os fusíveis atuais ou reprogramar o chip sem uma placa Arduino - todos os meus projetos têm um cabeçalho de 6 pinos. Se você fizer isso, antes de reprogramar usando a placa Arduino, precisará "Burn Bootloader" (no menu Ferramentas). Observe que a programação ainda pode ser feita via IDE do Arduino.

Como alternativa, se você quiser ficar "leve" (e possuir um ISP), poderá mudar os fusíveis para usar o relógio interno de 8 mhz - isso libera 2 pinos extras também! Lembre-se, no entanto, de que o relógio interno pode variar 1,2 horas por dia (= 5%), comparado a 1,7 segundos por dia (= 20 partes por milhão) em um cristal de quartzo típico. Se você não usá-lo para cronometragem, isso provavelmente não importa.

Você precisará fazer alterações no tempo, para o seu código - você precisa adicionar um boards.txt com as configurações corretas para o seu chip / velocidade do relógio, etc. - você pode copiar as configurações da entrada do quadro, alterar o nome e alterar a configuração "build.f_cpu"; reinicie (ou inicie) o seu Arduino IDE, vá em "Ferramentas-> Placa" e selecione a placa que você adicionou.

Você pode ativar / desativar o chip na placa e reprogramar a mesma (observe que a placa selecionada em Ferramentas-> Placa é a placa FINAL, não a placa de programação). Cuidado ao conectar / desconectar - eventualmente, você VAI dobrar os pinos! Como alternativa, você pode usar o ISP (ICSP), como mencionado acima - muito recomendado. A programação do provedor também funcionará se o chip for o padrão de fábrica, desde que tenha um relógio funcionando.

A quantidade de energia usada pelo chip depende muito do que você faz com ele - não apenas a velocidade do relógio, a fonte do relógio, etc., mas também os modos de suspensão. Se você estiver dormindo muito, pode demorar menos quando estiver mais rápido do que em um ritmo mais lento - se quase todo o seu tempo estiver adormecido, o consumo de energia deverá ser contado por ciclo de relógio, não por segundo - se seu relógio estiver com metade da velocidade e meia corrente, você desenha a mesma corrente por instrução. Como o resto do seu tempo é gasto no sono, você não recebe nenhum benefício. Consulte http://www.gammon.com.au/power para obter uma análise muito boa do uso de energia, dicas sobre como economizar energia, etc.

Se você desacelerar demais o relógio, o serial e o i2c podem se tornar não confiáveis ​​(a menos que você diminua a velocidade), mas eu esperaria poder diminuir para 1mhz antes que isso seja um problema - um chip de 1mhz tentando fazer 9600bps possui 104 instruções por bit de dados transferidos. O i2c roda a 100khz, portanto, você recebe 10 instruções por bit (a 1mhz) - possivelmente pressionando-o. 8mhz deve estar bem. Teste, teste, teste.

ATUALIZAÇÃO: Existem 3 configurações possíveis para a detecção de escurecimento - existem 3 valores possíveis para o AtMega328p: desativado, 1,8v, 2,7v e 4,3v. Fiquei com a impressão (acima) de que os Arduinos eram normalmente configurados em 4,3v; aparentemente esse não é o caso (veja o comentário abaixo). Lembro-me de ter visto em algum lugar que havia detecção de queda de energia. Isso é algo a ter em mente, se o seu arduino for redefinido, especialmente ao colocar cargas maiores na bateria (motores em funcionamento, leds múltiplos, etc.).


Obrigado por esta resposta! Estou um pouco confuso com o que você disse sobre o detector de queda de energia desligando abaixo de 4,3 V. Agora estou com 3,7 V e funciona bem; não precisou fazer nenhuma alteração nos fusíveis.
Vulcan

@ user40, consulte a seção "ATUALIZAÇÃO" na parte inferior da minha postagem.
AMADANON Inc.

4

Primeiro: para rodar em 8 MHz, só preciso substituir o cristal? Ou há mais alguma coisa que eu tenho que fazer?

Não, execute o oscilador interno conforme sugerido pela AMADANON Inc.

Como alternativa, defina o fusível "dividir o relógio por 8" (que o executaria em 2 MHz a partir de um cristal de 16 MHz) e, em seguida, no código, altere a divisão novamente para 2. ie.

#include <avr/power.h>

void setup ()
  {
  // slow clock to divide by 2
  clock_prescale_set (clock_div_2);
  } // end of setup

Ou, para programar em outro Uno, deixe o fusível em paz, programe a 16 MHz e depois diminua o relógio no chip de destino, esperando que funcione o suficiente a 3,3V para executar a primeira instrução. O mais seguro seria instalar apenas um cristal ou ressonador de 8 MHz na placa de destino. No entanto, se o tempo não for crítico, execute o oscilador interno.

Segundo: preciso fazer alterações no código para refletir a nova velocidade? Estou usando conexões seriais, SPI e I2C neste projeto, juntamente com o sistema operacional NilRTOS e funções millis / delay.

Se você informar ao IDE que possui um processador de 8 MHz (por exemplo, um Lilypad), ele deverá ajustar atrasos, cálculos de taxa de transmissão etc.

Alguma dessas coisas será quebrada?

I2C e SPI têm auto-clock. Eles podem ser executados em uma variedade de taxas. Duvido que haja algum problema com eles. Quanto ao serial, desde que os cálculos sejam feitos corretamente, uma ampla faixa de taxas de transmissão ainda deve estar disponível.

O código funcionará visivelmente mais devagar?

Bem, sim, ele será executado a meia velocidade em comparação com 16 MHz.

Terceiro: como posso programar o chip? É possível programá-lo em um Arduino Uno a 16 MHz e depois transplantá-lo para o arduino personalizado?

Você pode fazer isso. Ou você pode conectar um cabeçalho ICSP ou FTDI e programá-lo in situ.

Exemplos aqui: http://www.gammon.com.au/breadboard

Quarto: o consumo de energia mudará em 8 MHz?

Sim, é um pouco reduzido.

Você pode reduzi-lo consideravelmente mais usando outras técnicas descritas em http://www.gammon.com.au/power e mencionadas pela AMADANON Inc.


Obrigado Nick! Eu já li o seu site antes e isso me ajudou a reduzir radicalmente o consumo de energia. Como resultado, os AAs e AAAs agora são uma fonte de energia viável para este dispositivo, o que é importante porque o peso é importante. Então, obrigado por esse site também - é um serviço enorme para a comunidade e realmente útil para pessoas como eu.
Vulcan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.