Korzystając z Waszej nieuwagi modyfikowałem algorytm zanurzania
okrętu. Teraz wydaje się, że jest już w miarę dobrze. Program sterujący wykorzystuje
dwa rodzaje PWM. Jeden to w okresach 20 milisekundowych silniki włączane są na
czas krótszy niż 20 milisekund. Dodatkowo silnik dziobowy włączany jest
na czas krótszy ( o jedną milisekundę ) niż silnik rufowy.
Jeszcze drugi rodzaj, to w okresach 1900 milisekund silniki pracują przez TPracy
milisekund.
Stosowny kawałek programu decydującego o sterowaniu wygląda tak :
Kod: Zaznacz cały
switch( ZanurzenieActCM - ZanurzenieNaPowierzchni )
{
case 0:
SetMocSilnikaZbiornika( ZBIORNIK_DZIOBOWY, PELNA_MOC );
SetMocSilnikaZbiornika( ZBIORNIK_RUFOWY, PELNA_MOC );
TPracy = MAX_MILISECOND_NUMBER;
break;
case 1:
SetMocSilnikaZbiornika( ZBIORNIK_DZIOBOWY, TRZY_CZWARTE_MOCY1 );
SetMocSilnikaZbiornika( ZBIORNIK_RUFOWY, TRZY_CZWARTE_MOCY );
TPracy = 350;
break;
case 2:
SetMocSilnikaZbiornika( ZBIORNIK_DZIOBOWY, POL_MOCY1 );
SetMocSilnikaZbiornika( ZBIORNIK_RUFOWY, POL_MOCY );
TPracy = 300;
break;
case 3:
SetMocSilnikaZbiornika( ZBIORNIK_DZIOBOWY, POL_MOCY1 );
SetMocSilnikaZbiornika( ZBIORNIK_RUFOWY, POL_MOCY );
TPracy = 280;
break;
case 4:
SetMocSilnikaZbiornika( ZBIORNIK_DZIOBOWY, JEDNA_CZWARTA_MOCY1 );
SetMocSilnikaZbiornika( ZBIORNIK_RUFOWY, JEDNA_CZWARTA_MOCY );
TPracy = 240;
break;
default:
if ( ZanurzenieActCM > ZanurzenieZadaneCM )
{
SetMocSilnikaZbiornika( ZBIORNIK_DZIOBOWY, JEDNA_CZWARTA_MOCY1 );
SetMocSilnikaZbiornika( ZBIORNIK_RUFOWY, JEDNA_CZWARTA_MOCY );
TPracy = 150;
}
else
{
SetMocSilnikaZbiornika( ZBIORNIK_DZIOBOWY, JEDNA_OSMA_MOCY );
SetMocSilnikaZbiornika( ZBIORNIK_RUFOWY, JEDNA_OSMA_MOCY );
TPracy = 200;
}
break;
}
if ( TNmilisecond > TPracy )
{
ZmianaGlebokosciZbiorniki( ZANURZENIE_OK, 0 );
}
else
{
ZmianaGlebokosciZbiorniki( StanZanurzeniaZa300msInklinometr( ZanurzenieZadaneCM ), inclination );
}
A skutki przyniosły takie oto rezultaty :
http://www.youtube.com/watch?v=8sE51QKtT8c
Z ukłonami
Andrzej Korycki