High Resolution Timer With Low Cost Microcontroller

Un timer è un contatore di cicli di clock. La massima risoluzione che è possibile ottenere è quindi limitata dal clock del contatore. La misura accurata di intervalli temporali è fondamentale in molte applicazioni e alcuni microcontrollori sono dotati di timer hardware con frequenza di clock molto più elevata di quella di funzionamento della CPU.

Ad esempio MSD340 è dotato di un timer hardware “Timer D” con una risoluzione di 4 nano secondi . Alcuni modelli della famiglia STM32 (es.  STM32F334) includono un “High Resolution Timer” con risoluzione di 217 picosecondi.

Nel caso di ESP8266 il limite è dato dalla frequenza di clock della CPU pari a 80 o 160 MHz. Scegliendo 160MHz  l’intervallo di tempo tra due impulsi di clock è 6,25 nano secondi

CodeCogsEqn (1)

Per contare il numero di impulsi di clock trascorsi tra due eventi si può utilizzare la funzione

unsigned long counter= ESP.getCycleCount()

che restituisce il valore del contatore dei cicli di clock

Con un clock a 160MHz si hanno 160 cicli per ogni microsecondo. Quindi il numero di cicli contati tra due eventi sarà

CodeCogsEqn (3) con:

ΔCK: incremento del contatore dei cicli di clock
Δt: intervallo temporale tra due eventi
T_f: tempo (misurato in numero di cicli di clock) impiegati dalla funzione
     "ESP.getCycleCount()" per restituire il valore del contatore.

Per stimare T_f è necessario misurare ΔCK per alcuni valori di Δt noti. Per una stima approssimativa si può utilizzare la funzione

unsigned long currentTime = micros()

che restituisce il tempo trascorso dal boot in microsecondi. Per una stima più accurata è invece necessario uno strumento di misura esterno.

 

 startClockCounter1us = ESP.getCycleCount();
 delayMicroseconds(1);
 stopClockCounter1us = ESP.getCycleCount();
 Serial.print("clock count 1uS : "); //ΔCK
 Serial.println(stopClockCounter1us-startClockCounter1us);

Il contatore ha misurato un incremento pari 222 unità. Quindi ΔCK = 222=160+Tf → Tf= 62 cicli di clock.

Ripetendo l’esperimento per diversi valori di ritardo è possibile verificare se la stima di T_f è valida anche per altri valori di ritardo:

startClockCounter2us = ESP.getCycleCount();
 delayMicroseconds(2);
 stopClockCounter2us = ESP.getCycleCount();
 Serial.print("clock count 2uS : ");
 Serial.println(stopClockCounter2us-startClockCounter2us);

startClockCounter5us = ESP.getCycleCount();
 delayMicroseconds(5);
 stopClockCounter5us = ESP.getCycleCount();
 Serial.print("clock count 5uS : ");
 Serial.println(stopClockCounter5us-startClockCounter5us);

...

Risultati ottenuti eseguendo  https://github.com/emanbuc/ESP8266_PerformanceTest/tree/master/clock_counter sono sembrano compatibili con il modello lineare ipotizzato ΔCK = 160*Δt+Tf anche se i coefficienti della retta di regressione sono un po’ diversi da quelli ipotizzati.

Nota: La misura di Δt è ottenuta dalla funzione “micros()” che probabilmente utilizza lo stesso contatore di cicli di clock di ΔCK, quindi questi dati hanno valore puramente indicativo. Per una stima affidabile è necessario utilizzare uno strumento di misura esterno (es. oscilloscopio) in  modo da avere una misura dell’intervallo di tempo Δt indipendente dal clock del microcontrollore. 

clock_counter_serial_log

ESP8266_clock_counter_test_result
Risultati delle misure effettuate utilizzando la funzione “micros()”
Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...