Ciao ragazzi. Ho acquistato da poco Arduino uno. Me la cavavo bene con il C e inoltre le mie basi sui core80 sono buone, sia da un punto di vista hardware che da quello della programmazione(anche se mi manca la parte dei timer che adesso dovremmo fare) perché a scuola in laboratorio programmiamo il mitico 8051.
Volevo realizzare un progetto di un "oscillatore" a frequenza variabili controllate via sofware. Esempio in poche parole gli dico che:
volgio una frequenza sul pin 13 di 1KHz per 10s, passati i dieci secondi la frequenza cambia a 500Hz e me la mantiene per 5secondi.
Ovviamente ciò risco a farlo via software agendo direttamente sul pin e chiamando un opportuno delay, ma ovviamente se inserisco altre istuzioni nel programma la frequenza che imposto non è più vera!!
Quindi l'unico sistema per fare ciò sarebbe quello di usare i timer e interrupt o sbalgio?
mi consigliate qualcos'altro? intanto io me li studio per bene...
Oscillatore con Arduino
Moderatore:
Paolino
11 messaggi
• Pagina 1 di 2 • 1, 2
0
voti
Bene dai, ho visto che non è poi una cosa così difficile. Sfruttando le istruzioni che creano un segnale PWM impostando il periodo diventa una cosa molto facile, più facile di quello che pensavo.
Non ho problemi di precisione, quindi va più che bene anche l'oscillatore suo del micro!!
Grazie ciao.
Non ho problemi di precisione, quindi va più che bene anche l'oscillatore suo del micro!!
Grazie ciao.
1
voti
Ciao,
Se devi realizzare un semplice generatore onda quadra a frequenza variabile questo metodo va bene.
Dopo aver configurato il timer1 a 16bit e il prescaler puoi calcolarti, con le formule che trovi sul data sheet dell'atmega328, i valori di reload da assegnare al timer.
Poi, abilitare gli interrupt, l'interrupt di overflow del timer1, scrivere l'isr e il gioco è fatto.
Oppure ti puoi connettere all' OCR1A ,1B (pin d'uscita) e gestirlo direttamente con il timer(metodo più performante).
I problemi, ovvero le difficoltà, nascono se vuoi realizzare un generatore di forme d'onda arbitrarie o sinusoidali.
Lì hai bisogno di creare una tabella con tutti i valori precalcolati e normalizzati, e inviare tali valori al timer1 configurato come PWM.... metti un filtro passa basso del secondo ordine e ottieni un bel generatore audio che potrà servirti per vari scopi.
Ti interessa anche questo metodo o ti basta la sola onda quadra ?
ciao
Se devi realizzare un semplice generatore onda quadra a frequenza variabile questo metodo va bene.
Dopo aver configurato il timer1 a 16bit e il prescaler puoi calcolarti, con le formule che trovi sul data sheet dell'atmega328, i valori di reload da assegnare al timer.
Poi, abilitare gli interrupt, l'interrupt di overflow del timer1, scrivere l'isr e il gioco è fatto.
Oppure ti puoi connettere all' OCR1A ,1B (pin d'uscita) e gestirlo direttamente con il timer(metodo più performante).
I problemi, ovvero le difficoltà, nascono se vuoi realizzare un generatore di forme d'onda arbitrarie o sinusoidali.
Lì hai bisogno di creare una tabella con tutti i valori precalcolati e normalizzati, e inviare tali valori al timer1 configurato come PWM.... metti un filtro passa basso del secondo ordine e ottieni un bel generatore audio che potrà servirti per vari scopi.
Ti interessa anche questo metodo o ti basta la sola onda quadra ?
ciao
1
voti
Da questo articolo potresti forse trovare qualche spunto. 

"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
Ciao ragazzi.
Purtroppo, lo dico sinceramente, ho trovato già le librerie belle pronte online che gestiscono i timer 1 e 2 e generano ritardi dall'ordine di microsecondi a quello di decine di minuti.
timerone.h qui
mstimer2.h qui
Ciò ovviamente non mi vieta di studiarmoi per bene il datasheet del328 e provare a configurare i timer manualmente. Adesso a scuola abbiamo accenntato quelli dell'8051 e loro modi d'impiego, quindi sono sicuro che presto comincerò a smanettarci in assembly e poi in C. Però intanto mi guardo lo stesso il data sheet e qualche guida online per vedere di capire qualcosa da solo.
Per la mia applicazione per ora ho solo bisogno di un generatore di onde quadre controllato da un timer e di un altro timer che generi un interrupt dopo un tempo prestabilito che vada a modificare la frequenza dell'onda quadra, quindi niente di così eccezionale se faccio uso delle librerie citate.
Bell'articolo, però per il momento non fa il caso mio, ma magari in futuro mi piacerebba implementaro con un altro micro magari...
Se ho problemi so dove venire a sbattere la testa
, con voi no c'è mai preoccupazione. Grazie ragazzi, a presto!! 
Purtroppo, lo dico sinceramente, ho trovato già le librerie belle pronte online che gestiscono i timer 1 e 2 e generano ritardi dall'ordine di microsecondi a quello di decine di minuti.
timerone.h qui
mstimer2.h qui
Ciò ovviamente non mi vieta di studiarmoi per bene il datasheet del328 e provare a configurare i timer manualmente. Adesso a scuola abbiamo accenntato quelli dell'8051 e loro modi d'impiego, quindi sono sicuro che presto comincerò a smanettarci in assembly e poi in C. Però intanto mi guardo lo stesso il data sheet e qualche guida online per vedere di capire qualcosa da solo.
Per la mia applicazione per ora ho solo bisogno di un generatore di onde quadre controllato da un timer e di un altro timer che generi un interrupt dopo un tempo prestabilito che vada a modificare la frequenza dell'onda quadra, quindi niente di così eccezionale se faccio uso delle librerie citate.
...mmmm, belle le applicazioni del teorema di Fouriermetti un filtro passa basso del secondo ordine e ottieni un bel generatore audio che potrà servirti per vari scopi
TardoFreak ha scritto:Da questo articolo potresti forse trovare qualche spunto.
Bell'articolo, però per il momento non fa il caso mio, ma magari in futuro mi piacerebba implementaro con un altro micro magari...
Se ho problemi so dove venire a sbattere la testa
, con voi no c'è mai preoccupazione. Grazie ragazzi, a presto!! 
0
voti
Anche questo post sui timer di arduino potrebbe essere interessante.
http://arduino.cc/forum/index.php/topic,37875.0.html
ciao
Antonio
http://arduino.cc/forum/index.php/topic,37875.0.html
ciao
Antonio
0
voti
Ciao ragazzi, vi chiedo un informazione sempre riguardante arduino.
C'è la possibilità di estrarre un numero random da una serie di valori certa, mi spiego
questa è la classica: random(min,max);
Questa pesca il numero nell'intervallo min,max.
A me ne servirebbe una del tipo:
random(n1,n2,n3,n4..);
Cioè che pescasse un numero a caso sciegliendo uno degli nx...
C'è la possibilità di estrarre un numero random da una serie di valori certa, mi spiego
questa è la classica: random(min,max);
Questa pesca il numero nell'intervallo min,max.
A me ne servirebbe una del tipo:
random(n1,n2,n3,n4..);
Cioè che pescasse un numero a caso sciegliendo uno degli nx...
0
voti
Fattibilissimo:
crea una tabella puntata con tutti i tuoi valori certi messi a caso, (o anche in successione)
poi accedi ad una locazione della tabella indicando come range(min,max)nella function rnd le locazioni min e max che puntano alla tabella, a questo punto estrapoli il valore random. Quindi alla funzione rnd non passerai i valori ma gli indirizzi che puntano alla tabella che contiene i tuoi valori certi.
Spero essere stato chiaro.
Ciao
crea una tabella puntata con tutti i tuoi valori certi messi a caso, (o anche in successione)
poi accedi ad una locazione della tabella indicando come range(min,max)nella function rnd le locazioni min e max che puntano alla tabella, a questo punto estrapoli il valore random. Quindi alla funzione rnd non passerai i valori ma gli indirizzi che puntano alla tabella che contiene i tuoi valori certi.
Spero essere stato chiaro.
Ciao
1
voti
altro metodo.
se i valori non sono molti puoi inserire i valori certi in ram.
metti i tuoi valori certi in una array di [n] elementi.
la tua array alla fine avrà un indice [Idx] es:50
calcola l'rnd tra l'indice min(può essere=0 o altro) e il max della matrice e preleva il valore corrispondente.
ciao
se i valori non sono molti puoi inserire i valori certi in ram.
metti i tuoi valori certi in una array di [n] elementi.
la tua array alla fine avrà un indice [Idx] es:50
calcola l'rnd tra l'indice min(può essere=0 o altro) e il max della matrice e preleva il valore corrispondente.
ciao
11 messaggi
• Pagina 1 di 2 • 1, 2
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 2 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)




