Porovnanie frekvencie hodín na dvoch Arduinach

Zápisník experimentátora

Pred pár dňami som si dokúpil dve dosky Arduino Pro Mini. Priletoval som na ne odlamovacie lišty, aby sa dali zastrčiť do skúšobného poľa a pripojil ich na zdroj. Obvykle je v nich nahraná nejaká modifikácia programu Blink, ktorá bliká LED diódou na pine 13. Aj tu to tak bolo. Potom som si na niekoľko minút odskočil a keď som sa vrátil, všimol som si, že neblikajú rovnako. Napriek tomu, že boli zapnuté v rovnakom čase, už po pár minútach sa rozlaďovali. Preto vznikol tento test, ktorý mal ukázať, aké sú rozdiely medzi dvomi zdanlivo identickými Arduinami.

Princíp merania

Aby som mohol merať rozdiel medzi bliknutiami, musel som do hry zapojiť tretie Arduino. Ja som použil Arduino Mega, ale úplne rovnako by malo fungovať aj Arduino Uno. V Arduine je program, ktorý sleduje dva externé prerušenia. Dve testované Arduina majú výstup z pinu 13 pripojený na piny 2 a 3 v Mege, čo sú piny, na ktorých možno externé prerušenia sledovať.

Na pripojenie obsluhy prerušenia slúži funkcia attachInterrupt(). Pomocou nej som pripojil dve prerušenia na funkcie, ktoré si poznačia čas v mikrosekundách v danom okamihu a dajú signál hlavnému programu, ktorý sa opakuje vo funkcii loop. Akonáhle sa v tejto funkcii zistia oba signály, vypočíta sa ich rozdiel a vypíše na sériový port. V príklade sú uvedené iba podstatné časti z kódu.

volatile boolean signal0=false;
volatile boolean signal1=false;
volatile int32_t t0=0;
volatile int32_t t1=0;

void setup() {
...
// pin 2 and 3
attachInterrupt(0,int0,RISING);
attachInterrupt(1,int1,RISING);
...
}

void loop() {
if(signal0 && signal1)
  {
  ...  
  // difference between Arduinos in micros
  Serial.print(",");
  Serial.print(t1-t0);
  Serial.println("");
  signal0=signal1=false;  
  }
delay(100);
}

void int0() {
t0=micros();
signal0=true;
}

void int1() {
t1=micros();
signal1=true;
}

Výsledky

Z výsledkov možno pomerne presne odhadnúť, že každú minútu nastane medzi oboma Arduinami časový rozdiel približne 5 ms. Video z testu.

Čas Rozdiel
00:00 5 ms
01:00 0 ms
02:00 -6 ms
03:00 -11 ms
04:00 -16 ms
05:00 -22 ms
06:00 -27 ms
07:00 -33 ms
08:00 -38 ms
09:00 -43 ms
10:00 -49 ms
11:00 -54 ms
12:00 -60 ms
13:00 -65 ms
14:00 -71 ms
15:00 -76 ms

Na prvý pohľad sa to možno zdá byť hrozné, treba si však uvedomiť, že vo väčšine prípadov nebude rozdiel pár milisekúnd dôležitý. Ono to nakoniec nie až tak veľa, keď sa výsledku dá odhadnúť, že sa to za jeden deň rozladí približne o 10 sekúnd. Závisí to aj od toho, či sa používa kryštál alebo rezonátor a aká je teplota čipu v mikrokontroléri.

Ak je presnosť dôležitá, treba ju sledovať pomocou hodín reálneho času. Napríklad lacný obvod DS1307 je na túto úlohu viac než vhodný.



Download

15.08.2015


Menu