Vai al contenuto
PLC Forum


Pid E Motore Passo Passo


sacacetu

Messaggi consigliati

Ciao a tutti,

avrei bisogno di un consiglio, ora vi espongo il problema,

stò sviluppando il software di una macchina con una scheda a microcontrollore (84c015), questa deve gestire un motore passo passo che fa ruotare un rullo e fin qui ok :)

questo rullo deve mantenere avere la stessa velocità e la stessa fase di un'altro rullo da qui mi arriva un treno di impulsi, forunatamente, il passo dei due rulli è lo stesso e le 10 velocità a regime (non sulla rampa) sono tali da essere nelle frequenze che riesco a generare con in contatore (CTC) del micro. (le freq. variano da circa 1000Hz a circa 6000Hz e 1 giro del rullo corrisponde a 4800 step)

quindi non ho fatto altro che creare una rampa virtuale e usare come feedforward del controllo PI che ho implementato e dal valore che ottengo, vado a prendere quello più vicino alle possibili frequenze che riesco a generare.

la macchina deve anche poter aggiustare, ovvero muovere, la fase tra i due rulli.

il problema è che avendo anche gradini di 50 Hz tra una freq e l'altra a volte succede che, arrivati alla velocità di reggime, o la velocita oscilla (usando P o I troppo grandi) o rimane un'errore di sfasamento anche di 10 step (possibilmente non ci devono essere errori).

come posso risolvere questo dilemma :(

spero di "essere stato spiegato". :D

Link al commento
Condividi su altri siti


Il problema è facilemte risolvibile, nell'unico modo corretto: aumentare la risoluzione riducendo le dimensioni dello step.

Dici che ti arriva un treno di impulsi, quindi la tua risoluzione è pari ad un impulso. Non spieghi se il rullo master lo piloti direttamente, o ne ricavi solo il riferimento, anche se presumo che sia valida la seconda ipotesi. Il problema sembrerebbe essere costituito dal modo in cui ricavi il feed forward, modo di cui dai indicazioni. Prova a spegare come fai il feed forward.

Link al commento
Condividi su altri siti

Ciao Livio,

allora, purtroppo, non riesco a ridurre la dim dello step, l'azionamento arriva al massimo a 800 step/giro ed è intoccabile :ph34r: così come il riduttore, si tratta di una macchina già esistente di qui mi hanno chiesto un diverso funzionamento senza toccare l'hw. ho proposto un V/F (avendo 2 DAC a bordo sulla scheda) ma nada :angry: (costa troppo.... abbiamo poco tempo... bla bla bla... ) devo arrangiarmi con quello che ho. :(

il master è comandato da una scheda gemella, devo implementare anche quello, ma devono essere 2 macchine distinte, con possibilità di lavorare ognuna per i fatti suoi.

la cosa che oggi provando ( e che sicuramente è causa del problema) è che anche se le schede sono gemelle, le freguenze generate differiscono di un po ( nell'ordine di 0,01Hz su 1000 Hz). e deve essere questo che mi provoca l'oscillazione, sono riuscito a ridurla al minimo, ma c'è. secondo te è risolvibile? :huh:

per la partenza, essendo i rulli già in fase, partono con la stessa rampa fino al raggiungimento della velo di reggime, qui, ho messo un PI che mi corregge quel piccolo errore sopra.

il problema più grosso è quando devo cambiare la fase al volo, ho tenuto lo stesso PI ed ho aggiunto un FF che ora ti spiego:

mi calcolo la velocità che dovrei raggiungere per aggiustare la fase in un tempo T prestabilito da me e proporzionale a quanto mi devo sfasare, per non abbassare od alzare troppo la velo ( da 100 ms a 5 sec ).

essendo S lo sfasamento da inc o dec ho

F=S/t

questa F la raggiungo con una rampa di 50 Hz/ms la tengo x T-tempo rampa e poi torno alla velocità di reggime

a queste Freq vado ad aggiungere la correzione PI.

finchè devo sfasare di poco tutto ok (apparte il problema spiegato sopra), quando lo sfasamento diventa importante fà un po di casino.

tu che dici?

potrò mai riuscirci.... :blink:

Link al commento
Condividi su altri siti

Credo che il problema non sia nella risoluzione dello step in se per se, ma nel fatto che tu puoi cambiare la frequenza di pilotaggio solo a passi di 50 Hz.

Faccio un esempio: entrambi i motori stanno girando a 1000 Hz. Se per qualche motivo devi fare una correzione e accelerare uno di essi, sei costretto a farlo lavorare ad almeno 1050 Hz (se ho capito bene).

In tal modo ti sono precluse le piccole correzioni, e il sistema diventa poco stabile.

Dovresti modificare il sistema in modo che possa generare frequenza con passi minori. Perchè hai un passo così grande adesso?

Ciao!

Link al commento
Condividi su altri siti

Ciao bit

Come dicevo sopra le frequenze le genero con il contatore/timer del micro (CTC della famiglia Z80) che usa come riferimento la freq. di clock del micro di 9834000 Hz e posso generare solo frequenze che siano divisioni di questa.

e come dicevo sopra anche io immagino che sia proprio questo il problema, ma purtroppo questo è quello che mi hanno dato e io non ho voce in merito di cambiamenti sull'hw. :(

come al solito vogliono fare andare un Ferrari con il motore di una 500. :D

Link al commento
Condividi su altri siti

Forse il problema è diverso. Se devi cambiare solo la fase , non devi variare la frequenza, ma nel tuo regolatore PI devi inserire un offset.

Se tu riuscissi a mettere on line uno schema a blocchi dei due regolatori e dei legami fra i due forse potrei aiutarti meglio.

Link al commento
Condividi su altri siti

Ci provo, spero si capisca.

Se ho fatto dei maroni, dimmelo senza problema, perche' non ho molta esperienza con i controlli di questo tipo (sbagliando si impara :) )

-------------

| genero  |            ---                ----------------                    ------

| freq.        |--------->| + |--------->| Azionamento |------------>|M P/P| Slave

| reggime e |              ---              ----------------                    ------

| rampa      |              /|\                          |

-----------                |                            | treno impulsi

                                  |                        |

                                  |                          \|/

                                  |                  ------------

                                  |                    | Posizione | incremento una

                                  |                    | Slave    | variabile circolare (0-4799)

                                  |                  ------------

                                  |                        |

                                  |                          \|/

                                ----    errore        ---

                            | PI |<---------------| -  |

                                ----                        ---

                                                          /|\

                                                              |

                                                        ------------

                                                    | Posizione | incremento una

                                                    | Master | variabile circolare (0-4799)

                                                        ------------

                                                          /|\

                                                              |

      - -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  | -  -  -  -  -  -  -  -  -  -  -  -  -

                                                              | treno impulsi

                                                              |

                                                              |

                                                    ----------------                    -------

                                                      | Azionamento |------------>|M P/P| Master

                                                    ----------------                    -------

ho dovuto metterlo tra QUOTE altrimenti sparivano gli spazi.

Comunque si dovrebbe capire

Link al commento
Condividi su altri siti

Una CPU Z80? La conosco...

Uhmmm... ti chiedo un'altra cosa. Visto che le tue specifiche riguardano la parte hardware, che non puoi cambiare, potresti descrivermi dettagliatamente i blocchi hardware che compongono il tuo sistema e quali sono i segnali che si scambiano?

Sto lavorando ad un sistema simile (ancora sperimentale) e forse le mie idee potrebbero essere utili per risolvere il problema. Vorrei però capire se sono attuabili con il tuo hardware.

Ciao!

Link al commento
Condividi su altri siti

ciao bit,

lo farei molto volentieri :) perche' un'aiuto mi servirebbe proprio, ma non vorrei che il mi Capo :angry: se la prendesse se divulgo troppe informazioni.

è già tanto che ho descritto una parte del funzionamento e da quella penso si possa capire come può essere strutturato il sistema, quindi per la mia incolumità preferisco non approffondire troppo.

Link al commento
Condividi su altri siti

Samuele vediamo se ho capito. Dal master ti arriva un treno di impulsi (come fosse un encoder) Questi impulsi li conti in una contatore circolare con modulo 4799 (valore curioso ma avrai le tuo buone ragioni). Idem per lo slave. Confronti i due conteggi ricavandone un errore di posizione. Fino a qui, se le operazioni sono eseguite senza errori, è un algoritmo canonico. Processi l'errore con un algoritmo PI, l'uscita del regolatore va a modificare la frequenza che pilota l'azionamento.

E' corretta la mia interpretazione?

Se si vediamo ora alcuni particolari.

La frequenza che generi dici che non può avere una risoluzione ai 50 Hz. Ho capito bene? Se si, perchè?

Un gradino del genere sicuramente rende il sistema instabile a meno di inserire una banda morta di identica ampiezza, ma perderesti in sensibilità e rischieresti di avere un0instabilità a frequenza molto più bassa, cioè un lento pendolamento tra due gradini contigui.

Poi, se devi correggere la fase realtiva non correggere la frequenza, ma inserisci un certo numero di impulsi di offset. in pratica sommi o sottrai alla contator circolare dello slave una quantità di impulsi fissa che corrisponde alla minima variazione di fase richiesta. Se la variazione richiesta è maggiore la sommi più volte.

Immagina che ci sia un pulsante di correzzione di fase. Leggi il pulsante ogni 0,2 secondi e ad ogni lettura, se il pulsante è premuto, aggiungi l'offset. Questo è un esempio, l'importante è il concetto.

Ricorda che la risoluzione è importante. Pensa quando ero molto più giovane (sono passati vent'anni, purtroppo) feci il nio primo asse elettrico con un microprocessore, allora lavoravo in una grossa azienda azioanamentistica. Dopo un certo numero di ore passate a scervellarmi sul perchè non riuscivo a stabilizzare il sistema, decisi di ricorrere alla consulenza di un collega anziano che, oltre ad essere un'ottima persona, era anche un validissimo ingegnere. Ragionando sul regolatore scoprimmo che lo step minimo del D/A (pari a 4,88 mV!) era eccessivo! Cioè causava una variazione di velocità sueriore all'entità dell'errore da correggere. Scoperto l'inghippo la soluzione fu quasi immediata, cambua il guadagno del D/A da 10v ==> 1V e lo misi in somma ad un altro con f.s. di 10 V che fungeva da generatore di feed forward.

Link al commento
Condividi su altri siti

ciao Livio,

allora tu scrivi

4799 (valore curioso ma avrai le tuo buone ragioni).
il motore ha 800 passi passa per un ridittore 1/6 quindi un giro del rullo sono 4800 passi (0-4799)

poi

La frequenza che generi dici che non può avere una risoluzione ai 50 Hz. Ho capito bene? Se si, perchè?

Come dicevo sopra le frequenze le genero con il contatore/timer del micro (CTC della famiglia Z80) che usa come riferimento la freq. di clock del micro di 9834000 Hz e posso generare solo frequenze che siano divisioni di questa. quindi li gradino mi varia da pochi Hz sulle basse freq. a circa 50 Hz attorno ai 5kHz. :(

Ricorda che la risoluzione è importante

lo so benissimo, ma chi mi paga, pensa che sia più importante risparmiare su un convertitore V/F (vistro che sulla scheda avrei anche 2 DAC 12bit) piuttosto che avere una sicurezza di performance, e lascia a me i c....i da risolvere. :angry:

Grazie mille :D per il suggerimento del off-set "dosato" lo provo poi ti so dire.

p.s.

nello schema di prima, mi sono dimenticato di precisare che quando dovevo rifasare, oltre a calcolare Freq. Tempo , ecc. sommavo(o sottraevo) l'intero ammontare dello sfasamento alla posizione del Rullo, comunque poco importa, ora provo come mi hai suggerito.

:)

Link al commento
Condividi su altri siti

Come dicevo sopra le frequenze le genero con il contatore/timer del micro (CTC della famiglia Z80) che usa come riferimento la freq. di clock del micro di 9834000 Hz e posso generare solo frequenze che siano divisioni di questa. quindi li gradino mi varia da pochi Hz sulle basse freq. a circa 50 Hz attorno ai 5kHz.

9.834 MHz frequenza base da cui:

9834000/1965 = 5004,458

9834000/1966 = 5002,0346

9834000/1967 = 4999,49

9834000/1968 = 4996,95

Se invece stai sui 1000 Hz allora la risoluzione è dell'ordine dello 0,2Hz. Forse dovresti verificare come ricavi la frequenza, o forse mi manca qualche informazione.

Link al commento
Condividi su altri siti

...e magari il CTC-Z80 fo a 16 bit.... :)

dalla partendo dalla freq base 9834000 puoi dargli un primo tagli di 16 o 256 quindi

9830400/16=614400

9830400/256=38400

poi subentra il contatore a 8 bit e passa per un Flip-Flop per squadrare l'onda

qui quasi ok

38400/40=960/2=480

38400/39=984,.../2=492,....

.

.

.

ma qui... :(

38400/18=2133,../2=1066,....

38400/17=2258,../2=1129,....

anche qui quasi ok

614400/251=2447,8../2=1223,.....

614400/250=2457,6/2=1228,8

.

.

.

ma qui... :(

614400/64=9600/2=4800

614400/63=9752,../2=4876,...

comunque, come dicevo, io i miracoli non li so ancora fare... ora presentero una "relazione" di quella che è la situazione, poi vedranno più in alto cosa vogliono fare <_<

ma... io lo so che mi vogliono morto :D

grazie ancora x l'interesse.

Link al commento
Condividi su altri siti

Chiara la spiegazione riguardo alle frequenze generabili dalla CTC. Anche le mie idee, che sto sviluppando in questi giorni, si basano su contatori a 16 bit.

Sui data sheets della CTC Z80 non ho potuto far altro che confermare ciò che dici, ma mi è venuta in mente un'idea che potrebbe essere ottima: richiede una modifica hardware minima, ma utilissima.

La CTC Z80 è composta da 4 timer/counter. Sono tutti contatori a 8 bit, con precaler :1 :16 :256, come dicevi.

Potresti usare due blocchi di CTC in serie, collegando fisicamente l'uscita ZeroCount di un timer all'ingresso ClockTrigger di un altro timer. In tal modo il fattore di divisione possibile sarebbe pari a: AA x BB dove AA e BB sono due valori qualsiasi compresi tra 1 e 256. le possibilità sono molto maggiori...

Che ne dici? Non ho controllato in pratica la fattibilità, ne le modifiche software da fare, dovrei rispolverarmi gli appunti dello Z80, sono anni che non li uso più.

Ciao!

Link al commento
Condividi su altri siti

Si, ci avevo già pensato, ma purtroppo, cambiare l'hw è troppo oneroso, e comunque, gli altri 3 CTC li ho già impegati per altre funzioni.

comunque come dicevo a Livio io presento il max risultato con i mezzi che mi hanno dato, poi valuteranno dall'alto se investire ulteriormente nel progetto.

ciao e un ringraziamento per il vostro interessamento.

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...