Escolar Documentos
Profissional Documentos
Cultura Documentos
CENTRO TECNOLGICO
DEPARTAMENTO DE ENGENHARIA ELTRICA
VITRIA ES
MARO/2015
LEONARDO LYRIO MARCONI
COMISSO EXAMINADORA:
______________________________________________
__
Prof. Dr. Celso Jos Munaro
Universidade Federal do Esprito Santo - UFES
Orientador
______________________________________________
__
Prof. Dr. Jos Leandro Flix Salles
Universidade Federal do Esprito Santo - UFES
Examinador
______________________________________________
__
Prof. Dr. Alessandro Mattedi
Universidade Federal do Esprito Santo - UFES
Examinador
VITRIA ES
MARO/2015
Aos meus avs.
AGRADECIMENTOS
Agradeo a todos aqueles que me apoiaram e ajudaram durante toda essa jornada para me tornar
engenheiro. Aos colegas de curso, amigos de infncia, professores e funcionrios da
Universidade Federal do Esprito Santo e todos aqueles que tive o prazer de conhecer durante
esse perodo, mas em especial aos meus familiares e a minha namorada Geainny.
RESUMO
1 INTRODUO ............................................................................................................... 11
1.1 Apresentao ............................................................................................................... 11
1.2 Motivao .................................................................................................................... 12
1.3 Objetivo Geral e Objetivos Especficos ...................................................................... 12
1.3.1 Objetivo Geral ................................................................................................... 12
1.3.2 Objetivos Especficos ........................................................................................ 12
1.4 Estrutura do Trabalho .................................................................................................. 13
2 ASPECTOS TERICOS ................................................................................................ 14
2.1 Sistemas de Controle ................................................................................................... 14
2.2 Sistemas de Controle Digital ....................................................................................... 14
2.3 Controlador PID .......................................................................................................... 15
2.4 Controle por realimentao de estados ........................................................................ 16
3 HARDWARE ................................................................................................................... 18
3.1 Arduino ........................................................................................................................ 18
3.2 Circuitos Conversores de Sinais .................................................................................. 20
3.2.1 Introduo .......................................................................................................... 20
3.2.2 Conversor de -15/+15V para 0/3.3 V ................................................................ 20
3.2.3 Conversor de 0.52/2.72 V para -15/+15V ......................................................... 23
3.2.4 Ligao com o Arduino ..................................................................................... 25
3.3 Kit Didtico DC Servo Trainer ED-4400B ................................................................. 26
4 SOFTWARE .................................................................................................................... 28
4.1 Introduo .................................................................................................................... 28
4.2 Estrutura do cdigo...................................................................................................... 30
4.2.1 Estabelecendo a comunicao Serial. ................................................................ 30
4.2.2 Protocolo de Comunicao ................................................................................ 30
4.2.3 Controle de erros. .............................................................................................. 32
4.2.4 Buffer do MATLAB.......................................................................................... 33
4.2.5 Fluxograma ........................................................................................................ 34
4.2.6 Algoritmos de Controle ..................................................................................... 35
Algoritmo PID ..................................................................................... 35
Realimentao de estados .................................................................... 37
5 RESULTADOS ................................................................................................................ 39
5.1 Introduo .................................................................................................................... 39
5.2 Testes com o Motor DC .............................................................................................. 39
5.2.1 Tempo de Amostragem ..................................................................................... 39
5.2.2 Identificao do Modelo .................................................................................... 40
Modelo de Velocidade......................................................................... 42
Modelo de Posio .............................................................................. 43
5.2.3 Controle de Velocidade ..................................................................................... 45
Controlador PI ..................................................................................... 45
5.2.4 Controle de Posio ........................................................................................... 46
Controlador PI ..................................................................................... 47
Controlador PID .................................................................................. 48
Influncia do tempo de amostragem.................................................... 52
5.2.5 Realimentao de estados .................................................................................. 53
5.2.6 Realimentao de estados com integral do erro. ............................................... 54
5.3 Entrada Rampa.......................................................................................................... 55
5.3.1 Sistema de velocidade ....................................................................................... 55
Controlador P ...................................................................................... 55
Controlador PI ..................................................................................... 56
5.3.2 Sistema de Posio ............................................................................................ 57
Controlador P ...................................................................................... 57
Controlador PI ..................................................................................... 57
6 CONCLUSO ................................................................................................................. 58
6.1 Trabalhos Futuros ........................................................................................................ 59
7 BIBLIOGRAFIA ............................................................................................................. 60
11
1 INTRODUO
1.1 Apresentao
A teoria de controle muito rica e fascinante, porm muito complexa e o aluno necessita de
[...] demasiado poder imaginativo para entender o significado no-matemtico do contedo
que lhe apresentando [...]. (NEVES, SILVA e BARREIROS, 2004, p.1)
Isso faz com que as aulas de laboratrio sejam to importantes para que os alunos possam
assimilar com maior facilidade esses contedos e tambm ver de perto a teoria de controle sendo
aplicada no mundo real.
Para isso, so necessrios kits didticos que permitam a realizao de tais feitos. Porm, existe
uma srie de complicaes na utilizao de tais kits. O que mais compromete a utilizao o
fato que, muitas vezes, o hardware que executa a aquisio de dados da planta caro e ainda
possui um software fechado, o que, por questes comerciais, no permite programar livremente
algoritmos de controle por conta prpria, o que deixa o usurio engessado com os algoritmos
do fabricante, limitando muito o uso desses equipamentos.
muito importante o desenvolvimento de plataformas que realizem a aquisio e permitam a
elaborao de controle atravs de softwares livres. Alm de possibilitar sempre a incluso de
novas rotinas no software, mais uma ferramenta para capacitar os alunos da rea de controle
e automao de sistemas e de reas adjacentes, como eletrnica e computao. (NEVES,
SILVA e BARREIROS, 2004, p.2)
Contudo, essa plataforma no vem apresentando uma boa performance, primeiramente por
causa do alto tempo de amostragem e tambm por no garantir que esse tempo tenha um valor
fixo durante toda a amostragem do sinal, isto , no garante o tempo real. Como os algoritmos
de controle so executados dentro de um PC rodando o Windows, e este no um sistema em
12
tempo real, no possvel garantir que o intervalo de tempo em que a cada uma das amostras
coletada, seja fixo.
Outros trabalhos tambm foram feitos por estudantes da UFES na mesma linha, sempre
utilizando o MATLAB e algum hardware. (CAZELI, 2012) utilizou um Arduino Uno para
realizar o controle do motor DC do kit didtico do laboratrio de controle. (TEIXEIRA, 2008)
utilizou a placa NUDAQ PCI para fazer o controle de um tanque de nvel. J (BOZI,2011) usou
o NI USB-6008 para fazer o controle de temperatura de uma planta didtica. Entretanto, todos
esses estudantes utilizaram esses hardwares apenas com dispositivos de entrada e sada (I/O),
ou seja, apenas como uma ponte entre a planta e o computador, ficando a maior parte do
processamento a cargo deste, o que impede que o controle seja realizado em tempo real.
1.2 Motivao
2 ASPECTOS TERICOS
Nesse trabalhado ser realizado o controle de uma planta atravs de um controlador digital
implementado dentro de um hardware, o qual, nesse projeto ser o Arduino. Para isso,
necessrio um sistema que converta os sinais analgicos para digitais e de digitais para
analgicos. Na figura 1, esse tipo de sistema detalhado no formato de diagrama de blocos.
A regio circundada diz respeito aos elementos que estaro presentes dentro do Arduino. Tem-
se o controlador discreto C(Z) enviando um sinal que ser a entrada da planta G(s), em
intervalos de tempos de amostragem T, o qual convertido em um sinal constante por um
segurador de ordem zero.
O bloco H(s) um elemento da planta que nesse projeto poder ser um amplificador taco ou
potencimetro, os quais convertem velocidade e posio, respectivamente, em um sinal eltrico.
Esse sinal ser amostrado em intervalos de amostragem T pelo Arduino para ser utilizado no
clculo do sinal de erro.
15
O controlador PID muitas vezes referido como um controlador de trs termos e um dos mais
utilizados na indstria de processos. O sinal de controle gerado por um termo proporcional ao
erro, um termo integral do erro e um termo que a derivada do erro.
Termo proporcional: o erro multiplicado por um ganho Kp. Um ganho muito alto
pode causar instabilidade do sistema, j um ganho muito baixo pode fazer que a sada
do sistema se afaste muito da referncia.
Termo Integral: A integral do erro multiplicada por um ganho Ki. O ganho pode ser
ajustado para zerar o erro de estado estacionrio. Um ganho muito alto pode causar
oscilaes no sistema, entretanto, um ganho muito pequeno pode tornar o sistema muito
lento.
Na figura 3 e na equao (1) pode-se ver a estrutura ideal desse controlador, e na equao (2)
tem-se a estrutura do PID paralelo. No captulo 4 sero mais detalhadamente explicados os
algoritmos de controle PID e como eles foram discretizados para serem introduzidos no
Arduino.
()
= + + (1)
()
()
= + + (2)
()
() 1 2
= 2 (3)
() + (1 + ) + 1 2
possvel utilizar a integral do erro junto com a realimentao de estados para acrescentar um
polo na origem e, com isso, zerar o erro estacionrio.
() 1 2
= 3 (4)
() + (1 + ) 2 + (1 2 ) + 1 2
Sendo,
3 HARDWARE
3.1 Arduino
O Arduino uma placa de prototipagem muito utilizada hoje em dia, tanto por iniciantes, quanto
por profissionais mais experientes. Um dos pontos que o tornam muito atraente o baixo custo.
Comparando com outras placas utilizadas para aquisio de dados, como a USB-6008 da
National Instruments, o Arduino supera bastante em relao ao preo. (NATIONAL
INSTRUMETS CORPORATION, 2015). Outro diferencial que possvel embarcar cdigos,
tornando possvel, por exemplo, inserir o algoritmo do controlador PID, no sendo necessrio
utilizar o computador para esse fim. Enquanto que no Arduino esse processamento ser
realizado obedecendo um tempo de amostragem definido graas utilizao de temporizadores,
no computador existem outros processos rodando junto ao MATLAB, o que poderia promover
um certo atraso no envio da resposta do controlador planta.
O Arduino uma plataforma open source, isto significa que qualquer um pode ter acesso ao
seu cdigo fonte, o que permite que sejam feitas bibliotecas com os mais diversos propsitos e
que estas sejam disponibilizadas na Web gratuitamente. Esse fato, juntamente com a linguagem
de alto nvel utilizada baseada em C++/Java, facilita muito a programao.
(SOFTWARE LIVRE BRASIL, 2015).
Ele possui 96 KB de memria SRAM, enquanto os outros modelos no ultrapassam 2.5 KB.
Alm disso, a sua CPU possui um clock de 84 MHz, contra 8 e 16 MHz dos outros modelos.
Isso permitir coletar amostras das variveis com pequenos tempos de amostragem. As entradas
analgicas tambm possuem um diferencial no Due, elas fornecem uma resoluo de 12 bits.
19
Outro ponto positivo do Due que o nico que possui sadas analgicas reais (DACs), alm
das j conhecidas sadas PWM presentes nos outros Arduinos. (ARDUINO, 2015a)
3.2.1 Introduo
As entradas analgicas do Arduino trabalham com tenses que variam de 0 a 3.3 V, as sadas
analgicas trabalham com tenses que variam de 0.52 V a 2.72 V e o kit do Laboratrio de
Controle (KIT ED-4400B) trabalha com tenses que variam de -15 +15 V. Logo, necessrio
realizar a converso de tenso e, para isso, sero utilizados dois circuitos, um para realizar a
converso do sinal que sai do Arduino para a planta e o outro para converter o sinal que sai da
planta para o Arduino.
Esse circuito faz a converso que sai da planta e entra no Arduino. Seu esquemtico pode ser
visualizado na figura 5.
01 = ( + )
(5)
1 1
01 = ( 12 + )
7.3 9.09 (7)
O segundo amplificador operacional (figura 7) foi utilizado como amplificador inversor, o qual
possui a tenso de sada dada pela equao (9).
22
Figura 7-Amplificador Inversor
= ( )
(9)
Substituindo os valores dos componentes na equao (9) e desenvolvendo tem-se que a sada
do segundo amplificador operacional dada pela equao (12).
4
= ( )
3 01 (10)
100
= ( )
100 01 (11)
= 01
(12)
Substituindo a equao (8) na equao (12) obtm-se a sada completa do circuito a seguir:
0 = (1.65 + 0.11 )
(13)
23
Esse circuito faz a converso da tenso que sai do Arduino e entra na planta. Seu esquemtico
pode ser visualizado na figura abaixo.
6 6
01 = ( (2 ) + )
4 3 (14)
8
02 = ( )
7 01 (15)
Substituindo a equao (14) na equao (15) e os valores dos componentes da figura 8, tem-se
a sada completa do circuito dada pela equao (17).
24
56 56
= ( (12) + )
30.42 4.1 (16)
= (22.09 + 13.65 )
(17)
Foram feitas duas placas de circuitos impresso contendo cada um desses circuitos e ambas
foram colocadas em uma caixa plsticas junto com o Arduino com bornes, para assim trazer
segurana e facilidade ao manuseio do hardware. (Figura 9)
As duas sadas analgicas do Arduino Due (DAC0 e DAC1) so ligadas nos circuitos de
converso de 0.52 a 2.72 V para +/-15V. As entradas analgicas A5 e A7 so ligadas nos
circuitos que convertem o sinal de +/-15 V para 0 a 3.3 V.
Na caixa, os bornes E0 e E1 representam as entradas analgicas A5 e A7, respectivamente, e
os bornes S0 e S1 representam as sadas analgicas DAC0 e DAC1, respectivamente.
A figura 10 abaixo mostra um panorama geral como ocorre a interao entre computador,
Arduino, circuito conversor de sinais e a planta.
Para realizar os testes dessa plataforma foi utilizado um kit didtico composto pelos seguintes
componentes:
U-156 B Fonte de alimentao CC (+/- 15 V 0,2 A e alimentao do motor)
U-154 B Driver amplificar de tenso (10 watts)
U-161 B Servo motor
U-155 B Unidade taco amplificadora
U-152 B Amplificador Somador-Inversor
U-158 B Potencimetro
Utilizando esses componentes, foi montada a planta para realizar testes de monitoramento,
controle de posio e controle velocidade.
Na figura 11 possvel ver o esquemtico das ligaes do kit e da caixa contendo o circuito
conversor de sinais e o Arduino.
O sinal a ser aplicado na planta, seja no modo monitoramento ou controle, enviado pela caixa
no borne S0 e aplicado no amplificador inversor. A resposta, no caso do sistema de velocidade,
gerada pela unidade taco amplificadora, cuja sada est conectada na entrada E0 da caixa. No
caso do sistema de posio, o sinal gerado no bloco do potencimetro ligado no eixo mais
lento do motor. Pode-se observar que existe uma chave comutando entre os pontos 1 e 2,
indicando qual sistema est sendo usado. Essa chave apenas uma ilustrao de como a ligao
dever ser feita manualmente. O nmero 1 indica o sistema de velocidade e o nmero 2 indica
o sistema de posio. Vale ressaltar que esse esquemtico serve tanto para monitoramento,
como para controle.
27
Figura 11-Esquemtico de ligaes para monitoramento e controle
4 SOFTWARE
4.1 Introduo
No Arduino ocorre o processamento em tempo real, o que no seria vivel se fosse utilizado
um sistema que no permite tal processamento, como o Windows. Nele[...] tarefas de alta
prioridade podem ser interrompidas para que tarefas de baixa prioridade sejam executadas,
fazendo com que seja impossvel garantir um tempo de resposta constante para suas
aplicaes. [...] (MECATRNICA ATUAL,2015). Por isso a importncia de se executar os
algoritmos de controle em um hardware dedicado ao invs de executar em um PC, como feito
hoje em dia no laboratrio de controle.
Para se alcanar o tempo real no Arduino, foi feito uso de interrupes comandadas por
temporizadores, os quais permitem que o Arduino pare momentaneamente a execuo normal
do programa para fazer a tarefa que lhe foi destinada em intervalos de tempos definidos. Foi
encontrada uma biblioteca j pronta intitulado de DueTimer, exclusiva para o Arduino Due,
que fazia exatamente o que era necessrio para esse projeto. (SEIDEL, 2015).
Alm de garantir o tempo real, interessante que a plataforma execute a amostragem em tempos
baixos, essencial para o controle de alguns sistemas. Isso foi possvel graas poderosa CPU
29
de 84 Mhz, a melhor entre todos os Arduinos. Com isso pode-se executar os algoritmos que
realizam o controle mesmo utilizando um baixo tempo de amostragem.
Uma preocupao que ocorreu, foi em relao a integridade dos dados que seriam enviados do
Arduino ao MATLAB. Poderia ocorrer um problema de perda de dados se no existisse um
buffer no MATLAB para fazer o armazenamento, e foi constatado por meio de testes que o
MATLAB permite a configurao do tamanho do seu buffer de entrada, e ele grande o
suficiente para armazenar a quantidade mxima de amostras que o Arduino poder enviar. Com
isso, temos a garantia de executar o controle em tempo real sem haver perda de informaes.
A primeira etapa do projeto foi exclusivamente dedicada a realizar a aquisio dos dados, isto
, o Arduino amostraria os sinais eltricos provenientes da planta e os enviaria para o
MATLAB. Comeou-se enviando os dados para o Arduino como strings, o que foi logo visto
como um erro, pois cada caractere de um nmero iria ocupar 1 byte, o que seria um problema
quando fosse enviado uma grande quantidade de dados, pois a memria do Arduino um
recurso muito limitado. Todas as informaes que seriam enviadas ao Arduino possuiriam
valores inteiros, incluindo a entrada que seria aplicada na planta, pois as sadas analgicas do
Arduino possuem uma resoluo de 12 bits, e o intervalo de valores que precisaramos enviar
iria variar ente 0 e 4095. Ento, optou-se por enviar os dados no formato uint16, ou seja, inteiro
sem sinal de 16 bits. Com isso podia-se enviar um nmero variando entre 0 e 65536 em apenas
2 bytes.
Caso o modo de controle fosse escolhido, tambm seria necessrio enviar os ganhos do
controlador. Esses ganhos poderiam ter valores possuindo algumas casas decimais, por isso
foram enviados como variveis do tipo float que variam entre -3.40282334E+38 a
3.40282334E+38 e ocupam 4 bytes. (ARDUINO, 2015).
Para tornar o sistema mais confivel e de fcil utilizao, foi criado um sistema de alerta de
erros que informa quando algum problema ocorrer. Por exemplo, se a quantidade de dados que
o Arduino est esperando no chegar ou se a quantidade de amostras esperadas no for enviada
ao MATLAB, uma mensagem de erro ir informar o que ocorreu.
30
O usurio no MATLAB ir escolher os valores que sero enviados ao Arduino, os quais so: o
tempo de amostragem, a quantidade de amostras que ser coletada e se ser executado o
monitoramento ou controle de uma varivel. Se for escolhido o modo controle, tambm ser
selecionado o algoritmo a ser utilizado. Alm disso, sero enviados os parmetros dos
controladores e a entrada a ser aplicada na planta.
Independentemente do modo escolhido, os dados obedecero um protocolo de envio que pode
ser visto na figura 13.
A primeira informao a ser enviada ser a quantidade de dados que o Arduino dever esperar
chegar. Aps isso, o Arduino receber o valor do tempo de amostragem (Ts) e a quantidade de
amostras, que ser coletada e enviada ao MATLAB. Existem tambm dois parmetros
importantes a serem enviados, P1 e P2.P1 ter seu valor variando entre 0 e 3 para informar qual
modo ser executado e qual algoritmo de controle ser utilizado, P2 informar qual sada
analgica estar utilizada, se a DAC0 ou DAC1.
Essas primeiras informaes sero colocadas dentro do Arduino dentro de um vetor chamado
de VetDados. Se for desejo futuramente colocar mais dados nesse vetor, basta alterar o tamanho
dele e modificar o valor da varivel TamDados no cdigo do MATLAB e do Arduino para a
quantidade de interesse
Por ltimo, ser enviada a entrada que ser aplica na planta. Ela ser construda no MATLAB
pelo usurio, mas ter uma limitao de tamanho, pois dentro do Arduino ela ser armazenada
dentro de um vetor de inteiros de 16 bits chamado vetdados com 40 mil posies. Como a
memria Ram do Arduino possui 96 K, estar sendo usado 80K de memria s para este vetor,
o que mais do que suficiente. Por exemplo, se for escolhido um tempo de amostragem 1 ms,
ser possvel realizar at 40 s de aquisio de dados. Para tempos de amostragem maiores,
logicamente o tempo de coleta de dados aumenta.
P1 = 0: Monitoramento
P1 = 1: Controle PID com derivada da sada
P1 = 2: Controle PID com derivada do erro
P1 = 3: Controle Realimentao de estados.
P2 = 0: DAC0
P2 = 1: DAC1
Se tudo estiver correto, o MATLAB ir enviar os dados do vetor para o Arduino e o MATLAB
ficar esperando uma flag chamada de Flag 1 do Arduino, informando se a quantidade chegou
ou no. Se ocorrer algum problema em alguma informao ou de a sinalizao no chegar, o
usurio receber a seguinte mensagem de erro: O Arduino no recebeu todos os dados.
Com a certeza de que todos os dados chegaram corretamente ao Arduino, o MATLAB ir enviar
um comando para comear a aquisio de dados, a qual s ir terminar quando a quantidade de
amostras pedida for alcanada. Ao mesmo tempo em que faz a aquisio, o Arduino j envia as
amostras para o MATLAB.
33
4.2.5 Fluxograma
Escolha do modo e
definio de parmetros
no Matlab
Envio do tamanho do
vetor de dados
No
O tamanho do vetor de dados
Msg Erro 1 Fim do programa
chegou ao Arduino ?
Sim
Envio do vetor de
dados
No
A quantidade de dados esperados
Msg Erro 2 Fim do programa
chegou ao Arduino ?
Sim
Envio de comando
do Matlab para o Arduino
comear a Aquisio das
amostras do sinal
No
No
Quantidade de
amostras alcanado ?
Sim
No
Quantidade de amostras pedidas Msg Erro 3
chegou ao Matlab ? Fim do programa
Sim
Fim do programa
35
Algoritmo PID
Nessa plataforma foram implementados dos tipos de algoritmos PID que utilizam um filtro
passa baixa na parte derivativa, o que deixa o sinal de controle menos ruidoso.
O primeiro realiza a derivada do erro e sua equao pode ser vista a seguir.
()
() = + +
() (18)
1+
() (1 1 )
= + + (19)
() (1 1 ) (1 + ) 1
1 1 2 0 1 2
() = () 2 () + () + + 1 () + + 2 ()
0 0 0 0 0 (20)
Sendo,
0 = (1 + ) + (1 + ) +
1 = ( (2 + ) + + 2 )
2 = +
0 = (1 + )
1 = (2 + )
2 = 1
36
(()) (() ) ()
= = (21)
() = () + () ()
(22)
1+
(1 1 )
() = () + () ()
(1 1 ) (1 + ) 1 (23)
1 1 2 0 1 2 0 1 2 (24)
() = () + 2 () + () + 1 () + 2 () + () + 1 () + 2 ()
0 0 0 0 0 0 0 0
37
Sendo,
0 = (1 + NT)
1 = (NT 2)
2 = 1
0 = (1 + ) + (1 + )
1 = ( 2)
2 =
0 =
1 = 2
2 =
Com isso, as equaes (20) e (24) dos dois controladores PID podem ser implementadas no
Arduino.
Realimentao de estados
= (25)
()
= (26)
() 1 1
() = () 1 + () (27)
Com isso a referncia da equao (25) passa a ser o sinal de sada do integrador (Equao (27)).
39
5 RESULTADOS
5.1 Introduo
Nesse captulo sero detalhados os testes executados com Kit Didtico DC Servo Trainer ED-
4400B. Ser realizada a identificao dos sistemas de velocidade e posio atravs do mtodo
dos mnimos quadrados utilizando como entrada o sinal binrio pseudo aleatrio (PRBS) e o
degrau. Com base nesses modelos sero projetados controladores para se obter um bom
transitrio para a resposta dos sistemas. Sero feitas tambm anlises do efeito do coeficiente
do filtro passa baixa do termo derivativo do PID e do tempo de amostragem no controle de
posio. Tambm ser comentado o que a derivada da sada pode trazer de benefcios no
controle de posio. Alm disso, ser aplicada uma entrada do tipo rampa nos sistemas de
posio e velocidade para posteriormente analisar os resultados.
Foi utilizado o sistema de velocidade em malha aberta para testar a flexibilidade que essa
plataforma nos oferece em relao escolha do tempo de amostragem.
Na figura 14 possvel ver vrias curvas da resposta do sistema para uma entrada do tipo degrau
no instante t=0, com uma amplitude de 3V.
O tempo de amostragem no influencia no formato da curva de resposta. A diferena que
quanto menor o tempo de amostragem, maior quantidade de rudo. ver possvel que a curva
referente utilizao do tempo de amostragem de 1ms possui muito mais rudo se comparada
com a curva do tempo de amostragem de 80ms.
40
Figura 14- Resposta ao degrau do sistema de velocidade para diferentes tempos de amostragem
O mtodo mais simples para se identificar o modelo de um sistema , sem dvidas, utilizando
uma entrada do tipo degrau e encontrando o ponto referente ao valor de regime e o ponto onde
a resposta alcana 63% do valor de regime. Entretanto, quando existem rudos de medio,
como acontece em praticamente todos os sistemas de aquisio de dados, este mtodo fica
comprometido. Isto pode ser observado na figura 15. Ela representa a resposta do sistema de
velocidade a uma entrada do tipo degrau com um tempo de amostragem de 1ms. possvel
observar que ela possui rudos que podem ocasionar a escolha de valores errados para identificar
o sistema.
41
Figura 15-Resposta ao Degrau do sistema de velocidade
Por isso, nesse projeto usou-se o mtodo dos mnimos quadrados para a identificao dos
modelos de posio e velocidade do motor
Enquanto o mtodo da resposta ao degrau utiliza apenas pontos da curva, o mtodo dos mnimos
quadrados ajusta os parmetros usando todos os pontos da curva, de modo a reduzir o erro
quadrtico entre a sada medida e a estimada
Para o sistema de velocidade ser utilizado um sinal Binrio Pseudo Aleatrio (PRBS) (figura
16), o que permite identificar as dinmicas lentas e rpidas presentes na planta.
O sinal PRBS foi criado no ambiente Matlab usando a funo idinput, a seguir ele enviado
para o Arduino, onde ele fica armazenado dentro do vetor designado para manter as entradas
que sero aplicadas na planta.
42
Para a identificao do sistema de velocidade do Kit didtico foi criado um sinal PRBS com
amplitude variando entre 0 e 5V, com durao de 50s e com uma taxa de amostragem de 10ms,
ou seja, foi construdo um sinal com 5000 pontos.
Na figura 17 pode-se conferir a resposta do sistema de velocidade ao sinal PRBS.
Tendo posse da entrada e da resposta do sistema, possvel utilizar o toolbox Ident,
disponibilizado pelo prprio Matlab para realizar o processo de identificao do sistema,
utilizando o mtodo dos mnimos quadrados.
Modelo de Velocidade
Selecionando o modo process models dentro do Ident, pode-se escolher a estrutura do sistema
(nmero de polos, zeros, com ou sem atraso) e o MATLAB fica responsvel por calcular os
parmetros dele para reduzir o erro quadrtico entre a sada medida e a estimada.
Para o modelo de velocidade, escolheu-se duas estruturas diferentes, uma contendo um polo
apenas, ou seja uma estrutura de primeira ordem, e outro com dois polos, ou seja uma estrutura
de segunda ordem. As duas estruturas sem atraso.
Com o modelo de primeira obteve-se um FIT de 74,76%. Sua estrutura j com os parmetros
calculados, pode ser visto na equao a seguir:
0.97895
() = (28)
0.15773 + 1
Tentando melhorar o modelo, tentou-se uma estrutura com dois polos e chegou-se a um FIT de
90,48%. A sua estrutura com os parmetros calculados dada por:
0.9783 (29)
() =
0.004974 2 + 0.1411 + 1
Para verificar a qualidade dos modelos, plotou-se juntos no mesmo grfico, (figura 17): a
resposta real do sistema e a resposta obtidas com os modelos utilizando o sinal PRBS.
43
Figura 17-Resposta do sistema ao sinal binrio pseudo-aleatrio (PRBS)
Modelo de Posio
Foram utilizadas as rotinas procest e arx para estimar os parmetros do modelo de posio. A
primeira usa um algoritmo de otimizao no linear e a segunda usa o mtodo clssico dos
mnimos quadrados.
Para isso foi aplicado um degrau de amplitude de 3 V com tempo de amostragem de 1ms no
instante t=0, para coletar a resposta do sistema de posio em malha aberta
Utilizando a rotina procest do MATLAB, escolheu-se algumas configuraes de estruturas
que podem ser conferidas na tabela a seguir junto com seus respectivos FITs.
Tentou-se tambm identificar um polo no sistema, porm, foi encontrando um modelo cujo
polo estava em 106 , ento ele foi descartado.
44
Para a rotina arx, escolheu-se valores de 1,1,0 para os parmetros nb, nf e nk, respectivamente,
e foi encontrado um bom modelo com um FIT de 95,88%.
A estrutura do modelo discreto ARX pode ser visualizada abaixo.
Sendo,
() = 1 1
() = 0.002804
possvel notar pelos modelos encontrados que o processo praticamente um integrador puro.
Na figura 18 esto os grficos com os dados coletados e as respostas dos modelos para verificar
a qualidade deles.
Controlador PI
Com o auxlio da funo Tune do bloco PID, buscou-se um projeto de controlador que fizesse
com que o transitrio da resposta tivesse pouco ou nenhum sobressinal e um rpido tempo de
assentamento. Os valores de Kp e Ki que permitiram que se alcanasse tal objeto podem ser
visualizados na equao a seguir:
8.8354
() = 0.9808 + (31)
Na figura 20, tem-se a resposta do sistema utilizando esse controlador junto com simulao
realizada no SIMULINK. Tambm foi mostrado o sinal de controle enviado pelo Arduino e
aplicado na planta.
46
Figura 20-Controle de Velocidade com PI
O diagrama de blocos do SIMULINK foi utilizado para se efetuar as simulaes para o projeto
dos controladores, como pode ser visto na figura 21. Como foi feito para o controle de
velocidade, a referncia do sistema foi um degrau de 3V no instante 0,5 segundos e o tempo de
amostragem foi de 10ms.
Figura 21-Diagrama de blocos do controle de Posio
Controlador PI
Como foi feito para o sistema de velocidade, buscou-se uma configurao de controlador que
resultasse em uma resposta com baixo sobressinal e rpido tempo de assentamento. De novo
foi utilizada a ferramenta Tune do bloco PID do Simulink.
Na equao (32) pode ser vista a configurao do controlador utilizado e na figura abaixo a
resposta do sistema e do simulado.
0.04
() = 1.5 + (32)
possvel observar que a resposta tem uma leve diferena no transitrio. Um dos motivos
porque sistema possui uma no linearidade chamada zona morta. No linearidades so difceis
de serem simuladas com preciso e com isso podem ocorrer diferenas. Contudo, j uma
aproximao j muito satisfatria para o projeto de controladores.
48
Controlador PID
Apesar do sistema de posio com o controlador PI ter tido uma boa resposta, possvel torna-
la mais rpida aumentando o ganho Kp. Porm, esse aumento de ganho faz surgir um
sobressinal no transitrio da resposta como pode visto na figura 23.
Para contornar isso, ir ser feito agora o uso do controlador PID que utiliza a derivada do erro
possvel na figura 24 como o PID consegue diminuir consideravelmente o sobressinal, porm,
mantendo a resposta rpida obtida com o PI. Foi utilizado um ganho Kd = 0.2 e um coeficiente
de filtro N = 15, mantendo os mesmos valores de Kp e Ki. A sua equao pode ser vista na
equao (33). A entrada do sistema novamente foi um degrau de amplitude 3 V e amostragem
do sinal foi feita com um intervalo de tempo de 10ms.
0.04 15 (33)
() = 5 + + 0.2
15
1+
49
Figura 24-Sistema de posio com controlador PID
Na figura 25, as trs respostas, controlador PI, controlador PI com aumento de Kp e controlador
PID, foram plotadas. possvel ver de forma mais ntida ainda como o aumento de Kp deixa o
sistema mais rpido, porm, tendendo a oscilar. E como a introduo do termo derivativo com
o ganho Kd consegue amortecer a resposta.
Outro fator que influencia diretamente na resposta do sistema, o coeficiente do filtro do termo
derivativo do PID. Foram efetuados vrios testes utilizando o mesmo controlador PID, apenas
variando esse coeficiente.
50
Na figura 26 possvel conferir as respostas do sistema obtidas com esses testes. Valores
grandes de N suprimem o efeito do filtro, e tem-se apenas o efeito derivativo. Para valores
pequenos, a filtragem tem mais efeito, porm, um polo lento adicionado em N, reduzindo o
amortecimento produzido pelo zero na origem do controlador.
Para testar o efeito que a derivada da sada provoca no sinal de controle e na resposta do sistema,
foram utilizados os dois tipos de PID com os mesmos valores de ganhos e coeficiente de filtro
para efetuar o controle de posio. As respostas do sistema de posio esto figura 27 e as
equaes dos controladores podem ser vistas a seguir:
(34)
() 1 10
= 1.3 + + 0.3
() 1 + 10
1 10 (35)
() = 1.3() +
() + 10 0.2()
1+
51
Figura 27- Comparativo entre PID com derivada da sada e derivada do erro.
Nota-se (figura 27), que a derivada do erro provoca um incremento muito grande no sinal de
controle quando ocorre mudana de referncia, o que indesejvel em praticamente todos os
sistemas de controle. Existe tambm um efeito na resposta do sistema, o tempo de assentamento
utilizando o PID com derivada da sada menor do que utilizando a derivada do erro.
52
Como foi dito no incio desse captulo, o tempo de amostragem tem um papel crucial no controle
de sistemas. Para evidenciar esse fato, foram feitos testes no sistema de posio utilizando o
mesmo controlador PID da equao (33). As curvas da resposta do sistema para uma entrada
do tipo degrau de 3V com diferentes tempos de amostragem podem ser conferidas na figura 28.
Fica bem claro que a utilizao de tempos de amostragem muito altos pode ser prejudicial ao
controle de sistemas. Nota-se que utilizando 40ms de tempo de amostram a resposta do sistema
muito oscilatria. Por isso a importncia de ter-se uma plataforma que alm de prover o
controle em tempo real, tambm permita a amostragem do sinal em tempos de amostragem
pequenos se comparado constante de tempo da planta.
53
Com ganhos Kvel e Kpos iguais a 1 e 3 respectivamente, foi obtida um bom transitrio para a
resposta do sistema de posio. As curvas das simulaes e das respostas reais do sistema, como
tambm do sinal de controle, podem ser visualisadas na figura 30.
Para eliminar o erro estacionrio necessrio que a malha seja e fechada e o erro entre a
referncia e a sada seja integrado, alm de adicionar-se um ganho. Abaixo pode-se ver como
fica a realimentao de estados com a integral do erro.
Figura 31-Diagrama de blocos do sistema de controle por realimentao de estados com integral do erro
Escolheu-se um valor de K que fizesse com que a resposta do sistema fosse sobreamortecida
como no sistema sem a integral do erro, mas que zerasse o erro estacionrio.
Com um ganho K=6 e mantendo Kvel e Kpos com mesmos ganhos utilizados anteriormente
conseguiu-se alcanar o objetivo. Todas as curvas de resposta podem ser visualizadas na figura
32.
Com essa plataforma tem-se a flexibilidade de se criar qualquer tipo de entrada desejada para
aplicar ao sistema. Por isso, para efeito de teste, aplicou-se uma entrada do tipo rampa tanto no
sistema de velocidade, como no de posio, e analisou-se os resultados obtidos.
Controlador P
Como o sistema de velocidade do tipo zero, o erro de estado estacionrio tende ao infinito
com a utilizao de um controlador proporcional apenas. Como pode ser visto na figura 33.
Controlador PI
Com um controlador proporcional-integral eleva-se o sistema para tipo 1, com isso o erro de
estado estacionrio tende a um valor finito, o que pode ser visualizado na figura 34.
Controlador P
O sistema de posio j um sistema de tipo 1, com isso, diferentemente do sistema de posio,
o erro de estado estacionrio possui um valor finito quando utilizado um controlador
proporcional.
Controlador PI
Quando utilizado um controlador proporcional-integral, o erro estacionrio zerado, pois o
sistema resultante do tipo 2, ou seja, 2 polos na origem. (Figura 36)
6 CONCLUSO
Chegando ao final desse projeto, possvel dizer que todos os objetivos almejados foram
conquistados. Foi possvel elaborar uma plataforma de aquisio de dados, monitoramento e
controle em tempo real que permitisse a coleta das amostras em tempos de amostragem
pequenos e que tivesse um sistema de controle de erros para o usurio. Portanto, uma plataforma
mais eficiente do que a utilizada atualmente na disciplina de Laboratrio de Controle.
O controle em tempo real foi possvel graas utilizao do Arduino, com o qual fez-se uso de
temporizadores que permitiram a coleta das amostras em tempos de amostragem definidos, e
tambm devido presena do grande buffer no MATLAB, que garantiu que as amostras
enviadas no seriam perdidas.
O presente trabalho serviu tambm para pessoalmente entender vrios conceitos de controle e
eletrnica que foram vistas durante o curso de graduao. Foi possvel entender melhor, por
exemplo, como o processo de discretizao de um controlador PID e a implementao dele
em um hardware como o Arduino. E entender tambm como cada termo desse controlador
influencia a resposta de um sistema.
Alunos de iniciao cientfica ou em fase de concluso de curso podero usar esse trabalho
como base para outros projetos na a rea de controle e automao. Por meio dele ser possvel
implementar algoritmos de controle sem grandes dificuldades, pois foi feita uma documentao
detalhada nesse trabalho, o que permitir que o aluno tire suas dvidas a respeito do
funcionamento da plataforma. Com isso, ela poder ser eventualmente melhorada para o uso da
comunidade universitria, seja da prpria UFES, seja de outras universidades pelo pas.
60
7 BIBLIOGRAFIA
IBRAHIM, D. Microcontrooler Based Applied Digital Control. 1. Ed. West Sussex: John
Wiley & Sons Ltd. 2006.
NILSON, J.W.; RIEDEL, S.A.; Circuitos Eltricos. 6.ed. Rio de Janeiro: LTC.2003
%%Projeto de Graduao
%%Aluno: Leonardo Lyrio Marconi
%%Orientador:Celso Jos Munaro
%%Ultima edio: Maro/2015;
%%
%%
%%----------------------------------------------------%%
%%------------Estabelece a comunicao Serial---------%%
%%----------------------------------------------------%%
delete(instrfind({'Port'},{'COM6'}));
portaserial=serial('COM6');
portaserial.BaudRate=115200;
portaserial.InputBufferSize=600000; %100 mil amostras
fopen(portaserial);
pause(2);
%%
%%-----------------------------------------------------%%
%%-------Inicializa os valores de algumas variveis----%%
%------------------------------------------------------%%
vetor=0;vetorAR=0;degrauAR=0;degrau=0;totalvar=0;
P2=1; %0-DAC0 1-DAC1
Ganhos=[0 0 0 0];
Tamdados=4; % Pq 4 ? -> |Ts | Quantidade de amostras |P1 |P2|
TamGanho=4; % Pq 4 ? -> |Kp |Ki|Kd|Nfiltro|
%%
%%----------------------------------------------------%%
%%---------O usurio ir escolher agora :-------------%%
%%----------------------------------------------------%%
switch(entrada)
case 1
%-----------------------------%
load Degrau5;Input=Degrau5; %-Escolha do usurio
%-----------------------------%
P1=0;
case 2
%-----------------------------%
load PRBS5 ;Input=PRBS5; %-Escolha do usurio
63
%-----------------------------%
P1=0;
case 3
Controle=input('1-PID D(sada), 2-PID D(entrada), 3-Realimentao \n');
switch(Controle)
case 1
%---------------------------%
load Degrau4;Input=Degrau4; %->Escolha do usurio
%----------------------------%
Kp=1;Ki=3;Kd=0.2;Nfiltro=100; %->Escolha do usurio
%----------------------------%
P1=1;Ganhos=[Kp Ki Kd Nfiltro];
case 2
%--------------------------%
load Degrau4;Input=Degrau4; %-> Escolha do usurio
%--------------------------%
Kp=1.3;Ki=1;Kd=0.3;Nfiltro=10; %-> Escolha do usurio
%--------------------------%
Ganhos=[Kp Ki Kd Nfiltro];P1=2;
case 3
%---------------------------%
load Degrau4;Input=Degrau4; %-> Escolha do usurio
%---------------------------%
Kvel=1;Kpos=3;K=0; %-> Escolha do usurio
%----------------------------%
Ganhos=[Kvel Kpos K 0];P1=3;
end
end
%---------------------------------------------------%%
%%----------Vetor de dados que ser enviado----------%
%%---------------------------------------------------%%
u=[tsIN NamostrasIN P1 P2 Ganhos Input];
N=length(u);
Nvet=uint16(N);
Nvet=typecast(Nvet,'uint8');
fprintf(portaserial,'m');
%%
%-----------------------------------------------------------------------%
% ENVIA O TAMANHO DO VETOR DE DADOS PARA O ARDUINO %
%-----------------------------------------------------------------------%
fwrite(portaserial,Nvet,'uint8');
%-----------------------------------------------------------------------%
% RECEBIMENTO DA SINALIZAO AFIRMANDO QUE O %
% ADUINO RECEBEU O TAMANHO DO VETOR DE DADOS %
%-----------------------------------------------------------------------%
a=tic;
64
while(portaserial.BytesAvailable<2)
b=toc(a);
if(b>1)
fprintf('O Arduino no recebeu corretamente o tamanho do vetor de
dados');
return;
end
end;
Tamvet=fread(portaserial,1,'uint16');
if(Tamvet~=N)
fprintf('O Arduino no recebeu corretamente o tamanho do vetor de
dados'); %ERRO3
end
%%
%-------------------------------------------------------------------------%
% ENVIO DO VETOR DE DADOS PARA O ARDUINO %
%-------------------------------------------------------------------------%
for k=1:1:length(u);
vetorIN = u(k);
if(k>Tamdados+TamGanho)
vetorIN = 0.11*vetorIN+1.65; % -15 a 15 0 ~
3.3 V
vetor(k) = round(((4095/3.3)*vetorIN)); % 0 ~ 3.3V 0 ~
4095
%-----------------------------------------------------%
else
vetor(k) = u(k);
end
a=tic;
while(portaserial.BytesAvailable<1)
65
b=toc(a);
if(b>1)
fprintf('O Arduino no conseguiu receber todos os dados');
fclose(portaserial);
delete(portaserial);
return;
end
end;
Flag2=fread(portaserial,1,'uint8');
if(Flag2==0)
fprintf('O Arduino no conseguiu receber todos os dados \n');
return
end
fprintf(portaserial,'s');
%%
%------------------------------------------------------------------------%%
% AQUISIO DOS DADOS %
%-------------------------------------------------------------------------%
k=1;
for k=1:1:NamostrasIN
a=tic;
while(portaserial.BytesAvailable<6) %Informar a quantidade de dados
chegou.
b=toc(a);
if(b>10)
fprintf('A quantidade de amostras esperadas no chegou');
fclose(portaserial);
delete(portaserial);
return;
end
end
v1(k)=fread(portaserial,1,'uint16');
v2(k)=fread(portaserial,1,'uint16');
v3(k)=fread(portaserial,1,'uint16');
tambuffer2(k)=portaserial.BytesAvailable;
k=k+1;
end
%----------------------------------------------------%
%------------Fecha a comununicao Serial-------- ---%
%-----------------------------------------------------%
fclose(portaserial);
delete(portaserial);
%
66
%void monitoramento;
uint16_t Msig; %Bits Mais signoficativos
uint16_t Lsig; %Bits Menos significativos
uint16_t NvetLs=0;
uint16_t NvetMs=0;
double ts; %tempo de amostragem
uint16_t Namostras; %Nmero de amostras
if(_contmaster >=Namostras){
analogWrite(DAC0,2047);
analogWrite(DAC1,2047);
Timer3.stop();
_contmaster=1;
}
if(P1==0){
if(P2==0){
analogWrite(DAC0,vetdados[_contmaster-1]);
}
else if(P2==1){
analogWrite(DAC1,vetdados[_contmaster-1]);
}
}
noInterrupts();
v1=x;v3=z;
if(P1!=0){
PID();
}
w=SC;v2=w;
v1L=(uint8_t)v1;v1U=(uint8_t)(v1>>8);
v2L=(uint8_t)v2;v2U=(uint8_t)(v2>>8);
v3L=(uint8_t)v3;v3U=(uint8_t)(v3>>8);
%Envia os valores amostrados para o Matlab
Serial.write(v1L);Serial.write(v1U);
Serial.write(v2L);Serial.write(v2U);
Serial.write(v3L);Serial.write(v3U);
interrupts();
_contmaster++;
}
%--------------------------------------------------------------------------
----%
void Start(){
Timer3.start(ts);
}
%--------------------------------------------------------------------------
-----%
void Decodifica(){
ts=VetDados[0];
ts=ts*1000;
Namostras=VetDados[1];
T = (ts/1000000);
%*******************************************************************%
%*******************PID-derivada da sida***************************%
%*******************************************************************%
if(P1==1){
68
Kp=VetGanhos[0];
Ki=VetGanhos[1];
Kd=VetGanhos[2];
N=VetGanhos[3];
if((Kd==0)&&(Ki==0)){ %P
a0=Kp;
}
else if((Kd==0)&&(Ki!=0)){ %PI
a0=Kp+Ki*T;
a1=-Kp;
a2=0;
}
else if((Kd!=0)&&(Ki==0)){ %PD
a0=(1+N*T);
a1=1;
b0=Kp+Kp*N*T;
b1=-Kp;
c0=-Kd*N;
c1=Kd*N;
A=a1/a0;B=b0/a0;C=b1/a0;D=c0/a0;E=c1/a0;
}
else{ %PID
b0=(1+N*T)*(Kp+Ki*T);
b1=Kp*(-N*T-2)-Ki*T;
b2=Kp;
a0=(1+N*T);
a1=-(-N*T-2);
a2=-1;
c0=-Kd*N;
c1=2*Kd*N;
c2=-Kd*N;
A=a1/a0;B=a2/a0;C=b0/a0;D=b1/a0;E=b2/a0;F=c0/a0;G=c1/a0;H=c2/a0;
}
}
%**************************************************%
%*****************PID-derivada do erro*************%
%**************************************************%
else if(P1==2){
Kp=VetGanhos[0];
Ki=VetGanhos[1];
Kd=VetGanhos[2];
N=VetGanhos[3];
if((Kd==0)&&(Ki==0)){ %P
a0=Kp;
}
69
A=a1/a0;B=b0/a0;C=b1/a0;
}
else{ %PID
a0=(1+N*T);
a1=-(2+N*T);
a2=1;
b0=Kp*(1+N*T)+Ki*T*(1+N*T)+N*Kd;
b1=-(Kp*(2+N*T)+Ki*T+2*N*Kd);
b2=Kp+N*Kd;
A=(a1/a0); B=(a2/a0); C=(b0/a0); D=(b1/a0); E=(b2/a0);
}
}
%*********************************************************%
%****************Realimentao de estados*****************%
%*********************************************************%
else if(P1==3){
Kvel=VetGanhos[0];
Kpos=VetGanhos[1];
Ki=VetGanhos[2];
a0=Ki*T;
}
Start();
}
%--------------------------------------------------------------------------
---%
void VetorDados(){
uint8_t time1,time2,passou,k,j=0;
uint16_t Ls,Ms;
binaryFloat Ganho;
time1=millis();
while(Serial.available()<3){ % 1 byte -> lixo, 2 byte -> primeiro
valor.
time2=millis();
passou=time2-time1;
if(passou>1000){
%**ERRO1**%
%Envia um cdigo de erro ao Matlab informado que
%o tamanho do vetor de dados no foi recebido pelo Arduino
70
% Flag1=0;
% Serial.write(Flag1);
return;
}
}
lixo=Serial.read();
NvetLs=Serial.read();
NvetMs=Serial.read();
Nvet=NvetMs*256+NvetLs;
%*********************************************************************%
%*****************Loop de recebimento do vetor de dados***************%
%*********************************************************************%
for(i=0;i<Nvet;i++){
time1=millis();
while(Serial.available()<2){
time2=millis();
passou=time2-time1;
if(passou>1000){
%Se ocorrer erro na leitura de alguma possio do vetor,isto ,se o nmero
de dados que chegar
%no for o esperado o Matlab ser informado.
%** ERRO2** %
Flag1=0;
Serial.write(Flag1);
return;
}
}
Tamdados=4;
%******************************************************%
if(i>=0&&i<Tamdados){
Ls=Serial.read();
Ms=Serial.read();
VetDados[i]=Ms*256+Ls;
}
P1=VetDados[2];
P2=VetDados[3];
%******************************************************%
%*******************************************************%
if(TamGanho!=0 && i>(Tamdados-1) && i<=(Tamdados-1)+TamGanho){
71
while(Serial.available()<4);
for(j=0;j<4;j++){
Ganho.binary[j] =Serial.read(); %7.4761e-27
}
VetGanhos[i-Tamdados]=Ganho.floatingPoint;
}
%********************************************************%
if(i>((Tamdados-1)+TamGanho)){
Ls =Serial.read();
Ms =Serial.read();
vetdados[i-(Tamdados+TamGanho)]=Ms*256+Ls; %vetdados =
entrada do sistema.
}
}
%*************************************************************************%
%*****************Fim do recebimento das informaes**********************%
%*************************************************************************%
Flag1=1;
Serial.write(Flag1);
}
void PID(){
if(_contmaster==1){
erro[0]=0;erro[1]=0;erro[2]=0;
u[0]=0;u[1]=0;u[2]=0;
y[0]=0;y[1]=0;y[2]=0;
}
erro[0] = erro [1]; % ek-2 = ek-1;
erro[1] = erro [2]; % ek-1 =ek;
erro[2] = vetdados[_contmaster-1] - v1; %Referncia - Sada
%****************************************************************%
%******************PID-derivada da sada*************************%
%****************************************************************%
if(P1==1){
y[0]=y[1];
y[1]=y[2];
saida=mapfloat(v1,0,4095,-15,15);
y[2]=saida;
u[0] = u[1];
u[1] = u[2];
if((Ki==0)&&(Kd==0)){ %P
u[2]=a0*erro[2];
SC=u[2]+2048;
}
else if((Kd!=0)&&(Ki==0)){
%PD
u[2]=A*u[1]+B*erro[2]+C*erro[1]+D*y[2]+E*y[1];
SC=u[2]+2048;
}
else if((Ki!=0)&&(Kd==0)){
%PI
u[2] = u[1] + a0*erro[2] + a1*erro[1];
SC=u[2]+2048;
}
else{
72
u[2] = A*u[1]+B*u[0]+C*erro[2]+D*erro[1]+E*erro[0]+F*y[2]+G*y[1]+H*y[0];
%PID
SC=u[2]+2048;
}
%SC=(int)SC;
if(SC>4095){
SC=4095;
}
if(SC<0){
SC=0;
}
}
%*******************************************************%
%****************PID-derivada do erro*******************%
%*******************************************************%
else if(P1==2){
u[0] = u[1];
u[1] = u[2];
if((Ki==0)&&(Kd==0)){ %P
u[2]=a0*erro[2];
SC=u[2]+2048;
}
else if((Ki!=0)&&(Kd==0)){ %PI
u[2] = u[1] + a0*erro[2] + a1*erro[1];
SC=u[2]+2048;
}
else if((Kd!=0)&&(Ki==0)){ %PD
u[2]=-A*u[1]+B*erro[2]+C*erro[1];
SC=u[2]+2048;
}
else{ %PID
u[2] = -A*u[1]-B*u[0]+C*erro[2]+D*erro[1]+E*erro[0];
SC=u[2]+2048;
}
SC=(int)SC;
if(SC>4095){
SC=4095;
}
if(SC<0){
SC=0;
}
}
%************************************************************%
%***************Realimentao de estados********************%
%************************************************************%
else if(P1==3){
u[1] = u[2];
if(Ki!=0){
u[2] = u[1] + a0*erro[2]; %Com Integral do erro.
ref=u[2]+2048;
ref=mapfloat(ref,0,4095,-15,15);
}
else{
ref=vetdados[_contmaster-1]; %Sem Integral do erro.
ref=mapfloat(ref,0,4095,-15,15);
}
pos=x; %116; %0.5 -15/+15
vel=z; %225; %1.3 -15/+15
vel=mapfloat(vel,0,4095,-15,15);
73
pos=mapfloat(pos,0,4095,-15,15);
SC=ref-Kpos*pos-Kvel*vel; %Referncia - Kvel*vel- Kpos*pos.
%SC=SC+2048;
if(SC>15){
SC=15;
}
else if(SC<-15){
SC=-15;
}
SC=mapfloat(SC,-15,15,0,4095);
SC=int(SC);
SC=SC;
}
%***************************************************************%
if(P2==0){
analogWrite(DAC0,SC); % 0 a 4095
}
else if(P2==1){
analogWrite(DAC1,SC); % 0 a 4095
}
}
%********************************************************************%
%*******************Conversor de escalas*****************************%
%***********0~4095 para -15/15V ou -15/15V para 0 a 4095*************%
%********************************************************************%
void setup(){
analogReadResolution(12);
analogWriteResolution(12);
analogWrite(DAC0,2047);
analogWrite(DAC1,2047);
Serial.begin(115200);
Timer3.attachInterrupt(SerialData);
}
%--------------------------------------------------------------------------
----%
void loop(){
ch=Serial.read();
switch(ch){
case 'm':
VetorDados();
break;
case 's': %Depois que enviamos todas as informaes,
iniciamos a amostragem.
Decodifica();
break;
deafault:
break;
}
}
74