• 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ź
#2
Poczytaj o PID, dobierz te parametry najlepiej jak to możliwe i powinno zadziałać lepiej niż ręcznie.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Dziękuję za odpowiedź Smile
Przeglądam Improving the Beginner’s PID Bretta Beauregarda i zastanawiam się jak to zaaplikować u siebie? Czy nie powinienem zamieć jakoś wartości wejściowych, u mnie długość sygnału halla? Gdzie dla wyjścia sterowanie serwem od 0 do 255, u mnie empirycznie max do 45. Setpoint u mnie też w długości impulsu halla. Nie powinienem tych wartości jakoś sprowadzić do wspólnego mianownika?
 
Odpowiedź
#4
No właśnie źle to mierzysz " pulseIn" nie jest zbyt idealny....
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
Wyniki pomiaru 'rpm' wychodzą powtarzalne i do nich nie mam jakichś zastrzeżeń. Ale faktycznie musiałem dać 25 próbek do uśredniania Smile
A jak Myślisz to zrobić lepiej ?
 
Odpowiedź
#6
Ile masz impulsów na obrót? Jak jeden i jeszcze uśredniasz to pewnie nim zmierzysz i zorientujesz się że obroty się zmieniły to jest trochę za późno. Czy silnik pracuje we właściwym miejscu momentu obrotowego? Punkt pracy powinien być za "górką momentu" w kierunku wyższych obrotów, ale to nie jest pewnie problemem w tym wypadku.
Może przerwaniem jest lepiej zmierzyć czas pomiędzy impulsami, ale na ten temat niech się wypowiedzą specjaliści.
 
Odpowiedź
#7
Jeden impuls na obrót . Uśredniam, ponieważ pojedyncze odczyty były niedokładne. Co ileś impulsów pojawiał mi się też duży błąd. Dlatego przeszedłem z uno do mega. Myślę, że przy 15 zamiast 25 mogłoby być już zadowalająco akuratnie
 
Odpowiedź
#8
Czy w warunku if ( srednia < 900 & roznica > 1 ) i pozostałych ifach, nie powinno być dwóch &. Tam wykonujesz porównanie czy iloczyn bitowy?
 
Odpowiedź
#9
(28-03-2020, 09:46)dankal666 napisał(a): Jeden impuls na obrót . Uśredniam, ponieważ pojedyncze odczyty były niedokładne. Co ileś impulsów pojawiał mi się też duży błąd. Dlatego przeszedłem z uno do mega. Myślę, że przy 15 zamiast 25 mogłoby być już zadowalająco akuratnie
Źle mierzysz obroty. PulseIn się do tego nie nadaje a zmiana z UNO na MEGA na nic nie wpływa jeśli chodzi o pomiar. Użyj przechwytywania w timerze ale w HAL arduino nie znalazłem takiej funkcji, pozostaje ją napisać.
 
Odpowiedź
#10
Dzięki fast_rabbit ale zdecydowanie mnie przeceniasz Smile Rzeźbię w tym co mam, bo póki co na nic lepszego nie wpadłem, a że do szkoły się nie wybieram, więc pozostaje mi Wasza pomoc. Proszę tylko z wyrozumiałością i łopatologicznie jeżeli Ktoś znalazłby w sobie tyle empatii Smile
Agregacik, faktycznie powinny być dwa && żeby oba argumenty musiały być prawdziwe do wykonania. Odnośnie Twojego celnego wcześniejszego postu odnośnie momentu obrotowego. Na pewno byłoby lepiej przy większych obciążeniach (empirycznie pow 8kW) gdyby silnik 'chodził' na wyższych obrotach, ale całość już jest tak poskładana i tak musi zostać. Gdyby silnik reagował szybciej na obciążenie i nie dopuszczał do zbytnich spadków obrotów nie będzie problemu. Nawet 52Hz na wyjściu prądnicy mi nie przeszkadza. Jej również, bo może kręcić się grubo wyżej. Problem ze zbyt wysokimi obrotami mają tylko avrki. Dla nich max 270vac, a to jest chyba ok 54-55Hz tak z pamięci.

Zauważyłem też, że problemem jest zbyt duży skok serwa przy każdym kroku. Chciałbym podzielić mu te kroki na mniejsze, ale to zakładam, wymagałoby zmiany sterowania serwem z serwo write na microseconds? Serwo to PowerHD LF-20MG. Czy Ktoś wie może jaki minimalny skok w mikrosekundach obsłuży to serwo?
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości