Buongiorno, sono nuovo( già potrete immaginare le domande del caiser ), sto portando avanti diversi progetti da buon studente di ITIS sezione Telecomunicazioni, e in un recente progetto, mi servirebbe sapere, fino a che velocità Arduino Uno riesce a inviare segnali nell'arco di un secondo. In sintesi, se dovessi diciamo inviare 300 segnali al secondo(numero ipotetico ma non lontano dalla realtà) da un pin in uscita dall'Arduino Uno, riuscirei senza incappare in problemi di qualsiasi genere?
Grazie in anticipo.
Buona sera e benvenuto sul forum,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.
Guglielmo
P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili
Va bene
Provando ad informarmi e cercare in rete oltre a chiedere consulti a dei miei docenti, è saltato fuori che Arduino arriva a poter variare un Pin in modalità On/Off (High - Low) circa a 15Khz, quindi 15000 volte al secondo, vi risulta? Mi sembra tanto.
Dipende COME fai la cosa e quanto sei bravo a programmare ...
... considera che usando la funzione tone(), che ti genera un'onda quadra, puoi arrivare a 65'535 Hz
Se invece di usare le funzioni messe a disposizione da Arduino usi direttamente l'accesso alle porte ... forse puoi arrivare anche più su : ... considera che la MCU gira a 16 MHz e che eseguie le istruzioni macchina mediamente in UNO o DUE cicli !!!
Guglielmo
Io ho modificato l'esempio blinkwithoutdelay, utilizzando micros() invece di millis(), riducendo al minimo il tempo di "attesa". Poi mi sono "divertito" con i miei due oscilloscopi.
Tutto dipende cosa intendi per "segnali".
Ciao Uwe
digitalWrite(PIN, HIGH);
delayMicroseconds(100);
digitalWrite(PIN, LOW);
delayMicroseconds(100);
in un programmino mi serviva un'onda quadra a 10KHz e con queste 4 righe dentro un for ho risolto.
non sarà elegantissimo... ma funziona.
Ceres99:
Arduino arriva a poter variare un Pin in modalità On/Off (High - Low) circa a 15Khz, quindi 15000 volte al secondo, vi risulta? Mi sembra tanto.
Se deve fare solo quello, usando le "istruzioni standard" si arriva anche a 80000Hz (160000 variazioni al secondo). Invece con la scrittura diretta dei bit sui registri delle porte si può arrivare a 500000Hz (1 milione di variazioni al secondo).
Il vero "problema" è quello di "calibrare" la frequenza desiderata. Se non si possiede un frequenzimetro, quantomeno un oscilloscopio, diventa leggermente difficile.
speedyant:
Il vero "problema" è quello di "calibrare" la frequenza desiderata. Se non si possiede un frequenzimetro, quantomeno un oscilloscopio, diventa leggermente difficile.
... un secondo Arduino con le librerie FreqMeasure o FreqCount (... a secondo della frequenza minima e massima) e fai le misure
Guglielmo
Moooolto interessante, ora provo a formualre una domanda più complicata...
Ipotizziamo di avere un sensore di hall, che mi rileva il passaggio di un magnete, come può essere un banalissimo tachimetro per bici..etc
Se il magnete arriva a passare anche 200-300 volte al secondo, e io avessi necessita che dopo la lettura del passaggio mi invii dopo un determinato periodo di tempo (che sia in microsecondi o millisecondi) un altro segnale (per esempio) per accendere un led, arduino riuscirebbe a starci dietro? Sia a livello di calcolo che a livello di ricezione/invio?
Intanto scarica il datasheet del micro presente sulla uno, è molto utile.
scusate, visto che siamo in argomento, approfitterei un attimo di questa discussione per chiedere una delucidazione, visto che ripensandoci credo di aver detto una cazzata qualche post più su...
con le 4 righe di codice che ho scritto sopra (digitalWrite(PIN, HIGH); delayMicroseconds(100); digitalWrite(PIN, LOW); delayMicroseconds(100); ) la frequenza che ottengo è di 10KHz o 5KHz?
mi ero fissato sui 100 microsecondi e quindi pensavo a 10KHz... ma stanotte mi è venuta l'illuminazione... e mi sono reso conto che i delay sono 2... quindi 200 microsecondi... o sparo ancora cazzate?
Con due delay di 100 us il periodo totale è 200 us, frequenza 5 kHz.
100 μsec HIGH, 100 μsec LOW ti da un periodo di 200 μsec ovvero ... un'onda quadra con frequenza di 5000 Hz
Guglielmo
P.S.: Come al solito, per non perdere l'abitudine ... io e Astro ... ci sovrapponiamo
ok, grazie.
allora devo rivedere qualche conto... perché ho sbagliato i conti...
Ho provato a fare un esperimento per vedere quante volte esegue il void loop in un minuto, ho fatto un lavoro del genere:
int cnt = 1;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
cnt = cnt + 1;
Serial.print("velocita: ");
Serial.println(cnt);
}
Risultato esegue il loop circa 3700 volte al minuto, un po pochine per quello che devo fare... O dovendo scrivere in seriale perde tempo?
Ceres99:
... O dovendo scrivere in seriale perde tempo?
... tu che dici ? ? ?
Se vuoi fare un prova, allora leggi i micros() prima di cominciare un FOR (es. da 1 a 30'000), li rileggi dopo e vedi quanto tempo ha impiegato per fare 30'000 iterazioni ...
... ma sono prove che lasciano il tempo che trovano e che NON hanno molto senso.
Guglielmo
Hai, ragione, prova fatta, 20ms per fare 30000 passaggi in un ciclo for.... Interessante.
Scriver einvece su un lcd rallenta come scrivere in seriale?