ciao a tutti,
vorrei generare con attiny85 un tono continuo a 71,9hz.
Non sono riuscito a trovare uno scketch per farlo..
Avete suggerimenti ?
Grazie
Roberto
Magenta
ciao a tutti,
vorrei generare con attiny85 un tono continuo a 71,9hz.
Non sono riuscito a trovare uno scketch per farlo..
Avete suggerimenti ?
Grazie
Roberto
Magenta
Ciao, Roberto.
Benvenuto! ![]()
Un tono sinusoidale?
mi basta una quadra ..poi faccio un filtro r/c
ho buttato li questo, ma vorrei un uscita su un pin solo (questo e per lampeggiatore 2 led alternati, non so se su una delle due porte mi trovo i 72 Hz, che vorrei a 71,9..)
int frequency = 72; //Set frequency in Hertz
double delayTime = 1000 / (frequency * 2);
void setup() {
pinMode(PB3, OUTPUT);
pinMode(PB4, OUTPUT);
}
void loop() {
digitalWrite(PB3, LOW);
digitalWrite(PB4, HIGH);
delay(delayTime);
digitalWrite(PB3, LOW);
digitalWrite(PB4, HIGH);
delay(delayTime);
}
@iw2evk: ... fosse anche per una sola riga, come richiesto al punto 7 del REGOLAMENTO, il codice va racchiuso tra i tag CODE, per cui, cortesemente edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita
che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona <code/> nella barra degli strumenti per contrassegnarla come codice. Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE).
Grazie,
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà sistemato il codice come indicato, nel rispetto del regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farlo al più presto. ![]()
Ciao,
spero ora sia piu' leggibile..
Ma perché non usare la funzione tone()? Il minimo che genera sono 31Hz ...
Guglielmo
Si, così è formattato corretto. Però no, non ottieni 72 ma (idealmente) 83 Hz, perché delay accetta un numero intero di millisecondi e int(1000/72*2) da 6, quindi un periodo di 12 ms.
Un po' migliorerebbe usando delayMicroseconds, e quindi usando il risultato di 1000000/(71,9*2), perché si otterrebbe (idealmente) un sempiperiodo di 6954 µs (quindi un milliHz di errore).
Ma ancora non va bene, perché sia delay che delayMicroseconds generano un ritardo "almeno pari a", ma potrebbe anche essere superiore, a cui va aggiunto il tempo di esecuzione delle digitalWrite che è piuttosto elevato, diversi µs l'una.
Allora bisogna affidarsi alla funzione microseconds, che restituisce il tempo trascorso dall'accensione in µs a 32 bit, vuol dire che il contatore del tempo ritorna a zero circa ogni 72 minuti.
La procedura è questa:
In questo modo, a parte un piccolo jitter sui fronti, la frequenza è precisa al milliHz, al netto dell'imprecisione dell'oscillatore.
Ciao OM iw2evk
Prendete un motore di ricerca di vostra scelta e chiedete al WWW di 'CTCSS_Tone_Generator +arduino' per raccogliere alcuni dati da ordinare per ottenere le informazioni necessarie.
vy 73 es 55
Una cosa del genere:
uint32_t t_semiper=0;
void setup()
{
pinMode (2, OUTPUT); // Uscita su I/O 2.
// equivalente a: DDRB=0b00000100;
}
void loop()
{
if(micros()-t_semiper>=6954) // Se è trascorso un semiperiodo (6954us):
{
PINB|=0b00000100; // Inverte lo stato di I/O 2.
t_semiper+=6954; // Incrementa t_semiper di 6954us.
}
}
Anche su attiny?
Magari:
PINB^=0b00000100; // Inverte lo stato di I/O 2.
È la funzionalità di "Toggle Pin" che hanno gli AVR classici ![]()
Guglielmo
Non ho capito come devo modificare lo sketch : sono alle primissime esperienze ..
Me lo scrivete completo commentando i passagi in modo che capisco come funziona il trucco per generare i 71,9 hz su un pin (es. p0) ?
Grazie
Già fatto al post n.10!...
Naturalmente devi programmare l'ATtiny85 mediante un programmatore USBASP o simile.
Ebbene?...
Funziona? ![]()
Ma perché complicarsi la vita?
Un oscillatore al quarzo fa un euro
Un divisore programmabile
E abbiamo anche una precisione da quarzo
2MHz/27816... ![]()
2 x 2 x2 x3 x19 x61
Ma conviene mettere uno dei tre due come un flip flop all'uscita del divisore programmabile, per avere duty cycle 50%
Un po' anni '80... ![]()
Ma se uno non sa programmare...