Input onda quadra su PIN digitale tramite generatore di funzione

Progetti Arduino
Avatar utente
pgv
Messaggi: 484
Iscritto il: gio 17 set 2020, 13:16
Località: Ginevra

Re: Input onda quadra su PIN digitale tramite generatore di funzione

Messaggio da pgv »

Il problema e' risolto, per cui scrivo solamente per verificare che il mio cervello non abbia smesso di funzionare... Facendo un po' di "lurking", ossia leggendo i post qui e li', ne ho notato uno che si riferiva ai JFET. Ora, non sarebbe questa una applicazione perfetta per un JFET a canale N (con prestazioni non troppo scarse, per esempio un 2N3819). PSpice sostiene che funziona, ma non ho costruito il circuito e quindi si tratta di speculazioni.
Terre (del generatore di funzioni da -2V a +2V e dell'Arduino) in comune.

Il circuito:
Arduino alimentato tra la terra comune e +5V;
JFET 2N3819 con Source alla terra comune, Gate connesso tramite una resistenza di protezione (reciproca) da 4.7k (boh, dipende dall'impedenza di uscita del generatore di funzioni, il 2N3819 e' assolutamente limitato a non piu' di 10 mA di corrente di gate), Drain connesso tramite un'altra resistenza da 4.7 kOhm ai +5VDC. Il segnale digitale per l'Arduino si preleva al Drain del JFET.

Secondo il mio PSpice, il segnale sul Drain (senza carico) viaggia da appena piu' di 0 a +5 con dei fronti decorosi anche a 500 kHz. La corrente di Gate del JFET non arriva mai a 1 mA, e quella di Drain (ovviamente, grazie ai 4.7kOhm) varia da zero a appena piu' di 1 mA.

Oggigiorno i JFET si usano soltanto nei preamplificatori e in VHF, ma mi sembra una soluzione elegante al problema del lettore...
apollokid
Messaggi: 74
Iscritto il: lun 27 lug 2020, 14:36

Re: Input onda quadra su PIN digitale tramite generatore di funzione

Messaggio da apollokid »

C'è un solo problema. Ho e so usare (ed è già una parola grossa) solo transitor BJT.
Probabilmente sarò in grado di comprendere quello che hai scritto nel prossimo futuro, ma per il momento mi devo accontentare di quello che so fare oggi.
Io come ho detto in precedenza sono un informatico e non un elettronico e i problemi su cui sto lavorando in questo momento sono appunto di tipo informatico. Infatti mi sono accorto che la SoftwareSerial non è appropriata per quello che ho in mente di fare ed ho acquistato una ArduinoMega così da poter disporre di almeno un'altra UART e non dover più usare le interrupt anche per comunicare con il modulo HC-05.
Ora sto riscrivendo una parte del codice perchè perchè attualmente è cablato sulla SoftwareSerial. E' un argomento però fuori ambito rispetto alla richiesta oggeto del thread ed è comunque materia sulla quale mi ritengo autonomo.
NOTA: Volendo avrei potuto provare ad usare un Timer hardware e modificare l'attuale l'algoritmo per il calcolo della frequenza. Probabilmente avrebbe funzionato e sarebbe stato un esperimento istruttivo ma mi sarei comunque ritrovato presto con altre limitazioni col progredire del progetto e quindi tanto valeva passare subito ad una board più potente della Nano e tagliare la testa al toro.
Avatar utente
pgv
Messaggi: 484
Iscritto il: gio 17 set 2020, 13:16
Località: Ginevra

Re: Input onda quadra su PIN digitale tramite generatore di funzione

Messaggio da pgv »

Mah, e la Serial (Software o Hardware) perche' serve quando c'e' da misurare la durata di un segnale quadro in input? Esiste a libreria standard Arduino (quindi senza bisogno di caricare altre librerie) la simpatica funzione pulseIn() descritta in

https://www.arduino.cc/reference/en/lan ... o/pulsein/

Mi limito a dare un esempio di utilizzo che misura la durata di un impulso ALTO e la stampa a seriale:

<---- tagliare qui ---->
const int ingresso = 8; // Supponendo che l'ingresso sia connesso al pino Digitale 8
const unsigned long timeout = 1000000L; // Numero di microsecondi che aspetta

void setup() {
Serial.begin(9600);
while (!Serial) {;} // Aspetta che la porta seriale sia pronta
pinMode(ingresso, INPUT);
}

void loop() {

unsigned long durata;

// La temporizzazione della funzione pulseIn() e' stata determinata in maniera sperimentale
// e puo' rivelarsi imprecisa per intervalli molto lunghi. Funziona bene per intervalli tra
// 10 microsecondi e 4 minuti. Esiste una seconda forma della chiamata a questa funzione
// durata = pulseIn( pinDiIngresso, livelloAttivo, timeout);
// in cui il terzo argomento "timeout" indica il numero di microsecondi massimo che la
// funzione aspetta per ricevere il fronte desiderato prima di abbandonare l'attesa in disgusto
// Il valore di default e' di 1 secondo, per cui ho generato la costante (per 1,000,000) che
// corrisponde a un secondo ma non la uso. Non credo sia necessaria con le temporizzazioni
// che vedo sull'oscilloscopio.

durata = pulseIn(ingresso, HIGH); // questo misura la durata di un segnale a partire
// da un fronte di SALITA e fino a quello di DISCESA
// e quindi la durata di un segnale HIGH (alto). Per
// misurare la durata di un segnale basso, sostituire
// HIGH con LOW.
Serial.print("Il tuo segnale e' stato ALTO per ");
Serial.print(durata);
Serial.println("microsecondi.");
}
<---- Tagliare qui ---->

Per i piu' ardimentosi, oppure se l'Arduino e' anche in tutt'altre faccende affaccendato e non vogliamo che si fermi li' ad aspettare l'impulso, e' possibile utilizzare una ISR (Interrupt Service Routine) che reagisce ai vronti di ingresso, ma quello e' un soggetto un pelo piu' complesso. Se interessa, posso aggiungere un post con uno scheletro di programma anche per quello
apollokid
Messaggi: 74
Iscritto il: lun 27 lug 2020, 14:36

Re: Input onda quadra su PIN digitale tramite generatore di funzione

Messaggio da apollokid »

pgv ha scritto: gio 24 set 2020, 12:05 Mah, e la Serial (Software o Hardware) perche' serve quando c'e' da misurare la durata di un segnale quadro in input?
Perchè una misura va poi anche usata per farci qualcosa, nel mio messaggio del 21/09/2020, 19:05 avevo descritto brevemente il contesto del progetto.
Aggiungo che misurare la velocità degli impulsi (e non la durata) è solo una delle tante elaborazioni che deve fare il software ed una funzione come quella che hai riportato sarebbe totalmente inutile anche nel caso in cui misurasse il tempo tra un impulso ed il successivo dato che facendo una wait blocca l'esecuzione del codice.

Se può aiutardi a capire meglio, questo è un video che avevo fatto qualche giorno fa, funzionare funziona, ma non va bene ed i motivi sono quelli che ho detto.
https://www.youtube.com/watch?v=nV8LYO8v3TA
Avatar utente
pgv
Messaggi: 484
Iscritto il: gio 17 set 2020, 13:16
Località: Ginevra

Re: Input onda quadra su PIN digitale tramite generatore di funzione

Messaggio da pgv »

Carina come applicazione... Ora, io per mestiere sono costretto spesso a "pensare fuori dalla scatola", ossia a cercare soluzioni che possono sembrare in contrasto con il progetto iniziale. In passato, e per scopi diversi e perversi, mi sono trovato anche io a fare una misura del genere, ed alla fine ho utilizzato un Convertitore Frequenza Tensione (https://www.ti.com/lit/an/snaa088/snaa088.pdf) ossia un chip che produce in uscita una tensione che e' proporzionale alla frequenza degli impulsi in ingresso. capisco che ha poco o nulla a che fare con la soddisfazione di leggere direttamente il periodo del segnale con il tuo Arduino, ma magari campionare l'uscita analogica a intervalli fissi con l'aiuto di un interrupt potrebbe dare risultati interessanti.
Rispondi