5 impulsów było na innej "spokojnej" grafice, ale przy tych samych ustawieniach prędkości i przyspieszenia. Na tej konkretnej grafice mam 8 impulsów błędu.
Mój serwomechanizm bardzo mnie zaskoczył. Otóż okazało się, że PID oscyluje wokół wartości 1023 / 2 a nie jak było wcześniej wokół zera. Prawdę mówiąc to zadziałało przez jakiś przypadek

Stało się to od momentu gdy zacząłem sterować końcówkę mocy dwoma przebiegami PWM (odwrotnymi). W tej chwili rozszyfrowałem zasadę działania i wygląda na to, że składowa całkująca kompensuje to "przesunięcie" i ma wartość cały czas zbliżoną do 500 a pozostałe dwa człony odpowiadają za sterowanie. Co ciekawe polaryzacja sygnałów PWM zmienia się gdy wartość jest poniżej 511,5 lub powyżej. Najlepsze jest to, że takiej funkcjonalności nigdzie nie mogę znaleźć w nocie katalogowej. Poniżej konfiguracja PWM oraz funkcja od ustawiania PWM.
Konfiguracja Timera1
Kod: Zaznacz cały
// Timer1 jako fast PWM
TCCR1A = 0xB3; // Konfiguracja z CodeVision
TCCR1B = 0x09;
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH = 0x00;
OCR1AL = 0x00;
OCR1BH = 0x00;
OCR1BL = 0x00;
Najlepsze jest to, że te zmienne od kierunku nie są w ogóle potrzebne i serwo działa również bez tego tak jakby Timer sam w sobie zmieniał polaryzację przebiegów PWM wokół wartości 511,5. Czyli połowy maksymalnej 1023.
Kod: Zaznacz cały
void setPWM(float amps)
{
static float lpf = 0.0;
//lpf = (0.8 * lpf) + (0.2 * amps); // Filtr LPF - nieużywany
lpf = amps;
if(stat.dir == stat.dirLast)
{
// Wpisanie wart. PWM do rejestru porównującego
OCR1A = abs(lpf);
OCR1B = abs(lpf);
}
else
{
// Wyłączenie silnika na jedną pętlę po zmianie kierunku
OCR1A = 0;
OCR1B = 0;
}
stat.dirLast = stat.dir;
}
Jak ktoś to rozumie, to chętnie usłyszę wyjaśnienie bo wykres Fast PWM z noty katalogowej wg mnie tego nie wyjaśnia.
Jeszcze jedno. Gdy wyłączę człon całkujący (Igain = 0) to serwo zatrzymuje się na 52 lub -52 kroku enkodera, czyli człon P wyrównał aby serwo stało w miejscu. Przy wzmocnieniu Pgain = 10 wyjście wynosi wtedy 520... czyli silnik stoi.