Compare commits

2 Commits

Author SHA1 Message Date
ea8a528c02 Versão entregue 2023-03-09 12:35:43 -03:00
7f7a64fdf0 Comentarios no codigo 2023-03-09 12:34:13 -03:00
3 changed files with 58 additions and 63 deletions

Binary file not shown.

View File

@@ -11,38 +11,9 @@ uint8_t state = 0;
uint8_t lastState = 0;
int32_t theta = 0;
int32_t targetTheta = 100;
int32_t error = 0;
int32_t lastError = 0;
int32_t dError = 0;
int32_t iError = 0;
int32_t lastInstant = 0;
int32_t instant;
float Kp = 10;
float Kd = 0;
float Ki = 0;
bool f = false;
int32_t period = 10000;
void update() {
delay(1);
lastInstant = instant;
instant = micros();
int32_t deltaT = instant - lastInstant;
lastError = error;
error = targetTheta - theta;
dError = (error - lastError)/deltaT;
iError = iError + error*deltaT;
if (iError > 255)
iError = 255;
else if (iError < -255)
iError = -255;
}
int16_t pid() { return Kp * error + Ki * iError + Kd * dError; }
uint8_t buffer[3];
int16_t power;
void setPower(int16_t power) {
if (power > 255) {
@@ -63,12 +34,10 @@ void setPower(int16_t power) {
}
void plot(){
Serial.print(">timestamp:");
Serial.print(">t:");
Serial.println(micros());
Serial.print(">theta:");
Serial.println(theta);
Serial.print(">targetTheta:");
Serial.println(targetTheta);
}
void encoderIsr() {
@@ -104,6 +73,7 @@ void encoderIsr() {
}
break;
}
plot();
}
void setup() {
@@ -119,15 +89,11 @@ void setup() {
}
void loop() {
if (!f && millis() % period < period/2) {
targetTheta = 100;
f = true;
} else if (f && millis() % period > period/2) {
targetTheta = -100;
f = false;
if(Serial.available() >= 7){
Serial.readBytesUntil('\n', buffer, 7);
sscanf((const char*)buffer, "0x%04X", &power);
setPower(power);
}
plot();
update();
setPower(pid());
delay(10);
delay(100);
}

View File

@@ -1,30 +1,59 @@
clear;
%% Montando a função de transferência
% Executar essa seção antes das outras duas
clear;
s = tf('s');
G = exp(-2*s)/(3*s + 1)
G = exp(-2*s)/(3*s + 1) %% Planta
step(G);
%% Primeiro método de Ziegler-Nichols
A = 1;
td = 2;
tau = 3;
% Aqui foram usadas as fórmulas e tabelas das notas de aula
A = 1; %% Da função de transferência
td = 2; %% Da função de transferência
tau = 3; %% Da função de transferência
L = td;
R = A/tau;
kp = 1.2/(R*L)
kp = 1.2/(R*L) %% Tabelado
Ti = 2*L;
ki = kp/Ti
ki = kp/Ti %% Tabelado
Td = 0.5*L;
kd = kp*Td
D = kp + ki/s + kd*s
Tcl = D*G/(1+D*G);
step(Tcl);
kd = kp*Td %% Tabelado
D = kp + ki/s + kd*s %% Controlador
Tcl1 = D*G/(1+D*G); %% FTMF
Tlp1 = Tcl1/(s+1);
% step(Tlp1);
%% Segundo método de Ziegler-Nichols
ku = 3.0625; %%determinado no LabVIEW
Pu = 1/(0.0405*3.7) %%determinado no LabVIEW
kp = 0.6*ku
Ti = 0.5*Pu;
% Para este método, a resposta temporal da planta com um elemento de ganho
% na entrada foi simulada no LabVIEW. Foram então testados vários valores
% de ganho e, por método iterativo, descobriu-se que k=3.0625 era o que
% fazia com que a saída estivesse marginalmente estável. Em seguida foi
% encontrado o período da onda de saída pelo espectro de frequênciadesse
% sinal. Pelo gráfico, foi notado um pico na frequência de 0.0405*3.7 Hz.
ku = 3.0625; %% Determinado no LabVIEW por inspeçao do gráfico
Pu = 1/(0.0405*3.7) %% Determinado no LabVIEW por inspeção do gráfico
kp = 0.6*ku %% Tabelado
Ti = 0.5*Pu; %% Tabelado
ki = kp/Ti
Td = 0.125*Pu;
Td = 0.125*Pu; %% tabelado
kd = kp*Td
D = kp + ki/s + kd*s
Tcl = D*G/(1+D*G);
step(Tcl);
D = kp + ki/s + kd*s %% Controlador
Tcl2 = D*G/(1+D*G); %% FTMF
Tlp2 = Tcl2/(s+1);
% step(Tlp2);
%% Plot dos gráficos
step(Tlp1);
hold on
step(Tlp2);
hold off
% Dessa forma, percebe-se que os tempos de subida dos dois controladores
% são bem semelhantes, quase indiferenciáveis. O overshoot do segundo
% controlador é maior, porém este tem um settling time menor. Qual
% controlador é melhor dependeria de uma análise caso a caso.