Appunti da e per chi si vuole auto-costruire un posizionatore

:p

Il 16F84 che ha provato a usare Maxicono ha la EEPROM interna da soltanto 64 byte, se nell'arco di movimento del motore deve contare più di 256 impulsi allora per ogni posizione bisogna usare 2 byte, il che fa scendere a 32 le posizioni memorizzabili. Se poi si aggiunge il fatto che oltre alle posizioni bisogna memorizzare anche altri valori non perdibili (conteggio dei limiti, ultima memoria richiamata) ed eventualmente i registri di stato, capisci che la EEPROM interna al 16F84 non basta.
Il mio 16F876 ha 256 byte in tutto, quindi 128 posizioni a 16 bit, limitandole a 99 c'è spazio a sufficienza per tutti i dati di controllo ;).
Nel 16F84 per implementare la gestione dei protocolli I2C (memorie 24Cxx) o SPI (memorie 93Cxx) bisogna scriversela a mano, perchè quel modello di PIC non dispone di ricetrasmettitore sincrono integrato.
Il 16F876 invece ha sia il controller sincrono che può funzionare in I2C o SPI, sia il ricetrasmettitore asincrono seriale per il telecomando. Una volta impostato a dovere, basta scrivere nei 2 registri specifici l'indirizzo, il comando o il byte da scrivere o leggere e il processore si occupa della trasmissione autonomamente, segnalando lo stato (fine trasmissione, errore ecc.) con un interrupt (quindi il PIC può tornare in attesa di altro mentre scrive o legge dalla memoria esterna).

Forse sono riuscito a eliminare comodamente il gruppo contatore esterno e il rivelatore di transizione (monostabile). Questo perchè ho modificato la logica di gestione dell'impulso dal motore: prima ogni impulso dal sensore veniva gestito in un interrupt handler che, avendo i contatori esterni, doveva soltanto verificare che il numero contato corrispondesse a quello richiesto dal richiamo memoria. Il problema è che tutti i PIC16 possono vettorizzare un solo interrupt alla volta, quindi mentre sto servendo l'interrupt gestione dell'impulso non posso accettare segnali dal telecomando, e viceversa.
Implementando il registro contatore in software, a ogni interrupt avrei dovuto gestirlo io (aumenta decrementa azzera carica ecc.), e nel caso mi arrivi un impulso mentre è in servizio la ricezione dal telecomando quell'impulso viene perso, il contatore non lo conta e va tutto a rotoli ;).
La modifica consiste nell'eliminare l'interrupt dall'impulso, ma bensì utilizzare la tecnica del polling. Questo perchè tutti i casi in cui deve essere gestito il contatore prevedono che il processore sia più o meno occupato; quando faccio STEP devo sempre attendere l'impulso successivo per fermare il motore, al richiamo memoria devo sempre leggere gli impulsi per confrontare il numero contato con quello richiamato, il comando MOVE che con il contatore esterno può anche non richiedere di leggere gli impulsi richiede comunque il controllo se è stato raggiunto il limite e se ho premuto STOP per fermarlo. Quindi integrare qualche routine che si occupa di gestire il contatore non è troppo difficile ;).
La rimozione del monostabile si può fare grazie al fatto che io elimino sì il conteggio tramite interrupt, ma il piedino che usavo per entrare con gli impulsi (PB0/INT) è dotato di un rivelatore di transizione, cioè può informare la CPU che l'onda ha cambiato stato, inoltre è programmabile per rilevare solo le salite o solo le discese, ma non entrambi e a me questo fa comodo :D

P.S. chi ha lo Jaeger H-H mi può dire quanti impulsi escono dal sensore per percorrere i 180° che copre? Non ho ancora fatto le prove...
 
Ottima soluzione pm.astra2dve
La frequenza degli impulsi di conteggio è molto bassa, e con 1uS di ciclo macchina, si dovrebbe riuscire bene a fare tutti i controlli.
Volendo si può usare anche quarzi di frequenza superiore e collegarci un display alfanumerico, per visualizzare il contatore ed avere un buon riferimento di ciò che il PIC sta facendo, specialmente in fase di prova.

Maxicono, dimmi su quali 2 pin del PIC vuoi collegare SDA-SCL, dammi 2 registri (2 byte) dove vuoi mettere i 2 valori da scrivere o leggere e un registro di indice (1 byte) che mi indica in quale coppia di celle operare (0 = celle 00-01... 1 =celle 02-03... 2= celle 04-05)
In questo modo con una call alla subroutine che ti faccio, scrivi o leggi 2 byte alla volta e con un'indice che va da 0 a 255, si può operare su 512 byte di memoria... sono sufficienti???
Se ne vuoi di piu facciamo 2 byte di indice oppure sempre con 1 byte di indice anzichè 2 valori per volta ne facciamo 4 o 8 o 16...
Che ne dici?
P.S: mi serve sapere di preciso la dimenzione delle eeprom... 24c16 (2048 byte) va bene?
 
Ultima modifica:
@antgue
Ecco che dopo averti stressato con le mie domande sui comparatori, torno a stressarti acnhe con il PIC!!

Allora come porte mettiamo rispettivamente PB0 e PB1

Registri:
10, 11

index, 12

Bastano e avanzano 512 byte, grazie. :)

@pm.astra
Ho anche un paio di 876 che avevo preso per giocare con l' ingresso analogico, ma per adesso gioco con l' 84.
 
Maxicono...
Vediamo se ce la faccio in breve tempo... non sono un'esperto in software però ci provo :icon_rolleyes:
P.S. il watchdog lo attivi?
 
antgue ha scritto:
Maxicono...
Vediamo se ce la faccio in breve tempo... non sono un'esperto in software però ci provo :icon_rolleyes:
P.S. il watchdog lo attivi?

tranquillo, io non ho nessuna fretta, lo faccio per ritagliarmi qualche attimo di svago con un hobby, non ho la pretesa di portare a termine il progetto a breve, altrimenti me lo comprerei. :) Comunque se devi star lì a pensarla apposta per me, lascia stare.

No, per il momento non lo uso, tanto anche se si "luppa" in qualche subroutine, o si annida negli stack, non corro rischi, poi me la vedrò io quando sarà il caso di metterlo.

Ciao
 
Riflessioni e idee sui posizionatori

Io ho due ricevitori con posizionatore integrato:
A) vecchio ricevitore analogico
B) manhattan plaza ST450

A) Conta un impulso ogni qualvolta rileva un cambiamento di stato del reed, per capirci meglio se il contatto era chiuso e poi si apre allora conteggia un impulso, se il contatto si richiude ne conteggia un altro e così via.
B) Conta un impulso ogni qualvolta il contatto reed si apre, quando il contatto si richiude non c'è nessun conteggio. Appena il contatto si riapre conteggia un altro impulso e così via.

O contatto aperto (open)
C contatto chiuso (close)

A) COCOCOCOCOCOCOCOCOCO (conteggia 20 impulsi)
B) COCOCOCOCOCOCOCOCOCO (conteggia 10 impulsi)

Quindi il posizionatore A conteggia il doppio degli impulsi del posizionatore B e questo è di fondamentale importanza nei pistoni con sensore reed che si aprono 4 volte a ogni giro della rotellina calamitata. Con questo tipo di motori A conta 8 impulsi a giro mentre B ne conteggia solo 4 di conseguenza il posizionamento diventa più preciso con il posizionatore A.

Sarebbe utile secondo voi implementare un parametro X, configurabile dall'utente, che svolga la seguente funzione?
Quando ci spostiamo da una posizione satellitare S1 ad un'altra S2 il motore deve conteggiare tot giri (in più o in meno) per raggiungere la nuova posizione, arrivati a S2 - X (giri in più) o S2 + X (giri in meno) il posizionatore riduce la tensione di alimentazione del motore per farlo andare più lentamente e arrivare alla posizione S2 senza andare oltre, evitando così di sforare con qualche conteggio in più per poi dover ritornare indietro.
Si potrebbe altresì prevedere un secondo parametro Y, sempre configurabile dall'utente, che per satelliti lontani tra loro più di Y giri faccia aumentare la tensione di pilotaggio del motore per farlo andare più veloce. Praticamente il valore di Y sarebbe il numero minimo di giri che devono intercorrere tra due satelliti affinchè il motore possa andare più veloce.
 
Ottima considerazione Mistersat, per questo consigliavo di usare il sistema di pilotaggio a mosfet (in PWM) anzichè a rele (on-off), in quanto è possibilie gestire la velocità del motore im modo da fare un'avvicinamento alla posizione a velocità ridotta ed annullare le inerzie meccaniche del motore e elettromeccaniche dei rele :D
 
:p

Io conto su un solo fronte dell'onda, altrimenti a ogni conteggio dovrei preoccuparmi di reimpostare il rivelatore su PB0 in modo che conti il fronte opposto... vuol dire complicare ancora il programma :D come clock penso di usare il massimo ammesso dal PIC (20 MHz) quindi non ci dovrebbero essere problemi di "count miss" perchè va molto veloe ;).

Antgue tu vuoi implementare lo stesso metodo di pilotaggio dello Stab, con la differenza che devi dimensionare i 4 finali per una corrente massima di almeno 4A, anche se lavorano in PWM scalderanno comunque un pochino quindi suggerirei 5-6A di corrente minima di collettore (o di Source visto che tu sei fissato con i mosfet ;)); io ho fatto un circuito con un BDX53 (8A) che faceva da interruttore, e scaldicchiava anche con 800 mA di corrente che lo attraversava...
Dovrai dimensionare di conseguenza anche i diodi di protezione tra la giunzione di ogni coppia di finali e + e massa, gli 1N5402 sono un po' troppo tiratini, io metterei dei P600K (6A) o ancora meglio i BYW29 (8A in TO220 così li metti, previo isolamento, sul radiatore dei mosfet ;)).
 
:p

@Mistersat

Devo decidermi e preparare un alimentatorino da 36V con il toroidale da 350W (forse un po' grosso... :5eek: :lol:) che ho giù in garage, collego l'oscilloscopio all'uscita del reed e vediamo.
Non so che duty-cycle ha l'onda che esce dal reed, e il posizionatore del vecchio ricevitore analogico funziona soltanto se l'onda in uscita ha un duty-cycle del 50%. Infatti contando ogni transizione (0-1 e 1-0) se il tempo in cui il reed rimane chiuso è differente dal tempo in cui il reed rimane aperto, ho un errore incredibile in quanto, essendo ogni passo di lunghezza differente alternata (alto-basso-alto ecc.) avrò che i passi hanno 2 lunghezze diverse a seconda che leggano il periodo alto o il periodo basso dell'onda :evil5:.
Il Manhattan invece adotta un metodo più "universale", non devo avere un dischetto magnetizzato a metà esatta N e a metà S, lui leggerà sempre una sola transizione, quindi posso avere N impulsi al giro anche di durata molto diversa dal tempo in cui il reed rimane nell'altro stato e lui conterà sempre giusto. Ovviamente ha una precisione teorica del 50% inferiore all'analogico, ma la precisione dipende anche da quanto demoltiplicata è la trasmissione del motore in rapporto al segnale in uscita.
Ripeto, devo verificare con l'oscilloscopio che segnale esce dal mio H-H reed e dal pistone ottico ;). Dal pistone ottico credo siamo sui 10 impulsi al giro di rotella (20 transizioni)
 
Pm.astra2dve:
I BDX53, pur essendo veloci tra i vari darlington, (a meno che si monti un circuito di estrazione di corrente dalla base) sono molto lenti, specialmente in desaturazione e nella configurazione a ponte, si ottiene che nelle fasi commuazione da una direzione all'altra, i 2 transistor che dovranno chiudere lo fanno + velocente di quelli che devono aprire, con il risultato di un'alta corrente transitoria nei 4 transistor per un tempo relativamente breve. Il risultato è un riscaldamento dei finali con conseguente assorbimento inutile di corrente... questo riscaldamento è direttamente proporzionale alla frequenza del PWM.
Mi sono fissato con i mosfet in quanto sono molto + veloci, piu facili da pilotare, e di piu facile ottimizzazione dei tempi di chiusura e apertura. Si può anche dimensionare l'apertura piu veloce della chiusura in modo di ridurre drasticamente il riscaldamento dovuto alle commutazioni.
Per quanto riguarda i 4 diodi, vanno benissimo qualsiasi schottky da 60V 3A (es: MBR360) oppure degli ultrafast BYW98-200... di valore RMS, questi portano una corrente molto bassa e non scaldano.

P.S. i darlington non satureranno mai con tensione inferiore a 1-1.5V (specialmente a 3 Ampere) quindi anche questo contribuisce parecchio al riscaldamento.
I mos hanno in conduzione 15-25milliohm che a 3A danno una caduta massima 75mV... se queste tensioni le moltiplichi per la corrente noterai una differenza nella potenza dissiparta... vedrai che probbabilmente non servirà nemmeno l'aletta
 
Ultima modifica:
pm.astra2dve ha scritto:
... Dal pistone ottico credo siamo sui 10 impulsi al giro di rotella (20 transizioni)
Confermo, 10 impulsi al giro per l'ottico e 4 per il reed. Con l'ottico, cambiando paletta, si possono mettere fori a piacere per cui non sussiste il problema del conteggio doppio (aperto/chiuso).
 
Mistersat ha scritto:
...
Sarebbe utile secondo voi implementare un parametro X, configurabile dall'utente, che svolga la seguente funzione?
Quando ci spostiamo da una posizione satellitare S1 ad un'altra S2 il motore deve conteggiare tot giri (in più o in meno) per raggiungere la nuova posizione, arrivati a S2 - X (giri in più) o S2 + X (giri in meno) il posizionatore riduce la tensione di alimentazione del motore per farlo andare più lentamente e arrivare alla posizione S2 senza andare oltre, evitando così di sforare con qualche conteggio in più per poi dover ritornare indietro.
Si potrebbe altresì prevedere un secondo parametro Y, sempre configurabile dall'utente, che per satelliti lontani tra loro più di Y giri faccia aumentare la tensione di pilotaggio del motore per farlo andare più veloce. Praticamente il valore di Y sarebbe il numero minimo di giri che devono intercorrere tra due satelliti affinchè il motore possa andare più veloce.
e riguardo questo? :sad:
 
Il sistema di conteggio doppio, a chiusura e apertura nel caso di sensore ottico è un'ottima soluzione che consente di raddoppiare la risoluzione del contatore.
Ne caso del sensore reed, bisogna tener presente che come qualsiasi contatto elettrico, nel cambio di stato si registrano una marea di impulsi di "rimbalzo" che se non opportunamente filtrati con filtro passa basso, possono alterare di molto i conteggi.
Consiglio di modificre i sensori magnetici in sensori ottici con un circuito trigger di shmitt sul segnale del fototransistor in uscita ed eventualmete si può raddoppiare gli impulsi con due piccoli monostabili ad ogni cambio di stato in modo da raddoppiarne le risoluzione.
Se non erro Mistersat sta realizzando delle modifiche che presumo possano essere un buon riferimento :icon_rolleyes:
 
antgue ha scritto:
...
Se non erro Mistersat sta realizzando delle modifiche che presumo possano essere un buon riferimento :icon_rolleyes:
Ho in cantiere uno schema progettato da antgue, con un lm393, dopo aver realizzato il prototipo e constatato il funzionamento pubblicherò il progetto.
 
una nota sull' utilizzo del diodo P600, se non erro questo è un normale diodo raddrizzatore, in PWM credo ci voglia qualcosa di più veloce, altrimenti gli spite vanno a finire comunque sul Transistor o sul MOS.
Sui passo passo si usano i FAST tipo 1N4937 o 1N5819, ma portano poca corrente, ci vorrebbe qualcosa del genere ma con più corrente.
In pausa pranzo accendo l' attuatore e tiro giù il timing dell' uscita ottica, così vediamo il duty, anche se nonè così importante se andremo a contare le transizioni.

Ciao
 
Per quanto riguarda i diodi, se si fa on-off sono sufficienti diodi retificatori, mentre se si va in PWM, di certo servono degli ultrafast o se si vuole esagerare degli schottky (hanno anche il vantaggio di avere una tensione in conduzione Vf circa metà dei diodi tradizionali, dissipando quindi a parità di corrente circa metà potenza)... comunque diodi da 3A sono piu che sufficienti... questi servono solo per il ricircolo nei tempi morti dei finali, non portano tutta la corrente, ad impulsi sopportano picchi anche di 10 volte superiori al nominale RMS.
Il duty-cicle degli impulso in uscita del sensore ottico, rispechia fedelmente il rapporto chiuso aperto dei buchi della palettina che gira nel sensore, quindi abbastanza simmentrico... nel caso di sensore reed, dovrebbero essere impulsi molto corti, in quando chiude solo al passaggio del magnetino e apre subito appena il magnetino si allontana
 
Ultima modifica:
Ho approfittato di un uscita del capo, per fare la prova, ssssssss, non ditelo a nessuno. :)

Allora il Duty è circa 1/3 ON 2/3 OFF, questo perchè, se leggo bene lo schema, l' impulso stesso va a spegnere il LED del fotoaccoppiatore, ancora prima che venga oscurato dalla ruota dentata.
Questo, nel caso fosse veramente così, darebbe uno "stato sicuro" quando il motore è fermo, e quindi, la prima transizione sarebbe sempre con fronte positivo. Magari serve, magari no.




Sul tuo a comparatore semplice il duty è al 50%, mentre nella versione con dupplicatore, credo dipenda dal condensatore in ingresso al secondo stadio.

Ciao
 
Ultima modifica:
Maxicono ha scritto:
Sul tuo a comparatore semplice il duty è al 50%, mentre nella versione con dupplicatore, credo dipenda dal condensatore in ingresso al secondo stadio.

Ciao

Esatto Maxicono, dipende da quel condensatore, che fa da monostabile per entrambi i fronti... essendo questo tempo fisso, il duty-cicle riultante, sarà inversamente proporzionale alla frequenza.
Mi scuso con il forum in quanto lo schema non è ancora stato pubblicato in attesa di ulteriori sviluppi... a suo tempo, l'ideatore Mistersat, lo renderà pubblico :evil5:
 
antgue ha scritto:
Esatto Maxicono, dipende da quel condensatore, che fa da monostabile per entrambi i fronti... essendo questo tempo fisso, il duty-cicle riultante, sarà inversamente proporzionale alla frequenza.
Mi scuso con il forum in quanto lo schema non è ancora stato pubblicato in attesa di ulteriori sviluppi... a suo tempo, l'ideatore Mistersat, lo renderà pubblico :evil5:
:D seguo con interesse la discussione:D e mi domando:eusa_think: non li fabbricano piu i posizionatori?:eusa_think: :eusa_think: :D
 
Indietro
Alto Basso