Můj příspěvek k měření přesnosti časování Arduina.
Pro testy jsem použil čínský klon Arduina Nano s nějakým NONAME rezonátorem.
Fotka:
http://www.astromik.org/forum/nano-rezonator.jpg
Vycházím z toho, že procesor očekává jako zdroj základního kmitočtu 16MHz krystal.
Od této frekvence se pak odvíjí veškeré časování.
Když samotný krystal kmitá rychleji (vyšší frekvencí), procesor nemá žádnou možnost zjistit, že frekvence neodpovídá 16MHz, a proto jsou všechny funkce millis() i delay() zrychlené (trvají kratší dobu, než by měly).
Při mojí metodě zkoumání přesnosti časování jsem tedy zkusil přesně změřit kmitočet, na kterém 16MHz krystal opravdu kmitá.
Protože není možné měřit krystal přímo (jakékoliv kapacitní zatížení krystalu hýbe výrazně s frekvencí), napsal jsem program, který tuto základní frekvenci vydělí přesně 256 a pošle ji na samostatný pin (D3)
Je to v podstatě jen klasické nastavení PWM signálu pomocí registrů v ATmega328.
Kód: Vybrat vše
void setup(void)
{
pinMode(3,OUTPUT); // pin D3 na vystup
TCCR2A = 0b00100011; // nastaveni PWM: "Clear OC0B on Compare Match" a zaroven "Fast PWM"
TCCR2B = 0b00000001; // prescaler = 1x (frekvence = 16000000/256 = 62.5kHz)
OCR2B = 127; // 50% strida na pinu D3
}
void loop(void)
{
}
Ideálně bych tedy na pinu D3 očekával frekvenci 16000000 / 256 = 62500 Hz
(číslo 256 je rozlišení PWM střídy)
Frekvenci jsem pak měřil metodou porovnávání dvou frekvencí na osciloskopu (Lissajousovy obrazce).
Teorie například tady:
http://vyuka.hradebni.cz/mod/resource/v ... ue&id=9712
Jeden kanál osciloskopu byl zapojen na pin D3 v Arduinu, a druhý byl připojený k velmi přesnému nastavitelnému generátoru.
Nastavováním frekvence generátoru byl hledán stav, kdy se obrazec ustálí.
Čím je rozdíl frekvencí vyšší, tím rychleji se obrazec na osciloskopu pohybuje.
Na přiloženém videu je vidět, že frekvence na pinu D3 je 62536 Hz.
Video:
https://youtu.be/CbTdadjba6Y
Když se tato frekvence vynásobí 256, je výsledkem skutečná frekvence krystalu.
62536 * 256 = 16009216 Hz
Rozdíl mezi ideální a skutečnou frekvencí krystalu je tedy "plus" 9216 Hz.
Převedeno na procenta je to odchylka ( 9216 / 16000000 ) * 100 = + 0.0576 %
Pokud by tato chyba byla konstantní (ve skutečnosti je závislá i na teplotě), projevila by se v časovači chybou 1s asi za 29 minut.
Výpočet:
1 / 0.000576 = 1736s = 29 minut