Qual a precisão do oscilador do arduino e do uso do timerOne?

A ideia deste tópico é entender melhor o que pode ser erro causado por falha do oscilador ( variação) ou falha no programa (erro de lógica) ao usar o timer do arduino como base de tempo para projetos ,medidas de pulsos, sincronismos, etc

Pessoal. a ideia aqui é discutir o oscilador e o timer do arduino, e agradeço se encontrem erros

ou equívocos da minha parte, que me corrijam e melhorem a informação.

O oscilador dos arduinos (Uno e mega) originais é de 16 MHz.

Eles são montados com cristais de quartzo. 16.000.000 ciclos por segundos.

 Variação da frequência destes cristais:

F-Deviation = (PPM/1.000.000)*F-Ideal.

Os cristais comerciais são encontrados na faixa de 20 a 50 PPM.

Ex: F-Deviation = (50/1000000) * 16000000 = 800 Hz. um erro de 0,005%

Referencia:

http://www.jameco.com/z/CY16LP-16-MHz-Crystal-50ppm-HC49-S_137891.h...

Isto significa uma variação de 4 segundos (pra mais ou pra menos) ao final de 24 horas 

24 horas = 24*60*60 segundos = 86400 segundos 86400 * 0,005% = 4,32 segundos de erro por dia.

Mas como é um cristal oscilador, ele tem uma característica de estabilidade, ou seja, este desvio é constante na razão da estabilidade da temperatura.

A variação de frequência é de aproximadamente 0,7 Hz, por grau centigrado, ou 0,000004375%, o que representa uma variação de 0,00378 segundos ao dia.

Os RTCs de mais alta precisão, como por exemplo o DS3231, utlizam cristais montados internamente no CI, ajustados para a frequencia central, e com PPM baixos na ordem de 2 PPM

e ainda usam o recurso de estabilidade térmica.

• Accuracy ±2ppm from 0°C to +40°C; 0,0002% Variação 0,017 segundos dia.

• with an integrated temperaturecompensated crystal oscillator (TCXO) .....

Referencia:

https://datasheets.maximintegrated.com/en/ds/DS3231.pdf

Com base nestas informações, podemos identificar o desvio de frequência do nosso arduino e usar este valor de desvio para corrigir erros na contagem do tempo.

A estabilidade da temperatura é um pouco mais complicada de fazer, mas ela é muito pequena e dependerá da precisão que alvejamos.

Você pode usar um sensor de temperatura encostado no cristal, e medira atemperatura nele, e depois compensar a contagem com o desvio calculado a partir desta temperatura.

Agora vamos falar da biblioteca TimerOne.

Esta é uma biblioteca que permite voce usar um recurso do arduino UNO/MEGA e outros, é o TIMER1 (não serve para o DUE).

Ela permite que você defina uma contagem de tempo usando o registrador TIMER1 do arduino.

Este TMR1 é programado pela biblioteca para receber o incrementos vindos do oscilador do arduino, ou seja um pulso a cada 62,5 NanoSegundos, através de prescaler definido no momento da inicialização do timer1.

Prescaler é um circuito que divide a contagem dos pulsos antes de aplica-los no timer.

Por exemplo, se o prescaler está definido como 16, a cada 16 pulsos na entrada, do circuito, um pulso será incrementado no registrador do timer.

Se estiver definido como 1, todos pulsos na entrada do circuito incrementarão o registrador.

O Timer1 tem os seguintes prescalers 1, 8, 64, 256 e 1024.    Reg TCCR1B do Atmega.

A definição da biblioteca para este prescaler é feita no momento em que se inicializa o timer1.

Este timer, nesta configuração, é incrementado, independente do processador do arduino, ele roda "stand alone" bastando os pulsos do oscilador.

Esta biblioteca permite também que você defina um valor, que ao ser atingido pelo timer1, um interrupt seja gerado, ou seja interrompe-se tudo que o processador está executando e executa uma função definida pelo usuário.

O Timer 1 é zerado e reinicia a contagem novamente independente do processador, ao gerar o interrupt.

Desta forma, você pode por exemplo gerar um interrupt a cada 100ms ou a cada seg, e acumular este tempo gerando uma base de tempo, como fosse um relógio.

Com esta linha: Timer1.initialize(100000); você diz para o timer gerar um interrupt a cada 100ms, ou com esta: Timer1.initialize(1000000); um interrupt a cada segundo.

Se você conseguir identificar o desvio do cristal do seu arduino, pode alterar estes valores para que então, apesar de não ser exato o valor do seu cristal, você consiga gerar uma contagem de um segundo com grande precisão.

Ex: meu arduino aumenta 4 segundos por dia, então ele gerou 4.000.000 usegundos a mais.

4.000.000 /86400 = 46 u segundos por segundo.

Então defina a linha assim: Timer1.initialize(1000046); e deverá ter um "relógio bem preciso".

Rui

Exibições: 3573

Responder esta

Respostas a este tópico

Pessoal, este code imprime o valor da frequência central do seu arduino:

http://pastebin.com/sfKumiMD

Rui

Rui, o que eu entendi nas minhas leituras é que o problema não esta no cristal. 

Não medi a frequência do cristal do Arduino, mas também acho que deva ser bem estável. 

Um erro de precisão da frequência principal é esperado - cristais mais precisos são mais caros. 

Ainda acho que o problema esta no ATmega 328. Talvez não exista esse problema em outros ATmega. 

Abraços 

Gustavo. 

Oi Pessoal, boa noite.

Se alguém quiser montar o medidor do oscilador do arduino, seque o esquema das ligações.

O Arduino "Contador de Pulso" é que enviará as medidas para a serial.

Rui

Olá pessoal, gostaria de saber se posso trabalhar com uma frequência de 10kHz de PWM no Arduino Due?

Boa tarde ARP,

veja se este link ajuda:

https://forum.arduino.cc/index.php?topic=420674.0

RV

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço