Dziękuję za odpowiedź. Niestety zbyt słabo rozumiem zasadę działania regulatora PID, żeby móc tam cokolwiek zmienić:/ Mam jeszcze jedno pytanie. Muszę jeszcze go nastroić. Czytałem już w Internecie jak się stroi regulatory ale że tak się wyrażę tylko na czuja. Czytałem też o jakichś metodach Zieglera Nicholsa itp ale są trochę zbyt skomplikowane:P
Tylko, że na większości stron jest napisane, żeby stroić PID już na działającym urządzeniu. A ja zauważyłem, że jak zmienię te 3 stałe to również poziom wartości tych zmiennych wychodzących z regulatora na DAC się zmienia. Korzystając z metody proporcji musiałbym za każdym razem zmieniać tę proporcje?
A.T.
Dodano po 2 [minuty]: Tutaj jest kod regulatora. Nie jest pisany przeze mnie, tylko znaleziony w Internecie.
Dziękuję i pozdrawiam
A.T.
#include <stdlib.h>
#include <math.h>
#include "pid.h"
//-------------------------------------------------------------------------------------------------
//
// Definicja struktury ustawien PID - zmienna globalna
//
//-------------------------------------------------------------------------------------------------
struct Settings_tag {
struct {
float P;
float I;
float D;
float angle_int_err;
} angle_PID;
struct {
float P;
float I;
float D;
float diferential_int_err;
float diferential_old_err;
} diferential_PID;
};
struct Settings_tag settings;
float phi1; // obrót pierwszego koła
float phi2; // pbrót drugiego koła
float dphi1; // prędkość obrotowa pierwszego koła
float dphi2; // prędkość obrotowa drugiego koła
int output1 = 0;
int output2 = 0;
//settings.angle_PIDa.P = 1.5;
//settings.angle_PID.I = 10.0;
//settings.angle_PID.D = 0.01;
//-------------------------------------------------------------------------------------------------
//
// Procedura regulacji
//
//-------------------------------------------------------------------------------------------------
void PID(void)
{
//
//-------------------------------------------------------------------------------------------------
// Prosty podwójny regulator PID
//-------------------------------------------------------------------------------------------------
//
float ster1 = 0; // sterowanie pierwszego silnika - zmienna pomocnicza
float ster2 = 0; // sterowanie drugiego silnika - zmienna pomocnicza
float angle_err = 0; // błąd odchylenia od pionu
float diferential_err = 0; // błąd różnicy prędkości kół
float diferential_deriv_err = 0; // różnica błędu różnicy prędkości kół
settings.angle_PID.P = ANGLE_PID_P; //1.5
settings.angle_PID.I = ANGLE_PID_I; //10.0
settings.angle_PID.D = ANGLE_PID_D; //0.01
//
////////////////////////////////////////////////
// Pierwszy regulator PID (odchylenie od pionu)
//
angle_err = state.alpha; // błąd odchylenia od pionu
settings.angle_PID.angle_int_err += angle_err; // całkowanie błędu
// Sprawdzanie granic całkowania
if(settings.angle_PID.angle_int_err > 0.1) settings.angle_PID.angle_int_err = 0.1;
if(settings.angle_PID.angle_int_err < -0.1) settings.angle_PID.angle_int_err = -0.1;
//
///////////////////////////////////////////////
// Drugi regulator PID (różnica prędkości kół)
//
diferential_err = dphi1 - dphi2; // błąd różnicy
settings.diferential_PID.diferential_int_err += diferential_err; // całkowanie błędu
// Sprawdzanie granic całkowania
if(settings.diferential_PID.diferential_int_err > 10) settings.diferential_PID.diferential_int_err = 10;
if(settings.diferential_PID.diferential_int_err < -10) settings.diferential_PID.diferential_int_err = -10;
//
diferential_deriv_err = diferential_err - settings.diferential_PID.diferential_old_err; // różniczkowanie błędu
//
/////////////////////////////////////////////
// Wyliczanie sterowania dla pierwszego koła
//
ster1 = (angle_err * settings.angle_PID.P + state.dalpha * settings.angle_PID.D + settings.angle_PID.angle_int_err * settings.angle_PID.I)
+ diferential_err * settings.diferential_PID.P + settings.diferential_PID.diferential_int_err * settings.diferential_PID.I
+ diferential_deriv_err * settings.diferential_PID.D;
//
///////////////////////////////////////////
// Wyliczanie sterowania dla drugiego koła
//
ster2 = (angle_err * settings.angle_PID.P + state.dalpha * settings.angle_PID.D + settings.angle_PID.angle_int_err * settings.angle_PID.I)
- diferential_err * settings.diferential_PID.P - settings.diferential_PID.diferential_int_err * settings.diferential_PID.I
- diferential_deriv_err * settings.diferential_PID.D;
output1 = ster1;
output2 = ster2;
}
Dodano po 3 [minuty]: Dodam jeszcze, że jest to podwójny regulator. Projektem jest robot balansujący. Czyli do regulatora wchodzi zmienna state.alpha - odchylenie od pionu oraz state.dalpha - prędkość tego odchylenia.