Compare commits
2 Commits
main
...
trabalho_p
| Author | SHA1 | Date | |
|---|---|---|---|
| ea8a528c02 | |||
| 7f7a64fdf0 |
Binary file not shown.
@@ -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);
|
||||
}
|
||||
67
Trabalho01.m
67
Trabalho01.m
@@ -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.
|
||||
Reference in New Issue
Block a user