Sunteți pe pagina 1din 14

Universitatea "Lucian Blaga" Sibiu

Facultatea de Inginerie
Specializarea - Electronic aplicat
Indrumtor: Student:
Prof. Univ. Dr. Ing. Laurean Bogdan










AUTOMATIZAREA PROCESELOR INDUSTRIALE







PROIECT DE AN





-MODEL-





Controlul vitezei unui motor de CC utiliznd algoritmul PID















2013



CUPRINS
2






Consideraii teoretice 3
Tema proiectului 4
Structura fizic 4
Sursa de alimentare 4
Schema electric a sursei de alimentare 5
Procesorul i circuitele aferente: 5
Interfaa cu utilizatorul 6
Circuitul de for pentru controlul motorului de curent continuu 6
Encoderul mecanic i circuitele aferente 7
Concluzii 9
Bibliografie 9
Anexe 10
Anexa 1 - Schema electric a controlerului 10
Anexa 2 - Codul dezvoltat cu ajutorul mediului MikroC for dsPIC IDE 11






















3



Consideraii teoretice
Majoritatea automatizrilor pe care le observm n jurul nostru se bazeaz pe elemente de
acionare electro-mecanice, iar dintre acestea remarcm motoarele de curent continuu, o soluie
uor de abordat din punct de vedere al comenzii/controlului.
n ciuda uurinei cu care poate fi controlat un motor de CC, aplicaiile sensibile necesit
o reglare fin a mrimilor de ieire (vitez, cuplu), acest lucru putnd fi obinut doar utiliznd
regulatoare/controlere.
Din multitudinea de controlere existente se distinge, cu performae foarte bune,
controlerul PID (proporional-integrator-derivator). Acesta reprezint, la baz, un mecanism de
control n bucl nchis, cu reacie, ce calculeaz eroarea (diferena) dintre valoarea actual a
variabilei de proces avut n vedere i valoarea prescris a acesteia.
Algoritmul PID are n componen trei elemente: elementul proporional (P), elementul
integrator (I) i elementul derivator (D). Aceste elemente pot fi interpretate, cu referire la timp, n
modul urmtor:
- P: este utilizat la calculul erorii actuale;
- I: ne ofer informaii despre suma erorilor precedente;
- D: ofer o predicie a erorilor viitoare, bazndu-se pe rata actual de fluctuaie a mrimii.
Rspunsul controlerului PID este obinut prin nsumarea celor trei elemente, avnd urmtoarea
expresie:
( ) ( ) ( ) ( ) t e
dt
d
k d e k t e k D I P t u
d
t
i p
+ + = + + =


0

unde:

p
k - constanta de proporionalitate;
i
k - constanta de integrare
d
k - constanta de derivare
e - eroarea
t - momentul de timp (prezent)
- variabila de integrare; ia valori de la 0 la t.
Termenul proporional produce o valoare de ieire proporional cu eroarea curent.
Rspunsul acestui termen poate fi ajustat prin modificarea constantei de proporionalitate (k
p
). O
valoare mare a lui k
p
are ca efect o schimbare semnificativ a ieirii. De aici rezult c o valoare
prea mare a acestei constante poate mpinge sistemul ntr-o stare de instabilitate. n contrast, o
valoare mic a lui k
p
face ca ieirea s se modifice lent, fapt ce mrete timpul de rspuns al
sistemului. Teoria reglrii i practica industrial spun c termenul proporional trebuie s
contribuie semnificativ la schimbarea valorii ieirii.
Termenul integrator contribuie la modificarea ieirii ca rspuns att la amplitudinea ct i
la durata erorii. Acest termen reprezint suma erorilor instantanee obinute pn n momentul
actual i ne ofer o informaie despre cantitatea ce a trebuit corectat anterior. Aceast sum este
multiplicat cu constanta de integrare (k
i
). Termenul integrator accelereaz reacia procesului n
direcia valorii de referin i elimin erorile care ar fi obinute cu un controler pur proporional.
Termenul derivator este calculat determinnd panta erorii n timp, care este multiplicat
cu o constant de derivare (k
d
). Acest termen reduce rata de modificare a ieirii sistemului, fiind
folosit la reducerea variaiei ieirii produse de termenul integrator i are ca efect mbuntirea
stabilitii sistemului.
Reglajul buclei de control const n acordarea celor trei constante (k
p
, k
i
i k
d
) la valori
optime pentru rspunsul dorit. n imaginea de jos se poate observa variaia rspunsului unui
4



sistem la un stimul de tip treapt atunci cnd pstrm k
p
i k
d
constante, iar k
i
ia diverse valori.

Figura 1. Reglajul buclei de control
Dac cele trei constante sunt alese incorect, procesul controlat poate deveni instabil. n
mod normal, n urma unui proces de reglare executat corect, regulatorul PID obine rezultatele
urmrite.
Tema proiectului
Se cere implementarea unui regulator PID pentru controlul vitezei unui motor de curent
continuu. Regulatorul, de tip numeric, va fi implementat cu ajutorul unui procesor digital de
semnal i va permite execuia unei reglri a turaiei utiliznd att un algoritm PID, ct i utiliznd
un algoritm pur proporional sau chiar nu va executa nici un fel de reglare a turaiei, toate acestea
n scop didactic, pentru a pune n eviden avantajele unui controler de tip PID.
Motorul utilizat este un motor de curent continuu, cu magnei permaneni. Acesta are
ataat un reductor mecanic de turaie, ce produce o cretere a cuplului i o scdere a vitezei de
rotaie la mers n gol pn la 240 rpm.
Reacia sistemului este asigurat printr-un encoder mecanic, ce ofer la ieire un numr
de 26 de pai pe rotaie.
Structura fizic
Controlerul este alctuit din surs de alimentare, procesor i circuitele aferente, interfaa
cu utilizatorul (un LCD i un switch de selecie a modului de lucru), circuit de for utilizat
pentru comanda motorului de curent continuu i bucla de reacie ce cuprinde encoderul mecanic
i circuitele aferente acestuia.
Sursa de alimentare
Alimentarea controlerului este realizat direct de la o surs de curent continuu, care ofer
direct tensiunea de alimentare a motorului. n acelai timp, printr-un regulator LDO, se obine
din aceast surs i tensiunea de alimentare pentru partea logic (+5V).
5



Schema electric a sursei de alimentare

Figura 2. Schema sursei de alimentare
Alimentarea circuitului se face prin intermediul conectorului PWR. Capacitorii C11 i
C12 au rolul de a acumula energie i a o livra circuitului atunci cnd sursa nu este capabil s
acopere necesarul acestuia.
Dioda D2 reprezint o protecie la inversarea polaritii sursei de alimentare. Capacitorii C13,
C14 i C15 au rol de filtraj/reducere a variaiei tensiunii de ieire din regulator. Circuitul
LM1117 este un stabilizator LDO ce poate fi alimentat cu o tensiune cuprins ntre 6.2 i 18V,
oferind la ieire o tensiune stabilizat de 5V. Aceasta (+5V), mpreun cu tensiunea de alimentare
(Vcc = 12 - 18V) reprezint cele dou tensiuni de alimentare din circuit. LED-ul 1 are rolul de a
semnaliza prezena tensiunii de alimentare la bornele PWR-1, respectiv PWR-2.
Procesorul i circuitele aferente:
Cel ce deine puterea de decizie este microcontrolerul. Pentru aceast aplicaie am decis
s utilizez un procesor digital de semnal, din cauza performanelor ridicate, din familia dsPIC30F
produs de firma Microchip, respectiv dsPIC30F4012.
Funcionarea n bune condiii a acestui uC este contiionat de existena unor circuite
adiionale: circuitul de reset, oscilatorul, interfaa de programare serial.
Circuitul de reset este format din R11, C9 i D1. Acesta are rolul de a mpiedica resetarea
uC. Pentru aceasta pinul MCLR trebuie s primeasc un semnal '1' logic pe tot timpul
funcionrii.
Cristalul de quartz Q5, mpreun cu capacitorii C8 i C10 alctuiesc oscilatorul extern,
iar conectorul ICSP reprezint interfaa de programare serial.
Circuitele adiionale i conectarea lor cu uC pot fi observate n figura urmtoare:
6




Figura 3. Conectarea la microcontroler
Interfaa cu utilizatorul
Este compus dintr-un LCD cu dou linii a cte 16 caractere fiecare i un switch cu
revenire.
Ecranul LCD este folosit pentru a afia turaia actual a motorului i meniul de selecie a
modului de funcionare (fr regulator - opiunea NOT, cu regulator proportional - opiunea PRO
i cu regulator PID - opiunea PID).
Switch-ul permite selecia modului de funcionare: la fiecare apsare a switch-ului,
modul de funcionare se schimb, fapt afia pe cea de a doua linie a LCD-ului

Figura 4. Afiajul LCD
Circuitul de for pentru controlul motorului de curent continuu
Acest circuit este reprezentat de un invertor n punte realizat cu tranzistoare MOS.
Comanda acestora se realizeaz prin intermediul unor drivere (TC4428 - realizate de compania
7



Microchip) dedicate.

Figura 5. Circuitul de for
Encoderul mecanic i circuitele aferente

Figura 6. Encoderul mecanic
Encoderul mecanic este un dispozitiv ce convertete micarea de rotaie ntr-o serie de
impulsuri electrice, cu o anumit structur.
Acest dispozitiv are dou canale de ieire, pe fiecare din ele genernd un numr de 26 de
impulsuri la fiecare rotaie de 360 a axului. Pentru a putea determina direcia de rotie, semnalele
8



generate pe cele dou canale de ieire nu sunt n faz. Prin stabilirea ca referin a unui semnal i
citirea strii celui de al doilea la fiecare front cresctor al semnalului de referin, se poate
determina direcia n care este rotit axul encoderului.
Rezistenele R1 i R2 sunt rezistene de pull-up, R3 i R4 au rolul de a limita curentul
care intr n pinul microcontrolerului, iar C1 i C2 asigur eliminarea impulsurilor de tensiune
parazite aprute ca urmare a procesului de comutaie mecanic ce are loc n interiorul
encoderului.
Funcionare:
Imediat dup alimentarea circuitului are loc iniializarea dispozitivelor periferice din
microcontroler. Dup ce acest proces este ncheiat, tranzistorul Q2 este adus n stare de conducie
prin setarea bitului IN2. Concomitent cu aceast aciune, pe bitul IN3 este generat un semnal
PWM al crui factor de umplere crete treapta de la 0% la 100%, obinnd astfel o pornire lin a
motorului, prin accelerare de la viteza zero la viteza maxim.
Controlerul este iniializat n modul de funcionare fr regulator de turaie. Odat cu
apsarea switch-ului SW are loc o ntrerupere hardware ce modific ciclic modul de funcionare -
reglare proporional, reglare PID, fr reglare, iar apoi ciclul este reluat.
Conform ecuaiilor ce descriu funcionarea motorului de curent continuu cu magnei
permaneni, la funcionarea fr reglare a turaiei, viteza de rotire a motorului este direct
proporional cu tensiunea de alimentare a acestuia, fapt ce poate fi observat prin modificarea
tensiunii sursei de alimentare n gama 12V - 18V.
n modul de funcionare cu reglare a vitezei motorului (prin algoritm proporional sau
PID) un timer intern produce o ntrerupere software la fiecare 500 ms. Rutina de tratare a
ntreruperii calculeaza viteza instantanee a motorului i o compar cu viteza prescris (care are
valoarea de 160 rpm), determinnd eroarea n momentul respectiv.
n cazul algoritmului de reglare proporional aceast eroare este multiplicat cu o
constant de proporionalitate i cu ajutorul valorii obinute este modificat factorul de umplere al
semnalului cu care este comandat Q3, n sensul corectrii erorii.
Algoritmul PID se folosete de teoria detaliat n seciunea "Consideraii teoretice",
pentru a regla valoarea vitezei la valoarea de 160 rpm. Schema logic a algoritmului implementat
pentru calculul PID este prezentat pe pagina urmtoare.

9




Figura 7. Algoritmul PID
Concluzii
Controlerul proiectat ne ofer o idee destul de bun despre modul de funcionare al
motorului de curent continuu n bucl deschis sau n bucl nchis, cu regulator proporional sau
PID. Avantajele celui din urm sunt evidente, n ciuda faptului c limitrile elementelor
componente (ale encoderului, de exemplu) sunt evidente.
Ca i dezvoltare ulterioar se recomand nlocuirea encoderului mecanic cu unul optic, de
rezoluie mare (de exemplu 1000 imp/rot) i micorarea perioadei de achiziie la minimul posibil
(de la 500 ms n momentul de fa).
Bibliografie
[1] Microchip Application Note, "AN718 - Brush DC Servomotor Implementation using
PIC17C756A".
[2] Microchip Application Note, "AN937 - Implementing a PID Controller Using PIC18 MCU".
[3] Microchip Application Note, "AN898 - Determining MOSFET Driver Needs for Motor Drive
Applications".
[4] Microchip Datasheet, "dsPIC30F Family Reference Manual".
Adrese de internet
[1] http://www.microchip.com
[2] http://www.mikroe.com
[3] http://www.wikipedia.org
10



Anexe
Anexa 1 - Schema electric a controlerului

Figura 8. Schema electric
11



Anexa 2 - Codul dezvoltat cu ajutorul mediului MikroC for dsPIC IDE
#define RPM 160
#define BTN !LATE.B8
#define ACC_DELAY 10

// Lcd module connections
sbit LCD_RS at LATB1_bit;
sbit LCD_EN at LATB0_bit;
sbit LCD_D4 at LATE0_bit;
sbit LCD_D5 at LATE1_bit;
sbit LCD_D6 at LATE2_bit;
sbit LCD_D7 at LATE3_bit;

sbit LCD_RS_Direction at TRISB1_bit;
sbit LCD_EN_Direction at TRISB0_bit;
sbit LCD_D4_Direction at TRISE0_bit;
sbit LCD_D5_Direction at TRISE1_bit;
sbit LCD_D6_Direction at TRISE2_bit;
sbit LCD_D7_Direction at TRISE3_bit;

// variabile globale
unsigned short kp = 2, ki = 2, kd = 3;
unsigned short sat_flag = 0;
float ypid = 0, integral = 0, err = 0, err_init = 0;
unsigned short tip_regulator = 0; // 0 - nu exista, 1 - proportional, 2 - pid
unsigned short imp = 0;
float rpm = 0;
char lcd_txt0[5];
char lcd_txt1[15];

// prototipuri functii
void init(void);
void motor(char);
void acc_motor(unsigned short);

// rutine de tratare a intreruperilor
void BTNisr(void) org 0x0014 {

IFS0 &= 0xFFFE;

if(tip_regulator < 2) tip_regulator++;
else tip_regulator = 0;

if(tip_regulator == 0) Lcd_Out(2, 1, "#NOT PRO PID");
else if(tip_regulator == 1) Lcd_Out(2, 1, " NOT #PRO PID");
else if(tip_regulator == 2) Lcd_Out(2, 1, " NOT PRO #PID");

}

12



void ENCODERisr(void) org 0x0032 {

unsigned int buffer = 0;

IFS0 &= 0x7FFF;

Delay_ms(5);
buffer = PORTC & 0x2000;
if(buffer == 0x2000) imp++;

}

void TMR1isr(void) org 0x001A {

IFS0 &= 0xFFF7;

rpm = (imp / 26.0) * 120.0;
imp = 0;
if(rpm) {

FloatToStr(rpm, lcd_txt1);
Lcd_Out(1, 8, lcd_txt1);

}
else Lcd_Out(1, 8, "00.00000");

if(tip_regulator == 0) OC1RS = 125;
else if(tip_regulator == 1) { // proportional

if(RPM > rpm) OC1RS += 2;
else if (RPM < rpm) OC1RS -= 2;

}
else if(tip_regulator == 2) { // pid

err = RPM - rpm;
ypid = kp * err;
if(!sat_flag) integral += err;
ypid += integral * ki;
ypid += kd * (err - err_init);
if(ypid > 124) sat_flag = 1;
else sat_flag = 0;
ypid /= 10;
OC1RS += ypid;

}

}

void main(void) {
13




// initializare microcontroller
init();

motor('e');
acc_motor(125);

// endless loop
while(1);

}

// definire functii
void init(void) {

// initializare LCD
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1, " Controler PID ");
Lcd_Out(2, 1, "pentru motor CC");
Delay_ms(2500);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1, 1, "RPM => 00.00000");
Lcd_Out(2, 1, "#NOT PRO PID");

// initializare porturi
ADPCFG = 0xFFFF;
TRISC = 0xFFFF;
TRISD = 0x0000;
TRISE = 0x0100;

// initializare intrerupere buton
IPC0 |= 0x0005;
IFS0 &= 0xFFFE;
IEC0 |= 0x0001;

// initializare intrerupere encoder
CNEN1 |= 0x0002;
IPC3 |= 0x7000;
IFS0 &= 0x7FFF;
IEC0 |= 0x8000;

// initializare timer1
PR1 = 4882; // 500ms
T1CON = 0x0030;
IPC0 |= 0x6000;
IFS0 &= 0xFFF7;
IEC0 |= 0x0008;
T1CON |= 0x8000;

14



// initializare PWM
PR2 = 125; // 20kHz
T2CON = 0x0000;
OC1R = OC1RS = 0;
OC1CON |= 0x0006;

}

void motor(char c) {

if(c == 'e') {

PORTE |= 0x0020;
T2CON |= 0x8000;

}
else if(c == 'd') {

PORTE &= 0xFFDF;
T2CON &= 0x7FFF;

}

}

void acc_motor(unsigned short speed) {

unsigned int i;
for (i = 0; i <= speed; i++) {

OC1RS = i;
Delay_ms(ACC_DELAY);

}

}

S-ar putea să vă placă și