% Ultimas consideraçoes sobre o controlador PD
%
% Posiçao(n) = Posiçao(n-1) + Kp*erro(n) + Kd*[erro(n)-erro(n-1)]
% erro=posiçao desejada - posiçao efectiva
%
% Os parametros K respeitantes a estes graficos foram optimizados para a
% massa M4+M2=1138g no que respeita a minimizaçao de overshoot.
%  => Kp=0.10, Kd=0.45
%
% Como se pode visualizar para a massa M4+M2 ocorre alguma oscilaçao,
% embora nao seja significativa. A medida que diminuimos a carga, o tempo
% de estabelecimento vai aumentando, bem como o atraso relativamente ao
% percurso em malha aberta. Embora este controlador seja uma boa soluçao
% para eliminar o erro em regime estacionario (o integrador esta implicito
% no somador) apresenta a desvantagen de introduzir atraso na resposta.
%
% No que toca ao grafico com a maxima carga (1398g), oberva-se um erro na
% leitura da tensao do potenciometro - note que o servo nao segue a
% informaçao apresentada, trata-se de uma falha na leitura deste.
% Como a posiçao angular e medida a partir do valor minimo deste sensor ao
% longo de um ciclo de PWM para evitar a influencia do impulso de
% corrente, tal so pode ser provocado pelo facto do impulso de corrente
% ocupar todo o periodo de PWM. E importante referir que mesmo na zona de
% descendencia do PWM, a leitura e tambem efectuada a um ritmo bastante
% superior, pelo que ficamos com a garantia de que nenhuma zona do periodo
% apresenta o valor minimo de tensao. Para evitar este evento, e
% aconselhavel o nao uso de cargas superiores a 1200g... tendo em conta que
% o binario maximo exercido em cada junta do robot nao ultrapassa os 2.6 Nm
% e com relaçoes de transmissao de 2.5, o binario maximo exigido a estes
% servos sera de 1.04 Nm (cargas de 1060g) o que nos deixa bastante mais
% descansados...

close all

help controlo

title1= ['Resposta a rampa (-90º=>+70º) com um Controlador PD (Kp=0.10, Kd=0.45)'];
files1 =['Resposta à rampa COM controlo_kp0.10kd0.45_M0#t_pos_vpot_posEff_posCont_curr.txt                  ';
         'Resposta à rampa COM controlo_kp0.10kd0.45_M1#t_pos_vpot_posEff_posCont_curr.txt                  ';
         'Resposta à rampa COM controlo_kp0.10kd0.45_M2#t_pos_vpot_posEff_posCont_curr.txt                  ';
         'Resposta à rampa COM controlo_kp0.10kd0.45_M4#t_pos_vpot_posEff_posCont_curr.txt                  ';
         'Resposta à rampa COM controlo_kp0.10kd0.45_M42#t_pos_vpot_posEff_posCont_curr.txt                 ';
         'Resposta à rampa COM controlo_kp0.10kd0.45_M421_leituraContinua#t_pos_vpot_posEff_posCont_curr.txt'];
files1b=['Resposta à rampa SEM controlo_M0#t_pos_vpot_posEff_posCont_curr.txt                  ';
         'Resposta à rampa SEM controlo_M1#t_pos_vpot_posEff_posCont_curr.txt                  ';
         'Resposta à rampa SEM controlo_M2#t_pos_vpot_posEff_posCont_curr.txt                  ';
         'Resposta à rampa SEM controlo_M4#t_pos_vpot_posEff_posCont_curr.txt                  ';
         'Resposta à rampa SEM controlo_M42#t_pos_vpot_posEff_posCont_curr.txt                 ';
         'Resposta à rampa SEM controlo_M421_leituraContinua#t_pos_vpot_posEff_posCont_curr.txt'];
     
label1=['Massa nula (M0)     ';
        'Massa M1 = 258g     ';
        'Massa M2 = 463g     ';
        'Massa M4 = 675g     ';
        'Massa M4+M2=1138g   ';
        'Massa M4+M2+M1=1396g'];
legend1=['Posiçao solicitada   ';
         'Percurso sem Controlo';
         'Percurso com Controlo'];
ylabel1=['Posiçao (graus)'];


f1=figure(1);
set(f1,'name',title1);
for i=1:size(files1,1)
    array=load(files1(i,:));
    arrayb=load(files1b(i,:));
    
    subplot(2,3,i);
    % ---------------------------------------------------------------------
    % Adaptar este bloco de codigo de acordo com os dados de origem
    plot(array(:,1),array(:,2),'g',arrayb(:,1),arrayb(:,4),'b',array(:,1),array(:,4),'r');
    % ---------------------------------------------------------------------
    
    xlabel(label1(i,:));
    ylabel(ylabel1);

    if (i==size(files1,1))
        legend(legend1,4);
    end
    grid on
end