Archive for the ‘ Controlo ’ Category

Identificação do modelo de um motor DC

De forma a controlar os motores de tracção presentes na base osTWDR, decidi usar um controlador PID para manter a velocidade dos mesmos num valor desejado.

Ainda que este tipo de controlador não exija o conhecimento do modelo matemático do sistema, tentei identifica-lo para que houvesse um ponto de partida para a sintonização dos ganhos Proporcional, Integral e Derivativo.

A estratégia utilizada foi aplicar uma entrada em degrau (com o motor parado aplicar-lhe tensão) e observar a evolução do sistema ao longo do tempo. Esses dados foram guardados e posteriormente processados para obter o modelo matemático do sistema.

Os motores usados no osTWDR são servos RC alterados para poderem rodar 360º e em que toda a electrónica original foi removida e substituída por um microcontrolador dsPIC33FJ32MC302 e por uma ponte H SN754410. Para obter feedback da velocidade de rotação, foi adicionado aos servos um encoder magnético de 64 pulsos por rotação usando o integrado da  Austria microsystems AS5035.

O dsPIC usado nesta aplicação possui um módulo QEI (Quadrature Encoder Interface) e permite o interface directo com encoders com saida em quadratura. Foi escrito um programa que após iniciar a execução aplica ao motor um sinal de PWM com duty cycle de 100% e lê o número de pulsos com uma frequência de 10Hz. Estes dados são enviados por porta série para um programa terminal como o “terminal by br@y++” que fará o registo (log) dos mesmos.

Importando os dados utilizando o Matlab:


data=[];
posicao=[];

fid=fopen('log_servo_10Hz_pps_asc.txt');

C=textscan(fid, '%f,%f');

fclose(fid);

data=C{1,1};
posicao=C{1,2};

As variáveis “data” e “posicao” guardam informação do número de pulsos por segundo e instante respectivamente. Fazendo o plot das mesmas pode-se visualizar o comportamento que aparenta ter uma resposta semelhante a um sistema de segunda ordem. Infelizmente a mecânica dos servos é de má qualidade o que só por si introduz muito ruído no sistema daí não estabilizar e haver tanta oscilação.

O Matlab possui uma toolbox que auxilia a identificação do sistema. Essa ferramenta chama-se “System identification tool” e pode ser chamada escrevendo na shell do Matlab “ident” seguido de um “enter”.

Para dar inicio à identificação do sistema escolhe-se a opção “time domain data” do menu dropdown “import data”:

deverá aparecer a seguinte janela:

São poucas as informações que temos de fornecer sendo que:

Output – resposta do sistema, neste caso vamos escrever o nome da variável “data” que deve estar no “workspace”.

Input – Valor do comando fornecido ao motor, nesta situação particular é um vector com dimensões iguais às de “data” com todos os elementos iguais a 400.

comando=ones(size(data,1),1)*400;

Chega-se ao valor 400 pelo facto de ser o valor necessário carregar nos registos do módulo de PWM do dsPIC para gerar um duty cycle de 100%. Deverá ser escrito o nome da variável “comando”.

Starting Time – tempo inicial, colocar a 0.

Sampling Interval – tempo de amostragem, neste caso a frequência de amostragem é de 10Hz o que implica um tempo de amostragem de 0,1s.

No fim deverá ter este aspecto:

É agora necessário carregar na opção “Import”, que fará com que a janela do “system identification tool” mostre que já temos os dados do nosso sistema inseridos:


Do menu dropdown “Estimate–>” escolher a opção “Process Models…” irá abrir uma janela que para um sistema de segunda ordem sem atraso de resposta poderá ser preenchida da seguinte forma:

Para terminar falta escolher a opção “Estimate”, isto irá dar inicio ao processo de identificar qual o modelo matemático para os motores.

A janela do “system identification tool” terá agora o seguinte aspecto:

escolhendo a opção “Model Output” irá aparecer uma janela com os dados fornecidos e uma resposta com os dados estimados, neste caso:

Apesar das oscilações presentes nos dados originais (e provocadas por uma má mecânica) o sistema estimado consegue ter uma resposta adequada e representativa do sistema real.

Para finalizar basta apenas conhecer o modelo matemático do sistema. Para tal basta clicar no “system identification tool” com o botão do lado direito do rato em cima de onde diz “P2”.

Desta forma consegue-se verificar que a função de transferência do motor é:

G(s)= \frac{0.30138}{(1+2.3079s)(1+0.052916s)}

Sendo que uma função de transferência genérica de segunda ordem pode ter a seguinte forma:

G(s)= \frac{b_0}{s^2+a_1s+a_0}

E que a dinâmica pretendida em malha fechada pode ser escolhida através de:

\zeta w_n s^2 + 2 \zeta w_n s + w_n^2 = 0

então:

K_p= \frac{2 p \zeta w_n + w_n ^2 - a_0}{b_0}

K_i= \frac{2 \zeta w_n + p + a_1}{b_0}

K_d= \frac{p w_n ^2 }{b_0}

Onde “p” é um pólo extra inserido pelo controlador. Deve-se escolher este pólo de forma a que seja pelo menos 10 vezes maior que o pólo mais lento de forma a não interferir na dinâmica desejada.