home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


PIC + Encoder...
     
Autore Messaggio opzioni
picmicro675




una ogni 10 livelli


postato il:
28.03.2019, alle ore 08:26
marsram:
Con il motoriduttore si ferma subito.

Per fare la cosa può anche andare bene, come una stampante 3D fatta con le fascette per cavi



Solo che non si tiene conto dei pochi giri che vanno persi dal motorino che non si arresta subito (magari mezzo o 3/4 di giro = 6 o 10 impulsi). Questo dopo centinaia di operazioni la posizione comincia a cambiare.
Come misurare i decimi di metro con un flessometro.
marsram:
E anche se tu sapessi quanto è andato avanti, come lo riporteresti al target se non si fermasse quando togli corrente ?

Io ho previsto che il contatore continua a contare tramite i segnali di IOC. Quindi si deve contare con la verifica delle due fasi.
Quando ho iniziato avevo tenuto conto di tutti gli interrupts, che facilmente causano un sovraccarico. Con gli ehnanced è facile discriminare il fronte e saltare la routine con minor numero di istruzioni.

@OP

Se cerchi la semplicità non far cadere la tua scelta sui PIC, ma vai coi AVR.
Per il tuo caso fai presto con un digispark e le librerie di Arduino.

Le spiegazioni
https://www.instructables.com/id/How-to-Use-an-Rotary-Encode…
https://www.arduinolibraries.info/libraries/encoder

Oppure scendi ai componenti discreti e calcoli quanti giri fanno al motore e li inserisci a una catena di contatori. Se non sbaglio ti servirebbero almeno 700 impulsi per fare 2 giri dell'albero lento. Con 3 74xx190 hai lo scopo di rilevare il numero di giri e con qualche (N)AND vedere da che parte gira.

Ora che si capisce il tuo scopo, si può optare anche a un servo. Lo si programma per ruotare di 180° direttamente sul catenaccio. La rotazione della mandata della chiave diventa indotta.
https://www.instructables.com/id/Bluetooth-Door-Lock-Arduino…

Ad ogni modo io faccio il mio progetto e sei pregato di rispondere ai miei messaggi, se vuoi un mio aiuto.



Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675




una ogni 10 livelli


postato il:
28.03.2019, alle ore 08:42
pippodue:
I moduli QEI leggono gli ingressi un certo numero di volte prima di validarli, per prevenire i rimbalzi o le incertezze sui fronti, fare anche questo in SW comporta un ulteriore notevole aggravio.


Hai ragione si tratta di una applicazione professionale. Su questo forum non credo si cerchi tanto.
Nelle mie prove ho visto che c'è il problema di rilevare i fronti correttamente, ma non sono sceso nel dettaglio perché vorrei tenere il progetto il più semplice con un numero minimale di componenti.
Se tenessi conto di squadrare il segnale allora chiedo cosa si può applicare ad un foto-accoppiatore per migliorare la risposta del fototransistor. Ma forse dovrei mettere dei 40106.



Anno nuovo, forum nuovo.
Mi sa che lascio.
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
28.03.2019, alle ore 10:52
Anche se non ci azzecca molto, posto la ISR che sto scrivendo attualmente per 2 encoder in quadratura (anch'essi DIY):
void __attribute__((no_auto_psv)) _ISRFAST _T1Interrupt(void)   //timer3 ogni 125 microsec
{essg = ess; esig = esi;   //legge stato grezzo digital input
edsg= eds; edig = edi;     
if (essg==1 && essca<4) essca++; else essca=0;//enc.sin.sup.aggiorna contatore alti
if (essca==4) {essv=1; essca=0; }               //convalida valore alto
if (essg==0 && esscb<4) esscb++; else esscb=0;//enc.sin.sup.aggiorna contatore bassi
if (esscb==4) {essv=0; esscb=0; }              //convalida valore basso
if (esig==1 && esica<4) esica++; else esica=0;//enc.sin.inf.aggiorna contatore alti
if (esica==4) {esiv=1; esica=0; }               //convalida valore alto
if (esig==0 && esicb<4) esicb++; else esicb=0;//enc.sin.inf.aggiorna contatore bassi
if (esicb==4) {esiv=0; esicb=0; }              //convalida valore basso
if (edsg==1 && edsca<4) edsca++; else edsca=0;//enc.des.sup.aggiorna contatore alti
if (edsca==4) {edsv=1; edsca=0; }               //convalida valore alto
if (edsg==0 && edscb<4) edscb++; else edscb=0;//enc.des.sup.aggiorna contatore bassi
if (edscb==4) {edsv=0; edscb=0; }              //convalida valore basso
if (edig==1 && edica<4) edica++; else edica=0;//enc.des.inf.aggiorna contatore alti
if (edica==4) {ediv=1; edica=0; }               //convalida valore alto
if (edig==0 && edicb<4) edicb++; else edicb=0;//enc.des.inf.aggiorna contatore bassi
if (edicb==4) {ediv=0; edicb=0; }              //convalida valore basso
//incrementa il numero dei passi:
if ((essv==1 && essp==0 && esiv==0)||(esiv==0 && esip==1 && essv==0)) pas++;
if ((essv==0 && essp==1 && esiv==1)||(esiv==1 && esip==0 && essv==1)) pas++; 
if ((esiv==1 && esip==0 && essv==0)||(essv==0 && essp==1 && esiv==0)) pas--; 
if ((esiv==0 && esip==1 && essv==1)||(essv==1 && essp==0 && esiv==1)) pas--; 
if ((edsv==1 && edsp==0 && ediv==0)||(ediv==0 && edip==1 && edsv==0)) pad++;
if ((edsv==0 && edsp==1 && ediv==1)||(ediv==1 && edip==0 && edsv==1)) pad++; 
if ((ediv==1 && edip==0 && edsv==0)||(edsv==0 && edsp==1 && ediv==0)) pad--; 
if ((ediv==0 && edip==1 && edsv==1)||(edsv==1 && edsp==0 && ediv==1)) pad--; 

if ((pas-pas4)==4 || (pas4-pas)==4)    //ogni 4 passi ruota sinistra
{ tsg=TMR2; if (zers==0)les=5000; else //la prima lettura Ã¨ preimpostata
{ if(tsg>tsgp)les=tsg-tsgp;
else les=(65535-tsgp)+tsg; }
zers=1; tsgp=tsg; pas4=pas; }            //rileva lentezza sinistra da timer2    

if ((pad-pad4)==4 || (pad4-pad)==4)    //ogni 4 passi ruota destra 
{ tdg=TMR2; if (zerd==0)led=5000; else  //prima lettura preimpostata
{ if(tdg>tdgp)led=tdg-tdgp;
else led=(65535-tdgp)+tdg; }
zerd=1; tdgp=tdg; pad4=pad; }            //rileva lentezza sinistra da timer2    

essp = essv; esip = esiv;   //memorizza stato digital input
edsp = edsv; edip = ediv;
if (esig== 1 || edig==1)ledv=1; else ledv=0; //segnala encoders inferiori per taratura trimmer 
if (essg == 1 || edsg==1)ledr=1; else ledr=0;//segnala }encoders superiori per taratura trimmer

tem++; if ((tem>=80)&&(reg==1))        //segue regolazione velocità ogni 10 msec
{ ers=les-leis;            //errore sinistra=lentezza rilevata-impostata richiesta
cus=(long int)cus+ers;     //cumulo integrale errore
aux=700+(ers>>3);          //azione proporzionale
if (ers>0)aux=aux+5;       //contributo tipo accelerazione costante 
if (ers<0)aux=aux-5;       //o decelerazione
aux=aux+((ers-ersp)>>1);   //+derivata
aux=aux+((long int)cus>>9);//+ integrale
if(aux>1000)aux=1000;      //limite superiore duty cycle
if (aux<300)aux=300;       //limite inferiore
dus=aux; ersp=ers;         //imposta duty cycle e salva errore
erd=led-leid;              //idem lato destro
cud=(long int)cud+erd; 
aux=700+(erd>>3);   
if (erd>0)aux=aux+5;if (erd<0)aux=aux-5;
 aux=aux+((erd-erdp)>>1);
aux=aux+((long int)cud>>9);    //+ integrale
 if(aux>1000)aux=1000;
if (aux<300)aux=300;
dud=aux; erdp=erd; tem=0; }
con++; if(con>=8)               //ogni 8 interrupt      
{ con=0; ms++; }               //incrementa millisecondi
IFS0bits.T1IF = 0; }            //fine ISR



anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
spippolo





postato il:
28.03.2019, alle ore 18:43
picmicro675:

Ad ogni modo io faccio il mio progetto e sei pregato di rispondere ai miei messaggi, se vuoi un mio aiuto.


Ti ringrazio e mi sembra di aver risposto a tutti, non vedo perchè usare un servo quando ho un motore che mi va bene allo scopo, se volete io ho chiesto un aiuto per una cosa personale e amatoriale, se pensate che lavori dietro a un progetto industriale.. avete sbagliato ..
picmicro675




una ogni 10 livelli


postato il:
28.03.2019, alle ore 19:28
spippolo:
Ti ringrazio e mi sembra di aver risposto a tutti

Se vuoi le risposte da tutti allora scrivere sul forum è corretto.
Facilmente ho considerato che l'indirizzo di posta elettronica fosse valido, quindi ho scritto in privato. Che è stato anche enunciato in questa discussione.
Se facessi attenzione quando accedi al forum, c'è una icona di lettera che lampeggia, appena sotto la testata. Se ci clicchi sopra ti porta ai tuoi messaggi privati del forum
Vedrai che c'è un messaggio per te.

Da come hai descritto la tua intenzione, direi che sarebbe meglio se il motore girasse ad una tensione inferiore ai 12 V. Anche perché il micro non può lavorare a quella tensione. Magari si trova meglio se mettessi una tensione unica per tutto il progetto.
Il problema sta nel riuscire a leggere l' encoder a quella velocità senza perdere il conteggio.

Il progetto lo porto avanti. Ormai ho ancora qualche ragguaglio per completare il programma. Non l' ho ancora messo alla prova in hardware, ma voglio vedere alcuni difetti dal simulatore, che mi premette di verificare anche passo per passo.
Quando sarà in grado di fare secondo le mie concezioni allora lo pubblico nelle mie pagine.

@pippodue
Vedo che quello sviluppo prende un cospicuo ammontare di flash. Mi fa supporre che non siano ingressi veloci per quello che hai scritto. Io ho fatto la routine di conteggio in assembly, poi vedrò se riesco a leggere anche oltre il kHz.



Anno nuovo, forum nuovo.
Mi sa che lascio.
spippolo





postato il:
29.03.2019, alle ore 00:10
Era finita nello spam la tua mail, l'indirizzo è valido.. ti ho risposto.
la bustina del forum non lampeggia e nel forum non mi è arrivato nessun messaggio privato..
Far girare il motore a meno tensione, lo rende troppo lento.. e inoltre potrevvero generarsi errori di lettura con la stessa alimentazione. Per questo avrei pensato di alimentare la parte logica a 3.3 V e il motore a 12 .. magari posso scendere a 10 V .. per rallentarlo un poco..
picmicro675




una ogni 10 livelli


postato il:
29.03.2019, alle ore 14:11
Ho quasi fatto con il 16F84A. L'ho stipato bene che m'è rimasto solo 90 words di programma.
Magari provo in hardware domani.....
Preparati con il basic
http://www.protonbasic.co.uk/vbdownloads.php?do=download&dow…

Il simulatore accetta senza problemi anche 1000 Hz

Ho il motore che fa 3000 g/1' con 20 impulsi al giro. Vedrò se in hardware fa come alla simulazione.



Anno nuovo, forum nuovo.
Mi sa che lascio.
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale