VAŽNO! Ovdje pročitajte kako se registrirati na forum. Bez registracije, nećete biti u mogućnosti pisati na forumu.

Upravljanje i regulacija brzine vrtnje DC motora

Tvoj projekt je upravo dovršen? Podijeli s nama što si napravio u ovom podforumu! Upute drugima kako napraviti isti projekt su uvijek dobrodošle!
Odgovorite
petrovicjosip48#1405
Novak
Novak
Postovi: 5
Pridružen/a: sri stu 25, 2020 8:15 pm

Upravljanje i regulacija brzine vrtnje DC motora

Post Postao/la petrovicjosip48#1405 » pon stu 30, 2020 10:22 am

Upravljanje i regulacija brzine vrtnje DC motora

Kod regulacije procesa (temperatura, brzina vrtnje, …) koristimo PID regulator (proporcionalno, integralno, derivacijski ).
Ovaj regulator bilo da je analogni ili digitalni oponaša matematičke operacije množenja, integracije i derivacije.
Kod analognog regulatora, proporcionalni član je obično IC pojačalo sa pojačanjem kp.
Iz PID regulatora možemo izvesti kombinacije kao što su PI, PD, P regulator. Kod regulacije brzine vrtnje motora koristio sam PI proporcionalno-integralni regulator.

Slijedeći program je algoritam digitalnog PID regulatora.
Ovaj program možemo učitati u croduino i na serijskom portu pratiti ponašanje varijable Output i svih ostalih varijabli.
Na pinu 10 mjerimo napon 0-5V, kojim reguliramo frekvenciju motora.
Iz programa vidimo englesku terminologiju koja se uobičajeno koristi kod regulacije.
Input je ulazna izmjerena veličina nakon senzora (mjerni pretvornik temperature, brzine vrtnje). Setpoint u slobodnom prijevodu je postavna vrijednost brzine vrtnje. Error je regulacijsko odstupanje, a Output je izlazna varijabla čija je vrijednost ulazna veličina PWM pina 10. Varijabla Output kreće se u intervalu od 0-255.
Comparator (error = Setpoint – Input) ostvaren je običnom matematičkom funkcijom oduzimanja.
Sa izlaza procesa djelujemo na ulaz preko negativne povratne veze (Negative Feedback).
Ako imamo smanjenje frekvencije motora preko komparatora dobivamo da je error pozitivan i povećava se varijabla Output (primjer kao u programu PID regulatora), a time se frekvencija motora vraća na početnu vrijednost.
Na osnovi PID algoritma imamo blok shemu regulacije slika 1., a na slici 2. ponašanje PID regulatora na ulaznu skokovitu promjenu regulacijskog odstupanja. Iz programa je vidljivo da je to error = 2.
Čim startamo program imamo upravo karakteristiku ponašanja PID regulatora na ulaznu skokovitu promjenu.
Treba naglasiti da nakon izvjesnog vremena slika 2. ostaje konstantno P djelovanje i integralno I (ki*samplingTime*error), a to je pravac. Prolazom kroz petlju void loop(), varijabla samplingTime povećava se za 1 i time simuliramo integriranje. Integralno djelovanje djeluje sve dok traje regulacijsko odstupanje, a kad je uključen proces, sve dok eror nije sveden na nulu.
Derivacijsko djelovanje aktivno ie samo na skokovitu promjenu i kratko traje.
U idealnom slučaju D skok bi bio beskonačno veliki impuls.
Output naponom sa pina 10 reguliramo dalje preko postavnog uređaja, brzinu vrtnje motora. Naš postavni uređaj je analogni elektronički sklop sa LM358 i tranzistorom BD139.

Digitalni PID regulator

Kod: Označite sve

int samplingTime = 1;
float Kp = 2.00;
float Ki = 2.00;
float Kd = 4.00;
float Setpoint = 10.00;
float Input = 8.00;
float oldError;
float error;
float Output2 = 100.00;
void setup() {
              Serial.begin(9600);
             }
void loop() {
          regPID();
           }
           void regPID()
           {
             error = Setpoint - Input;
             float P = Kp*error;
             float D = Kd *(error - oldError)/samplingTime;
            float I = Ki * samplingTime * error;
            float Output1 = P + I + D;
            float Output=Output1+Output2;
            if(Output > 255) {Output = 255;}
            if (Output <= 0) {Output = 0; }
            analogWrite(10,Output); 
            samplingTime = samplingTime + 1;
            oldError = error;
            Serial.println(Output);  
            delay(2000);
          }
slika

slika

Mjerenje frekvencije ostvareno je optičkim sklopom ( e radionica, fotoprekidnik) i kao što je vidljivo iz slike 3, sastoji se od fotodiode i fototranzistora i između je prorez.Kroz prorez kruži ploča sa 10 utora i zuba. Naime, motor je prvobitno korišten samo za mjerenje frekvencije sa rezolucijom od 0.1 Hz. Ako na ulaz za mjerenje frekvencije stižu 123 pravokutna impulsa, to znači da je frekvencije motora 12.3 Hz.

Na slici 4. je sklop sa dva tastera za postavljanje frekvencije (Setpoint). Ulazi u Croduino su aktivni kada je vrijednost na ulazu 0 (LOW). Tasteri T1,T2 spojeni su na PIN 8 i PIN 9 croduina.
.

slika



slika


Na slici 5.prikazana je shema elektroničkog sklopa za upravljanje i regulaciju brzine vrtnje motora. Upravljati brzinom motora možemo preko potenciometra 10 k, a da ne koristimo Pin 10 croduina. Također možemo koristiti tastere za upravljanje i koristeći PWM podižemo napon na ulazu elektroničkog sklopa.
Elektronički sklop se sastoji od IC LM358, koji je dvostruko pojačalo. Prvo pojačalo je sa maximalnim pojačanjem 10, a drugo pojačalo je pojačalo snage sa tranzistorom BD139. Ovo pojačalo je naponsko slijedilo, jer je napon na izlazu (emiter tranzistora, napajanje motora) gotovo jednak naponu na + ulazu pojačala. Napajanje sklopa je 8V, što je sasvim dovoljno za frekvencijski raspon od 4-30Hz.
Želimo li upravljati ili regulirati snažniji motor veće frekvencije, samo trebamo odabrati snažniji tranzistor i povećati napon na njemu.

PI regulator realiziramo kada za derivacijsku konstantu uzmemo Kd =0.Koristimo gotovi PID algoritam, koji uključujemo arduino bibliotekom PID_v1.h. Odredimo konstante Kp, Ki regulatora, a sve tri konstante nisu fiksno određene, već se određuju tijekom rada motora, tako da se dobije maksimalno stabilan rad motora.
Iz glavnog programa poziva se prvo podprogram postfreq2, kojim se mjeri frekvencija rada motora. Pravokutni
impulsi, koji dolaze na pin 7 croduina, imaju pola perioda maksimalni napon 5V, a pola 0V. Ovim impulsima izmjeri se period T, što je vidljivo iz programa za mjerenje frekvencije. Frekvencija je određena po formuli
f = 1/T, a budući da je perid u µs imamo u brojniku faktor 106. Budući da je broj impulsa 10 puta veći, ovu frekvenciju djelimo sa 10. Podprogramom postfreq1 postavljamo vrijednost zadane frekvencije SETPOINT-a.


slika


Program PI regulatora

Kod: Označite sve

#include <PID_v1.h>
double Input,Output,Setpoint;
PID myPID(&Input,&Output,&Setpoint, 1,5,0,DIRECT);
#define pulse_ip 7
int ontime,offtime;
int freq,freq1,period;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,6,4,3,2);
int tipka1 = 8;
int tipka2 = 9;
int val1 ;
int val2 ;
int izl = 10;
int z = 20;

void setup() 
{
    lcd.begin(16,2);
    Serial.begin(9600);
    myPID.SetMode(AUTOMATIC);
    pinMode(tipka1,INPUT);
    pinMode(tipka2,INPUT);
    pinMode(izl,OUTPUT);
    pinMode(pulse_ip,INPUT);
    lcd.clear();
    }
void loop()
{
  postfreq2 ();
  Input = freq1;
  Setpoint = z;
  myPID.Compute();
  lcd.setCursor(0,0);
  lcd.print("Frek=");
  lcd.setCursor(5,0);
  lcd.print("           ");
  lcd.setCursor(5,0); 
  lcd.print(freq1);
  lcd.print(" Hz");
  analogWrite(izl,Output);
  postfreq1 ();
  lcd.setCursor(0,1);
  lcd.print("z=");
  lcd.setCursor(2,1);
  lcd.print("          ");
  lcd.setCursor(2,1);
  lcd.print(z)
  delay(400);
  }
                  void postfreq1()
                  {
                    val1 = digitalRead(tipka1);
                    val2 = digitalRead(tipka2);
                    if (val1 == LOW)     {z = z + 1;}
                    if (z >= 30)         {z = 30;}
                    if (val2 == LOW)     {z = z - 1;}
                    if (z <= 4)          {z = 4;}
                  }
                  void postfreq2()
                  {
                   ontime = pulseIn(pulse_ip,HIGH);
                   offtime = pulseIn(pulse_ip,LOW);
                   period = ontime + offtime;
                   freq = 1000000/period; 
                   freq1 =freq/10; 
                   if (period==0)
                    	{
                    		freq1=0;
                    	}
                  }
/*                          
Dodatni program za regulaciju brzine vrtnje                  

Ovdje također iz glavnog programa pozivamo iste podprograme za mjerenje frekvencije i postavljanje zadane frekvencije. Međutim poseban je algoritam za regulaciju, koji je riješen podprogramom postfreq3. 
Nakon što je izmjereno regulacijsko odstupanje gr = freq1-z, prolazi se kroz program u kojemu se  proporcionalno greški mijenja i varijabla m. Ako greška raste znači da je frekvencija motora u porastu i varijabla m se smanjuje i obrnuto. Varijabla m je ulazna vrijednost PWM pina 10 analogWrite(izl, m), a time negativnom povratnom vezom reguliramo frekvenciju.  Pokazivanje frekvencije ostvareno je preko LCD displaya 16*2, a to je standardna veza, koju ne treba posebno objašnjavati.
Na kraju moram spomenuti da je el. motor uređaj (proces) sa  brzim odzivom, ali regulacija je dosta dobro ostvarena ovim programima.
*/

#define pulse_ip 7
int ontime,offtime;
int freq,freq1,period;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,6,4,3,2);
int tipka1 = 8;
int tipka2 = 9;
int val1 ;
int val2 ;
int izl = 10;
int m = 80;
int z = 20;
int gr;

void setup() {
    lcd.begin(16,2);
    Serial.begin(9600);
    pinMode(tipka1,INPUT);
    pinMode(tipka2,INPUT);
    pinMode(izl,OUTPUT);
    pinMode(pulse_ip,INPUT);
    lcd.clear();
    }
void loop()
{
  postfreq2();
  postfreq3();
  lcd.setCursor(0,0);
  lcd.print("Frek=");
  lcd.setCursor(5,0);
  lcd.print("           ");
  lcd.setCursor(5,0); 
  lcd.print(freq1);
  lcd.print(" Hz");
  analogWrite(izl,m);
  postfreq1();
  lcd.setCursor(0,1);
  lcd.print("z=");
  lcd.setCursor(2,1);
  lcd.print("          ");
  lcd.setCursor(2,1);
  lcd.print(z);
  delay(400);
  }
                  void postfreq1()
                  {
                    val1 = digitalRead(tipka1);
                    val2 = digitalRead(tipka2);
                    if (val1 == LOW)     {z = z + 1;}
                    if (z >= 30)         {z = 30;}
                    if (val2 == LOW)     {z = z - 1;}
                    if (z <= 4)          {z = 4;}
                  }
                  void postfreq2()
                  {
                   ontime = pulseIn(pulse_ip,HIGH);
                   offtime = pulseIn(pulse_ip,LOW);
                   period = ontime + offtime;
                   freq = 1000000/period; 
                   freq1 =freq/10; 
                   if (period==0)
                    	{
                    		freq1=0;
                    	}
                  }
                    void postfreq3 ()
                    {
                   gr = freq1 - z;
                   if (gr == 1)            {m = m-1;}
                   if (gr == 2)            {m = m-2;}
                   if (gr == 3)            {m = m-3;}
                   if (gr == 4)            {m = m-4;}
                   if (gr == 5)            {m = m-5;}
                   if (gr >= 6)            {m = m-8;}
                   
                   if (gr == -1)           {m = m+1;}
                   if (gr == -2)           {m = m+2;}
                   if (gr == -3)           {m = m+3;}
                   if (gr == -4)           {m = m+4;}
                   if (gr == -5)           {m = m+5;}
                   if (gr <= -6)           {m = m+8;}
                   }
                   
Avatar
david.zovko#4562
e-radionica.com team
e-radionica.com team
Postovi: 436
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Osijek, Croatia
Kontakt:

Re: Upravljanje i regulacija brzine vrtnje DC motora

Post Postao/la david.zovko#4562 » ned pro 06, 2020 8:06 pm

Josipe, hvala Vam na svim detaljima koje ste podijelili s nama. Projekt zaista izgleda lijepo, a lijepo je i sve pojašnjeno.

Siguran sam da će više ljudi pronaći ove upute i moći ih iskoristiti u vlastitim projektima, a posebno mislim da bi mogle biti korisne studentima koji o ovim stvarima uče na fakultetima
petrovicjosip48#1405
Novak
Novak
Postovi: 5
Pridružen/a: sri stu 25, 2020 8:15 pm

Re: Upravljanje i regulacija brzine vrtnje DC motora

Post Postao/la petrovicjosip48#1405 » ned pro 13, 2020 3:11 pm

Dodat ću dodatno objašnjenje za sliku 2. Naime, radi se o ponašanju analognog PID regulatora, gdje vrijeme teče kontinuirano.
Integral konstante (error=2) je pravac. Jasno, kod digitalnog PID regulatora izdvajamo samo pojedine točke iz ovoga prikaza. Još jednom naglašavam da samo integralno djelovanje tijekom procesa. grešku svodi na nulu.
Hvala na razumijevanju!
Josip
Odgovorite