Jump to content
PLC Forum


Toniospritz

Simulazione motore sincrono matlab

Recommended Posts

Toniospritz

Salve, mi scuso anticipatamente per la poca chiarezza con cui esporrò ma è proprio questo uno dei problemi che mi hanno spinto a chiedere il vostro aiuto.

Sono uno studente di ingegneria e devo simulare l'azionamento di una motore sincrono brushless, a magneti permanenti isotropa, e fino a poco più di un mese fa ero quasi a digiuno da simulink e totalmente dal mondo macchine. 

Da vari paper e documenti si è scelto di utilizzare uno tra i metodi più gettonati ed efficienti per comandare i pmsm, il FieldOrientedControl implementabile attraverso lo Space Vector pwm simmetrico.
Nello studio e applicazione dei metodi sono partito da un FOC di esempio fornito(immagine seguente)

 

Spoiler

Org.thumb.png.d859d71ec95b9344cdddbe55d5de7223.png

 

 

 a cui ho apportato le modifiche per lo space vector modulation (inverter, sector index, vector times ecc ecc).

Come potete ben immaginare nulla è filato liscio e il sistema, se realmente parte, risulta essere molto instabile e non segue minimamente il modello originale(immagine seguente).

Spoiler

mod.thumb.jpg.4298d3c0ce4aaeba9428549e370be1b6.jpg

 

 

Secondo la mia ignoranza, uno dei principali problemi è di come calcolo i periodi di tempo in gioco . In particolare supponendo che il pmsm è costituito da 4 coppie di poli, so che la frequenza nominale del motore è

FreqPMSM=omega_rpm*PairPoles/60 -> Tpmsm=1/FreqPMSM (1)

dove quindi il SVPWM dovrà avere come periodo di riferimento Ts=2*Tpmsm. (2)

Adesso però, date le mie lacune, mi chiedo... Idealmente riesco a produrre  la coppia massima quando velocità e frequenza sono legate dalla relazione scritta precedentemente(1), quindi se io voglio far ruotare correttamente il motore devo variare la frequenza a seconda della velocità del rotore e quindi aumentare gradulmente la frequenza Fs=1/Ts in sincronia con la frequenza rotore fino ad arrivare alla velocità di riferimento, quindi non tenermi fisso Fs alla velocità richiesta dall'ingresso. (che nei miei test è la omega nominale).

Se ciò che ho supposto è giusto, come faccio a far modificare automaticamente i periodi dell'onda triangolare che uso per generare i gates?

 

grazie infinite a chi ha avuto tutta questa pazienza di leggermi 🙏

Link to post
Share on other sites

Sandro Calligaro

Per capire come aiutarti, sarebbe utile sapere cosa sai, quindi che cosa stai studiando, che corsi hai fatto che riguardino l'elettrotecnica, i sistemi/controlli, l'elettronica e l'elettronica di potenza.

Potresti anche postare il modello Simulink, possibilmente salvato in un formato vecchio, così lo si può aprire con la maggior parte delle versioni.

 

Da quel che capisco, comunque, alla base del tuo ragionamnto c'è un malinteso...

La frequenza di switching (cioè quella della portante PWM) normalmente rimane fissa, ed è molto più alta (tipicamente almeno 10-20 volte) rispetto alla frequenza elettrica a cui deve funzionare il motore. La PWM, infatti, è un modo per generare, come media nel periodo di switching, una certa tensione.

Se il periodo di switching è sufficientemente piccolo, quello diventa il tempo di campionamento con il quale il controllo agisce sul sistema fisico.
In pratica, l'inverter trifase, comandato in PWM, è come 3 DAC (Digital-to-Analog Converter) di potenza (o, se preferisci, 3 generatori di tensione variabile, comandabili dal controllo), in grado di generare un valore di tensione diverso ad ogni periodo di switching.

Edited by Sandro Calligaro
Link to post
Share on other sites
Toniospritz

Ciao Sandro,

scusa solo in questo momento ho notato la notifica del forum. Si, ci hai preso in pieno, una tra le tante confusini era appunto le definizione di un tempo si switching variabile o stazionario. Alla fine dati vari catastrofici tentativi ho deciso di settare una frequenza fissa, scelta in maniera del tutta arbitraria, a 8khz. 

Il PWM classico, per inteso quello presenti nei famosi dc/dc buck/boost/buck-boost ne conosco il funzionamento teorico, e alla fine è pensando a loro che ho fissato questa frequenza, alta, rispetto quella della macchina pmsm che attualmente mi sto studiando.

Quindi è un funzionamento regolare nel svpwm far variare più volte gli switch in un settore del pmsm come in questo screen?

Spoiler

stp5.thumb.png.08ea791d990bac955ce9b84f808dfc49.png

 

 

Seguendo il paper presente a questo indirizzo PMSM drive sono riuscito a far funzionare, anche se in malo modo, il pmsm. Infatti dai plot  vedo un ripple importante nella velocità che suppongo possa provenire dal torque sul cui non applico nessun controllo, se non un. Inoltre mi capitava/capita che ponendo la velocità a 0 la macchina tendeva a girare autonomamente portandosi ad angolo/velocità negativi,e non riseco ancora a capire il perchè... _-_

Spoiler

stp4.png.b08d230cfab86a88e626c98b8fbacec7.png

stp2.thumb.png.a83aa36d73da055d8ed4d026ae7b50d3.png

 

stp3.png.278278aa43babe3da85b0195b06d3097.png

 

Come potete vedere gli spike della velocità non sono simmetrici e tendono infatti ad essere più ampi per le velocità negative, come mai? non riesco proprio a capire e a trovare qualche riferimento  online sulla problematica...

Ho salvato invece i file simulink a questo link, spero si scarichi senza problemi.

simulSlx

 

Link to post
Share on other sites
Sandro Calligaro
Il 17/5/2020 alle 02:41 , Toniospritz ha scritto:

Il PWM classico, per inteso quello presenti nei famosi dc/dc buck/boost/buck-boost ne conosco il funzionamento teorico, e alla fine è pensando a loro che ho fissato questa frequenza, alta, rispetto quella della macchina pmsm che attualmente mi sto studiando.

Bene, allora sei sulla buona strada. Tra l'altro, 8 kHz è una frequenza abbastanza tipica per un inverter industriale, di potenza fino a qualche decina (ma direi anche centinaia, volendo) di kW.

Un inverter trifase non è altro che l'insieme di tre chopper o half-bridge. Ciascuno può generare una tensione media (nel periodo di switching) variabile tra 0 e la tensione di bus DC. Quello che arriva al carico è, ovviamente, la tensione concatenata, cioè la differenza tra le tre uscite. Questo modo di vedere le cose è, a mio avviso, il più flessibile e semplice.

Purtroppo, c'è un po' di confusione sui termini ("modulazione" in particolare), ma al di là dei nomi ci sono due operazioni, per passare dalle tensioni desiderate (fase-centro stella del motore) ai comandi di gate per i tre rami dell'inverter. Un'operazione è quella che porta dalle tre tensioni di fase ai tre valori di duty-cycle, mentre l'altra (PWM) è banalmente l'attuazione dei duty-cycle, solitamente tramite confronto tra una portante triangolare ed un valore di compare, proporzionale al duty-cycle.

 

Siccome si suppone che il carico sia bilanciato (il che è vero, a parte piccole non-idealità, per tutti i motori trifase), allora si sa che il potenziale del centro stella si porterà al valore medio dei tre potenziali delle uscite dell'inverter. Questo significa che le tensioni di fase sono le differenze tra ciascuna tensione di uscita (riferita al negativo del bus DC) e la media delle tre. In pratica, il modo comune tra le tre tensioni di uscita dell'inverter (media delle tre, misurata ad esempio rispetto al negativo del bus DC) può essere qualunque, il carico non ne risentirà.

La space vector corrisponde ad una certa scelta del modo comune (se ti interessa l'argomento, posso aggiungere qualche particolare).

 

 

Per l'upload di file, c'è una modalità consigliata, che rimane interna al forum, ho provato ad usarla (spero di aver fatto nel modo giusto) per una versione del tuo modello (quello che non modella la PWM) con qualche modifica.

Ho preso solo la parte commentata, quella con il modello più semplice, ed ho applicato i parametri dello script (mi sono accorto dopo che erano diversi da quelli dell'altra parte del modello). Ho provato a dargli un'occhiata, e credo di aver modificato solo due cose:

- ho impostato diversamente i guadagni dei regolatori;

- ho introdotto un guadagno all'uscita del regolatore di velocità.

Per la prima cosa, ho usato un criterio semplicissimo, che permette (con qualche approssimazione) di avere una risposta del primo ordine, alle variazioni del riferimento (setpoint), con banda che è facile da impostare. Si basa sul fatto che il sistema da regolare è del primo ordine, e si applica la cancellazione zero-polo.

In pratica, per il regolatore di corrente si imposta il guadagno proporzionale come Kp = 2*pi*BwI*L ed integrale Ki = 2*pi*BwI*R, dove BwI è la banda desiderata di controllo della corrente, in Hz.

Il guadagno in uscita al regolatore di velocità (1/(3/2*p*Lambda) potrebbe essere inglobato nel regolatore di velocità (impostanto guadagni che sono il prodotto di quelli attuali per questo guadagno, ovviamente). L'ho lasciato esplicitamente fuori, per esplicitare il principio che viene impiegato: per regolare la velocità, si produce un riferimento di coppia, che viene realizzato tramite un riferimento di corrente di asse q (proporzionale alla coppia desiderata).

 

Mi pare che ora funzioni. In ogni caso, avevi fatto un buon lavoro, ma forse hai preso il problema tutto insieme, invece che analizzarlo un pezzo per volta.

Se vuoi giocarci un po', prova a tarare a mano i regolatori di corrente, imponendo come riferimento dei gradini di corrente (quindi senza l'anello di velocità).

Una volta tarati gli anelli di corrente, puoi chiudere l'anello di velocità e tararlo.

E' importante, per fare delle simulazioni realistiche, impostare correttamente anche i limiti dei regolatori (ed il relativo anti-windup).

 

PS: ti consiglio di rappresentare la posizione "normalizzata", da 0 a 2*pi (basta calcolare il resto della divisione per 2*pi). In questo modo, hai un range limitato e vedi la periodicità.

PPS: hai intenzione di usare la generazione automatica di codice per STM32?

 

Edited by Sandro Calligaro
Link to post
Share on other sites
Toniospritz

Sandro grazie mille per il tuo aiuto e le tue spiegazioni, il modello come hai già detto funziona!

Guarda, la scelta dell'inverter a 8kHz è stato un mero caso, chissà, forse less qualcosa a riguardo durante le mie ricerche e mi è rimasto impresso questo valore... 

Quote

La space vector corrisponde ad una certa scelta del modo comune (se ti interessa l'argomento, posso aggiungere qualche particolare).

Si, mi farebbe molto piacere ricevere un link che mi aiuti a comprendere meglio la Space Vector,  in quanto sicuramente ho commesso degli di implementazione poichè, supponendo che a meno di un fattore di proporzionalità dato dall'impedenza, la corrente debba presentare una forma d'onda pari a quella di tensione, a me ciò non avviene...

 

Quote

BwI è la banda desiderata di controllo della corrente, in Hz.

mmm mi piacerebbe capire meglio cosa si intende per banda desiderata BwI  e BwSp, su diversi paper ho letto la tua stessa frase ma... come la decido? calcolo la freq di crossover da bode su un circuito equivalente?

Quote

E' importante, per fare delle simulazioni realistiche, impostare correttamente anche i limiti dei regolatori (ed il relativo anti-windup).

Non so se ho pensato male o meno, ma per quanto riguarda i regolatori D e Q avevo pensato di settare i limiti come il rapporto di tensione VdcBus/(2*sqrt(3) così da limitare la Vref nella circonferenza interna all'esagono SVpwm (sempre se il ragionamento che ho fatto è corretto), in modo simile il Pi speed avendo come limite la coppia massima o la iq massima, ma per questo dovrei avere dei dati motore che non ho...

Quote

PPS: hai intenzione di usare la generazione automatica di codice per STM32?

Si, assolutamente si!

 

ecco la nuova versione

PMSM simulation

 

Edited by Toniospritz
Link to post
Share on other sites
Sandro Calligaro
9 ore fa, Toniospritz ha scritto:

mi farebbe molto piacere ricevere un link che mi aiuti a comprendere meglio la Space Vector

La space vector ha un'implementazione alternativa, che permette con un calcolo semplice di ricavare i tre valori di duty-cycle.

Come dicevo, se si ragiona in termini di tensioni di ramo o "gamba" (uscita inverter, misurata rispetto al negativo del bus DC), è molto semplice immaginare le cose.

image.png.131c15db9e4f08ba1feb8c2884895bfd.png

In pratica, alla fine dell'esecuzione (aggiornamento) dell'algoritmo di controllo, hai 3 valori di tensione di fase (risultato della trasformazione di Clarke inversa, a sua volta ricavate con la trasformazione di Park inversa, applicata alle tensioni Vd e Vq): Van,Vbn,Vcn.

Da questi bisogna ricavare 3 valori di duty-cycle. Il duty-cycle di ciascuna gamba dell'inverter (delta_a,delta_b,delta_c) deve realizzare una tensione di gamba Va0,Vb0,Vc0 (come media nel periodo). Le tre tensioni di gamba, che devono essere ovviamente comprese tra 0 e Vdc, sono Vx0 = delta_x*Vdc (x=a,b,c).

Uno dei motivi per fare un passaggio intermedio tra Vxn e delta_x è che le tre tensioni di fase (Vxn) non sono comprese tra 0 e Vdc, quindi non si possono semplicemente dividere per Vdc ed applicare come duty-cycle.

Tutte le varie tecniche corrispondono comunque ad aggiungere un certo valore (che può anche cambiare da un periodo di controllo ad un altro) a tutte e tre le tensioni di fase:

Vx0 = Vxn + V0

Siccome la somma delle tre tensioni di fase Vxn è nulla (sono una terna trifase bilanciata), anche la loro media sarà nulla, e la loro media corrisponde alla tensione tra il centro stella del motore ed il negativo del bus DC:

Vn0 = (Va0+Vb0+Vc0)/3 = [(Van+V0) + (Vbn+V0) + (Vcn+V0)] /3 = V0

Una volta ricavate delle Vx0 opportune (quindi, in generale, qualunque sia la scelta di V0), si assegnano i duty-cycle come

delta_x = Vx0/Vdc

 

Una scelta è quella di aggiungere V0 = Vdc/2 alle tre tensioni di fase:

Vx0 = Vxn + V0 = Vxn + Vdc/2

Se le tre tensioni di fase sono comprese tra -Vdc/2 e +Vdc/2, si è sicuri che le varie Vx0 saranno comprese tra 0 e Vdc e quindi delta_x saranno tra 0 e 1.

 

La space vector corrisponde alla scelta:

V0 = +Vdc/2 - (max{Vxn}+min{Vxn})/2

In questo modo, si fa sì che la gamba più alta e quella più bassa siano centrate a cavallo di Vdc/2. I valori di duty-cycle generati da questo algoritmo sono esattamente gli stessi che si hanno con la space vector. A quanto ne so, qualcuno deve averlo anche dimostrato formalmente, ma non sono mai riuscito a trovare questa dimostrazione.

Nonostante il grande successo della space vector, questo calcolo è secondo me di gran lunga più semplice e, su molti processori, credo sia anche più veloce da calcolare.

La probabilità di sbagliare nell'implementazione della space vector è molto alta.

Questo non toglie "bellezza" al concetto che sta dietro la space vector, anche perché questa si può applicare anche ad altri casi, come quello di inverter a più livelli.

 

Per ciascuna parte (blocco, sottosistema) che implementi, a meno che non sia banale o che tu non abbia molta esperienza, è buona regola (direi quasi indispensabile) verificare che questo si comporti come da "specifica", cioè come previsto.

Per la space vector, si possono generare due tensioni alpha-beta, arbitrarie (purché l'ampiezza del vettore sia minore di Vdc/sqrt(3).

Si danno in pasto queste tre tensioni alla space vector (o al corrispondente qui sopra, dopo averle trasformate con Clarke inversa), si dividono le tre uscite per Vdc e si applicano i risultati come duty-cycle.

Poi si calcola il valore medio nel periodo di switching, e lo si confronta con i valori di tensione iniziali.

Per calcolare la media nel periodo, puoi calcolare la differenza tra l'integrale e l'integrale ritardato di un periodo di switching, e dividerla per il periodo stesso.

 

PS: questa presentazione breve potrebbe aiutare, anche se magari è stringata...

 

Edited by Sandro Calligaro
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...