Gestione segnale in frequenza

Buona domenica a tutti. Ho la necessità di leggere un segnale ad onda quadra su un pin analogico di arduino, poichè i digitali sono tutti occupati.

Il segnale in questione proviene da un sensore sperimentale che fornisce in uscita un'onda quadra a duty cicle al 50% e livello 0-5V, nel quale viene variata la frequenza in base alla risposta: essa è grosso modo compresa tra 50hz e 15kHz, ma nella versione definitiva potrebbe, forse, raggiungere anche i 500khz.

Come posso fare per rendere la frequenza un segnale gestibile da un ingresso analogico di arduino?

... qualsiasi pin analogico di Arduino Uno è anche un pin digitale, quindi ... usalo tranquillamente come usi gli altri ;)

Essi sono definiti, assieme agli altri, nel file pins_arduino.h del "core" :

static const uint8_t A0 = 14;
static const uint8_t A1 = 15;
static const uint8_t A2 = 16;
static const uint8_t A3 = 17;
static const uint8_t A4 = 18;
static const uint8_t A5 = 19;
static const uint8_t A6 = 20;
static const uint8_t A7 = 21;

... se vuoi puoi quindi usare, per identificarli, sia A0, A1, A2, ... che 14, 15, 16 ...

Guglielmo

Grande! Quindi posso usare un qualsiasi analogico come digitale ed usare le librerie apposite per leggere la frequenza?

Certo, ripeto, un qualsiasi pin analogico di Arduino UNO (… che non possiede gli unici due solo analogici, del ATmega328P, A6 e A7) ha anche le normali funzioni di un pin digitale, quindi … :smiley:

Guglielmo

Edit : La cosa è ben visibile nello schema a blocchi del ATmega328P allegato

gualandd: Quindi posso usare un qualsiasi analogico come digitale ed usare le librerie apposite per leggere la frequenza?

No, la libreria per leggere la frequenza funziona solo un un ben preciso pin del micro, nel caso del 328 è il pin 8, perché viene utilizzato l'input di un timer, settato come counter, per la misura.

astrobeed:
No, la libreria per leggere la frequenza funziona solo un un ben preciso pin del micro, nel caso del 328 è il pin 8 …

Aha, buono a sapersi …
… quindi, dato che il suo è un problema di numero di pin insufficienti, può spostare quello che ha attualmente sul pin 8 su un qualsiasi pin analogico ed usare il pin 8 per fare le misure :smiley:

Guglielmo

Per pin 8 intendete il D8 (digitale 8)? In questo caso posso tranquillamente spostare il led a lui collegato ed usarlo per leggere la frequenza.

A proposito, avendo un Nano ma che dovrebbe avere il pinout dell'UNO, che libreria uso per leggere la frequenza? Ho visto che ce ne sono diverse, ma ne vorrei usare una che non blocca l'esecuzione del programma mentre misura...

gualandd: Per pin 8 intendete il D8 (digitale 8)?

Errore mio, sono andato a memoria invece di controllare, il pin è il 5 (digitale 5), la libreria migliore è sicuramente quella di pjrc, funziona in totale autonomia interrupt driven, devi solo leggere il valore della misura quando ti serve e la funzione "FreqCount.available()" ti informa quando c'è un nuovo valore disponibile. Ovviamente c'è un "costo" da pagare, sono il timer 1 e il timer 2 che non puoi più usare per il pwm(pin 3,9,10,11 utilizzabili solo come GPIO) perché sono utilizzati dalla libreria per il conteggio degli impulsi e il periodo del gate, inoltre non puoi usare nessuna libreria che utilizza questi timer, p.e. la libreria servo.

Ottimo! Direi che il PWM non dovrebbe servirmi e non uso servo o altre librerie che usano quei timer.

In teoria sono a cavallo, di che cosa lo imparo con la pratica a breve...

Signori, mi sono cambiate le carte in tavola... :'( Avrei la necessità di leggere non uno ma almeno 3 sensori che rispondono in frequenza, quindi il discorso del pin 5 va a cadere.

Conoscete qualche metodo di conversione Frequenza - Tensione che non implici componentistica obsoleta?

gualandd: Conoscete qualche metodo di conversione Frequenza - Tensione che non implici componentistica obsoleta?

Entro quale range e con quale precisione ? Sei cosciente che l'ADC di Arduino è solo 10 bit e che la risoluzione sarà 1/1024 della frequenza fondo scala ? Hai valutato l'uso di un multiplexer sul pin 5 ?

Il sensore, come scritto, lavora grossomodo con una risposta tra 50hz e 15kHz e segnale 0-5V ad onda quadra. In uscita mi interessa avere una conversione che stia nei limiti degli ingressi di arduino... diciamo max 5V. La precisione non mi interessa molto, mi basta che sia proporzionale alla frequenza... per ora.

L'utilizzo di un multiplexer l'ho valutato, ma al momento non mi è sembrata la soluzione più comoda (anche per problemi di spazio...).

In quel range potresti usare un LM331, uno per ciascun canale, che trovi da RS a circa 3 Euro, può lavorare sia come convertitore tensione-frequenza che viceversa, ovviamente andrai ad impegnare tre ingressi analogici.
L’alternativa, decisamente più semplice a livello circuitale e più economica, è usare una piccola mcu low cost per misurare le tre frequenze e farla dialogare tramite I2C con il processore principale.

che fornisce in uscita un'onda quadra a duty cicle al 50% e livello 0-5V,........... essa è grosso modo compresa tra 50hz e 15kHz,

Puoi sempre usare la PulseIn() . Fino a 10­µS ( 50 kHz ) ci arriva

@astrobeed Ottimo! Probabilmente gli LM331 li ho anche in smd al lavoro (devo guardarci); per l'occupazione degli ingressi analogici non è un problema, sono quasi tutti liberi!

@Brunello la PulseIn() non blocca il programma fino a lettura ultimata?