Domanda:
Quando imposto i timer hardware come interrupt, devo preferire un valore di prescaler inferiore o un CTC inferiore?
Roberto Santalla
2014-09-02 02:42:00 UTC
view on stackexchange narkive permalink

Attualmente sto giocando con i timer hardware di Arduino e mi è venuta in mente una domanda. Lascia che ti spieghi un po '.

Supponiamo che io voglia che una certa funzione venga eseguita ogni 1024 battiti di clock. Per quanto ne so, potrei ottenere questo risultato in diversi modi, giocando con il valore del prescaler per Timer2 e il suo CTC:

  1. Impostazione del prescaler su 1 e CTC su 1024
  2. Impostazione il prescaler a 8 e il CTC a 128
  3. ...
  4. Impostare il prescaler a 1024 e il CTC a 1.

Tutti questi modi potrebbero ottenere ciò che voglio, ma quale è più efficiente? O non importa affatto?

Grazie in anticipo per aver condiviso le tue conoscenze: P

Valori più grandi del prescaler risulteranno in una leggerissima diminuzione del consumo di energia poiché qualsiasi circuito sia collegato all'uscita del prescaler commuterà a una frequenza inferiore e il consumo energetico è proporzionale a c v ^ 2 f.
CTC non è un numero, è una modalità di funzionamento del contatore (modalità 2). Si imposta il periodo del timer impostando "OCR2A", il periodo effettivo essendo "(OCR2A + 1) × prescaler" cicli della CPU. Pertanto, se si imposta il prescaler su 8, è necessario impostare "OCR2A = 127".
Due risposte:
Janakiram
2014-09-02 09:11:50 UTC
view on stackexchange narkive permalink

Se il conteggio del "clock tick" (qui 1024), la larghezza del timer e il clock MCU utilizzati sono costanti (un valore fisso), non sceglierei l'ultima opzione, ovvero prescalar 1024 e CTC di 1. Ecco le mie ragioni (specialmente per Arduino)

1) Quando CTC è vicino a zero (come 1-> 10), a volte il timer si comporta come se il conteggio fosse zero ed emette un'onda quadra (con un rapporto di lavoro del 50%) con metà della frequenza richiesta . Quindi rendi CTC ragionevolmente grande. Ma ancora una volta la selezione di una frequenza di clock elevata (pre scalare 1) può anche mostrare una precisione ridotta. Un'opzione intermedia penso sia migliore.

2) Quando il conteggio CTC cambia dinamicamente in un processo, il timer pre scalare dovrebbe essere selezionato in modo tale che il conteggio CTC sarà sempre inferiore o uguale alla larghezza del timer per l'intero processo.

ad es. il massimo 'conteggio tick del timer' dovrebbe essere comodamente sistemato dal timer con la sua larghezza data. Anche qui si verifica di nuovo lo stesso dilemma, quindi la selezione basata sul punto 1 è migliore.

Se ciò non è sufficiente, l'unico modo che penso sia implementare fisicamente ogni caso e verificare quale combinazione ti dà i migliori risultati. I risultati pratici penso siano più affidabili (forse otterrai una combinazione efficiente specifica per la tavola!)

Non vedo alcuna causa principale ragionevole per convalidare la tua osservazione sui valori CTC bassi che potrebbero ridurre la precisione. In particolare, il "timer a volte si comporta ..." è ovviamente sbagliato: perché i timer nell'architettura AVR non avrebbero un comportamento ripetibile in questo caso?
Ho detto che pre scalari bassi (non valori CTC) possono ridurre la precisione. Valori CTC bassi possono fornire uscite indesiderate dai timer.
"A volte" qui significa "alcune schede" di Arduino. Ho usato questa parola perché la domanda non è stata posta per una scheda specifica. Ho lavorato molte volte con i timer 'Arduino Due', con frequenza del timer di 10,5 MHz e ogni volta che ho dato un conteggio CTC inferiore a 15 (o vicini) i timer mi hanno dato un'onda quadra, quindi la ragione ovvia è che il conteggio è considerato zero. Questa non è un'osservazione matematica ma pratica. Come detto ho lavorato solo con "Due" per il mio scopo che è un ARM (non AVR con frequenze di clock inferiori utilizzate in Arduino) e quindi utilizzare "a volte" è valido credo.
Nick Gammon
2016-01-14 16:14:34 UTC
view on stackexchange narkive permalink

Esiste un compromesso tra risoluzione e frequenze ottenibili. Citi Timer 2, ma su Atmega328P Timer 2 è un timer a 8 bit, quindi non saresti in grado di impostare il CTC su 1024.

Supponiamo che stiamo parlando di un timer a 16 bit, come Timer 1 su Atmega328P. Con un prescaler di uno, puoi cronometrare (assumendo un clock di 16 MHz) da 1 a 65536 "tick", ovvero 62,5 ns fino a 4096 µs.

Questo sarebbe il più preciso perché stai usando un clock (processore) per tick del timer (un prescaler di uno).

Tuttavia, se prevedi di durare più di 4.096 ms, devi aumentare il prescaler . Il prossimo prescaler sul Timer 1 è 8, quindi ora puoi calcolare il tempo per un intervallo 8 volte più lungo (32768 µs), tuttavia la tua accuratezza (precisione) è ora diminuita di un fattore 8. La granularità del timer è aumentato da 62,5 ns a 62,5 * 8 ns, ovvero 500 ns.

Se è necessario un tempo superiore a 32,768 ms, il prescaler deve essere nuovamente più grande, il successivo sarà 64. Quindi ora puoi cronometrare fino a 262144 µs, ma con una granularità di 62,5 * 64, che è 4000 ns (4 µs).

Il mio suggerimento sarebbe di utilizzare il prescaler più basso possibile, ma comunque ottieni l'intervallo che desideri. Quindi ovviamente non puoi usare un prescaler da uno a 10 ms.


Ho una discussione sui timer su http://www.gammon.com.au/timers.

In quella pagina c'è un grafico che aiuta a visualizzare gli effetti di diversi prescaler:

Timers and prescalers

La parte superiore (conteggio di uno) fornisce effettivamente la granularità di ogni prescaler. Ad esempio, un prescaler di 256 ha una granularità di 16.000 ns (16 µs). Alcune frequenze (potenze di 2) si presteranno a combinazioni (es. Prescaler di 1 con un conteggio di 256, o prescaler di 256 con un conteggio di 1).

Tuttavia per le frequenze che non hanno quella proprietà, il prescaler più piccolo darà (se può essere utilizzato) una granularità più fine.

L'utilizzo di un prescaler più alto non perde affatto la precisione. Ottieni una granularità maggiore, ma se scegli come target un conteggio dei cicli che è una potenza di due (come nella domanda), la granularità non è un problema.
In caso contrario, il prescaler inferiore ti consente di avvicinarti all'obiettivo. Supponi di voler cronometrare 30 cicli di clock. Un prescaler di 1 consente di inserire direttamente il numero 30. Un prescaler di 8 significa che devi usare 30/8 (3.75) che non puoi inserire direttamente nel registro, perdendo così la precisione.
La domanda era formulata con 1024 conteggi, quindi le mie osservazioni non si applicano a questo, ma stavo cercando di dare una risposta più generale, nel caso in cui il fatto che 1024 sia un caso piuttosto speciale non fosse ovvio.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...