Ci gira il PID su Arduino?

Come da oggetto. Ci gira? Bene? Male? Impiccato?

Giusto perchè devo fare un controllo ad uno Spindle DC (48V) per la CNC un amico, e ho un Arduino buttato lì in un angolo, e sopratutto non ho tempo di scrivere codice.

Altrimenti vado con il solito dsPIC...

BaBBuino:
Altrimenti vado con il solito dsPIC...

Buona la seconda, sorpratutto usa un dsPIC33 serie MC che è specifico per il controllo motori con gestione hardware del encoder.

No, niente encoder, lo Spindle è troppo veloce (20.000 rpm). Metto un pò di adesivi rifrangenti (2 a 180° o 4 a 90°) e leggo con fotodiodo.

Sono indeciso tra PID oppure un controllo di corrente. E' un motore DC, con coppia che scende all'aumentare della velocità, quindi un controllo di corrente può essere una soluzione.

Su Arduino non ci gira il PID eh? :confused:

Ho giusto un dsPIC33FJ128 in DIP nel cassetto, ma lo volevo tenere per qualcosa di più interessante.

BaBBuino:
No, niente encoder, lo Spindle è troppo veloce (20.000 rpm). Metto un pò di adesivi rifrangenti (2 a 180° o 4 a 90°) e leggo con fotodiodo.

Dipende da cosa devi fare esattamente, se lo scopo è mantenere la velocità costante ti serve un encoder a media risoluzione, diciamo uno da 64 cpr, 20.000 rpm per un encoder ottico decente non sono un problema.
Ma di che spindle stiamo parlando, link ?

Sono indeciso tra PID oppure un controllo di corrente. E' un motore DC, con coppia che scende all'aumentare della velocità, quindi un controllo di corrente può essere una soluzione.

Il pid è un tipo di controllo ad anello chiuso, poi che agisce sulla corrente o sulla velocità è solo come lo vuoi usare, si possono gestire tutti due con un doppio pid.
Tieni presente che è la norma il calo della coppia all'aumentare dei giri in un motore visto che la coppia altro non è che la potenza divisa per la velocità angolare, dato che la potenza di un motore è una costante ne consegue che la coppia massima erogabile è vincolata dal numero di giri.
Il controllo a corrente costante comporta la variazione degli rpm, si usa quando è importante mantenere costante la coppia, però va a discapito della velocità di rotazione.
Si può usare il pid a doppio anello per mantenere costante la velocità di rotazione, abbastanza importante su una cnc, e gestire la corrente massima sul motore, in questo modo è possibile usare tecniche di overvoltage per aumentare la coppia massima disponibile senza fondere il motore, ovvero la corrente viene limitata al massimo possibile compatibilmente con la potenza elettrica massima supportata dal motore.

Su Arduino non ci gira il PID eh? :confused:

Per girare ci gira, ma va bene solo per fenomeni relativamente lenti come il controllo della temperatura, su un motore che viaggia a 20.000 rpm serve un pid con un ciclo non maggiore di 300 us se vuoi riuscire a tenere la velocità costante in modo decente, decisamente fuori portata non tanto per Arduino, che andrebbe in crisi già con tempi di ciclo di qualche ms (programmazione tramite wiring), ma per il 328 stesso, anche se programmato direttamente in Ansi C, troppo lento come micro.

OK, stesse mie considerazioni. Niente Arduino e scrivo un po' di codice per il DSP.

Tra l'altro, come hai intuito, vorrei pilotarlo anche con brevi finestre di overvoltage per i passaggi profondi dell'utensile sull'alluminio, passaggi da max 7-8 secondi. Per questo avrei bisogno di conoscere e computare la corrente assorbita. Poi metto il mio amico a fare un po' di verifiche sul campo, con una pistola termica Fluke e verificare temperature di esercizio del motore.

Alla fine ho optato per un sistema basato sull'Application notes di Microchip, ed è esattamente quello che cercavo.

Ho un controllo di velocità e un closed loop di corrente. Il PID è già disponibile come libreria, quindi neanche mi devo sbattere a farne l'integrazione matematica in C.

Butto un dsPIC30 con il supermodulo PWM apposito per motori, con già le uscite complementari, il dead-time già pronto, ci aggiungo due driver a ponte intero IRF2111, 4 MOS di quelli belli 'gnoranti, un encoder rotativo per regolare la velocita (non amo i potenziometri sui input ADC) e mi faccio pagare la pizza dall'amico! :smiley:

Ah! Anche una tastiera "telefonica" ed un display 16x4 che fa sempre figo, per impostare le tre costanti K.

Per il software devo fare 2 calcoli di quanto dura sto PID e vedere se è salutare infilarlo dentro una ISR, oppure lasciare nella ISR solo le variabili e computare il PID nel loop. Non ho bisogno di velocità di calcolo fantastiche, ma direi che almeno un campionamento della VEL una volta ogni 10 mSec ci può stare.

Con Arduino siamo lontanissimi...

BaBBuino:
direi che almeno un campionamento della VEL una volta ogni 10 mSec ci può stare.

Forse non hai letto con attenzione quello che ho scritto sopra, per controllare decentemente un motore che arriva a 20000 rpm devi avere un ciclo pid non più veloce di 300us, il che vuol dire acquisire la velocità con questa cadenza.
Se usi il pid delle librerie XC16 (ex C30) il suo ciclo dura meno di 30us, in tutti i casi deve stare fuori dalla ISR.

Porca zozza, dopo un pò di prove frustranti ho scoperto che il dsPIC si blocca (a caso) a frequenze lecite:

Quarzo 10 MHz, PLL a 16 = 160MHz, con FCY a 40MHz (come da datasheet Microchip).

Mi tocca farlo lavorare decloccato... porc@!Ø~[ƒ

BaBBuino:
Quarzo 10 MHz, PLL a 16 = 160MHz, con FCY a 40MHz (come da datasheet Microchip).
Mi tocca farlo lavorare decloccato... porc@!Ø~[ƒ

Attenzione, il clock dei dsPIC33 è molto versatile, però è un casino settarlo tra prescaler, postscaler e moltiplicatore, sopratutto è indispensabile il dual start con il quarzo da 10 MHz in quanto la massima frequenza in ingresso al pll deve essere 8 MHz, in fase di avvio pre, post, multi, non sono ancora settati pertanto si parte con l'oscillatore rc e poi si passa al quarzo.
Inoltre il clock deve essere 80 MHz per un Fcy di 40 MHz, due colpi di clock per ogni ciclo macchina.
Posta il codice che stai usando per i fuse e il clock così ti dico dove si trova il problema, meglio se lo fai sul topi delle altre mcu in bar sport visto che qui siamo OT con i dsPIC.

Astro è un dsPIC30F4011, quindi FOSC / 4

Per partire parte (senza softstart con FRC interno) ma dopo un minuto circa si pianta.

Cmq ho messo PLL a 8, ergo 80MHz e FCY di 20, e funziona da un paio di ore senza problemi, però mi gira le palle farlo girare a metà delle specifiche di Freq. max.

Mangio qualcosa e poi rispondo dillà...