Skip to content

Instantly share code, notes, and snippets.

@valerionew
Last active April 4, 2020 20:02
Show Gist options
  • Save valerionew/c533c5911c05ecc0508650c154c3ed96 to your computer and use it in GitHub Desktop.
Save valerionew/c533c5911c05ecc0508650c154c3ed96 to your computer and use it in GitHub Desktop.
Generatore di onda quadra a 1MHz per Arduino Uno, basato su timer1
/*
Generatore di onda quadra a 1MHz per Arduino Uno, basato su timer1
Valerio Nappi - 04-04-2020
Impostiamo di seguito il timer1 di arduino (sul quale fa affidamento la libreria servo,
quindi rompendo la compatibilità con quella libreria).
Il timer1 è un contatore a 16 bit che conserva il suo valore nel registro TCNT1 (Time CouNnT timer1).
Lo impostiamo in modo che una volta raggiunta una certa soglia (conservata in OCR1A - Output Compare Register timer1 channel A)
inverta il valore logico del pin speciale OC1A (Output Compare timer1 channel A), mappato sul pin 9 di arduino.
Quando TCNT1 = OCR1A il timer assegna pin9 = not(pin9). Oltre a questo, resetta TCNT1 a 0, in un'operazione
chiamata CTC (Clear Timer on Compare match).
OCR1A conterà quindi 8 (da 0 a 7) colpi di timer (il prescaler è 1, quindi va a 16 MHz come la cpu).
In questo modo, divide per 8 la frequenza di clock -> otteniamo 2MHz.
Non dobbiamo dimenticarci che 2 MHz è la frequenza di inversione del segnale, la frequenza dell'onda
quadra generata è la metà: 1 MHz
*/
void setup() {
TCNT1 = 0x00; // inizializzo il timer a 0 (lo svuoto)
OCR1A = 0x07; // al raggiungimento del valore 7 facciamo toggle del pin
TCCR1A = (1<<COM1A0); // impostiamo toggle di OC1A (PB1 o pin 9 di arduino)
TCCR1B = (1<<CS10); // impostiamo il prescaler = 1
TCCR1B |= (1<<WGM12); // Clear on Timer Compare match - resetta TCNT1 quando TCNT1 = OCR1A e toggla OC1A
DDRB |= (1<<DDB1); // imposta il pin 9 (PB1) come output
}
void loop() {
// put your main code here, to run repeatedly:
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment