Migliorare immunità disturbi fotodiodo

Ciao a tutti, Ho realizzato un encoder applicando dello scotch nero a metà di una ruota da modellismo, come risoluzione per il momento 1/2 giro può bastare. Per la lettura dei giri ho inserito un led infrarosso e un fotodiodo che produrrà una corrente maggiore quando rileverà l'infrarosso di rimbalzo dalla parte chiara della ruota.

Il ricevitore è http://www.hobbytronics.co.uk/datasheets/bpw41n.pdf e non è amplificato, per il momento purtroppo non ho la possibilità di sostituirlo.

Tutto funziona bene fino a quando non aziono alla massima velocità il motore che fa girare la ruota, i disturbi mi falsano le letture e modificano le soglie che utilizzo per leggere.

Al momento ho utilizzato una resistenza da 1M ohm e leggo un segnale di 260mV ai capi della resistenza collegata al fotodiodo, avete qualche consiglio per rendere più immune l'encoder ai rumori?

Prova a seguire questi consigli, se il motore che hai è come quello dell'articolo confermo che elimini quasi del tutto i disturbi. http://www.ivotek.it/robotica/TUTORIALMICROROBOTWEB/LEZIONE43.HTM

Ho già messo un C da 100nF e devo dire che ha eliminato molti molti disturbi che avevano un ampiezza anche di 1 volt sulla linea di alimentazione (che per queste prove è totalmente separata, è l'alimentatore mentre Arduino è collegato all'USB).. Il problema però persiste.. Non ho toroidi aggiuntivi, l'alimentatore ne ha di suoi all'interno però..

Ho identificato un problema, il fotodiodo genera troppa poca corrente che non basta all'ADC per funzionare bene, c'è quindi un problema di adattamento di impedenza da risolvere, ho trovato un application note http://physlab.lums.edu.pk/images/1/10/Photodiode_circuit.pdf che sembra interessante, magari aggiungerò un op-amp

Ciao

Probabilmente mettere altri 2 condensatori collegati tramite la cassa metallica era l’ideale per ridurre ulteriormente i disturbi purtroppo per un fattore di forma e dimensioni non posso farlo, devo far stare il motore in un gearbox tamiya.

Ho pensato sia ad un trigger di schmitt ma vista la natura impulsiva dei disturbi più pesanti farebbe ben poco, penso che proverò a realizzare un filtro digitale passa-basso via software (in parole povere una semplice media con scarto dei valori massimo e minimo) e ad aggiungere un convertitore corrente-tensione tramite un op-amp sperando che il rumore non venga iniettato nel circuito prima che il segnale giunga all’op-amp, purtroppo ho qualche cm di filo tra il ricevitore ed il resto…

Ad ogni modo il problema più grosso sembra la deviazione di “soglia”, provo a spiegarmi con un esempio:
inizialmente (senza op-amp) ho una soglia come:
bianco v>15
nero v<10
dove v è la tensione convertita da Arduino in un numero da 0 a 1024, e la soglia funziona bene, dopo un pò, quando soprattutto il motore accelera mi ritrovo con una soglia
bianco v>25
nero v<20
che mi falsa naturalmente tutte le letture… la media in questo caso serve a ben poco purtroppo…

Ciao flz47655, Riflettevo sul tuo problema e penso che se usi filtri ed opamp sicuramente risolvi il problema ma se l'esempio che hai fatto espone valori reali noto che la differenza tra bianco e nero resta sempre 5 ....se faresti dei test individuando quali sono i valori minimi e massimi della differenza tra bianco e nero non si potrebbe risolvere lo stesso via scketch ???

Allora ho misurato direttamente la corrente col multimetro senza passare per un convertitore corrente-tensione quale una resistenza o un op-amp ed ho 1uA nero 5uA bianco, sono al limite della risoluzione del multimetro +-1uA però.

Oggi ho sostituito la semplice resistenza con un op-amp (per il momento semplice LM358) in configurazione convertitore corrente-tensione con una R da 330K ed ho notato che se aggiungo in parallelo alla R un condensatore il rumore viene eliminato parecchio.. domani magari proverò ad approfondire la teoria dietro questo fenomeno che mi sembra abbastanza logica, un condensatore sul feedback permette di non amplificare il rumore ma magari ci sono altri dettagli interessanti. Ad ogni modo con l'op-amp ho una bassa impedenza in uscita a vantaggio dell'ADC che lavora meglio.

Via sketch secondo me si potrebbe risolvere ma mettiamo il caso reale in cui ho due motori (ho fatto i test con uno) o ci sono disturbi nelle vicinanze, il rapporto S/N (Signal/Noise) scende ad un livello tale da rendere inutilizzabile l'encoder e c'è ogni volta da ricambiare lo sketch, volevo risolvere più alla radice senza passare per forza da un fototransistor e per imparare il più possibile (oltre al fatto che il fotodiodo è già saldato).

Ciao

Oggi ho sostituito la semplice resistenza con un op-amp (per il momento semplice LM358) in configurazione convertitore corrente-tensione con una R da 330K ed ho notato che se aggiungo in parallelo alla R un condensatore il rumore viene eliminato parecchio.. domani magari proverò ad approfondire la teoria dietro questo fenomeno che mi sembra abbastanza logica, un condensatore sul feedback permette di non amplificare il rumore ma magari ci sono altri dettagli interessanti. Ad ogni modo con l'op-amp ho una bassa impedenza in uscita a vantaggio dell'ADC che lavora meglio.

La strada dell'opamp come dicevo prima è senza dubbio la migliore perchè ti rende leggibile il segnale , lo pulisci e lo adatti allo stadio che lo deve leggere.......il condensatore serve per limitare la banda passante ed in questo caso lo dovresti calcolare in base al disturbo che hai da parte del motore.

Ho un segnale abbastanza lento dall'encoder casalingo: motore da 13k rpm, riduttore da 115:1 -> 113 giri al minuto circa 2 giri al secondo, risoluzione di mezzo giro quindi ho un segnale ad onda quadra a 4 Hz :)

La cosa migliore sarebbe iniziare a tagliare da 40 Hz in su, così elimino anche parte delle interferenze a 50 Hz delle rete elettrica che girano nell'etere :D

Per il momento mi sto documentando su come analizzare in frequenza gli op-amp per ottenere questo risultato

Ciao

In pratica il dimensionamento è come in una rete RC :) Con una R da 330K e un condensatore da 100nF ottengo una frequenza di taglio di circa 5 Hz (fc=1/(2*pi*R*C)) dove il guadagno inizia a calare rapidamente da circa 100db a sotto i 50db (ovvero un guadagno 100.000 volte inferiore!).

Ecco i risultati:

Quando la ruota è sul bianco ottengo circa 2V, il massimo sarebbe circa 3V (l'LM358 non è rail-to-rail) ma la banda limitata dell'op-amp scelto è limitata. Quando è sul nero ottengo circa 0.7V

Ho quindi un margine di 2-0.7=1.3V che non è male, aumentando il valore della resistenza potrei ottenere risultati ancora migliori ma la banda dell'LM358 è limitata ed è meglio non spingersi oltre, sarebbe possibile utilizzare il secondo op-amp dell'integrato ma visto che ho due ruote servomotrici utilizzero il secondo per l'altro encoder.

La soglia ideale sarebbe quindi di 0.7+(1.3/2)=1.35V

L'unico problema che mi sembra che ci sia, risolvibile tramite un filtro digitale, sono gli spike provenienti dal motore che purtroppo spesso superano la soglia soprattutto quando la ruota è sul nero e la tensione non dovrebbe superare gli 1.35V, facendo una media il tutto si risolve

Ciao a alla prossima