27-03-2020, 21:59
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' 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ę
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
}
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' 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ę
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
}