• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Utrzymywanie zadanych obrotów silnika spalinowego w agregacie prądotwórczym DIY
#1
Witam Wszystkich serdecznie, 
zwracam się do Was o pomoc w zaprogramowaniu arduino mega do sterowania silnikiem spalinowym daewoo tico napędzającym prądnicę Frigoblock G17 tworząc, a póki co próbując tworzyć, zespół prądotwórczy własnej konstrukcji. Silnik zasilany jest gazem i sterowany przepustnicą, do której przymocowałem serwo. Prądnica ma osobne wzbudzenie +24v, które jest załączane podczas rozruchu. Do każdej 3 faz prądnicy mam podłączone AVRki 10kVa każda, działające od 150 do 270vac. Prądnica jest połączona z silnikiem przez koła pasowe czterorowkowe, o przełożeniu 2,3 do 3. Prądnica do 230vac przy 50Hz potrzebuje możliwie stabilnych 3000obr/min, więc na silniku powinienem mieć ok 2300obr/min. Obroty silnika odczytuję z czujnika halla.
Proszę o możliwie łopatologiczne i cierpliwe wytłumaczenie mi co powinienem zmienić w skrypcie, żeby zaczęło to lepiej i stabilniej działać. Póki co działa tylko przy bardzo delikatnych dodawaniach obciążenia. Przy dołożeniu podczas pracy np 1kW obroty mocno spadają, następnie mocno się podnoszą i tak parę razy, aż do wyłączenia avr-ek przy 270Vac. Przy obsłudze 'ręcznej' Smile przepustnicy, agregat działa stabilnie do ok 9KW.
Poniżej zamieszczam skrypt pętli, jaki udało mi się dotychczas sklecić za pomocą kilku innych, prostych na tyle, żebym w miarę rozumiał o co chodzi. Doradźcie proszę co i jak pozmieniać, z góry serdecznie dziękuję Smile

void loop()
  {
  byte licznik = 0;
  word srednia = 0;
  word poprzedniasrednia;
 
  int poprzedniasredniachar;
  int sredniachar;
  int roznica;
  unsigned int odczyt;
 
  while (licznik < 25)              // hall sensor impuls lenght for one rpm counter
    {
    odczyt = pulseIn(hallPin, LOW);
   
    if ((odczyt > 300)&&(odczyt < 10000))
      {
      srednia += odczyt;
      licznik++;
      }
    }

  srednia /= 25;                  //  average from 25 counts
if ( czas > 1 )                  //  last average
  {
    poprzedniasrednia = srednia;
    czas = 0;
  }
sredniachar = int(srednia);      // i've switched variables types to make my sketch work
poprzedniasredniachar = int(poprzedniasrednia);
roznica = poprzedniasredniachar - sredniachar;

//  main rpm conditions
    if ( srednia < 900 & roznica > 1 ) { pozycja--; }          // max desired rpm / position-
    if ( srednia > 960 & roznica < 1 ) { pozycja++; }          // min desired rpm / position+
   
    if ( roznica >= 25 & roznica < 69 & srednia < 1110 ) { pozycja--; }    // if last average bigger than 25 & rpm length smaller than 1110 / position-
    if ( roznica >= 12 & roznica < 69 & srednia < 1020 ) { pozycja--; }
    if ( roznica >= 3 & roznica < 69 & srednia < 920 ) { pozycja--; } 
   
    if ( roznica <= -25 & roznica > -69 & srednia > 850 ) { pozycja++; } 
    if ( roznica <= -12 & roznica > -69 & srednia > 870 ) { pozycja++; }
    if ( roznica <= -3 & roznica > -69 & srednia > 940 ) { pozycja++; }
   
if ( pozycja < 0 ) { pozycja = 0; }  // zabezpieczenie pozycja nigdy ujemna = to avoid servo minus values
if ( srednia < 750 ) { pozycja = 0; }  // natychmiastowe zabezpieczenie przez za wysokimi obrotami = maximum rpm safety break
if ( pozycja > 60 ) { pozycja = 60; }    // maximum servo angle

czas++;
serwo.write(pozycja);      // servo position write
}
 
Odpowiedź
  


Wiadomości w tym wątku
Utrzymywanie zadanych obrotów silnika spalinowego w agregacie prądotwórczym DIY - przez dankal666 - 27-03-2020, 21:59

Skocz do:


Przeglądający: 1 gości