Implementarea Controlului Vectorial al Masinii Sincrone cu Magneti Permanenti

Introducere

Controlul inteligent al mișcării stă la baza creșterii productivității, a calității și eficienței energetice a liniilor de producție, reducând totodată costul mentenanței echipamentelor industriale.

Marea majoritate a aplicațiilor industriale care necesită controlul mișcării au la bază acționările electrice. Totodată o gamă largă de acționări electrice necesită turație variabilă. Pentru a satisface cerințele legate de performanța dinamică și eficiență energetică, o acționare electrică trebuie sa conțină mașini electrice performante, convertoare statice (convertizoare de frecvență) și un sistem de control digital cu microprocesor.

În această lucrare se prezintă o metodologie modulară de proiectare a unei strategii de control vectorial pentru o mașină sincronă cu magneți permanenți de suprafață.

Aceasta lucrare este structurată după cum urmează.

În Capitolul 2 este prezentată structura generală a unui sistem de acționare electrică. Sunt identificate caracteristicile mașinilor sincrone care o recomandă pentru un sistem de acționare electrică performant. Tot în acest capitol se descrie structura internă a unui convertizor de frecvență și se identifică principalele caracteristici ale unui procesor de semnal. Sunt descrise caracteristicile obligatorii care trebuie sa le aibă un procesor de semnal digital pentru a răspunde cerințelor de putere de calcul, memorie și de existență a unor module periferice specifice unui sistem de acționare electrică.

Capitolul 3 începe cu modelul matematic al mașinii sincrone cu magneți permanenți urmat de principiile de bază ale controlului vectorial cu orientare după câmp. În continuare se trece la descrierea implementării structurate și optimizate a strategiei de control.

În Capitolul 4 se descriu modalitățile de vizualizare a formelor de undă și se prezintă rezultatele încercărilor experimentale.

Capitolul 5 conține descrierea standului experimental iar în Capitolul 6 se discută concluziile finale.

Sistemul de acționare electrică

Un sistem de acționare electrică se compune din următoarele componente: mașina electrică (în regim de motor), convertorul static de putere si sistemul de control.

2.1 Mașina Electrică

În această lucrare ne vom îndrepta atenția, în principal, asupra mașinii sincrone cu magneți permanenți montați pe suprafața rotorului. Metodologia de proiectare a unui control vectorial este asemănătoare și pentru celelalte mașini sincrone, cât și pentru mașinile asincrone din punct de vedere al implementării software.

Mașina sincronă are în stator un miez magnetic cu crestături în care este plasată o înfășurare polifazată de curent alternativ iar în rotor pot exista înfășurări de curent continuu (bobinaj concentrat) sau magneți permanenți. În cazul rotorului bobinat accesul la înfășurarea rotorică se face printr-un sistem inel-perie. Rotorul poate fi și pasiv, fără înfășurări sau magneți, având anizotropie magnetică. La aceste tipuri de rotoare este de dorit ca raportul între inductivitatea longitudinală și cea transversală să fie cât mai mare [1]. Există și alte tipuri de mașini sincrone pe care însă nu le vom aminti în această lucrare.

Important la mașina sincronă este faptul că excitația rotorică produce un câmp magnetic fix față de rotor, care devine învârtitor odată cu rotația rotorului. În stator, câmpul magnetic produs de solenația polifazată alimentată în curent alternativ produce un câmp magnetic învârtitor, care trebuie sa fie în repaus față de cel rotoric. Așadar, pentru a produce cuplu, cele două câmpuri, rotoric și statoric trebuie sa fie sincronizate din punct de vedere al vitezei de rotație.

Principalele caracteristici ale mașinilor sincrone sunt:

posibilitatea de a furniza energie reactivă rețelei de alimentare sau instalației electrice din care face parte;

viteza de rotație constantă indiferent de sarcina mecanică;

motoarele sincrone pot fi construite cu întrefier mai mare decât cele de inducție ceea ce le face mai stabile din punct de vedere mecanic;

eficientă mai mare in zona turațiilor mici comparativ cu motoarele de inducție [2].

2.2 Convertorul Static

Conversia statică a energiei electrice se realizează prin intermediul echipamentelor cu electronică de putere. Energia electrică convertită trebuie sa difere de cea de la intrare cu cel puțin un parametru (tensiune, curent, frecvență, fază, număr de faze) astfel încât sa fie adaptată cerințelor sarcinii, in cazul nostru mașinii electrice.

Tipul de convertor static utilizat in sistemul de acționare electrică descris în această lucrare are la baza un invertor. Invertoarele realizează conversia energiei electrice din curent continuu în curent alternativ prin schimbarea după un anumit algoritm a stărilor de conducție a unor dispozitive electronice conectate ca in Figura 1, [3]:

Figura 1 – Structura unui invertor

În figura de mai sus cu T sunt notate tranzistoarele iar cu D diodele de fuga corespunzătoare. Tranzistoarele sunt de obicei de tip IGBT și comută la frecvențe de ordinul 10-20 kHz. Comanda tranzistoarelor invertorului este dată de un microprocesor și are ca scop obținerea unui sistem trifazat de tensiuni sinusoidale la ieșirile A, B, C.

Invertoarele sunt parte a variatoarelor (convertizoarelor) de frecvență sau de turație (in engleza: VSD – Variable Speed Drive) alături de un redresor și un filtru capacitiv sau capacitiv inductiv, Figura 2:

Figura 2 – Structura unui convertizor de frecvență

In general odată cu reducerea frecvenței, în scopul reducerii turației motorului sincron, se reduce și nivelul tensiunii de alimentare, în vederea menținerii constante a cuplului dezvoltat de motor. [4]

Redresorul are rolul de transforma curentul alternativ în curent continuu. Pentru netezirea tensiunii din circuitul intermediar se folosesc condensatoare electrice. În această lucrare sunt utilizate două convertizoare de frecvență Danfoss VLT 5000.

2.3 Procesorul de semnal

Procesoarele de semnal sunt microprocesoare specializate pentru prelucrarea în timp real a semnalelor analogice si digitale. Caracteristic procesoarelor de semnal este măsurarea, filtrarea, prelucrarea semnalelor analogice, caz în care procesoarele de semnal au nevoie de periferice precum convertoarele analog – digitale și digital – analogice. Algoritmii care stau la baza procesării semnalelor necesită un număr mare de operații care trebuie efectuate rapid, în mod repetat. Procesorul de semnal trebuie sa efectueze aceste operații într-un timp riguros stabilit. [5]

Un procesor de semnal dedicat pentru sistemele de acționare electrică trebuie să aibă următoarele caracteristici:

cel puțin 4 convertoare analog – digitale: 3 pentru măsurarea curentul pe cele trei faze și unul pentru măsurarea tensiunii din circuitul intermediar;

un modul PWM (Pulse Width Modulation) pentru invertoare trifazate: cele trei ieșiri trebuie sa fie sincronizate și sa aibă o frecvență de ieșire de 10 kHz. Rezoluția modulului PWM trebuie sa fie suficient de mare;

interfață pentru un traductor de poziție unghiulară incremental;

capacitatea de ”on-board programming”: folosirea unui emulator pentru programare, depanarea și încărcarea programului;

capacitate de calcul suficient de mare a unității centrale;

librarii cu funcții matematice dedicate.

O comparație între 8 plăci de dezvoltare cu procesor de semnal dedicate pentru sistemele de acționare electrică poate fi găsită în [6]

2. 3.1 Procesoarele de semnal în virgulă fixă și virgulă mobilă

Diferența majoră între procesoarele convenționale și procesoarele de semnal digital (Digital Signal Processor – DSP) constă în optimizarea construcției celor din urmă pentru operații aritmetice specifice unui domeniu de aplicații și pentru gestionarea transferului de date. De asemenea DSP-urile sunt optimizate pentru execuția rapidă a algoritmilor de procesare a semnalelor, fie ca este vorba despre semnale audio, video sau semnale numerice în general. În ceea ce privește gestionarea datelor, DSP-urile folosesc magistrale de date suplimentare pentru a permite procesarea rapidă a datelor interne și externe cu perifericele [7].

Un sistem DSP tipic este ilustrat în Figura 3:

Figura 3 – Structura de bază a unui sistem cu DSP

Unde:

LFT – Low Pass Filter – filtru trece jos care limitează frecvența maximă a semnalului de procesat, evitând apariția fenomenului așa numit ”aliasing”.

ADC – Analog to Digital Converter – convertorul analog-digital convertește semnalul analogic într-o valoare digitală

DAC – Digital to Analog Converter – convertorul digital-analogic

Deosebirea fundamentală între cele două tipuri de procesoare de semnal este felul în care numerele sunt reprezentate de către procesor. Astfel, procesoarele în virgulă flotantă au o unitate hardware dedicată care suportă operații cu numere reprezentate în virgulă flotantă.

Numerele in virgulă fixă au un număr fix de biți pentru fiecare parte a punctului binar. Astfel este limitat numărul de valori posibile și rezoluția pentru un anumit număr de reprezentat. Pe de alta parte reprezentarea în virgulă fixă permite cea mai rapidă aritmetică.

DSP-urile în virgulă fixă sunt de obicei mai ieftine decât cele în virgulă mobila deoarece conțin mai puțin siliciu și au mai putini pini.

Procesoarele in virgulă mobilă se pretează pentru aplicații unde coeficienții care multiplică semnalele variază în limite largi, adică semnalele prelucrate și coeficienții au o variație dinamică mare. La acest timp de aplicații raportul dintre cea mai mică si cea mai mare valoare a semnalului este foarte mare sau intervalul de variație a unor intrări nu este cunoscut în stadiul de proiectare a sistemului. Totodată, procesoarele de semnal în virgulă mobilă, se pretează pentru situațiile în care este nevoie de un ciclu de implementare a software mai rapid și contează mai puțin costul suplimentar al componentelor. Aritmetica în virgulă mobilă nu necesită identificarea completă a dinamicii semnalelor de prelucrat.

Procesarea audio de mare fidelitate si procesarea video necesită procesoare de semnal în virgulă mobilă. De exemplu în cazul procesării sunetelor coeficienții utilizați în cadrul calculelor intermediare au valori foarte mari și este nevoie de un grad ridicat de acuratețe.

Procesoarele în virgulă fixă realizează numai operații cu numere întregi în timp ce procesoarele în virgulă flotantă suportă toate numerele reale.

Compromisul în alegerea tipului de procesor de semnal se face între costul redus și viteza de calcul mai mare a procesoarelor în virgulă fixă față de efortul depus în proiectarea algoritmului de calcul, a datelor precum și a scalării coeficienților pentru a evita depășirea capacității acumulatorului [8].

Reprezentarea numerelor în virgulă fixă

Această reprezentare are la bază forma zecimală ordinară a numerelor. Fiecare poziție din cadrul numărului reprezentat îi corespunde o pondere, fapt pentru care se mai numește și notație pozițională.

Pentru a putea reprezenta numerele cu semn din biții disponibili, prin convenție, cel din stânga (cel mai semnificativ) este utilizat pentru semn: ”0” pentru semnul ”+” și ”1” pentru semnul ”-”.

Există trei reprezentări de bază ale numerelor binare în virgulă fixă:

reprezentarea semn-mărime

(1)

unde xd – valoare în zecimal a numărului binar x reprezentat prin alăturarea lui k unde k = 0:n-1, iar xk reprezintă bitul k al lui x.

complement de 1

(2)

unde , adică cifra binară se înlocuiește cu valoarea ei complementară.

complement de 2

(3)

unde .

Reprezentarea numerelor în virgulă flotantă

Numerele în virgulă mobilă sunt reprezentate într-o formă științifică. Notația științifică reprezintă o modalitate compactă de a reprezenta numerele foarte mari și foarte mici. Aritmetica în virgulă mobilă este însă mai complexă și poate dura mai mult, în sensul că o anumită operație poate necesita mai multe cicluri de ceas. Pentru a sprijinii portabilitatea software-ului Organizația IEEE a introdus in 1985 standardul IEEE 754 care definește trei formate: simplă precizie (32 biți), dublă precizie (64 biți) și precizie extinsă (80 de biți).

Pentru simplă precizie avem 1 bit de semn (S), 8 biți pentru exponent (E) și 23 biți pentru mantisă (M). Valoarea unui număr într-o astfel de reprezentare este:

(4)

unde 1 > M > ½.

2.3.2 Utilizarea procesoarelor de semnal pentru controlul mișcării

Înaintea introducerii sistemelor de control digitale, controlul motoarelor electrice se realiza cu sisteme de control analogice.

Principalele dezavantaje ale sistemelor analogice sunt:

îmbătrânirea componentelor – modificare parametrilor

variația cu temperatura a parametrilor componentelor determinând ajustarea continua a sistemului analogic

adăugarea altor componente scade robustețea controlului

apar probleme legate de toleranța parametrilor componentelor

dificultatea realizării unui modernizări (actualizări) pentru o anumită componentă.

Sistemele digitale de control elimină toate aceste dezavantaje deoarece marea majoritate a funcțiilor îndeplinite de componentele analogice sunt realizate digital, modernizarea sistemului digital este mai ușor de realizat presupunând în cele mai multe cazuri schimbarea software-ului. [8]

După cum s-a discutat mai sus componentele unui sistem de acționare electrică performant sunt:

motorul electric

convertorul static de putere

sistemul digital de control

Cel puțin pentru aplicațiile unde cerințele legate de performanța dinamică a acționării electrice nu sunt foarte ridicate, se preferă utilizarea procesoarelor de semnal în virgulă fixă ca parte a sistemului de control din două motive, unul economic și unul tehnic:

costul scăzut al acestui tip de DSP față de DSP cu virgulă flotantă;

pentru marea majoritate a aplicațiilor gama dinamică oferită de DSP-urile pe 16 biți este suficientă.

Intrările pentru sistemul de control sunt:

valorile de referință (poziție, viteză, cuplu);

valorile analogice ale procesului (motorului electric) care sunt măsurate cu senzori și convertite în digital de către convertoare analog-digitale. De obicei se măsoară curenții pe cele trei faze și tensiunea din circuitul intermediar al convertorului static de putere. Se poate măsura de asemenea și poziția si viteza unghiulară a arborelui motorului [9].

In cazul sistemului de acționare electrică prezentat în această lucrare între convertorul static de putere și procesorul de semnal se intercalează o placă de interfațare care are rolul de a separa galvanic cele două componente, de a ajusta nivelul de tensiune dintre senzori și perifericele procesorului de semnal (convertorul analog-digital de exemplu).

Implementarea controlului vectorial al mașinii sincrone

cu magneți permanenți de suprafață

În acest capitol se prezintă structura de bază a controlului vectorial al mașinii sincrone cu magneți permanenți, precum și implementarea controlului în limbajul C++. Codul a fost rulat pe procesorul de semnal produs de Texas Instruments TMS320F28335.

3.1 Mașina sincronă cu magneți permanenți de suprafață

Clasificarea acționărilor electrice cu mașini sincrone cu magneți permanenți se poate face din mai multe puncte de vedere. Din punct de vedere al formei de undă a curentului pe fază distingem acționări electrice cu curenți rectangulari (așa numitele mașini de curent continuu fără perii) și acționări electrice cu curenți sinusoidali (cunoscute în literatură sub denumirea de brushless ac motors). Indiferent daca curenții statorici sunt sinusoidali sau rectangulari, ei trebuie sa fie sincronizați cu poziția rotorului.

Din punct de vedere al prezenței senzorului de poziție distingem: acționări electrice cu și fără senzor de poziție. In această lucrare vom prezenta controlul vectorial al mașinii sincrone cu magneți permanenți de suprafață cu senzor de poziție.

Secțiunea transversală a unei mașini sincrone cu magneți permanenți este ilustrată în Figura 4.

Figura 4 – Secțiune transversală motor sincron cu magneți permanenți de suprafață

Înainte sa prezentăm structura unui astfel de control trebuie cunoscut modelul matematic al mașinii sincrone.

Modelul matematic în coordonate sincrone este alcătuit din următoarele ecuații, [10]:

(5)

(6)

(7)

unde:

– Vds și Vqs reprezintă tensiunile de fază în coordonate rotorice;

– ids și iqs reprezintă curenții de fază în coordonate rotorice;

– λds și λqs reprezintă fluxurile statorice în coordonate rotorice;

– Rs, Ls (=Ld=Lq) – reprezintă rezistența, respectiv inductanța statorică;

– ΨPM – fluxul magnetului permanent;

– ωr – viteza unghiulară a rotorului.

În plus se mai adaugă și ecuația mecanică:

(8)

unde:

Te și TL reprezintă cuplul la arborele rotorului, respectiv cuplul de încărcare

J și p – reprezintă momentul de inerție al rotorului, respectiv numărul de perechi de poli

Cuplul electromagnetic este dat de relația:

(9)

Pe baza modelului matematic se poate realiza un model care sa simuleze mașina sincronă. Implementarea în Simulink este ilustrată în Figura 5, [11]

Figura 5 – Modelul Simulink

Parametrii mașini sincrone cu magneți de suprafață utilizată în această lucrare pentru partea experimentală sunt prezentați în Tabelul I:

TABELUL I – Parametrii mașinii sincrone cu magneți permanenți

3.2 Controlul vectorial cu orientare după câmp

Principalul scop al controlului cu orientare după câmp (controlul vectorial) este acela de a controla separat fluxul de excitație de fluxul care ”produce” cuplul electromagnetic.

Prin această decuplare a controlului magnetizării mașinii de controlul cuplului dezvoltat de aceasta se obțin nu numai performanțe dinamice ridicate dar și o eficientă energetică mărită. Există strategii de control are urmăresc obținerea cuplului maxim pentru un anumit curent absorbit (în engleză MTPA – maximum torque per ampere).

Decuplarea se realizează prin operații matematice care transformă un sistem de trei mărimi de fază variabile în timp și dependente de viteza de rotație într-un sistem cu două mărimi care nu depind nici de timp, nici de viteza de rotație.

La mașinile sincrone cu magneți permanenți avem o singură sursă de putere care poate fi controlată și anume convertorul static care alimentează statorul mașinii.

Se poate discuta despre cele două componente ale curentului statoric:

componenta de magnetizare – id;

componenta de cuplu – iq.

Pentru a obține aceste componente sunt necesare operații matematice care trebuie executate rapid, de obicei in 0.1 ms. Pe lângă aceste transformări matematice există un număr mare de alte operații care trebuie efectuare corespunzătoare strategiei de control adoptate. Această cerință de procesare într-un timp foarte scurt, sub 100 microsecunde, este îndeplinită de puterea de calcul a procesoarele de semnal.

Un algoritm de control rapid asigura performanțe dinamice sporite sistemului de acționare electrică.

Astfel, fazorul spațial al curentului statoric se definește astfel, Figura 6:

unde (10)

Figura 6 – Fazorul spațial al curentului statoric și componentele lui [13]

Pentru a transforma acest sistem trifazat sinusoidal (depinde de timp și viteză) într-un sistem format din două componente care nu depind de timp si viteză sunt necesari doi pași:

transformarea sistemului trifazat intr-un sistem bifazat cu două componente sinusoidale ortogonale – transformata Clarke, Figura 7.

transformarea sistemului bifazat sinusoidal întru sistem cu doua componente constante în timp – transformata Park, Figura 8.

Cele două componente rezultate în urma transformatei Park se obțin din relațiile:

(11)

Sistemul bifazat ortogonal obținut mai sus este transformat întru-un sistem de două componente constante în timp cu ajutorul relațiilor:

(12)

Aceste două tipuri de transformări stau la baza controlului vectorial la mașinilor electrice.

Figura 7 – Fazorul spațial al curentului statoric is si componentele sale ortogonale iα și iβ

Figura 8 – Componentele fazorului statoric într-un sistem de referință învârtitor

Sarcina procesorului în implementarea acestei strategii cuprinde următoarele etape:

calculul celor două transformări (transformarea sistemului trifazat de tensiuni sinusoidale în sistemul cu două componente continue) și a transformărilor inverse;

compararea rezultatele obținute în urma transformărilor cu un set de valori prescrise;

actualizarea ieșirilor regulatoarelor de tip PI (Proporțional Integrator);

generarea factorilor de umplere pentru tranzistoarele convertorului static.

Schema de baza a unui control cu orientare după câmp pentru mașinile sincrone cu magneți permanenți este ilustrată în Figura 9.

Figura 9 – Structura de bază a unui control cu orientare după câmp

3.3 Implementarea strategiei de control

În această lucrare se prezintă o metodologie modulară de implementare a unui control vectorial simplu, de bază, care utilizează informația de poziție obținută de la un traductor de poziție. Strategii de control vectorial pentru mașini sincrone care nu utilizează informația de la un traductor de poziție implementate de autorul acestei lucrări pot fi găsite în [14] și [15].

Deoarece procesoarele în virgulă fixă sunt încă destul de utilizate în sistemele de control al mișcării, datorită costului redus al acestora și al performanțelor dinamice satisfăcătoare, vom prezenta în această lucrare atât o strategie de implementare în virgulă fixă, bazată pe librăria IQmath dezvoltată de Texas Instruments, cât și o strategie de implementare în virgulă mobilă.

Librăria IQmath este o colecție de funcții matematice utilizate pentru transformarea algoritmilor în virgulă mobilă în algoritmi în virgulă fixă. Această librărie folosește așa numitul ”Format Q” pentru a emula partea fracționară.

3.3.1 Reprezentarea in Format Q

Acest tip de reprezentare este utilizat în aplicații unde se poate face un compromis între valoarea maximă care poate fi reprezentată pentru partea întreagă și rezoluția părții fracționare.

Acest tip de reprezentare este o reprezentare în virgulă fixă. Numerele sunt stocate și sunt procesate ca numere întregi cu semn, putându-se folosi astfel o unitate aritmetică logică standard (care operează cu numere întregi) pentru calcule cu numere fracționare.

Așadar formatul Q este un mod de a reprezenta numerele în virgulă fixă și conține următoarele câmpuri:

semn – 1 bit pentru semn;

partea întreagă – m biți pentru partea întreagă;

partea fracționară – n biți pentru partea fracționară.

În Figura 10, se ilustrează o reprezentare Q15 pentru un registru de 32 biți.

Figura 10 – Reprezentare unei valori numerice în Q15

Poziția punctului binar pentru această reprezentare este între bitul 15 și bitul 16.

Poziția punctului binar poate fi schimbată. Librăria IQmath permite utilizatorului să aleagă locația acestui punct. Este important ca poziția punctului binar sa fie urmărită deoarece există operații precum înmulțirea care modifică această poziție.

De exemplu înmulțirea a două numere în formatul Q15 produce un rezultat în formatul Q30. Este necesară o conversie înapoi in Q15 pentru o reprezentare corectă a rezultatului.

Pentru implementarea software descrisă în această lucrare s-a ales Q21 ca format Q global.

În tabelul următor sunt prezentate rezoluția părții fracționare, valorile minime si maxime care pot fi reprezentate pentru un anumit format Q al unui număr pe 32 de biți.

TABEL II – Intervalul de valori și precizia reprezentării

3.3.2 Implementarea structurată și optimizarea codului

Dată fiind complexitatea controlului vectorial, a cărui structură de baza este ilustrată în Figura 8, întregul cod va fi împărțit în mai multe module software, fiecărui modul corespunzându-i un tip de dată struct localizat într-un fișier tip heder.

În cadrul acestei structuri putem găsi trei tipuri de membri:

variabile de interfațare: intrările și ieșirile din modul;

variabile intermediare necesare calculelor;

variabile constante.

Pe lângă date, fiecare modul are asociat și funcție pentru calcularea ieșirilor. Exista trei abordări:

fie calculele fac parte dintr-o funcție, caz în care funcția este atașată modulului software prin introducerea în structură a unui pointer la funcție.

Dacă considerăm cazul transformatei Clarke, fișierul antet „clarke.h” trebuie sa conțină următorul cod [16]:

#ifndef __CLARKE_H__

#define __CLARKE_H__

typedef struct {

_iq As; // Intrare: curentul pe faza a

_iq Bs; // Intrare: curentul pe faza b _iq Alpha; // Ieșire: componenta α a fazorului statoric

_iq Beta; // Ieșire: componenta β a fazorului statoric

void (*calc)(); // Pointer la funcția de calcul

} CLARKE;

// declararea tipului CLARKE_handle

typedef CLARKE *CLARKE_handle;

// creează o macro-definiție pentru inițializarea structurii

#define CLARKE_DEFAULTS { 0, \

0, \

0, \

0, \

(void (*)(Uint32))clarke_calc }

void clarke_calc(CLARKE_handle);

#endif // __CLARKE_H__

Funcția care realizează calculele necesare transformatei Clarke este introdusa într-un fișier sursă, „clarke.c”, care include:

#include "clarke.h"

void clarke_calc(CLARKE *v) {

v->Alpha = v->As;

v->Beta = _IQmpy((v->As + _IQmpy(_IQ(2),v->Bs)) ,_IQ(0.57735026918963));

// 1/sqrt(3) = 0.57735026918963

}

se folosesc funcții inline

Utilizarea funcțiilor inline reprezintă o tehnică pentru a mări performanța codului, prin introducerea corpului funcției în cadrul programului de către compilator. Ea se pretează în cadrul acestor module software deoarece conținutul funcțiilor este mic și trebuie executat de foarte multe ori pe secundă. Atunci când se utilizează funcții inline compilatorul poate optimiza această funcție in concordanță cu zona de cod unde se face apelul.

inline void clarke_calc(CLARKE *v) {

v->Alpha = v->As;

v->Beta = _IQmpy((v->As + _IQmpy(_IQ(2),v->Bs)) ,_IQ(0.57735026918963));

}

fie calculele se fac într-o macro-definiție cu parametri, atât structura cât și macro-definiția sunt inserate în fișierul antet ”clarke.h”:

#ifndef __CLARKE_H__

#define __CLARKE_H__

typedef struct {

_iq As; // Intrare: curentul pe faza a

_iq Bs; // Intrare: curentul pe faza b _iq Alpha; // Ieșire: componenta α a fazorului statoric

_iq Beta; // Ieșire: componenta β a fazorului statoric

} CLARKE;

typedef CLARKE *CLARKE_handle;

// creează o macro-definiție pentru inițializarea structurii

#define CLARKE_DEFAULTS { 0, \

0, \

0, \

0, \

}

//macro-definiție pentru transformata clarke

#define CLARKE_MACRO(v) \

\

v.Alpha = v.As; \

v.Beta = _IQmpy((v.As +( v.Bs<<1 )),_IQ(0.57735026918963));

// 1/sqrt(3) = 0.57735026918963

#endif // __CLARKE_H__

Compilatorul oferă mai multe opțiuni de optimizare a codului.

În tabelul următor se poate observa reducerea numărului de cicluri de execuție și a dimensiunii codului pe măsură ce se aplică diferite nivele de optimizare.

TABELUL III – Optimizarea dimensiunii codului și a numărului de cicluri de execuție

pentru un regulator de tip PID

Trebuie să avem grijă însa atunci când utilizăm funcțiile inline deoarece reducerea ciclurilor de execuție nu este mereu concomitentă cu reducerea dimensiunii codului.

În cazul funcțiilor inline, expandarea codului se realizează pentru fiecare apel. Strategia de control implementată în această lucrare conține trei regulatoare de tip PI. Componenta derivativă nu este utilizată deoarece amplifică zgomotul introdus de senzorii de curent și cel de poziție. Este însă de real interes măsurarea celor două metrici amintite mai sus atunci când se folosesc funcții inline pentru implementarea regulatorului de tip PID.

În tabelul IV sunt ilustrate dimensiunea codului și ciclurile de execuție pentru trei invocări ale regulatorul. Reprezentarea grafică a acestor două metrici este ilustrată în Figura 11 și Figura 12.

TABELUL IV – Dimensiunea codului și ciclurile de execuție [16]

Figura 11- Reducerea numărului de cicluri de execuție pentru trei invocări, [16]

Figura 12 – Reducerea dimensiunii codului pentru trei invocări [16]

3.3.3 Implementarea controlului vectorial pentru mașina sincronă cu magneți permanenți de suprafață

După cum s-a discutat și în secțiunea 3.2 structura de bază a unui control vectorial cu senzor de poziție pentru mașina sincronă cu magneți permanenți de suprafață este ilustrat în Figura 13, [13]:

Figura 13 – Diagrama bloc a controlului cu senzor de poziție a mașinii sincrone cu magneți permanenți

Întregul algoritm de calcul (care se găsește in Anexa 1) este procesat în mod periodic pentru fiecare întrerupere primită de la modului ePWM. Calculele de actualizare a vectorului de tensiune aplicat pe invertor se fac în rutina de tratare a întreruperii de la modului ePWM. Acest lucru se ilustrează grafic în Figura 14:

Programul principal cuprinde următoare structura:

includerea tuturor fișierelor header

– caracteristice plăcii de dezvoltare: #include "DSP2833x_Device.h"

– a perifericelor acesteia: #include "PeripheralHeaderIncludes.h"

– tuturor modulelor software componente ale structurii de control:

Figura 14 – Diagrama simplificată a implementării

#include "clarke.h" //transformata clacke

#include "park.h" //transformata park

#include "ipark.h" //transformata park inversă

#include "svm.h" //modulare lățime de puls vectorială

#include "f2833xqep.h" //calculator poziție unghiulară

#include "speed_fr.h" //calculator viteză unghiulară

#include "aquisition.h" //măsurare tensiune circuit intermediar

#include "pid_reg3.h" //regulator PID

#include "aga_PT1.h" //filtru trece jos

Conținutul acestor fișierelor care implementează modularea în lățime de puls se găsește în Anexa 2.

Inițializarea structurilor modulelor software:

CLARKE clarke1 = CLARKE_DEFAULTS;

PARK park1 = PARK_DEFAULTS;

IPARK ipark1 = IPARK_DEFAULTS;

PWMGEN pwm1 = PWMGEN_DEFAULTS;

SVM spv= SVM_DEFAULTS;

QEP qep1 = QEP_DEFAULTS;

SPEED_MEAS_QEP speed1 = SPEED_MEAS_QEP_DEFAULTS;

I_DC_BUS_MEAS adc= I_DC_BUS_MEAS_DEFAULTS;

PIDREG3 pidd = PIDREG3_DEFAULTS;

PIDREG3 pidq = PIDREG3_DEFAULTS;

PIDREG3 pidw = PIDREG3_DEFAULTS;

AGA_PT1 pt1q = AGA_PT1_DEFAULTS;

Implementarea funcției principale main()

Funcția principală trebuie să conțină următoarele inițializări:

Inițializarea modulelor hardware

inițializarea registrilor sistemului (watchdog, PLL, peripheral clocks)

resetarea întreruperilor CPU, inițializarea tabelei vectorilor de întreruperi

inițializarea registrilor de control al PIE (Peripheral Interrupt Expansion) – PIE este un controller care arbitrează cererile de întreruperi de la diferite surse cum ar fi perifericele sau pinii exteriori.

inițializarea registrilor de control ai multiplexorului GPIO

asignarea adresei subrutinei de tratare a întreruperii în tabela vectorilor de întreruperi

activarea întreruperii modulului de PWM, si flagului general pentru întreruperi

Inițializare modulelor software

Inițializarea modulului PWM

pwm1.PeriodMax = 7500; // PWM frequency = 10 kHz, clock = //150 MHz

PWM_INIT_MACRO(pwm1);

inițializarea convertorului analog digital

inițializarea modulului de calcul a poziției unghiulare

qep1.LineEncoder = 5000; //numar linii encoder

qep1.MechScaler = _IQ30(0.25/qep1.LineEncoder);

qep1.PolePairs = polep/2;

qep1.CalibratedAngle = 0;

QEP_INIT_MACRO(qep1);

inițializarea modulului de calcul a vitezei unghiulare. Modulul de calcul al vitezei cuprinde și un filtru trece jos pentru eliminarea zgomotului. Viteza unghiulară se poate calcula ușor pe baza informației de poziție unghiulară astfel:

(13)

(14)

unde fb = 50 și T=0.0001 sunt frecvența de bază și respectiv perioada de eșantionare.

Plecând de la funcția de transfer a filtrului trece jos:

(15)

cu fc – frecvența de tăiere,

și discretizând cu metoda trapezului retardată (s = (z-1)/Tz): obținem:

(16)

(17)

astfel inițializarea modului de calcul al vitezei unghiulare se face după cum urmează

speed1.K1 = _IQ21(1/(BASE_FREQ*T));

speed1.K2 = _IQ(1/(1+T*2*PI*25)); // Low-pass cut-off //frequency

speed1.K3 = _IQ(1)-speed1.K2;

speed1.BaseRpm = 120*(BASE_FREQ/polep);

inițializarea regulatoarelor de curent

Diagrama unui regulator de tip PID – proporțional Integrator Derivativ este ilustrată în Figura 15:

Figura 15 – Diagrama bloc a unui regulator de tip PID cu anti-windup

În figura de mai sus Ref reprezintă mărimea de referință, prescrisă, iar Fbd reprezintă mărimea măsurată (feedback-ul).

Astfel plecând de la funcțiile de transfer ale fiecărei componente a regulatorului și aplicând metoda de discretizare a dreptunghiului retardată obținem următoarele relații:

(18)

(19)

(20)

notând cu Ku = T / Ti, și Gd = TD / T, avem un set de patru constante: Kp, Ki, Kd și Kc care trebuie inițializate. Deoarece componenta derivativă nu v-a fi utilizată vom inițializa numai trei constante:

// inițializarea regulatorului de curent axa d

pidd.Kp=_IQ(300);

pidd.Ki=_IQ(5);

pidd.Kc=_IQ(1);

pidd.OutMax=_IQ(550);

pidd.OutMin=_IQ(-550);

Inițializarea regulatorului pentru curentul de pe axa q este identică, adică constantele sunt aceleași deoarece inductanțele mașinii după cele două axe sunt egale.

inițializarea regulatorului de viteză:

// Inițializarea regulatorului de viteză

pidw.Kp=_IQ(0.13);

pidw.Ki=_IQ(0.0001);

pidw.Kc=_IQ(0.01);

pidw.OutMax=_IQ(5);

pidw.OutMin=_IQ(-5);

Bucla infinită de așteptare poate fi implementată astfel:

for(;;)

{

if(on == 1)

{

GpioDataRegs.GPADAT.bit.GPIO6 = 1;

EINT; //Enable Global Interupt

}

else

{ GpioDataRegs.GPADAT.bit.GPIO6 = 0;

DINT;

}

}

// „on” este o variabilă fanion care activează convertizorul de

// frecvență prin pinul controlat de bitul GPIO6

Rutina de tratare a întreruperii.

Acasă rutină, asociată cu întreruperea generată de modulul ePWM, conține algoritmul de calcul al strategiei de control desfășurat în următoarele etape:

calculul poziției unghiulare:

QEP_MACRO(qep1);

th_el=_IQmpy(_IQ24toIQ(qep1.ElecTheta),_IQ(twopi));

calculul vitezei unghiulare

speed1.ElecTheta = _IQ24toIQ((int32)qep1.ElecTheta);

SPEED_FR_MACRO(speed1);

citirea curenților de statorici de fază:

adc.read(&adc);

calculul fazorului spațial statoric în coordonate statorice:

clarke1.As=_IQ19toIQ(adc.IU);

clarke1.Bs=_IQ19toIQ(adc.IV);

CLARKE_MACRO(clarke1);

calculul fazorului spațial statoric în coordonate rotorice:

park1.Alpha=clarke1.Alpha;

park1.Beta=clarke1.Beta;

park1.Angle=th_el;

PARK_MACRO(park1);

calculul curentului iq prescris, necesar stabilirii regimului staționar de turație prescris:

pidw.Ref=_IQ(wref);

pidw.Fdb=_IQmpy(speed1.Speed,_IQ(25));

PID_MACRO(pidw);

calculul tensiunii Uq

pidq.Ref=pt1q.out;

pidq.Fdb=park1.Qs;

PID_MACRO(pidq);

calculul tensiunii Ud

pidd.Ref=_IQ(0);

pidd.Fdb=park1.Ds;

PID_MACRO(pidd);

calculul componentelor tensiunii statorice în coordonate statorice α și β:

ipark1.Ds=pidd.Out;

ipark1.Qs=pidq.Out;

ipark1.Angle=th_el;

IPARK_MACRO(ipark1);

calculul factorilor de umplere pentru tranzistoarele invertorului de tensiune

spv.Valfa=ipark1.Alpha;

spv.Vbeta=ipark1.Beta;

spv.Dc_link=_IQ(560);

spv.calc(&spv);

Rezultate experimentale

4.1 Obținerea formelor de undă

Pentru a putea vizualiza formele de undă se poate utiliza modului DATALOG oferit de Texas Instruments. Cu ajutorul acestui modul software se poate realiza un osciloscop virtual cu patru canale în cadrul mediului Code Composer Studio (CCS).

Acest modul permite stocarea valorilor (format Q15) pe 16 biți în memoria RAM și vizualizarea lor în ferestrele Graph Windows. Acest modul este foarte util in procesul de depanare a programului și chiar în stadiul de implementare a strategiei de control de o manieră incrementală, modul cu modul.

Utilizarea acestui modul presupune următoarele etape:

Instanțierea:

DLOG_4CH dlog_aga;

Inițializarea:

DLOG_4CH dlog1 = DLOG_4CH_DEFAULTS;

Invocarea funcțiilor de calculul:

dlog1.init(&dlog1);

dlog1.update(&dlog1);

asignarea variabilelor de vizualizat și parametrizarea modulului în funcția main():

main()

{

dlog1.iptr1 = &Q15_var1;

dlog1.iptr2 = &Q15_var2;

dlog1.iptr3 = &Q15_var3;

dlog1.iptr4 = &Q15_var4;

dlog1.trig_value = 0x0;

dlog1.size = 0x400;

dlog1.prescalar = 1;

dlog1.init(dlog1);

}

apelarea funcției de actualizare (dlog1.update()) se face în rutina de tratare a întreruperii unde se actualizează toate calculele algoritmului:

void MainISR() {

//…

dlog1.update(&dlog1);

}

Valoarea maxima a buffer-ului este de 32767. Rata de eșantionare se alege de obicei aceeași cu frecvența întreruperii de la modului PWM, adică 10 kHz.

Pentru vizualizarea pe un osciloscop real se utilizează cel de-al doilea modul ePWM pe post de convertor digital analogic cu performanțe modeste dar suficiente pentru necesitatea noastră de a vizualiza intervale de timp.

Semnalul de tip PWM este un semnal dreptunghiular cu factor de umplere variabil având amplitudinea e 3.3V. Un astfel de semnal poate fi descompus în două componente: o componentă continuă și o componentă alternativă (variație dreptunghiulară), ca in Figura 16 [16].

Figura 16 – descompunerea semnalului modulat în lățime de puls

Mărimea de interes o reprezintă componenta continuă. Astfel, pentru a minimiza componenta alternativă trebuie sa folosim un filtru trece jos, Figura 17:

Figura 17 – Filtrarea semnalului modulat în lățime de puls

Pentru a realiza această filtrare se folosește un filtru pasiv RC, Figura 18, [17].

Figura 18 – Circuitul exterior RC conectat la pinii PMW5A și PMW5B

Dimensionarea filtrului se face în funcție de frecvența de tăiere dorită și ținând cont de următoarea relație:

(21)

Valori practice pe R și C sunt: R = 1.8 kΩ și C = 100 nF. Frecvența de tăiere rezulta în jurul valorii de 884 Hz.

Astfel se utilizează modulul PWMDAC care permite vizualizarea variabilelor în format Q15 ca semnale modulate în lățime de puls la pinii PWM5A și PWM6A.

4.2 Rezultatele încercărilor experimentale:

Încercările experimentale presupun testarea regimului nominal al mașinii sincrone, adică controlul trebuie să poată să aducă mașina la turația nominală în condiții de încărcare nominală.

Astfel, prima încercare este aceea de a atinge turația nominală de 1500 rpm și de a suporta încărcarea nominala de 2.5 Nm.

În Figura 19 este reprezentată viteza unghiulara a rotorului pentru o accelerare la turația nominală și o încărcare la cuplul nominal. În Figura 20 se observă variația cuplului pentru încercarea descrisă anterior.

Figura 19 – Variația viteza unghiulare pentru regimul de accelerare în gol

și încărcare la turația nominală

Figura 20 – Variația cuplului pentru regimul de accelerare în gol

și încărcare la turația nominală

În Figura 21 și Figura 22 se observă variația curentului id, respectiv a curentului iq pentru o încercare de accelerare și încărcare la viteza și turația nominală.

Figura 21 – Variația curentului id pentru regimul de accelerare în gol

și încărcare la turația nominală

Figura 22 – Variația curentului iq pentru regimul de accelerare în gol

și încărcare la turația nominală

Un alt scenariu de testare a strategiei de control constă în decelerarea până la atingerea turației nominale pentru sensul opus de rotație și încărcarea în regim nominal.

În Figura 23 și în Figura 24 se observă forma de variație a vitezei unghiulare și respective a cuplului. Variația curentului id și respective iq sunt ilustrate în Figura 25 și respective 26.

Figura 23 – Variația viteza unghiulare pentru regimul de decelerare în gol

și încărcare la turația nominală

Figura 24 – Variația cuplului pentru regimul de decelerare în gol

urmată de încărcare la turația nominală

Figura 25 – Variația curentului id pentru regimul de decelerare în gol

urmat de încărcare la turația nominală

Figura 26 – Variația curentului id pentru regimul de decelerare în gol

urmat de încărcare la turația nominală

Standul Experimental

Standul experimental este compus din:

două mașini electrice: mașina sincronă al cărui control a fost implementat în această lucrare și o mașină de inducție cu rolul de sarcină

două convertizoare de frecvență Danfoss FC 302

o placă de interfațare pentru procesorul de semnal

o placă de interfațare pentru convertizoarele de frecvență Danfoss

cutia cu senzori de curent

procesorul de semnal Ezdsp TMS320F28335

Cele două mașini electrice sunt ilustrate în Figura 27. Mașinile sunt aproximativ de aceeași putere, aproximativ 400 W, turații nominale apropiate (mașina sincronă 1500 rpm, iar mașina de inducție 1350 rpm) și sunt conectate mecanic între ele și cu un senzor de poziție incremental care furnizează la pe fiecare din cele două canale A și B, 5000 de pulsuri pe revoluție.

Figura 27 – Ansamblul motor – generator – senzor de poziție

Convertizorul de putere Danfoss VLT 5000, Figura 28, are o putere de 2.7kVA, se alimentează de la rețeaua trifazată de tensiune 3x380V.

La convertizorul legat la mașina sincronă s-a înlocuit panoul cu butoane cu o placă de interfațare. Una dintre funcționalitățile acestei plăci este aceea de a asigura separarea galvanică a semnalelor venite de la procesorul de semnal.

Figura 28 – Convertizoarele de frecvență Danfoss VLT 5000 și placa de interfațare

In Figura 29 este ilustrată placa de interfațare cu procesorul de semnal care realizează următoarele funcționalități:

scalarea semnalelor analogice primite de la senzorii de curent pentru a putea fi adaptate la nivelul de tensiune acceptat de modul ADC, adică de la +/- 10 V la 0-3V.

conversia semnalelor electrice in semnale optice pentru separarea galvanică

Figura 29 – placa de interfațare a procesorului de semnal

In Figura 30 se observă placa de dezvoltare cu procesor de semnal TMS320F28335. Prin intermediul grupului de pini P8 și P9 se face conectarea la placa de interfațare din Figura 29.

Figura 30 – Placa de dezolare TMS320F28335

Concluzii

Odată cu apariția microcontrolerelor, a procesoarelor de semnal, precum și a tehnicilor avansate de control a motoarelor electrice performanțele dinamice ale acestora s-au îmbunătățit considerabil în condiții de eficacitate energetică tot mai mare.

Prin performanțe dinamice îmbunătățite înțelegem:

accelerări și reversări mai rapide,

controlul în viteză și în poziție mai precis,

cuplu electromagnetic produs este mai mare,

Aceste îmbunătățiri nu ar fi posibile fără strategiile de control avansate și puterea de calcul pe care o oferă microprocesoarele din ziua de azi. Înainte de a descrie strategia de control din această lucrare se prezintă caracteristicile de baza care trebuie să le aibă un procesor de semnal ca parte a unui sistem de acționare electrică și se argumentează alegerea implementării în virgulă fixă fată de implementarea în virgulă mobilă.

Tipul de semnal prelucrat este alături de costul de achiziție un factor de decizie atunci când se alege între un DSP în virgulă fixă și unul în virgulă mobilă.

Această lucrare prezintă o metodologie modulară de proiectare a unui control vectorial pentru mașina sincrona cu magneți permanenți. Se utilizează diagrama bloc pentru a vizualiza componentele strategiei de control și pentru a identifica mai ușor care este ordinea de prelucrare a semnalelor de intrare. Pentru fiecare bloc în parte se dezvoltă și parametrizează un modul software care implementează funcționalitatea blocului respectiv. Marea majoritate e acestor module software pot fi reutilizate în cadrul unei alte strategii de control. Fiecare modul software reprezintă o unitate de cod care deservește o funcționalitate specifică și are o interfață bine definită pentru a schimba date cu alte module.

La finalul acestei lucrări sunt prezentate rezultate experimentale care confirmă performanțele dinamice ale sistemului de acționare electrică cu procesor de semnal.

Bibliografie

[1] Boldea, Ion – Transformatoare și Mașini Electrice, Editura Politehnica, Timișoara 2010.

[2] Boldea Ion, Tutelea Lucian – Electric Machines Steady State, Transients and Design with Matlab, CRC Press Taylor and Francis Group, Boca Raton Florida, 2010.

[3] Munteanu Nicolae – Convertoare Statice, Editura Politehnica, Timișoara, 1998.

[4] Ovidiu Neamțu – Convertoare Electronice de putere pentru alimentarea motoarelor de curent alternativ, Editura Universității din Oradea, 2002.

[5] Vlăduțiu Mircea – Arhitectura si Organizarea Calculatoarelor, Editura Politehnica, Timișoara 2011.

[6] Qian Cheng, Lei Yuan – Vector Control of an Induction Motor based on a DSP, Department of Energy and Environement Division of Electric Power Engineering, CHALMERS UNIVERSITY OF TECHNOLOGY, Goteborg, Sweden 2011.

[7] Arnon Friedmann – TI’s new TMS320C66x fixed and floating-point DSP core conquers the ‘Need for Speed’, White Paper, Texas Instruments 2010.

[8] Mircea Vlăduțiu – Computer Arithmetic, Algorithms and Hardware Implementations, Springer, 2012.

[9] Stefan Beierke – Digital Signal Processing Solutions for Motor Control, Texas Instruments.

[10] De Doncker, Rik, Pulle, Duco W.J., Veltman, André, – Advanced Electric Drives, Analysis, Modeling, Control, Editura Springer, 2011.

[11] Boldea Ion, S.A. Nasar – Electric Drives, Second Edition, CRC Press, 2005.

[12] Lucian Prodan, Mihai Udrescu – Arhitectura Calculatoarelor – Indrumător de laborator, web: http://www.acsa.upt.ro/teaching/lab_tutorials.htm .

[13] Bilal Akin, Manish Bhardwaj – Sensored Filed Oriented Control of 3-Phase Permanent Magnet Synchronous Motors, Application Note, Texas Instruments.

[14] S. C. Agarlita, I. Boldea, F. Blaabjerg – High-Frequency-Injection-Assisted “Active-Flux”-Based Sensorless Vector Control of Reluctance Synchronous Motors, With Experiments From Zero Speed, Industry Application, IEEE Transactions on, 2012, Volume 48, Issue 6, pp. 1931-1939.

[15] S. C. Agarlita, C. E. Coman, G.D. Andreescu, I. Boldea, – Stable V/f control system with controlled power factor angle for permanent magnet synchronous motor drives, IET Electric Power Application, 2013, Volume 7, Issue 4, pp. 278-286

[16] Texas Instruments – Optimizing Digital Motor Control (DMC) Libraries, Application Report, SPRAAK2, March 2007

[17] David M. Alter – Using PWM Output as a Digital-toAnalog Converter on a RMS320F280x Digital Signal Controller, Application Report SPRAA88A, Septembrie 2008

[18] Texas Instruments Motor Control Libraries – 3-channel PWM DAC Driver, Technical Backgroud section

Anexa 1 – Implementarea sofware a algoritmului de control

#include "DSP2833x_Device.h"

#include "PeripheralHeaderIncludes.h"

#include "DSP2833x_Examples.h"

#include <math.h>

#include <stdio.h>

#include "IQmathlib.h"

#include "parameter.h"

#include "clarke.h"

#include "park.h"

#include "ipark.h"

#include "speed_fr.h"

#include "f2833xpwm.h"

#include "svm.h"

#include "f2833xpwm.h"

#include "DSP2833x_EPwm.h"

#include "DSP2833x_ePwm_defines.h"

#include "f2833xqep.h"

#include "speed_fr.h"

#include "f2833xileg_vdc.h"

#include "aquisition.h"

#include "pid_reg3.h"

#include "aga_PT1.h"

#define Bufflength 1000

// Prototipuri funcții

interrupt void MainISR(void);

void agaPWM_HW_init();

void DelayUs(volatile Uint32);

// Variabile globale

float32 T = 0.0001; // Samping period (sec), see parameter.h

float32 chn1[Bufflength], chn2[Bufflength], chn3[Bufflength];

float32 wref = 10;

int16 on = 0;

int increment=0,se=0,valse=1;

long GlobalQ = GLOBAL_Q;

_iq th_el;

Uint16 IsrTicker = 0;

volatile Uint16 EnableFlag =1;

Uint16 BackTicker;

unsigned int i,en_dead_time_comp;

// instanțierea structurilor

CLARKE clarke1 = CLARKE_DEFAULTS;

PARK park1 = PARK_DEFAULTS;

IPARK ipark1 = IPARK_DEFAULTS;

PWMGEN pwm1 = PWMGEN_DEFAULTS;

SVM spv= SVM_DEFAULTS;

QEP qep1 = QEP_DEFAULTS;

SPEED_MEAS_QEP speed1 = SPEED_MEAS_QEP_DEFAULTS;

I_DC_BUS_MEAS adc= I_DC_BUS_MEAS_DEFAULTS;

PIDREG3 pidd = PIDREG3_DEFAULTS;

PIDREG3 pidq = PIDREG3_DEFAULTS;

PIDREG3 pidw = PIDREG3_DEFAULTS;

AGA_PT1 pt1q = AGA_PT1_DEFAULTS;

void main(void)

{

// Initialize System Control:

InitSysCtrl();

// Clear all interrupts and initialize PIE vector table

// Disable CPU interrupts

DINT;

// Initialize the PIE control registers to their default state.

InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:

IER = 0x0000;

IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt

// Service Routines (ISR).

InitPieVectTable();

// InitEPwm1Gpio();

agaPWM_HW_init();

InitEQep1Gpio();

// Interrupts that are used in this example are re-mapped to

// ISR functions found within this file.

EALLOW; // This is needed to write to EALLOW protected registers

PieVectTable.EPWM1_INT = &MainISR;

EDIS; // This is needed to disable write to EALLOW protected registers

// User specific code, enable interrupts:

// Enable PIE group 3 interrupt 1 for EPWM1_INT

PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

// Enable CNT_zero interrupt using EPWM1 Time-base

EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable EPWM1INT generation

EPwm1Regs.ETSEL.bit.INTSEL = 1; // Enable interrupt CNT_zero event

EPwm1Regs.ETPS.bit.INTPRD = 1; // Generate interrupt on the 1st event

EPwm1Regs.ETCLR.bit.INT = 1; // Enable more interrupts

// Enable CPU INT3 which is connected to EPWM1-6 INT:

IER |= M_INT3;

// Enable global Interrupts and higher priority real-time debug events:

EINT; // Enable Global interrupt INTM

ERTM; // Enable Global realtime interrupt DBGM

// Initialize PWM module

pwm1.PeriodMax = SYSTEM_FREQUENCY*1000000*T/2; //=7500 Prescaler X1 (T1), ISR period = T x 1

PWM_INIT_MACRO(pwm1);

// Initialize ADC module

ADC_MACRO_INIT() //(F28xxILEG_VDC.H)

// Initialize QEP module

qep1.LineEncoder = 5000;

qep1.MechScaler = _IQ30(0.25/qep1.LineEncoder);

qep1.PolePairs = polep/2;

qep1.CalibratedAngle = 0;

QEP_INIT_MACRO(qep1);

// Initialize the Speed module for QEP based speed calculation

speed1.K1 = _IQ21(1/(BASE_FREQ*T));

speed1.K2 = _IQ(1/(1+T*2*PI*25)); // Low-pass cut-off frequency

speed1.K3 = _IQ(1)-speed1.K2;

speed1.BaseRpm = 120*(BASE_FREQ/polep);

// pidd initialization

pidd.Kp=_IQ(300);

pidd.Ki=_IQ(5);

pidd.Kc=_IQ(0);

pidd.OutMax=_IQ(550);

pidd.OutMin=_IQ(-550);

//pidq initialization

pidq.Kp=_IQ(300);

pidq.Ki=_IQ(5);

pidq.Kc=_IQ(0);

pidq.OutMax=_IQ(550);

pidq.OutMin=_IQ(-550);

//pidw initialization

pidw.Kp=_IQ(0.13);

pidw.Ki=_IQ(0.0001);

pidw.Kc=_IQ(0);

pidw.OutMax=_IQ(5);

pidw.OutMin=_IQ(-5);

//pt1q initialization

pt1q.K2=_IQ(1/(1+T*2*PI*500));

pt1q.K3=_IQ(1)-pt1q.K2;

pt1q.max=_IQ(5);

pt1q.min=_IQ(-5);

// Configure pin EPWM4A as enable pin for interface card

EALLOW;

GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0; //enable the internal pullup

//no qualification needed (output pin)

GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0; //configure GPIO6 pin as GPIO6

GpioCtrlRegs.GPADIR.bit.GPIO6 = 1; //configure pin as output

EDIS;

// Bucla de așteptare

for(;;)

{

if(on == 1)

{

GpioDataRegs.GPADAT.bit.GPIO6 = 1;

EINT; //Enable Global Interupt

}

else

{ GpioDataRegs.GPADAT.bit.GPIO6 = 0;

DINT;

}

}

}

//MainISR

interrupt void MainISR(void)

{

QEP_MACRO(qep1);

th_el=_IQmpy(_IQ24toIQ(qep1.ElecTheta),_IQ(twopi));

speed1.ElecTheta = _IQ24toIQ((int32)qep1.ElecTheta); //_IQ15toIQ(((int32)qep1.ElecTheta));

speed1.DirectionQep = (int32)(qep1.DirectionQep);

SPEED_FR_MACRO(speed1);

adc.read(&adc);

clarke1.As=_IQ19toIQ(adc.IU);

clarke1.Bs=_IQ19toIQ(adc.IV);

CLARKE_MACRO(clarke1);

park1.Alpha=clarke1.Alpha;

park1.Beta=clarke1.Beta;

park1.Angle=th_el;

PARK_MACRO(park1);

pidw.Ref=_IQ(wref); // 300rpm/60

pidw.Fdb=_IQmpy(speed1.Speed,_IQ(25));

PID_MACRO(pidw);

pt1q.in=pidw.Out;

AGA_PT1_MACRO(pt1q);

pidq.Ref=pt1q.out;

pidq.Fdb=park1.Qs;

PID_MACRO(pidq);

pidd.Ref=_IQ(0);

pidd.Fdb=park1.Ds;

PID_MACRO(pidd);

ipark1.Ds=pidd.Out;

ipark1.Qs=pidq.Out;

ipark1.Angle=th_el;

IPARK_MACRO(ipark1);

spv.Valfa=ipark1.Alpha;

spv.Vbeta=ipark1.Beta;

spv.CrtIU=_IQ(0);

spv.CrtIV=_IQ(0);

spv.CrtIW=_IQ(0);

spv.Dc_link=_IQ(560);//adc.Vdc;

spv.calc(&spv);

//alinierea rotorului

//spv.da=_IQ(0.52);

//spv.db=_IQ(0.48);

//spv.dc=_IQ(0.48);

// scale the spv output from 0->1 to -1->1

spv.da=_IQmpy(spv.da,_IQ(2)) – _IQ(1);

spv.db=_IQmpy(spv.db,_IQ(2)) – _IQ(1);

spv.dc=_IQmpy(spv.dc,_IQ(2)) – _IQ(1);

// ––––––––––––––––––––––––––

// Connect inputs of the PWM_DRV module and call the PWM signal generation macro

// ––––––––––––––––––––––––––

pwm1.MfuncC1 = _IQtoQ15(spv.da); // MfuncC1 is in Q15

pwm1.MfuncC2 = _IQtoQ15(spv.db); // MfuncC2 is in Q15

pwm1.MfuncC3 = _IQtoQ15(spv.dc); // MfuncC3 is in Q15

PWM_MACRO(pwm1) // Calculate the new PWM compare values

EPwm1Regs.CMPA.half.CMPA=pwm1.PWM1out; // PWM 1A – PhaseA

EPwm2Regs.CMPA.half.CMPA=pwm1.PWM2out; // PWM 2A – PhaseB

EPwm3Regs.CMPA.half.CMPA=pwm1.PWM3out; // PWM 3A – PhaseC

if(se++>=valse)

{

se=0;

chn1[increment]=_IQtoF(pidw.Fdb);

chn2[increment]=_IQtoF(pidq.Out);

chn3[increment]=_IQtoF(pidd.Out);

if((increment++)>Bufflength) increment=0;

}

// Enable more interrupts from this timer

EPwm1Regs.ETCLR.bit.INT = 1;

// Acknowledge interrupt to recieve more interrupts from PIE group 3

PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

}

void agaPWM_HW_init()

{

//unsigned int PR;

EALLOW;

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;// Stop all TB clocks

EDIS;

// Setup Sync

EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // Pass through

EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // Pass through

EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // Pass through

// This will enable the pullups for the specified pins + mux1

EALLOW;

GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // Enable pull-up on GPIO0(EPWM1A)

GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // Configure GPIO0 as EPWM1A

GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; // uncomment if –> Set Low initially

GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0; // Enable pull-up on GPIO2 (EPWM2A)

GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // Configure GPIO2 as EPWM2A

GpioDataRegs.GPACLEAR.bit.GPIO2 = 1 // uncomment if –> Set Low initially

GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0; // Enable pull-up on GPIO4 (EPWM3A)

GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; // Configure GPIO4 as EPWM3A

GpioDataRegs.GPACLEAR.bit.GPIO4 = 1; // uncomment if –> Set Low initially

EDIS;

EPwm1Regs.TBCTR = 0x0000; //have the 3 counters in synchronism

EPwm2Regs.TBCTR = 0x0000;

EPwm3Regs.TBCTR = 0x0000;

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

//no prescaller is used the timer runs at 150MHz

EPwm1Regs.TBCTL.bit.CLKDIV = 0;

EPwm2Regs.TBCTL.bit.CLKDIV = 0;

EPwm3Regs.TBCTL.bit.CLKDIV = 0;

EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;

EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0;

EPwm3Regs.TBCTL.bit.HSPCLKDIV = 0;

//when Timer match the CPR reg val upcount period PWM pin set 0

EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;

//when Timer match the CPR reg val downcount period PWM pin set 1

EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;

EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;

EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;

EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;

EPwm3Regs.AQCTLA.bit.CAD = AQ_SET;

EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD; //load the compare value in double update

EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;

EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;

EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; //CMPR register is shadowed

EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

EPwm1Regs.ETPS.bit.INTCNT = 1; //generate interrupt on the first event

EPwm2Regs.ETPS.bit.INTCNT = 0;

EPwm3Regs.ETPS.bit.INTCNT = 0;

//set up the interrupts

EPwm1Regs.ETSEL.bit.INTEN = 1; //Enable EPWM1_INt GENERATION

EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group

EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//Enable event time-base counter equal 0

//Generate an interrupt on the first event

EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;

//Generate an interrupt on the first event

EPwm2Regs.ETPS.bit.INTPRD = ET_DISABLE;

//Generate an interrupt on the first event

EPwm3Regs.ETPS.bit.INTPRD = ET_DISABLE;

EPwm1Regs.ETCLR.bit.INT = 1; // To receive more interrupts ePWM modul

EPwm2Regs.ETCLR.bit.INT = 0; // To receive more interrupts ePWM modul

EPwm3Regs.ETCLR.bit.INT = 0; // To receive more interrupts ePWM modul

EALLOW;

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; //synchronize the three PWM //clocks

EDIS;

}

Anexa 2 – Codul sursa pentru modularea în lățime de puls vectorială

Fișierul antet „svm.h”

typedef struct { _iq Valfa;

_iq Vbeta;

_iq Dc_link;

_iq da;

_iq db;

_iq dc;

_iq Ualfa;

_iq Ubeta;

_iq Valfa_est;

_iq Vbeta_est;

_iq CrtIU;

_iq CrtIV;

_iq CrtIW;

_iq Enable_dead_time_comp;

void (*calc)();

} SVM;

typedef SVM *SVM_handle;

/*––––––––––––––––––––––––––

Default initalizer for the SVM object.

––––––––––––––––––––––––––*/

#define SVM_DEFAULTS { _IQ(0),\

_IQ(0),\

_IQ(560),\

_IQ(0.01),\

_IQ(0.01),\

_IQ(0.01),\

_IQ(0),\

_IQ(0),\

_IQ(0),\

_IQ(0),\

_IQ(0),\

_IQ(0),\

_IQ(0), \

_IQ(0),\

(void (*)(Uint32))space_vector_calc }

/*–––––––––––––––––––––––

Prototypes for the functions in SVM.C

–––––––––––––––––––––––*/

void space_vector_calc(SVM_handle);

Fișierul „svm.c”

#include "IQmathLib.h"

#include "svm.h"

#include <stdlib.h>

#include "DSP2833x_Device.h"

#include "parameter.h"

void space_vector_calc(SVM *v)

{

_iq k1,t1,t2,y; // zone,k,tdead,k2,k4,k3,K;

Uint16 sector;

//aga: voltage scaling in perunit using Ubase=Umax=R3/Vdc

v->Ualfa=_IQmpy(v->Valfa,_IQmpy(_IQ(R3),_IQ(Umax)));

v->Ubeta=_IQmpy(_IQ(Umax),v->Vbeta);

if (v->Ubeta>_IQ(0))

if (v->Ualfa>v->Ubeta)

{

sector=0;

t1=_IQmpy(_IQ(0.5),(v->Ualfa-v->Ubeta));

t2=v->Ubeta;

}

else if (-v->Ualfa<v->Ubeta)

{ sector=1;

t1=_IQmpy(_IQ(0.5),(v->Ualfa+v->Ubeta));

t2=_IQmpy(_IQ(0.5),(v->Ubeta-v->Ualfa));

}

else

{

sector=2;

t1=v->Ubeta;

t2=_IQmpy(_IQ(-0.5),(v->Ualfa+v->Ubeta));

}

else if (v->Ualfa<v->Ubeta)

{

sector=3;

t1=_IQmpy(_IQ(0.5),(v->Ubeta-v->Ualfa));

t2=-v->Ubeta;

}

else if (-v->Ualfa>v->Ubeta)

{

sector=4;

t1=_IQmpy(_IQ(-0.5),(v->Ualfa+v->Ubeta));

t2=_IQmpy(_IQ(0.5),(v->Ualfa-v->Ubeta));

}

else

{

sector=5;

t1=-v->Ubeta;

t2=_IQmpy(_IQ(0.5),(v->Ualfa+v->Ubeta));

}

if (t1>_IQ(1)) t1=_IQ(1),t2=_IQ(0);

else if (t2>_IQ(1)) t1=_IQ(0),t2=_IQ(1);

else if ((t1+t2)>_IQ(1))

if (t1>t2) t2=_IQ(1)-t1;

else t1=_IQ(1)-t2;

//Duty cycles

switch (sector)

{

case 0: v->da=_IQmpy(_IQ(0.5),(_IQ(1)+t1+t2));

v->db=_IQmpy(_IQ(0.5),(_IQ(1)-t1+t2));

v->dc=_IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));

break;

case 1: v->da=_IQmpy(_IQ(0.5),(_IQ(1)+t1-t2));

v->db=_IQmpy(_IQ(0.5),(_IQ(1)+t1+t2));

v->dc=_IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));

break;

case 2: v->da=_IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));

v->db=_IQmpy(_IQ(0.5),(_IQ(1)+t1+t2));

v->dc=_IQmpy(_IQ(0.5),(_IQ(1)-t1+t2));

break;

case 3: v->da=_IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));

v->db=_IQmpy(_IQ(0.5),(_IQ(1)+t1-t2));

v->dc=_IQmpy(_IQ(0.5),(_IQ(1)+t1+t2));

break;

case 4: v->da=_IQmpy(_IQ(0.5),(_IQ(1)-t1+t2));

v->db=_IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));

v->dc=_IQmpy(_IQ(0.5),(_IQ(1)+t1+t2));

break;

case 5: v->da=_IQmpy(_IQ(0.5),(_IQ(1)+t1+t2));

v->db=_IQmpy(_IQ(0.5),(_IQ(1)-t1-t2));

v->dc=_IQmpy(_IQ(0.5),(_IQ(1)+t1-t2));

break;

default:

v->da=_IQ(0);v->db=_IQ(0);v->dc=_IQ(0);

}

y=_IQmpy(_IQ(2),v->da)-v->db-v->dc;

k1=_IQmpy(v->Dc_link,(_IQmpy(y,_IQ(c3))));

v->Valfa_est=k1;

v->Vbeta_est=_IQmpy((v->db-v->dc),_IQmpy(v->Dc_link,_IQ(invR3)));

}

Similar Posts

  • Ceas cu Efect Vizual

    Cuprins Capitolou 1 1.2 Led….…………………………….……………………………pag 9 1.3 Motoare..……………………………………………………….pag 9 1.4 Alimentatoare……………………………………………………pag 9 1.5 Microprocesorul Pic………….………………….……………..pag 9 Capitolul 2 2.1 Descrierea circuitelor……………………………….…………pag 9 2.2 Circuitul rotativ…………………………………………….…pag 9 2.3 Circuitul de baza………….…………………………………..pag 10 2.4 Circuitul telecomenzi…….……………………………………pag 10 Capitolul 3 3.1 Notiunni de baza………………………………………………pag 11 3.2 Pasi construiri ceasului…………………………………………pag 11 3.2.1 Baza………………………………………………………….pag 12 3.2.2 Telecomanda……………………….…………………………pag 12 Capitolol 4…

  • Tehnologia de Executie a Piesei Flansa Ovala

    Cap.1. Analiza desenului de executie si tehnologitatea piesei…………………………….…pag.4. Stabilirea preciziei de executie apesei Evidentierea calitatii suprafetei Verificarea corectitudinii reprezentarilor si a cotarii Evidentierea conditiilor tehnice prescrise Cap.2. Stabilirea tipului de productie……………………………………………………………….. …pag.6. Cap.3. Determinarea modului de obtinere a semifabricatului…………………………………pag.8. (Se vor lua in calcul doua variante si se va alege cea mai buna) Cap.4. Stabilirea…

  • Proiectarea Unui Sistem DE Fabricatie Pentru Confectionarea Produselor DE Imbracaminte “sacou Pentru Barbati”

    TEMA PROIECTULUI PROIECTAREA UNUI SISTEM DE FABRICAȚIE PENTRU CONFECȚIONAREA PRODUSELOR DE ÎMBRĂCĂMINTE “SACOU PENTRU BĂRBAȚI” Cuprins tema proiectului…………………………………………………… Cuprins……………………………………………………………… Capitolul 1. considerații generale, memoriu justificativ…… CAPITOLUL 2. Descrierea tehnică a modelului proiectat……… CAPITOLUL 3. Stabilirea necesarului de materiale…………….. 3.1. Stabilirea necesarului de materii prime principale……….. 3.2. Stabilirea necesarului de materiale auxiliare……………… CAPITOLUL 4. Stabilirea fluxului…

  • Consideratii Legate de Buna Exploatare Si Mentenanta Unei Instalatii cu Turbine Eoliene

    LUCRARE DE DISERTAȚIE CONSIDERAȚII LEGATE DE BUNA EXPLOATARE ȘI MENTENANȚA UNEI INSTALAȚII CU TURBINE EOLIENE CUPRINS CAPITOLUL I PROMOVAREA SISTEMULUI DE PRODUCERE A ENERGIEI DIN SURSE REGENERABILE Dezvoltarea surselor regenerabile de energie Condiții de integrare a energiilor regenerabile în sistemul electroenergetic Energia eoliană. Aspecte privind integrarea instalațiilor eoliene în sistemul electroenergetic CAPITOLUL II UTILIZAREA INSTALAȚIILOR CU…

  • Obtinerea Energiei Electrice cu Ajutorul Panourilor Fotovoltaice

    LUCRARE DE DISERTAȚIE OBȚINEREA ENERGIEI ELECTRICE CU AJUTORUL PANOURILOR FOTOVOLTAICE CUPRINS Introducere 1. Caracteristicile Radiației Solare 1.1. Declinația solară 1.2. Factori care influențează radiația solară 1.2.1 Influența factorului meteorologic 1.2.2. Influența factorului geometric 1.3. Harta solară a României 1.4. Potențialul solar al României 2. Conversia fotovoltaică 2.1. Generalități 2.2. Descrierea efectului fotovoltaic 2.3. Eficiența celulelor…