Witam.
1. Wykorzystuję w swoim projekcie program regulatora PID, który sobie napisałem.
Problemem moim jest zjawisko Windupu całkowania i pytanie jak i kiedy zerować całkę błędu, żeby nie było to ciągle całkowane bo błąd osiąga wtedy duża wartość i się nawija czyli zjawisko windup.
2. I drugie pytanie czy w regulatorze trzeba wykorzystywać jakieś odmierzanie czasu i czy tak napisana funkcja jest wystarczająca? (kod poniżej)
3. I zastanawia mnie jak dobrać dobrze współczynniki wzmocnienia regulatora wiem, że są różne metody zieglera nicholsa itd, ale nie za bardzo wiem jak je ruszyć w rzeczywistości.
Regulator reguluje kąt załączenia triaka i steruje grzałką. Wszystko działa, ale widzę, że windup się ukazuje bo jak wyreguluje temperaturę to po pewnym czasie, chwili pomalutku sobie rośnie temperatura ponad zadaną więc błąd ciągle się całkuje
Wszystko piszę w języku C na uC Atmega32
Dodałem przerwanie co jedną milisekunde, i w pętli głównej do zmiennej ,,now" przypisuje milisekundy które przenoszę do funkcji regulatora PID, którego kod zamieściłem poniżej i czy jest on poprawny waszym zdaniem? Wychodzi, ze regulator uruchamiam co 200ms a czas jest chyba wystarczający.
I nie za bardzo wiem jak zrealizować to antiwindup programowo.
1. Wykorzystuję w swoim projekcie program regulatora PID, który sobie napisałem.
Problemem moim jest zjawisko Windupu całkowania i pytanie jak i kiedy zerować całkę błędu, żeby nie było to ciągle całkowane bo błąd osiąga wtedy duża wartość i się nawija czyli zjawisko windup.
2. I drugie pytanie czy w regulatorze trzeba wykorzystywać jakieś odmierzanie czasu i czy tak napisana funkcja jest wystarczająca? (kod poniżej)
3. I zastanawia mnie jak dobrać dobrze współczynniki wzmocnienia regulatora wiem, że są różne metody zieglera nicholsa itd, ale nie za bardzo wiem jak je ruszyć w rzeczywistości.
Regulator reguluje kąt załączenia triaka i steruje grzałką. Wszystko działa, ale widzę, że windup się ukazuje bo jak wyreguluje temperaturę to po pewnym czasie, chwili pomalutku sobie rośnie temperatura ponad zadaną więc błąd ciągle się całkuje
Wszystko piszę w języku C na uC Atmega32
Dodałem przerwanie co jedną milisekunde, i w pętli głównej do zmiennej ,,now" przypisuje milisekundy które przenoszę do funkcji regulatora PID, którego kod zamieściłem poniżej i czy jest on poprawny waszym zdaniem? Wychodzi, ze regulator uruchamiam co 200ms a czas jest chyba wystarczający.
I nie za bardzo wiem jak zrealizować to antiwindup programowo.
