Vai al contenuto
PLC Forum


Pic Con Encoder Ottico


MinaFikri

Messaggi consigliati

Ciao a tutti,

sto lavorando su un progetto per controllare un robot cartesiano con un PIC 16F877A, c'è un motore DC sul suo asse è montato un encoder ottico di 400 PPR. Per evitare che il PIC perda qualche impulso, uso un counter esterno per dividere la frequenza per 16, cioè la risoluzione dell'encoder diventa 25 impulsi per giro.

Quando faccio girare il motore a mano, trovo che il PIC conta gli impulsi in maniera corretta, cioè dopo un numero prestabilito di impulsi accende un LED, ma quando collego il motore al PIC (ovviamente attraverso un L298) trovo che il motore gira di meno, cioè invece di fare 4 giri, ne fa soltanto 2 o 2.5 giri.

Credo che il problema sia causato da disturbi sul pin del PIC che deve contare gli impulsi, quindi conta falsi impulsi che non esistono, perciò ho usato 2 filtri passa basso e un Schmitt Trigger, però il problema ancora esiste.

Qualche consiglio ?? per favore, è urgente,

GRAZIE

Modificato: da MinaFikri
Link al commento
Condividi su altri siti


Hai dimenticato di dare alcuni dati importanti.

L'accoppiamento all'encoder è diretto o trmite foto accoppiatori?

Il discriminatore di up/down in quadratura è realizzato con Hw esterno o con Sw?

Gli impulsi sono collegati ai pins di interrupts?

Link al commento
Condividi su altri siti

Grazie Livio per la risposta,

l'uscita dell'encoder va collegata direttamente attraverso un filtro passa basso all'ingresso di un Schmitt Trigger, che poi va collegato al clock del counter.

Il discorso del up/down in quadratura non l'ho usato, io collego all'ingresso un solo canale dell'uscita dell'encoder, tanto non mi serve sapere la direzione della rotazione perché il PIC è sempre quello che da comandi al driver.

Poi gli impulsi sono collegati alla porta B con interrupt.

grazie.

Link al commento
Condividi su altri siti

Questo, e l'assenza di disaccopiamento galvanico, spiega gli errori di conteggio.

La discriminazione di Up/Down, se ben fatta, ha anche una notevole funzione di filtro. Questo avviene perchè l'impulso, per essere validato, deve avere le coincidenze di fase tra i due canali. In questo modo la quasi totalità degli impulsi spuri viene eliminata.

Un buon disaccoppiamento galvanico, unito ad un cablaggio "umano", riduce la capatazione di disturbi dal campo.

Se piloti il motore con tecnica PWM, o fai comunque uso di impulsi di potenza, hai parecchi disturbi, anche parecchio robusti, che circolano sui cablaggi.

Con un encoder da 400 ipr, anche se non dici nulla circa la massima velocità di rotazione, non dvresti aver grandi problemi di tempo di CPU.

Se usi un quarzo da 20MHz dovresti rilevare e conteggiare un impulso in <= 2us. Se il motore ruotasse a 3000 rpm avresti un periodo par a 50us, quindi il conteggio occuperebbe solo circa il 4% del tempo di CPU.

Di queste applicazioni ne ho fatte parecchie senza problemi.

Link al commento
Condividi su altri siti

Finalmente ho risolto il problema isolando completamente l'alimentazione dei motori dall'alimentazione del PIC con optoisolatori, infatti i disturbi del motore comportavano falsi conteggi, però ho trovato un altro problema,

Il segnale PWM va nell'ingresso dell'optoisolatore poi c'è una resistenza di 4.7 Kohm di pull up collegata al collector del transistor dell'optoisolatore e poi un Schmitt trigger, ma trovo che l'uscita dello Schmitt è sempre 1, cioè non segue il segnale all'ingresso dell'optoisolatore; e quindi il motore va sempre alla massima velocità..

non credo il problema sia dovuto a lentezza dell'optoisolatore, tanto che ha tempi di risposta di circa 5 micro secondi.

Uso un 4N35...

Cosa mi consigliate ??

GRAZIE DI CUORE

Modificato: da MinaFikri
Link al commento
Condividi su altri siti

L'ingresso dell'optoisolatore è un led, come l'hai collegato? Se l'uscita è sempre alta vuol dire che il led è sempre spento, potrebbe essere polarizzato male, oppure lo piloti con una corrente insufficiente.

L'uscita del pic è programmata push-pull o con pull-up?

Non hai modo di postare uno schema elettrico?

Livio ha ragione, se usi l'interrupt non hai bisogno di un divisore... non è possibile che il PIC perda il conteggio.

Link al commento
Condividi su altri siti

Allora, il led è polarizzato in maniera giusta, ho verificato, e l'uscita del PIC è un segnale PWM con onda quadra perfetta. La corrente di pilotaggio del led è di 37mA.

Io uso il divisore di frequenza perché il programma che faccio è abbastanza lungo, e ci sono 2 motori con 2 encoder, quindi temo che il PIC perda qualche impulso, e comunque con dei switch posso anche annulare il funzionamento del divisore.

comunque ecco uno schema del segnale PWM.

GRAZIE

user posted image

Modificato: da MinaFikri
Link al commento
Condividi su altri siti

Diminuisci, e di parecchio, la resistenza di collettore. Ora la corrente di collettore dell'opto è <1 mA

Sono andato a controllare i data sheet del 4N35.

Devi mettere una R da 220k tra base ed emitter, poi la If del diodo dovrebbe essere nell'intorno dei 10 mA, comunque non oltre i 20 mA, quindi i 100 ohm dovrebbero diventare 330 ohm e, per finire ma importantissimo, per avere tempi di commutazione decenti (ton e toff di circa 2us ognuno) la resistenza di collettore dovrebbe essere 390 ohm, max 470 ohm ( 10mA - 12 mA di Ic).

I valori che ho indicato son stati calcolati molto velocemente, quindi è possibile sia necessaria un'aggiustatina. Comunque dovrebbero gsarantire un funzionamento accettabile

I valori dei componenti van calcolati bene, altrimenti i circuiti non vanno rolleyes.gif

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Quoto, anche senza vedere il datasheet non è una cosa buona lasciare la base "volante". Potrebbe essere proprio questo che fa stare sempre in conduzione il transistor e quindi l'uscita della porta sempre alta.

Quindi non usi l'interrupt. rolleyes.gif

Se usi l'interrupt la lunghezza del programma non è influente poichè l'ingresso genera un interruzione del programma principale per saltare al vettore di interrupt, dove dovrebbe essere il codice da eseguire all'occorrenza, nel tuo caso ad esempio potresti aggiornare la variabile del contatore encoder.

probabilmente tu fai semplicemente un test dell'ingresso all'interno del programma principale.

Link al commento
Condividi su altri siti

Grazie per le risposte, sono riuscito a risolvere il problema usando un optoisolatore del tipo High Speed, 6N136 che consente alta velocità di comutazione, con una resistenza di pull up di 4.7 kohm e resistenza sul diodo di 220 ohm.

Comunque i risultati mi vanno bene,

Grazie a Livio e a Nikiki.... biggrin.gif

Modificato: da MinaFikri
Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...