matheus pilotto fi gueiredo 2013 -...
TRANSCRIPT
Controle indireto de vazã
medição de velocidade a partir da força
Curso de Engenharia Elétrica
Monografia do Projeto de Fim de Curso
Controle indireto de vazão em uma bomba de infusão
velocidade a partir da força contra-eletromotriz
Matheus Pilotto Fi
Curso de Engenharia Elétrica
Monografia do Projeto de Fim de Curso
o em uma bomba de infusão com
eletromotriz do
motor
theus Pilotto Figueiredo
2013
Instituto Federal de Educação, Ciência e Tecnologia Sul-rio-grandense
Departamento de Ensino de Graduação e Pós-Graduação
Campus Pelotas
Curso de Engenharia Elétrica
Matheus Pilotto Figueiredo
Orientador: Prof. Dr. Carlos Mendes Richter
Co-orientador: Prof. Dr. Adão Antônio de Souza Júnior
Controle indireto de vazão em uma bomba de infusão com medição de
velocidade a partir da força contra-eletromotriz do motor
Monografia do Projeto de Fim de Curso
Pelotas, RS
2013
Instituto Federal de Educação, Ciência e Tecnologia Sul-rio-grandense
Departamento de Ensino de Graduação e Pós-Graduação
Curso de Engenharia Elétrica
Monografia do Projeto de Fim de Curso
Controle indireto de vazão em uma bomba de infusão com
medição de velocidade a partir da força contra-eletromotriz
do motor
Matheus Pilotto Figueiredo
Relatório submetido como requisito parcial
para obtenção do grau de Engenheiro Eletricista
Banca Examinadora
Prof. Carlos Mendes Richter, Dr (Orientador)
Prof. Adão Antônio de Souza Júnior, Dr. (Co-orientador)
Prof. Mauro André Barbosa Cunha, Dr (Examinador)
Prof. Cláudio Luis d’Elia Machado (Examinador)
CESSÃO DE DIREITOS
AUTOR: Matheus Pilotto Figueiredo
TÍTULO: Controle indireto de vazão em uma bomba de infusão com medição de velocidade
a partir da força contra-eletromotriz do motor
GRAU: Engenheiro Eletricista ANO: 2013
É concedida ao Instituto Federal de Educação, Ciência e Tecnologia Sul-rio-grandense permissão para reproduzir cópias desta monografia de graduação e para emprestar ou vender tais cópias somente para propósitos acadêmicos e científicos. O(s) autor(es) reserva(m) outros direitos de publicação e nenhuma parte desta monografia de graduação pode ser reproduzida sem autorização por escrito do(s) autor(es).
Matheus Pilotto Figueiredo Rua Benjamin Constant, 1254 96010-020 – Pelotas – RS – Brasil
Dedico este trabalho às pessoas que contribuíram para minha formação acadêmica e
humana desde a infância até hoje, em especial minha mãe, meu pai e familiares.
Agradeço a essas pessoas com grande carinho.
Agradecimentos
Agradeço ao professor Carlos Mendes Richter pela orientação e acompanhamento deste
trabalho.
Agradeço ao professor Adão Antônio de Souza Júnior, pois atuou como co-orientador, com
interesse e efetivo auxílio em termos de idéias e orientação. Além disso, agradeço por ter me
convidado a pesquisar no GET (Grupo de Eletrônica e Telecomunicações), o que foi o ponto
de partida deste trabalho.
Agradeço à Lifemed e ao Fabrício Ferreira Neitzke pela disponibilização do mecanismo
peristáltico, dos equipos e pelas informações fornecidas para realização deste trabalho.
Agradeço ao professor Mauro André Barbosa Cunha por ter sido um dos grandes professores
que tive no IFSUL, tanto como profissional quanto como ser humano. Agradeço também
pelas oportunidades que me proporcionou de participar em trabalhos de pesquisa e
desenvolvimento técnico-científico.
Agradeço aos professores e servidores do IFSUL como um todo pela formação que me foi
proporcionada durante todos esses anos, no ensino médio, no Curso Técnico de Eletrônica e
no Curso de Graduação em Engenharia Elétrica.
Agradeço aos amigos e colegas que conheci no IFSUL pelo convívio, alegria e
companheirismo.
Resumo
Este projeto de fim de curso tem como objeto de estudo uma bomba de infusão
produzida pela empresa de engenharia biomédica Lifemed. Nessa bomba não há sensor de
vazão, mas o valor médio dessa variável é proporcional à velocidade do eixo do mecanismo
peristáltico da bomba. Realiza-se, então, controle indireto da vazão a partir do controle da
velocidade desse eixo.
Com o objetivo de melhorar o rendimento, aumentando a autonomia da bomba quando
alimentada por bateria, utiliza-se um motor DC acionado por sinal PWM em vez do motor de
passo já utilizado comercialmente.
Visando a atingir uma faixa de vazões e precisão adequadas para utilização comercial
e atendimento da norma, é feita uma caracterização funcional da planta atual e a especificação
de um novo conjunto de motor, redução e encoder.
Para compensar a baixa resolução do encoder atual, utiliza-se a velocidade medida a
partir da força contra-eletromotriz do motor. A medição da velocidade é precedida de um
ensaio de calibração em que se utiliza, dentre outros, o método dos mínimos quadrados. Com
base nesse ensaio prévio, as constantes de calibração são recalculadas automaticamente em
tempo de execução.
Dada sua efetividade e simplicidade, é implementado um controlador PID utilizando a
técnica de lugar das raízes. É feito controle direto da posição em vez da velocidade, evitando
erros cumulativos de volumetria.
O erro de posição de regime permanente fica na faixa de ±13% da resolução do
encoder, ficando claro o aumento da resolução equivalente da medida, assim como o bom
funcionamento do controlador PID.
Palavras-chave: Bomba de infusão. Controle indireto de vazão. Motor DC acionado por sinal
PWM. Medida de velocidade a partir da força contra-eletromotriz do motor. Controlador PID.
Abstract
This work’s study object is an infusion pump developed by the biomedical engineering
company Lifemed. The pump isn’t equipped with a flow rate sensor, but the mean value of
that variable is proportional to the speed of the pump’s peristaltic mechanism axis. As a
result, indirect flow rate control is performed by the direct control of the speed of that axis.
In order to improve the efficiency, increasing battery life, a DC motor along with
PWM control signal is used instead of the former stepper motor.
Aiming to reach adequate flow rate range and precision for commercial use and
standards compliance, a functional characterization of the current system and the specification
of a new set of motor, gearhead and encoder is made.
Compensating the poor resolution of the encoder, the speed is measured through the
back electromotive force and used. The speed measurement is preceded by a calibration
experiment in which three methods, including least squares, are used. Based on this
experiment, the calibration constants are recalculated automatically during execution time.
Due to it’s effectiveness and simplicity, a PID controller is implemented using the root
locus method. Position is directly controlled instead of speed, avoiding cumulative volumetric
errors.
Steady state position error is bounded to the range of ±13% of the encoder resolution,
showing clear improvement in the equivalent resolution of the measurement as well as a good
performance of the PID controller.
Keywords: Infusion pump. Indirect flow rate control. DC motor PWM control. Back EMF
speed measurement. PID controller.
Lista de Figuras
Figura 1 Espira simples imersa em um campo magnético constante ...................... 19
Figura 2 Disposição das bobinas em um motor e força contra-eletromotriz gerada
21
Figura 3 Tensão de ripple nas escovas do motor da Figura 2 ................................. 22
Figura 4 Configuração atual da planta .................................................................... 27
Figura 5 Ensaio com equipo, sem líquido de infusão ............................................. 28
Figura 6 Diagrama de blocos do PIC18F4550 ........................................................ 35
Figura 7 Configurações de oscilador disponíveis no PIC18F4550 ......................... 37
Figura 8 Circuito ICSP ............................................................................................ 38
Figura 9 Remapeamento dos vetores de reset e interrupção no compilador C CCS
39
Figura 10 Diagrama de blocos do Timer0 ................................................................ 40
Figura 11 Diagrama de blocos simplificado da função PWM do módulo CCP ....... 41
Figura 12 Cálculo do período do sinal PWM ........................................................... 41
Figura 13 Calculo da resolução do sinal PWM ........................................................ 42
Figura 14 Diagrama de blocos do Timer1 ................................................................ 42
Figura 15 Fluxograma do mecanismo de manutenção do tempo de amostragem .... 43
Figura 16 Circuito de medição da força contra-eletromotriz do motor .................... 46
Figura 17 Ensaio em alta velocidade para determinação do tempo do transitório
elétrico devido à indutância do motor ...................................................................................... 47
Figura 18 Ensaio em baixa velocidade para determinação do tempo do transitório
elétrico devido à indutância do motor ...................................................................................... 48
Figura 19 Sinal de entrada: duty cycle usado no ensaio de calibração ..................... 54
Figura 20 VAN0DIG medida pelo PIC .......................................................................... 55
Figura 21 TMR0, Pulsos do encoder durante todo o ensaio ..................................... 56
Figura 22 TMR0, Pulsos do encoder durante os 10s iniciais do ensaio ................... 56
Figura 23 Integral da velocidade teórica comparada com a posição dada pelo
encoder 57
Figura 24 Posição combinando os pulsos do encoder com a integração da
velocidade teórica 58
Figura 25 Ampliação da Figura 24 ........................................................................... 59
Figura 26 Erro percentual entre a posição dada pelo encoder e a posição obtida
integrando a velocidade teórica entre os pulsos deste .............................................................. 60
Figura 27 Ampliação da Figura 26 ........................................................................... 60
Figura 28 Integral da velocidade calibrada pelo método dos mínimos quadrados ... 61
Figura 29 Ampliação da Figura 28 ........................................................................... 62
Figura 30 Posição combinando os pulsos do encoder com a integração da
velocidade ajustada pelo método dos mínimos quadrados ....................................................... 63
Figura 31 Erro percentual entre a posição dada pelo encoder e a posição obtida
integrando a velocidade ajustada pelo método dos mínimos quadrados entre os pulsos deste 63
Figura 32 Ampliação da Figura 31 ........................................................................... 64
Figura 33 Representação dos números em ponto flutuante do PIC usando o
compilador CCS 65
Figura 34 Resposta de velocidade do sistema à entrada aplicada ............................. 67
Figura 35 Trecho do ensaio utilizado para identificação do sistema ........................ 68
Figura 36 Diagrama de blocos do sistema com o controlador .................................. 70
Figura 37 Lugar das raízes do sistema compensado ................................................. 71
Figura 38 Controlador PID com anti wind-up da ação integral ................................ 72
Figura 39 Comparação entre a posição de referência e a posição medida – 99,36
ml/h 73
Figura 40 Sinal de erro – 99,39ml/h ......................................................................... 74
Figura 41 Ampliação da Figura 40 ........................................................................... 75
Figura 42 Sinal de controle ....................................................................................... 76
Figura 43 Comparação entre a posição de referência e a posição medida – 1 ml/h . 77
Lista de Tabelas
Tabela 1 Ensaio com equipo, sem líquido de infusão ............................................. 28
Lista de Abreviaturas e Siglas
MOSFET Metal-Oxide-Semiconductor Field Effect Transistor
USB Universal Serial Bus
CDC Communications Device Class
rpm Rotações por Minuto
ppr Pulsos por Rotação
pps Pulsos por Segundo
PWM Pulse Width Modulation
USART Universal Synchronous Asynchronous Receiver Transmitter
HID Human Interface Device
Lista de Símbolos
Fr
Vetor força
i Corrente elétrica com sentido convencional
lr
Vetor comprimento de um condutor reto, com sentido dado pela corrente
convencional
Br
Vetor densidade de fluxo magnético
l Vetor unitário comprimento de um condutor reto, com sentido dado pela
corrente convencional
B Vetor unitário densidade de fluxo magnético
B Intensidade do vetor densidade de fluxo magnético
l Comprimento de um condutor
τr
Vetor torque
rr
Vetor raio, apontando para fora
r Raio
τ Vetor unitário torque
U Tensão aplicada aos terminais do motor
Rm Resistência dos enrolamentos do motor, medida a partir de seus terminais
ke Constante de força contra-eletromotriz do motor
ω Velocidade angular do motor
kr Constante de torque do motor
L Indutância do motor
J Momento de inércia da carga acoplada ao motor
t Tempo
b Constante de atrito viscoso
N Valor da redução
η Rendimento da redução
DDV Tensão de alimentação do motor
θ∆ Deslocamento angular do motor
0a Constante de calibração
1a Constante de calibração
k Constante de calibração
Sumário
1 Introdução ............................................................................................................. 17
1.1 Objetivos ................................................................................................................................... 18
2 Fundamentos teóricos de funcionamento do motor DC com escovas .................. 19
3 Caracterização física e funcional da planta .......................................................... 26
3.1 Descrição física da planta ......................................................................................................... 26
3.2 Primeiro ensaio de caracterização funcional ............................................................................ 27
3.3 Análise dos resultados do primeiro ensaio ............................................................................... 29
4 Especificação de um novo conjunto de motor, redução e encoder ...................... 31
5 O circuito de processamento, aquisição, controle e comunicação de dados ........ 34
5.1 O microcontrolador ................................................................................................................... 34
5.2 Gravação do microcontrolador ................................................................................................. 38
5.3 Contagem de pulsos do encoder ............................................................................................... 39
5.4 Geração de sinal PWM .............................................................................................................. 40
5.5 Manutenção do tempo de amostragem ................................................................................... 42
5.6 Comunicação de dados com o computador .............................................................................. 44
5.7 Medição da posição/velocidade a partir da força contra-eletromotriz do motor .................... 45
5.7.1 O circuito e o método de medição da força contra-eletromotriz ................................... 46
5.7.2 Desenvolvimento matemático ........................................................................................ 48
5.7.3 Cálculo computacional das constantes de calibração ..................................................... 53
6 Controle de velocidade/posição ............................................................................ 65
6.1 Introdução ................................................................................................................................. 65
6.2 Levantamento da função de transferência ............................................................................... 66
6.3 Projeto do controlador PID ....................................................................................................... 69
6.4 Resultados da implementação prática do controlador PID ...................................................... 73
7 Conclusão ............................................................................................................. 78
8 Sugestões para trabalhos futuros .......................................................................... 79
9 Referências Bibliográficas .................................................................................... 80
Apêndice A – Circuitos eletrônicos .............................................................................. 81
Apêndice B – Programa MATLAB para aquisição de dados do ensaio de calibração 83
Apêndice C – Programa MATLAB para análise dos dados do ensaio de calibração do
motor 86
Apêndice D – Programa MATLAB para aquisição de dados do ensaio de controle.... 92
Apêndice E – Programa MATLAB para análise dos dados do ensaio de controle ...... 94
Apêndice F – Programa do microcontrolador em C do compilador CCS .................... 96
Anexo A – Características do motor DC 16N78-212E .............................................. 110
Anexo B – Características da redução R16 ................................................................ 111
17
1 Introdução
Este trabalho é fruto de um convênio de pesquisa estabelecido entre o Grupo de
Eletrônica e Telecomunicações (GET) do Instituto Federal Sul-rio-grandense (IFSUL),
campus Pelotas, e a empresa de engenharia biomédica Lifemed. Foi disponibilizado para este
trabalho o mecanismo peristáltico da bomba de infusão LF SMART, equipado com motor
DC, redução e encoder.
Uma bomba de infusão é um aparelho eletromédico utilizado para infusão enteral (via
trato digestivo) ou parenteral (via sistema circulatório) de alimento e medicamentos em um
paciente sob tratamento médico. Ela produz uma pressão positiva de forma a manter uma
vazão constante durante certo período de tempo. A manutenção da vazão constante possibilita
um tratamento mais efetivo do paciente.
Para gerar uma pressão positiva, normalmente utiliza-se um motor, que acaba sendo o
elemento de maior consumo de energia do sistema devido ao trabalho mecânico que realiza.
Atualmente muitas bombas são alimentadas por bateria como fonte redundante de energia, o
que melhora a confiabilidade das mesmas em relação à falta de energia elétrica. Assim,
considerando a autonomia de energia do sistema quando alimentado por bateria, é de grande
importância a utilização de um conjunto de motor e redução de maior rendimento assim como
o melhoramento das técnicas de acionamento eletrônico, diminuindo a dissipação de energia
na etapa de potência.
Com relação ao sensoriamento da vazão, muitas vezes este não é feito diretamente,
devido ao seu maior custo e complexidade. Na bomba utilizada neste trabalho, o mecanismo
peristáltico foi projetado de forma a gerar uma vazão média proporcional à velocidade de seu
eixo. Assim, aqui será realizado um controle indireto da vazão por meio do controle da
velocidade do eixo do mecanismo peristáltico. Para que o controle indireto seja bem sucedido,
é essencial a execução de ensaios de calibração da relação entre a vazão e a velocidade do
eixo do mecanismo peristáltico, o que de fato já foi feito pela empresa Lifemed.
Para o sensoriamento da posição/velocidade de motores em sistemas digitais,
normalmente se utiliza encoders incrementais acoplados ao eixo do motor ou ao eixo de
controle, após a redução. Ocorre, no entanto, que isso gera custos adicionais para importação
18
de motores já equipados com encoders, ou então, um aumento no tempo e complexidade da
montagem das bombas, dada a necessidade de acoplamento desse sensor.
Considerando os fatores apontados nos parágrafos logo acima, são apresentados os
objetivos deste trabalho.
1.1 Objetivos
Visando a aumentar a autonomia do sistema quando alimentado por bateria, esse
trabalho tem como objetivo a utilização de um motor DC com escovas acionado por sinal
PWM. Essa escolha justifica-se pelo fato de que o motor DC apresenta maior rendimento do
que o motor de passo, já utilizado comercialmente na bomba deste projeto. Além disso, o
acionamento por sinal PWM diminui a dissipação de energia e reduz a complexidade da etapa
de potência do sistema.
Neste trabalho, o encoder foi acoplado ao eixo de controle em vez de ser acoplado ao
motor, antes da redução. Além disso, o encoder apresenta uma resolução baixa, de 26 pulsos
por rotação. Considerando essa limitação na instrumentação e também os aspectos
econômicos e de montagem apontados na introdução, este trabalho tem como objetivo
explorar a utilização de um método alternativo de medição de velocidade por meio da força
contra-eletromotriz gerada pelo próprio motor. A medição da velocidade do motor é precedida
por um processo de calibração que utiliza, dentre outros, o método dos mínimos quadrados
para minimizar o erro entre a posição dada pela integração da velocidade medida e a posição
dada pelo encoder. A utilização desse método de medição visa a melhorar a instrumentação
da posição, complementando o sinal gerado pelo encoder.
Compensando a inadequação da planta atual ao objetivo de controle desejado, este
trabalho inclui como objetivo a especificação de um novo conjunto de motor, redução e
encoder comerciais adequados à faixa de vazões que se pretende que a bomba seja capaz de
controlar, já que se trata de um equipamento eletromédico e deve ser o mais seguro e preciso
possível, atendendo a todas as devidas normas.
O objetivo final é o controle indireto da vazão. Esse objetivo acaba coincidindo com a
implementação de um controlador direto para a velocidade do eixo do mecanismo peristáltico.
19
2 Fundamentos teóricos de funcionamento do
motor DC com escovas
O motor de tensão contínua tem seu funcionamento baseado no fato de que um
condutor elétrico de comprimento l pelo qual circula uma corrente i fica sujeito a uma força
Fr
quando imerso em um campo magnético de densidade de fluxo Br
. A Figura 1 ilustra uma
espira simples e um par de polos curvados, de forma que o vetor densidade de fluxo é sempre
perpendicular aos lados da espira. Nessa condição, a força sobre cada lado da espira é dada
por (1):
)ˆˆ(... BlBlF ×=×= liBirrr
(1)
Figura 1 Espira simples imersa em um campo magnético constante
Fonte: Chapman (2005).
20
Temos então forças constantes e de sentidos opostos nos dois lados da espira, o que
gera um torque. Esse torque é calculado a partir do produto vetorial do raio rr
pela força Fr
conforme a equação:
ττ ˆ.....2.2 liBr=×= Frrrr
(2)
Percebemos que o torque é proporcional à corrente. O vetor unitárioτ tem a direção
do eixo de rotação da espira e sentido tal que, olhando para sua ponta com seta de frente, o
giro que esse torque causaria na espira (inicialmente parada) seria anti-horário. Em um motor
DC comercial o isso pode ser utilizado como uma forma de medir o valor do torque a partir da
corrente. Há, portanto, uma constante de torque que relaciona o torque à corrente que o causa,
sendo seu valor normalmente fornecido pelo fabricante do motor.
Em um motor real, cada bobina tem várias espiras e há várias bobinas defasadas entre
si de certo ângulo. Essas bobinas são conectadas em série e os nós de ligação entre elas são
conectados aos diversos segmentos do anel de comutação. A Figura 2 ilustra um motor de
quatro bobinas e, portanto, anel comutador de quatro segmentos.
21
Figura 2 Disposição das bobinas em um motor e força contra-eletromotriz gerada
Fonte: Chapman (2005).
Essa figura ilustra, além da disposição das bobinas e do comutador, a tensão gerada
em função da velocidade do motor. Essa tensão é gerada devido ao fato de que os condutores
estão em movimento em um campo magnético. Nesse caso, o motor funciona como gerador e
a comutação faz com que a tensão seja aproximadamente constante, mas com uma oscilação
de ripple, conforme apresentado na Figura 3. Esse ripple na tensão gerada pode ser utilizado,
fazendo com que o motor tenha naturalmente a função de encoder incremental, pois cada
pulso indica uma variação angular fixa. Além disso, o valor da tensão gerada é proporcional à
velocidade, o que pode ser utilizado para instrumentação da mesma, como de fato foi feito
neste trabalho e descreve-se na seção 5.7. A relação entre a tensão gerada e a velocidade
depende de características construtivas de cada motor e normalmente é dada pelo fabricante
sob o nome de constante de força contra-eletromotriz (em inglês, back-emf constant). Deve-se
notar que quanto mais divisões houver no anel de comutação, maior será a frequência do sinal
de ripple sobreposto à tensão gerada e menor a amplitude do mesmo.
22
Figura 3 Tensão de ripple nas escovas do motor da Figura 2
Fonte: Chapman (2005).
Durante o desenvolvimento deste trabalho, foram avaliados dois métodos para
instrumentação da velocidade, além do que foi utilizado na prática. O primeiro é feito por
meio da medição da corrente do motor e o segundo utiliza a tensão de ripple devida à
comutação. Com relação à medição da corrente do motor, foi projetado um circuito de
medição (apresentado no Apêndice A), mas o sinal apresentou muito ruído devido ao layout
da placa. Com relação à aferição da velocidade a partir da tensão de ripple, em (HILAIRET,
2006) se propõe um método eficiente, mas com exigência de alto processamento adicional e
provavelmente inviável usando o microcontrolador deste trabalho.
Há vários outros pontos interessantes com relação aos aspectos construtivos dos
motores DC, mas para a análise seguinte a descrição apresentada até aqui é suficiente.
Pelo que foi discutido, e seguindo o que é apresentado em (PORTESCAP, 2009),
verificamos que a equação elétrica estática do motor DC é a seguinte:
ω.. keiRmU += (3)
23
Onde:
• U é a tensão aplicada aos terminais do motor, dada em V;
• Rm é a resistência dos enrolamentos medida a partir dos terminais do motor, dada em
Ω;
• i é a corrente que circula pelo motor, dada em A;
• ke é a constante de força contra-eletromotriz do motor, dada em V/rpm;
• ω é a velocidade angular do motor em rpm.
Sabemos, além disso, que a corrente é proporcional ao torque no eixo do motor:
ikr.=τ (4)
A equação (3) nos dá uma boa ideia intuitiva do comportamento do sistema quando
considerada em conjunto com a dinâmica mecânica da carga para uma resposta a um degrau
de tensão:
• Inicialmente, com o motor parado, a força contra-eletromotriz é nula e a corrente nos
enrolamentos do motor é limitada apenas pela resistência do motor. A indutância do
motor também limita a corrente inicial, mas essa dinâmica é geralmente
desconsiderada, pois é praticamente instantânea em relação à dinâmica mecânica.
Assim, a corrente começa alta, ou seja, o torque é também máximo nesse instante.
• O torque faz com que o motor comece a girar adquirindo certa velocidade,
aumentando a força contra-eletromotriz gerada, o que causa diminuição na corrente
que flui pelo motor;
• Com uma corrente menor, o torque diminui, mas continua a existir, aumentando a
velocidade de forma estável até que esta atinja seu valor de regime permanente,
quando o torque fornecido pelo motor compensa as perdas por atrito, mas não fornece
energia cinética ao eixo do motor.
• A tensão aplicada fica então dividida em duas parcelas: uma relativa à força contra-
eletromotriz gerada pelo motor em decorrência da velocidade e outra relativa à queda
de tensão nos enrolamentos pela passagem da corrente I, relacionada diretamente ao
torque fornecido à carga acoplada ao eixo.
24
Podemos demonstrar que as constantes de força contra-eletromotriz e de torque têm
valores iguais, partindo do fato de que a potência mecânica fornecida ao motor somada à
potência de perdas por efeito Joule é igual à potência elétrica. A potência elétrica é obtida
multiplicando (3) pela corrente. Para a demonstração partimos então de (5):
ikeiRmiUPeiRmPm ...... 22 ωωτ +===+= (5)
E após algumas simplificações e utilizando (4), chegamos à conclusão de que kekr =
numericamente, sendo kr dado em Nm/A e ke dado em V/(rad/s)=V.s/rad:
ike.=τ (6)
ikeikr .. = (7)
kekr = (8)
Essa igualdade se mantém desde que sejam desconsideradas as perdas no núcleo
ferromagnético do rotor.
Outro ponto importante a ser notado é que a partir de (3) e (4) podemos escrever a
velocidade como função do torque dada uma tensão aplicada U constante:
ω.. kekr
MRmU += (9)
krke
MRm
ke
U
.
.−=ω (10)
2ke
Rm
dt
d=−
ω (11)
Vemos que o gráfico da velocidade em função do torque corresponde a uma reta decrescente
cuja inclinação é dada por (11). Essa medida da inclinação é chamada de constante de
25
regulação do motor e caracteriza a facilidade de controlá-lo, pois quanto menor for seu valor,
menor será a variação da velocidade com variações de carga para uma tensão fixa aplicada.
Além disso, quando a constante de regulação é pequena, a resistência é pequena, e a
constante de torque é grande, de forma que a corrente será pequena, resultando em uma baixa
queda de tensão iRm. , o que implica em uma faixa maior de tensões que podem ser aplicadas
sem que o motor pare porque iRmU .< .
Um modelo dinâmico mais completo do funcionamento do motor inclui a equação
elétrica (12) e a mecânica (13), apresentadas abaixo:
ω... kedt
diLiRmU ++= (12)
ωω
... bdt
dJikr += (13)
Percebe-se que na equação elétrica (12) que foi incluído o efeito da indutância do motor.
A equação mecânica (13) considera uma parcela de torque devido ao atrito viscoso,
caracterizado pela constante de atrito b, e outra relativa à aceleração da carga acoplada ao
eixo do motor, que possui momento de inércia J.
Essa fundamentação teórica é muito importante para este trabalho como um todo.
26
3 Caracterização física e funcional da planta
Aqui é descrita a configuração física da bomba e o primeiro ensaio realizado para
obter uma visão geral do funcionamento da mesma.
3.1 Descrição física da planta
A configuração da bomba de infusão que nos foi cedida pela Lifemed para os
primeiros testes envolvendo o uso de motor DC para o controle de vazão incluía:
• o mecanismo peristáltico da bomba de infusão LF SMART;
• um motor DC com escovas e sistema de comutação de metais preciosos,
modelo 16N78-212E do fabricante Portescap;
• uma redução planetária de 121 vezes, modelo R16 do fabricante Portescap;
• um encoder incremental mecânico retirado do scroll de um mouse, gerando 12
pulsos por revolução, acoplado ao eixo do mecanismo peristáltico.
As características e parâmetros técnicos do motor e da redução podem ser visualizados
no Anexo A e no Anexo B, respectivamente.
O encoder de scroll de mouse apresentou problemas de bouncing quando foi feita
leitura de seus pulsos por meio do microcontrolador, tendo sido substituído por um encoder
óptico de mouse de 26ppr. Foi feita uma tentativa de resolver o problema em software,
esperando o tempo dos pulsos espúrios para habilitar a contabilização de um novo pulso. O
tempo de espera teria que ser maior do que o das transições indesejadas. Esse tempo foi
estimado a partir da maior velocidade de trabalho, mas se percebeu que o tempo de duração
das transições indesejadas aumenta conforme o período dos pulsos desejados, de forma que o
tempo de espera não poderia ser fixo, pois limitaria ou a leitura de pulsos rápidos por ser
muito grande, ou incluiria erros na leitura de pulsos lentos por ser menor do que o tempo das
transições espúrias. Foi considerada a ideia de adicionar um filtro passa-baixas analógico para
eliminar os pulsos espúrios, mas isso incluiria o efeito indesejado de modificar o momento em
que o pulso é detectado. A planta, em sua configuração atual, é ilustrada pela Figura 4.
27
Figura 4 Configuração atual da planta
Fonte: Elaborada pelo autor
3.2 Primeiro ensaio de caracterização funcional
Uma das primeiras atividades deste trabalho foi verificar qual seria a vazão máxima
atingível por meio da configuração inicial apresentada para determinar se englobaria toda a
faixa desejada a princípio, de 0,1ml/h a 1000ml/h. Para tanto foi feito um ensaio sumarizado
na Tabela 1 e no gráfico da Figura 5. Nesse ensaio foi utilizada uma fonte de bancada MPL-
3303 da Minipa com medição de corrente, sendo aplicadas diferentes tensões contínuas ao
circuito. Utilizando um osciloscópio MO-2061 da Minipa foi medida a frequência média do
sinal na saída do encoder de 12 ppr. Com essa frequência foram calculadas a velocidade no
eixo do mecanismo peristáltico e a vazão, supondo-se que cada volta completa corresponde à
infusão de 0,2ml, conforme informação da Lifemed.
28
Tabela 1 Ensaio com equipo, sem líquido de infusão
Tensão
(V) Corrente(mA)
Frequência
na saída do
encoder(Hz)
Velocidade
no eixo do
mecanismo
peristáltico
(rpm)
Velocidade
no eixo do
motor
(rpm)
Vazão
teórica(ml/h)
1,3 20-50 0,6 3 363 36
2 20-50 1,5 7,5 907,5 90
3 30-50 2,6 13 1573 156
4 30-50 3,7 18,5 2238,5 222
5 30-50 4,75 23,75 2873,75 285
6 30-50 5,8 29 3509 348
7 30-50 6,95 34,75 4204,75 417
8 30-50 8 40 4840 480
9 40-60 9,1 45,5 5505,5 546
10 40-60 10,18 50,9 6158,9 610,8
11 50-60 11,26 56,3 6812,3 675,6
12 40-60 12,5 62,5 7562,5 750
13 50-60 13,7 68,5 8288,5 822
14 50-60 14,6 73 8833 876
15 50-60 15,7 78,5 9498,5 942
16 50-60 16,8 84 10164 1008
17 50-60 18 90 10890 1080
18 50-60 19,1 95,5 11555,5 1146
19 50-60 20,2 101 12221 1212
20 50-60 21,2 106 12826 1272
25 50-60 26,7 133,5 16153,5 1602
Fonte: Elaborada pelo autor
Figura 5 Ensaio com equipo, sem líquido de infusão
Fonte: Elaborada pelo autor.
0
200
400
600
800
1000
1200
1400
1600
1800
0 5 10 15 20 25 30
Vazão(mL/h) x Tensão(V)
Vazão(mL/h) x
Tensão(V)
29
Foram feitos outros ensaios depois deste usando um resistor shunt de 0,5Ω e um
osciloscópio para ter uma precisão melhor na medição da corrente. Nesses ensaios a corrente
devido à carga variou entre 30mA e 70mA aproximadamente. Verificou-se que o sinal de
corrente é aproximadamente periódico e síncrono com a rotação do motor. Poderia então ser
utilizado como um encoder de 1ppr apenas para calibração da relação entre a força contra-
eletromotriz do motor e a velocidade, conforme descrito no capítulo 5.7. Apesar disso, o mais
interessante seria utilizar os pulsos gerados pela tensão de ripple do motor, possivelmente
eliminando a necessidade de um encoder acoplado ao eixo do motor ou ao eixo de controle.
3.3 Análise dos resultados do primeiro ensaio
Verificou-se pelo ensaio que a vazão de 1000ml/h seria atingida aplicando uma tensão
de 16V. Assim, para atingir tal vazão com uma bateria de 12V, mais facilmente encontrada no
mercado, seria necessário diminuir o valor da redução utilizada. Por meio da planilha de
cálculo descrita no capítulo 4 determinou-se que a redução mais adequada seria de 80 vezes
aproximadamente.
Ainda utilizando a planilha descrita no capítulo 4 calculou-se que a velocidade
aproximada do motor com uma redução de 80 vezes seria de 7320rpm, logo não ultrapassaria
o valor máximo recomendado pelo fabricante para a velocidade no eixo de entrada da
redução, ou seja, 7500rpm. Com a redução atual a velocidade do motor para uma tensão de
12V ultrapassa levemente a velocidade máxima recomendada pelo fabricante.
Foi estimado o máximo torque no eixo do mecanismo peristáltico a partir dos
seguintes parâmetros:
• A constante de torque do motor, com valor nominal de kr =13,6mNm/A;
• O valor da redução utilizada, que é de N=121 vezes;
• O rendimento da redução vale η =0,65;
• O limite superior da corrente medida nos ensaios, que foi considerado como
i=80mA.
30
Com esses dados, calculou-se o torque máximo no eixo do mecanismo peristáltico
durante o ensaio:
ητ ..._max_ Nkripermec = (14)
mNmAmNmApermec 6,8565,0.121)./6,13).(08,0(_max_ ==τ
(15)
Sabendo esse valor de torque máximo e observando a folha de dados da redução,
verificamos que tanto o torque quanto a velocidade de saída (84rpm para vazão de 1008ml/h)
estariam dentro da zona de operação recomendada pelo fabricante para a redução. O torque no
eixo do motor também ficou dentro da região recomendada pelo fabricante:
krimotor .max_ =τ (16)
mNmAmNmAmotor 1,1)/6,13).(08,0(max_ ==τ (17)
Percebemos que para tensões inferiores a 1,3V aproximadamente, o motor não
apresenta um movimento contínuo. Isso ocorre devido à presença de atrito estático e também
devido ao torque exigido para a movimentação da carga, que varia ao longo do giro do
mecanismo diminuído a velocidade do mesmo ou parando-o em certos pontos.
Esse ensaio foi repetido com a utilização de água sendo bombeada pelo sistema, mas
não houve mudanças significativas nos dados do ensaio, mesmo gerando uma oclusão no
equipo. Em virtude da ausência de mudanças nos resultados, foi descartada a ideia inicial de
utilizar a corrente para determinar a ocorrência de oclusão no equipo.
Essa análise inicial foi muito importante para dar uma visão geral das condições de
funcionamento da bomba com a configuração descrita.
Apesar de o trabalho ter sido realizado com a planta descrita, o encoder utilizado tem
baixa resolução e a faixa de vazões mais utilizada na prática é de 0,1ml/h a 100ml/h, de forma
que foi especificado um novo conjunto de motor, redução e encoder para a planta, conforme
descrito no capítulo seguinte.
31
4 Especificação de um novo conjunto de
motor, redução e encoder
Para ajudar na especificação de um novo conjunto de motor e redução foi
desenvolvida uma planilha de cálculo em que são inseridos pelo usuário os seguintes
parâmetros relativos a esses elementos:
• A constante de força contra-eletromotriz do motor, kE dada em mV/rpm;
• A constante de torque do motor, kr dada em mNm/A;
• A resistência dos enrolamentos do motor, Rm dada em Ω;
• O valor da redução, N, adimensional;
• A eficiência da redução, η , adimensional;
• O torque máximo necessário no eixo de controle, após a redução,
controleeixo_max_τ , dado em mNm;
• Uma faixa de tensões de entrada que se deseja aplicar, designadas por Vi e
dadas em V.
Para os cálculos, o torque máximo necessário no eixo de controle foi considerado
como constante ao longo do tempo com o valor de 85,6mNm calculado no capítulo anterior.
A partir dele foi obtido o torque máximo no eixo do motor:
mNmN
controleeixo
motoreixo
=
η
ττ
._max_
_max_ (18)
E a corrente relativa a esse torque:
Ak
ir
motoreixo
=
_max_τ
(19)
32
Foi gerada uma tabela semelhante à do ensaio descrito no capítulo 3. Na primeira
coluna o usuário insere os valores de tensão de entrada desejados Vi. Na segunda coluna é
calculada a velocidade do motor em rpm a partir da fórmula:
rpmk
iRmV
E
imotoreixo
−=
).(1000_ω (20)
Caso a tensão iV aplicada seja inferior ao produto iRm. , a velocidade é considerada
nula.
Sabendo as velocidades no eixo do motor para as diferentes tensões de entrada, na
terceira coluna da tabela é simples determinar as velocidades no eixo de controle usando a
seguinte relação:
rpmN
motoreixo
controleeixo
=
__
ωω (21)
Finalmente, com o valor da velocidade no eixo de controle foi determinada a vazão
teórica, considerando que sejam infundidos 0,2ml a cada rotação do eixo de controle:
( ) hmlQ controleeixoteórica /2,0.60._ω= (22)
Usando essa planilha de cálculo foram testados vários motores, considerando a faixa
de 0,1ml/h até 100ml/h. Para a especificação foram levados em conta os seguintes fatores:
• Os valores máximos de torque e velocidade tanto para a redução quanto para o motor;
• A regulação do motor 2M
m
k
R, que dá uma medida da facilidade de controlar a
velocidade, quanto menor a regulação mais fácil é o controle;
• A parcela da faixa de tensões disponíveis (0-12V) que fornece movimentação contínua
do motor, ou seja, para a qual torqueMi IRV .> ;
33
• A eficiência da redução, que constitui a parcela mais significativa no rendimento do
conjunto sistema.
O motor especificado foi o 22N78-216E com uma redução R22 de 641 vezes
(rendimento igual a 0,5) ambos do fabricante Portescap. Há, no entanto, outros motores
capazes de satisfazer às necessidades de vazão do projeto, possivelmente com menor custo, no
entanto essa variável foi desconsiderada já que essa informação é desconhecida.
Para a escolha do encoder, considerou-se que sua resolução determina o mínimo passo
de volume infundido. Com a nova redução, cada volta do eixo do mecanismo peristáltico
corresponde a 0,2ml e também corresponde a 641 voltas do eixo do motor, ao qual estaria
acoplado um encoder de M pulsos por revolução, de forma que o mínimo passo de volume
infundido seria:
mlM
V.641
2,0=∆ (23)
Tomando como base a figura 106 da norma NBR IEC 60601-2-24, consideremos que
seja razoável um erro máximo de 1% após 2 minutos de infusão para nossa vazão mínima de
0,1ml/h, que é o pior caso, pois temos menor rotação e, portanto, menos pulsos do encoder. O
volume total nessa vazão e tempo seria 0,0033ml e 1% desse volume corresponde a 3,3e-5ml.
Considerando que esse seja o mínimo passo de volume infundido, substituímos esse valor em
(23) e encontramos:
45,9.641
2,010.3,3 5 =⇒==∆ − M
M
mlmlV (24)
Assim um encoder Type D de 12 ppr do fabricante Portescap seria razoável para a
aplicação. Esse mesmo fabricante possui encoders de até 1024 ppr, de forma que seria
interessante, ao menos em tempo de projeto, utilizar um encoder de maior resolução para
determinar na prática a resolução mais adequada.
34
5 O circuito de processamento, aquisição,
controle e comunicação de dados
Aqui são descritos os recursos do microcontrolador e os circuitos usados para várias
funções do sistema: manutenção do tempo de amostragem, geração de sinal PWM, contagem
de pulsos do encoder, comunicação de dados com o computador e calibração da velocidade
para obtenção da posição por integração.
5.1 O microcontrolador
Para o processamento dos dados e implementação do controlador foi utilizado um
microcontrolador PIC18F4550, devido ao baixo custo, à facilidade de encontrar no mercado, e
ao conjunto de recursos periféricos como: interface de comunicação USB, módulo CCP para
geração de sinal PWM, conversor A/D e contadores/temporizadores. O diagrama de blocos da
Figura 6 ilustra os principais recursos desse microcontrolador.
35
Figura 6 Diagrama de blocos do PIC18F4550
Fonte: Microchip (2006).
36
O PIC18F4550 apresenta uma arquitetura Harvard, em que há barramentos distintos
para programa e dados. Além disso, há um sistema de pipeline de quatro estágios de forma
que a maioria das instruções são executadas em um único ciclo de máquina. Assim, o tempo
de ciclo de processamento TCY é quatro vezes o período do oscilador do sistema TOSC=1/FOSC.
Nesse PIC, há várias configurações de oscilador disponíveis, envolvendo utilização de
ressonador, cristal, oscilador interno ou oscilador externo de outro PIC, por exemplo. Essas
configurações são apresentadas na Figura 7. Há a possibilidade de utilização de PLL para
atingir sinais de clock mais elevados a partir de sinais de menor frequência.
Para utilizar a interface USB é necessário gerar um sinal de clock para a operação da
mesma. Para este projeto foi utilizado um cristal de 12MHz, ligado aos pinos OSC1 e OSC2.
Esse sinal de clock é dividido por três (PLLDIV=0102) gerando um sinal de 4MHZ. O
circuito de PLL gera um sinal de 96MHz a partir desse sinal de 4MHz. Esses 96MHz são
divididos por por dois definindo FOSC = 48MHz (CPUDIV=002). Da mesma forma, uma
divisão por dois gera o sinal de clock de 48MHz do periférico de comunicação USB
(USBDIV=12).
Os parâmetros de configuração de clock estão inseridos dentro de um conjunto maior
de configuration bits. Estes são usados para configuração do microcontrolador em tempo de
gravação, visto que são parâmetros essenciais para o funcionamento do mesmo. Outras
funcionalidades configuradas por meio de configuration bits são: habilitação de reset mestre
(MCLR), proteção do código da memória de programa, reset por queda de tensão (Brownout
Reset), Watchdog Timer, etc.
37
Figura 7 Configurações de oscilador disponíveis no PIC18F4550
Fonte: Microchip (2006).
38
5.2 Gravação do microcontrolador
Para gravação do microcontrolador normalmente usa-se um gravador independente do
PIC. Há vários tipos de gravador, alguns usam a porta serial como os JDM, outros usam a
USB, como o Pickit 2. O que há em comum entre eles é um conector de programação ICSP
(In Circuit Serial Programming). Na placa desenvolvida para este trabalho foi adicionado um
circuito para ligação do conector ICSP, apresentado Figura 8.
Figura 8 Circuito ICSP
Fonte: Elaborada pelo autor.
Outra possibilidade é a utilização de um bootloader, que consiste em um trecho de
programa no próprio PIC responsável pela gravação usando a interface USART ou USB do
próprio microcontrolador.
Neste trabalho foi utilizado um gravador Pickit 2 apenas uma vez para gravação de um
um bootloader USB HID (Human Interface Device) fornecido pela Microchip. Ao alimentar o
microcontrolador, o contador de programa (PC) aponta para o vetor de reset (0000h) onde é
testada uma chave de bootloader. Caso esteja pressionada, significa que o usuário deseja que
39
seja executado o bootloader para gravação de um novo programa. Caso contrário deve ser
executado o último programa gravado pelo usuário. A presença do bootloader exige um
remapeamento dos vetores de reset e interrupção no programa principal, como mostrado na
Figura 9 para o compilador C CCS.
Figura 9 Remapeamento dos vetores de reset e interrupção no compilador C CCS
Fonte: Elaborada pelo autor.
A desvantagem do uso do bootloader é a perda de um pequeno trecho de memória de
programa e a vantagem é a rapidez e facilidade nas reprogramações seguintes, o que ocorre
com freqüência durante um projeto.
5.3 Contagem de pulsos do encoder
A contagem de pulsos do encoder é feita utilizando o pino T0CLKI do
microcontrolador como entrada de pulsos de clock para o Timer0. O Timer0 foi utilizado
como um contador de 16 bits composto por dois registradores de 8 bits, o TMR0H e o
TMR0L, responsáveis por guardar a parte alta e a parte baixa do Timer0, respectivamente.
A leitura do Timer0 é feita lendo primeiro o TMR0L, momento em que o valor do
TMR0H é salvo no buffer TMR0 High Byte para ser lido posteriormente. Esse mecanismo
tem por objetivo evitar o erro de leitura ocasionado quando o TMR0H está prestes a ser
incrementado. Sem esse mecanismo, se TMR0H=00h e TMR0L=FFh, por exemplo, lemos
TMR0L=FFh em um ciclo e no próximo podemos ler TMR0H=01h, caso ocorra um
incremento, ou seja, ocorria um erro de leitura. Lendo primeiro TMR0H=00h, no ciclo
seguinte seria lido TMR0L=00h, devido a um incremento, o que também seria um erro de
leitura.
Para esse contador, há um prescaler configurável cuja função é dividir a freqüência do
sinal de entrada, mas ele não foi utilizado nesse trabalho. Pode-se também habilitar uma
40
interrupção gerada quando o Timer0 muda seu valor de FFFFh para 0000h, ou seja, quando
ocorre o overflow do contador. A Figura 10 ilustra o funcionamento do Timer0.
Figura 10 Diagrama de blocos do Timer0
Fonte: Microchip (2006).
5.4 Geração de sinal PWM
Para geração do sinal PWM que aciona o motor por meio do MOSFET foi utilizado o
módulo CCP2 do microcontrolador. Este módulo apresenta as funções Capture, Compare e
PWM, sendo possível escolher apenas uma delas para cada um dos dois módulos disponíveis
no PIC. A Figura 11 mostra um diagrama de blocos da função PWM. O sinal PWM depende
do Timer2, que funciona como uma rampa com a qual é comparado o valor de duty cycle
desejado, devidamente registrado em CCPR2L e nos bits 4 e 5 do registrador CCP2CON.
Para completar a resolução de 10 bits do sinal PWM, à rampa gerada pelo Timer2 são
adicionados dois bits menos significativos relativos aos quatro ciclos de pipeline do PIC.
41
Figura 11 Diagrama de blocos simplificado da função PWM do módulo CCP
Fonte: Microchip (2006).
Conforme ilustra a Figura 12, o período do sinal PWM depende do prescaler do
Timer2, da freqüência de clock do sistema e do registrador PR2, que define o valor máximo
de contagem do Timer2. Neste trabalho foram utilizados PR2 = 255, TOSC = 1/48MHz e
TMR2 Prescale Value = 1, resultando em uma freqüência de 46,875kHz.
Figura 12 Cálculo do período do sinal PWM
Fonte: Microchip (2006).
42
A resolução do sinal PWM é dada pela fórmula da Figura 13 e para a frequência usada
é de 10 bits.
Figura 13 Calculo da resolução do sinal PWM
Fonte: Microchip (2006)
5.5 Manutenção do tempo de amostragem
O tempo de amostragem do PIC é mantido por meio do Timer1. Esse temporizador
apresenta dois bytes, TMR1H e TMR1L de forma análoga ao Timer0. Esses dois
temporizadores funcionam de forma muito semelhante. A Figura 14 apresenta um diagrama
de blocos para o Timer1. Ele foi utilizado com valor de prescaler igual a 1, recebendo pulsos
a partir do sinal de clock do sistema.
Figura 14 Diagrama de blocos do Timer1
Fonte: Microchip (2006).
43
Para manutenção do tempo de amostragem, o registrador TMR1L é zerado antes que o
programa entre no laço de controle e nunca é modificado a partir daí. O registrador TMR1H,
no entanto, recebe um valor que será incrementado até que ocorra um overflow (quando o
Timer1 muda seu valor de FFFFh para 0000h). Nesse momento, o flag de interrupção
TMR1IF é setado automaticamente pelo PIC, indicando que o tempo de amostragem já foi
atingido, de forma que o registrador TMR1H é recarregado com seu valor. A Figura 15
apresenta um fluxograma com o mecanismo de manutenção do tempo de amostragem.
Figura 15 Fluxograma do mecanismo de manutenção do tempo de amostragem
Fonte: Elaborada pelo autor
44
O tempo de amostragem é calculado de acordo com (25):
)1_256).(256).(.4( HTMRVALORToscTa −= (25)
Essa fórmula é justificada pelos seguintes fatos:
• a cada 4.Tosc ocorre um incremento em TMR1L;
• a cada 256 incrementos em TMR1L ocorre um incremento em TMR1H;
• a cada 256-TMR1H incrementos do TMR1H ocorre um overflow setando o
flag de interrupção TMR1IF;
Essa técnica de marcação do tempo evita que o TMR1L seja modificado, preservando
o tempo de amostragem com a precisão do cristal do sistema, o que é muito importante para
evitar erros de volumetria em infusões longas. Já o TMR1H é sempre atualizado logo após um
overflow (TMR1L=00h, TMR1H=00h), de forma que essa ação não interfere nos incrementos
do TMR1H devidos ao TMR1L. No ensaio de calibração da força contra-eletromotriz,
VALOR_TMR1H=210, ou seja:
sMHz
Ta µ33,981)210256).(256.(48
1.4 =−
= (26)
5.6 Comunicação de dados com o computador
A comunicação de dados com o computador foi feita usando a interface USB do PIC.
Para evitar a complexidade do protocolo USB foi utilizada comunicação USB CDC, em que a
transmissão de dados ocorre de forma simples como se estivéssemos utilizando comunicação
RS232. Para que isso fosse possível, foi instalado no computador um driver fornecido pela
CCS, assim, ao conectar o cabo USB do circuito do PIC, é detectada uma porta “USB to
RS232” que pode então ser acessada por meio de um programa em MATLAB ou qualquer
outra linguagem com funções para acesso à porta serial. No programa em C do PIC foram
utilizadas basicamente as funções do compilador usb_cdc_putc e usb_cdc_getc para envio e
recepção de dados, respectivamente. Como o computador é multitarefa em testes feitos
anteriormente, verificou-se que muitas vezes o tempo de amostragem era excedido caso o PIC
esperasse alguma informação do computador. Por essa razão, em nenhuma das rotinas feitas o
45
computador envia dados continuamente para o PIC a cada período de amostragem. O PIC, no
entanto, continuamente envia dados para o computador para que este os armazene em
arquivos para posterior análise do funcionamento do sistema. O protocolo de comunicação do
PIC com o computador varia para cada rotina programada, dependendo dos dados que se
deseja salvar. Basicamente o computador envia ao PIC um número de 0 a 255 indicando qual
rotina deseja executar e o PIC, que fica continuamente esperando a chegada de um dado. Cada
byte recebido é inserido em um switch em que é escolhida uma dentre várias rotinas. Em
seguida, o programa do PIC, já dentro do laço de controle, envia continuamente para o
computador pacotes de dados como: os pulsos contados pelo TMR0, a tensão medida no canal
AN0 e outros canais analógicos, o duty cycle aplicado ou quaisquer outros dados que se
queira monitorar. Quando o computador envia um novo valor, o PIC interpreta isso como
indicativo de que a rotina deve ser finalizada, mas o valor recebido é irrelevante e assim é
descartado. O programa MATLAB salva os dados em arquivo e eles podem ser plotados e
manipulados. Caso o tempo de amostragem seja excedido, o PIC para de enviar dados ao
computador antes que isso seja solicitado, e assim esse evento é detectado e informado ao
usuário pelo programa MATLAB. Os programas MATLAB mais relevantes responsáveis pela
aquisição e análise de dados de ensaios foram adicionados aos Apêndices de B a E, assim
como o programa do microcontrolador adicionado, ao Apêndice F.
5.7 Medição da posição/velocidade a partir da força contra-
eletromotriz do motor
Para compensar a baixa resolução do encoder acoplado ao eixo de controle, foi
utilizada uma técnica alternativa de medição da velocidade a partir da força contra-
eletromotriz do motor. A ideia consiste em utilizar os pulsos do encoder em combinação com
a integração da velocidade medida entre eles dando uma medida de posição resultante com
maior resolução equivalente. Para relacionar a tensão medida pelo microcontrolador com a
velocidade foi utilizado um processo de calibração automático em que se busca minimizar a
diferença entre a posição dada pelo encoder e a posição dada pela integral da velocidade.
Abaixo são descritos: o circuito, o desenvolvimento matemático e os resultados obtidos pela
aplicação prática dos métodos matemáticos.
46
5.7.1 O circuito e o método de medição da força contra-eletromotriz
A força contra-eletromotriz gerada pelo motor é medida de forma indireta por meio do
circuito apresentado no Anexo A e redesenhado de forma simplificada na Figura 16. É
utilizada uma tensão de referência externa para o conversor A/D em vez de utilizar os 5V da
alimentação do sistema. Isso foi feito porque o amplificador operacional utilizado, o
LM324N, não é do tipo rail-to-rail, ou seja, a tensão em sua saída não atinge o valor da
tensão de alimentação, mas sim uma tensão garantida pelo fabricante de 1,5V abaixo dela, ou
seja, em torno de 3,5V.
Figura 16 Circuito de medição da força contra-eletromotriz do motor
Fonte: Elaborada pelo autor.
Entre os terminais do motor foi adicionado um diodo de roda livre UG2D cuja função
é evitar sobretensão nos terminais do motor durante o transitório elétrico que ocorre devido à
indutância das bobinas do motor quando o MOSFET não está conduzindo. Para a medição da
tensão gerada pelo motor, é essencial que a corrente seja nula, de forma que devemos esperar
o transitório elétrico devido à indutância.
Com o objetivo de determinar o tempo necessário para o transitório foi feito um ensaio
aplicando ao motor um sinal PWM alternado por intervalos em que o MOSFET é colocado na
47
região de corte, período durante o qual um sinal de trigger fica em nível alto para possibilitar
a visualização no osciloscópio da tensão no terminal negativo do motor (M-) em relação à
massa. A Figura 17 mostra que um tempo de espera de 80µs para o transitório parece
suficiente. Deve-se notar que a função inverter do osciloscópio foi ativada para facilitar a
visualização. O sinal de trigger é mostrado em azul e o sinal correspondente à tensão sobre os
terminais do motor é mostrado em amarelo.
Figura 17 Ensaio em alta velocidade para determinação do tempo do transitório elétrico devido à indutância do motor
Fonte: Elaborada pelo autor.
A Figura 18 ilustra o mesmo ensaio, mas com aplicação de um duty cycle menor, ou
seja, para uma velocidade menor do motor.
48
Figura 18 Ensaio em baixa velocidade para determinação do tempo do transitório elétrico devido à indutância do motor
Fonte: Elaborada pelo autor.
5.7.2 Desenvolvimento matemático
A tensão 0ANV na entrada do conversor analógico pode ser descrita por (27):
opampoffsettensaodivfatnkeVV DDAN ____)...(0 +−= ω (27)
Onde,
DDV é a tensão de alimentação, com valor nominal de 12V;
ke é a constante de força contra-eletromotriz do motor, de valor nominal 1,42mV/rpm;
n é o valor da redução utilizada, que vale 121;
ω é a velocidade no eixo do mecanismo peristáltico em rpm;
49
265
65__
RRR
RRtensaodivfat
++
+= é o fator do divisor de tensão, de valor nominal
0,28;
opampoffset __ é o offset do amplificador operacional, vale no máximo 7mV;
O primeiro método considerado para calibrar a relação entre a tensão medida e a
velocidade consiste em substituir os valores nominais e dados de fabricante em (27). Esses
valores podem diferir dos valores reais em função da variabilidade na montagem do circuito e
no processo de fabricação do motor. Assim este método carece de confiabilidade e exatidão,
embora seja o mais simples.
Manipulando (27) podemos reagrupar seus termos da seguinte forma:
ω.100 aaVAN′+′= (28)
Onde,
opampoffsettensãodivfatVa DD ____.0 +=′ (29)
tensãodivfatnkea __..1 −=′ (30)
Após a conversão de analógico para digital temos o sinal
ωω .1023
.)( 1000 aaV
VVrefAD
ANDIGAN′′+′′== (31)
Onde,
50
refADV é a tensão de referência usada para o conversor A/D, de valor nominal 3,4V.
Em decorrência de (31) temos que:
1023
.00refADV
aa ′=′′ (32)
1023
.11refADV
aa ′=′′ (33)
Isolando ω em (31) temos:
DIGANDIGAN Vaaa
aV010
1
00 .)(
+=′′
′′−=ω (34)
Onde,
1
00
a
aa
′′
′′−= (35)
1
1
1
aa
′′= (36)
A velocidade poderia ser obtida em qualquer unidade em (34) bastando multiplicar as
constantes por um fator de conversão de rpm para a unidade desejada.
Tomando a equação para a velocidade em RPS, e integrando no tempo em segundos
obtemos o deslocamento angular em rotações θ∆ :
51
τττθτω dVatadVadad
t
DIGAN
t
DIGAN
tt
.......0
010
0
01
0
0
0∫∫∫∫ +=+=∆= (37)
Dividindo (37) por t obtém-se (38):
t
dV
aat
t
DIGAN τθ
.
. 0
0
10
∫+=
∆
(38)
Podemos reescrever (38) como:
XaaY .10 += (39)
Onde,
t
dV
X
t
DIGAN τ.0
0∫= é o valor médio da tensão no canal AN0 após a digitalização;
tY
θ∆= é a velocidade média desenvolvida, em rotações por segundo.
Com relação a (39), a variável X pode ser calculada facilmente usando integração
numérica. A variação angular θ∆ pode ser obtida em rotações a partir da contagem de
pulsos do encoder, o que na prática consiste em zerar o Timer0 no início do período de
integração dividindo seu valor final pela resolução do encoder de 26ppr.
Assim, o segundo método para determinar as constantes de calibração consiste em
realizar um conjunto de ensaios a diferentes velocidades obtendo um conjunto de N valores de
X e Y, que podem ser utilizados no método dos mínimos quadrados para ajuste a uma reta
(regressão linear), dando como solução os parâmetros 0a e 1a por meio das fórmulas:
52
2
11
2
1111
2
0
.
.).(
−
−
=
∑∑
∑∑∑∑
==
====
N
i
i
N
i
i
N
i
i
N
i
ii
N
i
i
N
i
i
XXN
XYXYX
a (40)
2
11
2
1111
.
).(.
−
−
=
∑∑
∑∑∑
==
===
N
i
i
N
i
i
N
i
i
N
i
i
N
i
ii
XXN
YXYXN
a (41)
Um terceiro método para calcular os parâmetros 0a e 1a é obtido notando que em
(31), para velocidade nula, temos 00 )0( aV DIGAN′′= . Ou seja, uma das constantes é obtida
simplesmente medindo a tensão quando a velocidade do motor é nula. A partir daí,
reescrevemos (31) chamando 0a ′′ de k:
ω.)0(00 kVV DIGANDIGAN −= (42)
Depois isolamos ω :
k
VV DIGANDIGAN 00 )0( −=ω (43)
E integramos da mesma forma que antes:
k
dV
tk
Vd
k
Vd
k
V
t
DIGAN
DIGAN
t
DIGAN
t
DIGAN
τ
ττθ
.
.)0(
..)0( 0
0
0
0
0
0
0∫
∫∫ −=−=∆ (44)
53
Isolando k chegamos a (45):
θ
τ
θ ∆−
∆=
∫ dV
tV
k
t
DIGAN
DIGAN
.
.)0( 0
0
0
(45)
Verificamos que a constante k pode ser obtida pelo microcontrolador, visto que
depende do valor medido no canal analógico AN0 para velocidade nula do motor, do número
de pulsos do encoder (obtido a partir do Timer0), do tempo de duração do ensaio (registrado
pelo programa) e da integral do sinal convertido pelo CAD no canal analógico 0.
O três métodos apresentados permitem calcular as constantes da equação que relaciona
a tensão medida com a velocidade, ou seja, são métodos de calibração, se o motor for visto
como um sensor de velocidade.
5.7.3 Cálculo computacional das constantes de calibração
Utilizando a planta apresentada no capítulo 3, o sistema microcontrolado, e um
programa em MATLAB, foi feito um ensaio visando a encontrar as constantes de calibração
usando os três métodos apresentados na seção anterior. Na prática, em um sistema embarcado,
um dos processos de calibração deve ser realizado internamente ao microcontrolador. Neste
trabalho apenas o terceiro processo, foi implementado no PIC, embora os outros fossem
igualmente de fácil programação. No Matlab, entretanto os três métodos foram testados e
comparados para o cálculo das constantes de calibração:
1. Utilização de valores nominais e dados de fabricante;
2. Utilização do método dos mínimos quadrados;
3. Medição da tensão no canal analógico AN0 para velocidade nula do motor
seguida do cálculo da variável k.
No ensaio realizado, o microcontrolador gera uma rampa crescente de sinal PWM e o
programa MATLAB vai registrando em arquivo os seguintes sinais:
54
• A tensão VAN0DIG, que é a tensão relativa à força contra-eletromotriz do motor;
• Os pulsos no encoder, correspondendo à variável TMR0, que nos dão o
deslocamento angular em rotações θ∆ se dividirmos o valor de TMR0 pelos
26 ppr do encoder;
• O vetor de tempo, útil para a integração numérica e para obter o tempo final de
ensaio;
• O valor do duty cycle (ciclo útil do sinal PWM) aplicado, usado apenas para
relacionar com os demais sinais.
A Figura 19 apresenta o sinal aplicado ao motor durante o ensaio:
Figura 19 Sinal de entrada: duty cycle usado no ensaio de calibração
Fonte: Elaborada pelo autor.
A Figura 20 ilustra o sinal VAN0DIG medido pelo PIC. Devido à configuração do
circuito, a tensão medida diminui com o aumento da velocidade, conforme mostra o gráfico.
55
Nota-se também que o sinal de velocidade é periódico, visto que a carga é periódica ao
longo do ciclo do mecanismo peristáltico. Outro ponto importante é a presença de um sinal de
ruído, que aparentemente aumenta com a velocidade. Devemos notar que a medida de
velocidade obtida com a calibração terá a mesma forma e ruído do sinal VAN0DIG, sendo a
calibração responsável apenas por determinar um offset e um fator de escala relacionando
essas variáveis.
Figura 20 VAN0DIG medida pelo PIC
Fonte: Elaborada pelo autor.
A Figura 21 e a Figura 22 mostram o número de pulsos do encoder crescendo, durante
todo o ensaio e durante os 10s iniciais, respectivamente. Como a velocidade aumenta de
forma aproximadamente linear com o tempo, a posição aumenta de forma aproximadamente
quadrática.
56
Figura 21 TMR0, Pulsos do encoder durante todo o ensaio
Fonte: Elaborada pelo autor.
Figura 22 TMR0, Pulsos do encoder durante os 10s iniciais do ensaio
Fonte: Elaborada pelo autor.
57
A partir do ensaio de calibração, foram analisados no Matlab os três métodos de
calibração da velocidade apresentados na seção anterior. O primeiro consiste em
simplesmente substituir os valores nominais na equação da velocidade. Temos assim uma
velocidade calibrada a partir de valores teóricos, que não foram medidos e não são conhecidos
com exatidão.
A Figura 23 apresenta uma comparação entre os sinais de posição obtidos pelo
encoder e pela integração da velocidade teórica. Verificamos claramente que há um erro nas
constantes de calibração, já esperado em vista do que foi apontado no parágrafo anterior. Uma
calibração mais precisa poderia ser obtida medindo as constantes utilizadas em (27) para cada
bomba de infusão produzida, mas seria um processo que consumiria muito tempo. Além
disso, não seria automático de forma que não poderia ser feito pelo próprio sistema ao longo
do tempo com a finalidade de compensar possíveis modificações nesses parâmetros.
Figura 23 Integral da velocidade teórica comparada com a posição dada pelo encoder
Fonte: Elaborada pelo autor.
58
Uma solução pensada para evitar o acúmulo de erros ao longo do tempo consiste em
utilizar os pulsos do encoder como uma medida de referência da posição e a integral da
velocidade entre os pulsos, para determinar as posições entre eles, sendo o valor dessa integral
zerado a cada pulso. A Figura 24 mostra o resultado dessa técnica, que melhora a medida da
posição de maneira geral.
Figura 24 Posição combinando os pulsos do encoder com a integração
da velocidade teórica
Fonte: Elaborada pelo autor.
A Figura 25 permite visualizar erros na posição obtida pela integração da velocidade
entre os pulsos do encoder.
59
Figura 25 Ampliação da Figura 24
Fonte: Elaborada pelo autor.
A Figura 26 e a Figura 27 apresentam o erro percentual relativo a um pulso do encoder
(1/26 rotações). O erro é calculado como a diferença entre a posição dada pelo encoder e a
posição obtida combinando os pulsos deste com a integração da velocidade teórica.
60
Figura 26 Erro percentual entre a posição dada pelo encoder e a posição obtida integrando a velocidade teórica entre os pulsos deste
Fonte: Elaborada pelo autor.
Figura 27 Ampliação da Figura 26
Fonte: Elaborada pelo autor.
61
O segundo modo de calibração fez uso do método dos mínimos quadrados, como
descrito na seção anterior. Os valores X e Y foram obtidos dividindo o tempo total do ensaio
em algumas partes.
A velocidade obtida a partir do método dos mínimos quadrados, ao ser integrada no
tempo, gera um sinal muito mais próximo do sinal de posição do encoder, conforme mostra a
Figura 28. Apesar de ter um resultado muito melhor, com menor acúmulo de erros, há um erro
entre a posição obtida pelo encoder e a obtida pela integração da velocidade ajustada pelo
método dos mínimos quadrados, o que é ilustrado pela Figura 29.
Figura 28 Integral da velocidade calibrada pelo método dos mínimos quadrados
Fonte: Elaborada pelo autor.
62
Figura 29 Ampliação da Figura 28
Fonte: Elaborada pelo autor.
Utilizando a técnica de combinar a posição obtida pelo encoder com a posição obtida
pela integral da velocidade ajustada pelo método dos mínimos quadrados, têm-se erros muito
pequenos, como mostram a Figura 30, a Figura 31 e a Figura 32.
63
Figura 30 Posição combinando os pulsos do encoder com a integração da velocidade ajustada pelo método dos mínimos quadrados
Fonte: Elaborada pelo autor.
Figura 31 Erro percentual entre a posição dada pelo encoder e a posição obtida integrando a velocidade ajustada pelo método dos mínimos quadrados
Fonte: Elaborada pelo autor.
64
Figura 32 Ampliação da Figura 31
Fonte: Elaborada pelo autor.
A Figura 32 mostra que o erro fica na faixa de ±3% da posição angular correspondente
a um pulso do encoder.
Utilizando o terceiro método para encontrar as constantes de calibração obtêm-se
resultados muito próximos dos obtidos usando o método dos mínimos quadrados e por essa
razão os gráficos foram omitidos.
Para utilização no microcontrolador foi implementada a calibração usando o terceiro
método em tempo de execução, ou seja, a constante k é recalculada a cada pulso do encoder.
Como mostra a Figura 32, há erros na medição da posição pela integral da velocidade
a cada pulso do encoder, de forma que o sinal de posição combinado varia nesses instantes
devido à correção. Em decorrência disso, o erro de posição usado pelo controlador tenderá a
ter variações maiores nesses instantes.
65
6 Controle de velocidade/posição
6.1 Introdução
O título deste capítulo fala em controle de velocidade/posição porque ao controlar
diretamente uma destas variáveis no tempo automaticamente estamos controlando a outra.
Neste trabalho, no entanto, considerou-se mais adequado fazer o controle direto da posição. A
razão é que o controle direto da posição garante que não haja acúmulo de erros de volumetria
ao longo do tempo. Fazendo controle direto da velocidade, a ocorrência de perturbações e
mesmo o transitório inicial do sistema fazem com que o sinal de velocidade controlada seja
diferente do sinal de velocidade de referência em alguns momentos, de forma que a integral
da velocidade controlada pode ser diferente da integral da velocidade de referência. Isso
implica que o volume final infundido na realidade pode ser diferente do desejado em função
da velocidade de referência. Controlando diretamente a posição temos um controle de
velocidade em que o volume final infundido tende a ser igual ao desejado.
Em razão dessa escolha, a posição de referência em função do tempo consiste em uma
rampa com inclinação dada pela velocidade de referência. Como a posição de referência
aumenta constantemente seu valor ao longo do tempo, sua representação em ponto flutuante
vai perdendo precisão, pois os bits menos significativos vão sendo descartados com o
crescimento do número. A Figura 33 ilustra a representação dos números em ponto flutuante
no PIC utilizando o compilador CCS.
Figura 33 Representação dos números em ponto flutuante do PIC
Fonte: CCS
66
Com o objetivo de evitar essa perda de precisão foi utilizado o método seguinte: a
cada pulso do encoder subtrai-se o valor 1/26 tanto da posição de referência como da posição
do mecanismo peristáltico, de forma a limitar os valores dessas variáveis sem modificar o
erro, dado pela diferença entre elas.
A posição do eixo do mecanismo peristáltico em rotações é dada por:
veltegralinposTMR
permeceixopos _._26
0___ += (46)
Assim, subtraindo 1/26 rotações a cada pulso do encoder, a posição do eixo do
mecanismo peristáltico é dada pela integral da velocidade medida entre os pulsos, notando
que ela tem seu valor zerado a cada pulso de forma a evitar o acúmulo de erros conforme foi
apresentado na seção 5.7. Além disso, no PIC, o valor da posição dada pela integral da
velocidade foi limitado ao valor 1/26 que seria o máximo valor para essa variável caso o
processo de instrumentação fosse perfeito.
Conclui-se então que com essa alteração tanto o sinal da posição de referência como o
da posição do eixo do mecanismo peristáltico terão no tempo a forma de dente de serra, mas
isso não muda em nada o erro que é a variável efetivamente utilizada pelo controlador.
6.2 Levantamento da função de transferência
Para o levantamento da função de transferência da planta foi feito um ensaio aplicando
uma entrada u(t) à planta. A resposta de velocidade é ilustrada pela Figura 34:
stV
stsV
stsV
stV
tu
80
855
5110
10
)(
≥−
<≤−
<≤−
<−
= (47)
67
Figura 34 Resposta de velocidade do sistema à entrada aplicada
Fonte: Elaborada pelo autor.
Podemos ver claramente que a resposta ao degrau da planta muda ao longo do tempo.
Para fins de projeto foi utilizada a parte do ensaio apresentada na Figura 35.
68
Figura 35 Trecho do ensaio utilizado para identificação do sistema
Fonte: Elaborada pelo autor.
Foi considerado um modelo de primeira ordem para modelagem da resposta de
velocidade da planta. Assim, a função de transferência para posição é dada por:
)1..()(
)()(
+==
ss
K
sU
sYsG
τ (48)
Aplicando o teorema do valor final à resposta de velocidade ao degrau aplicado
calculamos a constante K:
9,0.101.
.10
.lim0
===+→
regs
yKs
K
ss
τ (49)
69
VrpsK /09,010
9,0== (50)
A constante de tempo τ é obtida graficamente pelos pontos apresentados na Figura
35, sabendo que após uma constante de tempo a velocidade atinge aproximadamente 63,2%
de seu valor de regime permanente.
Assim, a função de transferência aproximada do sistema é:
)1.013,0(
09,0)(
+=
sssG (51)
6.3 Projeto do controlador PID
O primeiro controlador considerado foi o PID, dada sua simplicidade. Esse
controlador tem a seguinte função de transferência:
s
KisKpsKdsKd
s
KiKp
sE
sUsC
++=++==
...
)(
)()(
2
(52)
A partir de (52) verificamos que o controlador adiciona um polo na origem e dois
zeros, que podem ser reais ou complexos, dependendo dos parâmetros Kp, Ki e Kd.
Com a adição do controlador, temos o seguinte diagrama de blocos para o sistema:
70
Figura 36 Diagrama de blocos do sistema com o controlador
Fonte: Elaborada pelo autor.
O projeto do controlador foi feito colocando um zero sobre o polo real da planta e o
outro no ponto médio entre o polo real da planta e a origem. Assim a função de transferência
do controlador tem a forma:
s
ssKi
sE
sUsC
)1.026,0)(1.013,0(
)(
)()(
++== (53)
O lugar das raízes do sistema compensado é apresentado na Figura 37 utilizando um
ganho 68400≅Ki . Esse ganho foi escolhido porque proporciona polos de malha fechada
mais rápidos, com menos oscilação, mantendo-os suficientemente lentos para que o sistema
digital seja capaz de realizar o controlador desejado. São considerados suficientemente lentos
porque estão próximos do polo real original da planta, que tem constante de tempo
aproximadamente 6 vezes maior do que o tempo de amostragem utilizado para o laço de
controle, que vale 2,26ms. Caso o sistema apresentasse comportamento indesejado esse ganho
poderia ser diminuído, tornando a resposta transitória mais lenta e oscilatória, no entanto.
71
Figura 37 Lugar das raízes do sistema compensado
Fonte: Elaborada pelo autor
Substituindo o ganho 68400≅Ki em (53) e comparando-a com (52) após as devidas
multiplicações, encontramos os parâmetros do controlador para o ponto do LGR escolhido:
2668=Kp (54)
68400=Ki (55)
12.23=Kd (56)
No tempo, o controlador gera a seguinte relação entre o erro e o sinal de controle:
72
dt
deKddteKiteKptu
t
.).(.)(.)(0
++= ∫ τ (57)
No microcontrolador a lei de controle foi implementada a partir de (57). Obtém-se o
erro, que é multiplicado pelo ganho proporcional de forma a obter a parcela proporcional do
sinal de controle. A integração é feita usando o método dos trapézios e não é a integração
direta do erro, visto que foi adicionado um sistema de anti wind-up do tipo back calculation
and tracking, conforme o diagrama de blocos da Figura 38. A derivada do erro de posição é
calculada como a diferença entre a velocidade de referência e a velocidade medida.
Figura 38 Controlador PID com anti wind-up da ação integral
Fonte: Silva (2000).
A constante Tt foi calculada usando a regra empírica (58) sugerida em (SILVA, 2000):
TdTiTt .= (58)
73
6.4 Resultados da implementação prática do controlador PID
Utilizando o controlador descrito na seção anterior foram realizados ensaios de
desempenho utilizando diferentes vazões de referência. Serão primeiramente apresentados os
resultados para uma vazão de referência de 99,6ml/h em um ensaio com duração de 60s. A
vazão de referência desejada era na verdade de 100ml/h, mas não pôde ser obtida devido à
forma como seu valor é calculado no PIC, a partir de um byte enviado pelo computador. Esse
problema, no entanto poderia ser minimizado enviando para o PIC um valor em ponto
flutuante por meio de quatro bytes.
A Figura 39 ilustra os primeiros segundos de controle, onde se percebe o
funcionamento do algoritmo usado para evitar o crescimento dos valores de posição medida e
posição de referência, conforme explicado na introdução deste capítulo.
Figura 39 Comparação entre a posição de referência e a posição medida – 99,36 ml/h
Fonte: Elaborada pelo autor
74
Comparando a Figura 39 e a Figura 41 percebemos que, ao corrigir os erros da
integração da velocidade tomando o encoder como referência, surgem alterações bruscas no
valor do erro. Percebemos que essas alterações bruscas geram os maiores erros ao longo do
controle, ou seja, o gargalo está na instrumentação da velocidade/posição e não no controlador
em si. Os valores de erro nesses instantes de correção têm valor máximo em torno de 1,5.10-3.
Como cada pulso do encoder corresponde a 1/26=0,038 rotações, conclui-se que para esta
vazão a utilização da força contra-eletromotriz para aferição da velocidade efetivamente
melhorou a instrumentação da posição diminuindo a resolução equivalente a
aproximadamente ±4% de seu valor original.
Figura 40 Sinal de erro – 99,39ml/h
Fonte: Elaborada pelo autor
75
Figura 41 Ampliação da Figura 40
Fonte: Elaborada pelo autor
A Figura 42 apresenta o sinal de controle, que tem valor médio em torno de 2,5V. Esse
sinal de controle passa por uma etapa de saturação em que fica limitado à faixa de 0-10V. Em
seguida é convertido para um valor de duty cycle do sinal PWM levando em conta o tempo
utilizado para medição da tensão relativa à força contra-eletromotriz do motor. Percebemos
que ele é periódico, compensando a mudança de carga ao longo do ciclo do mecanismo
peristáltico, que também é periódica.
76
Figura 42 Sinal de controle
Fonte: Elaborada pelo autor
A seguir são apresentados os resultados para uma vazão referência de 1ml/h,
aproximadamente, que foi a menor experimentada.
A Figura 43 nos mostra que para baixas velocidades a medição da posição a partir da
força contra-eletromotriz do motor não funciona corretamente e os erros de correção são
muito próximos do valor correspondente a um pulso do encoder, ou seja, 0,038 rotações. Na
verdade, mesmo nos momentos em que a posição do mecanismo peristáltico parece
acompanhar a posição de referência isso não acontece na realidade devido ao erro de medição
da velocidade. Nesse caso o desempenho fica dependente da medida de posição usando quase
que exclusivamente o encoder, que apresenta baixa resolução.
77
Figura 43 Comparação entre a posição de referência e a posição medida – 1 ml/h
Fonte: Elaborada pelo autor
Foram experimentadas também as vazões de referência de 5ml/h, 10ml/h, 50ml/h,
600ml/h e 650ml/h. A maior vazão atingível experimentada foi 600mL/h, para a qual o erro
de posição ficou na faixa de ±0.005 rotações que corresponde a ±13% da resolução do
encoder.
78
7 Conclusão
Concluiu-se com esse trabalho que a utilização de motor DC para acionamento do
mecanismo peristáltico é uma alternativa viável desde que sejam utilizados motor, redução e
encoder adequados à faixa de vazões e ao erro de infusão máximo aceitáveis.
Verificou-se que a técnica de utilização da força contra-eletromotriz do motor
efetivamente trouxe melhorias à aferição da posição para vazões médias e altas. Para vazões
baixas a instrumentação da velocidade foi ineficiente, de forma que a medida de posição ficou
dependente quase que exclusivamente do sinal do encoder, que tinha baixa resolução.
O sistema microprocessado se mostrou suficiente para a implementação do
controlador, aquisição dos dados e aplicação do sinal de controle.
79
8 Sugestões para trabalhos futuros
Verificou-se que mudanças no valor da tensão da fonte em infusões mais demoradas
podem alterar significativamente os resultados da técnica de instrumentação da velocidade,
principalmente para baixos valores dessa variável. Em razão disso, propõe-se que a etapa de
potência seja modificada, utilizando um MOSFET de canal P para o acionamento do motor,
que então seria ligado entre a massa e o dreno do MOSFET. Isso facilitaria inclusive o
processo de calibração que passaria a ter uma única variável a ser descoberta. A única
desvantagem seria o fato de que MOSFETs de canal P apresentam maior resistência de
condução RDS(on).
Em novos projetos recomenda-se que sejam utilizados o motor, redução e encoder
especificados nesse trabalho, pois assim será possível atingir uma faixa de vazões mais usual
(0,1ml/h-100ml/h), eliminado o principal gargalo encontrado neste trabalho, que foi a baixa
resolução do encoder, associada ao fato de que ele estava acoplado depois da redução.
Deve-se avaliar a influência da resolução da etapa de potência no controle para baixas
velocidades, pois ela pode passar a ser o gargalo do sistema com a troca do encoder.
Sugere-se que seja analisada a possibilidade de utilização da medição dos pulsos da
tensão de ripple do motor em combinação com a medição da força contra-eletromotriz para
avaliar a possibilidade de eliminar a necessidade de um encoder na aferição da posição.
Para um controle mais seguro da vazão sugere-se que seja pesquisada uma alternativa
para medição dessa variável. Caso isso não seja possível, é muito importante que sejam
realizados ensaios mais precisos da relação entre a velocidade do eixo do mecanismo
peristáltico e a vazão utilizando uma balança eletrônica de precisão ou então um sensor de
vazão apropriado. Esses ensaios são importantes principalmente para baixas vazões, pois a
norma não exige um ensaio para a mínima vazão que os fabricantes afirmam que a bomba é
capaz de manter com precisão.
80
9 Referências Bibliográficas
CHAPMAN, Stephen J. Electric Machinery Fundamentals. 4 ed. Nova York: McGraw-
Hill, 2005.
FUNDAMENTOS das máquinas CC. Disponível em: <http://www.ufjf.br/ramoieee/files/2010/08/fundamentos.pdf> . Acesso em: 2 dez. 2013. PORTESCAP. Catálogo de produtos.2009
MICROCHIP, PIC18F2455/2550/4455/4550 Data Sheet. 2006. Disponível em: < http://ww1.microchip.com/downloads/en/DeviceDoc/39632e.pdf > Acesso em: 2 dez. 2013. CCS, What is the format of floating point point numbers. Disponível: <http://www.ccsinfo.com/faq.php?page=mchp_float_format>. Acesso em: 2 dez. 2013. SILVA, João Manoel Gomes da. Wind-up da ação integral. 2000. Disponível em: <http://www.ece.ufrgs.br/~jmgomes/pid/Apostila/apostila/node31.html>. Acesso em: 2 dez. 2013. HILAIRET, M., AUGER, F. Sensorless speed measurement using current harmonic
spectral estimation in a DC-motor. In: International Symposium on Power Electronics, 2006.
81
Apêndice A – Circuitos eletrônicos
82
83
Apêndice B – Programa MATLAB para
aquisição de dados do ensaio de calibração
%INICIALIZAÇÃO clear all; close all; clc scrsz = get(0,'ScreenSize'); t_contr_des = 120;%s ta = 256*(256-210)/12000000; imax = floor(t_contr_des/ta)+1; vfcem = zeros(1,imax); TMR0 = zeros(1,imax); duty = zeros(1,imax); t = zeros(1,imax); s = serial('COM4'); fopen(s); %Entra no programa de calibração pelo computador fwrite(s,0); [buff_com,n_bytes_lidos,msg] = fread(s,6); disp(msg); i=0; while n_bytes_lidos==6 i = i + 1; t(i) = (i-1)*ta; vfcem(i) = buff_com(1) + 256*buff_com(2); TMR0(i) = buff_com(3) + 256*buff_com(4); duty(i) = buff_com(5) + 256*buff_com(6); [buff_com,n_bytes_lidos,msg] = fread(s,6); end t = t(1:i); vfcem = vfcem(1:i); TMR0 = TMR0(1:i); duty = duty(1:i); if t(i)<59 disp('Tempo de amostragem excedido!\n'); else fwrite(s,0); [buff_com,n_bytes_lidos,msg] = fread(s,8); disp(msg); %converte do ponto flutuante do PIC para o do computador expoente = buff_com(1)-127; if(buff_com(2)>=128) sinal = -1; else sinal = 1;
84
buff_com(2) = buff_com(2)+128; end vfcem0 = sinal*(buff_com(2)*65536 + buff_com(3)*256 + buff_com(4))/(2^(23-expoente)); TMR0_final = buff_com(5) + 256*buff_com(6); conta_ciclos = buff_com(7) + 256*buff_com(8); sprintf('vfcem0: %d',vfcem0) sprintf('TMR0_final: %d',TMR0_final) sprintf('conta_ciclos: %d',conta_ciclos) [buff_com,n_bytes_lidos,msg] = fread(s,8); %converte do ponto flutuante do PIC para o do computador expoente = buff_com(1)-127; if(buff_com(2)>=128) sinal = -1; else sinal = 1; buff_com(2) = buff_com(2)+128; end integral_vfcem = sinal*(buff_com(2)*65536 + buff_com(3)*256 + buff_com(4))/(2^(23-expoente)); sprintf('integral_vfcem: %d',integral_vfcem) %converte do ponto flutuante do PIC para o do computador expoente = buff_com(5)-127; if(buff_com(6)>=128) sinal = -1; else sinal = 1; buff_com(6) = buff_com(6)+128; end k = sinal*(buff_com(6)*65536 + buff_com(7)*256 + buff_com(8))/(2^(23-expoente)); sprintf('k: %d',k) fid = fopen('vfcem0.bin','w'); fwrite(fid,vfcem0,'float'); fclose(fid); fid = fopen('TMR0_final.bin','w'); fwrite(fid,TMR0_final,'float'); fclose(fid); fid = fopen('conta_ciclos.bin','w'); fwrite(fid,conta_ciclos,'float'); fclose(fid); fid = fopen('k.bin','w'); fwrite(fid,k,'float'); fclose(fid); fid = fopen('integral_vfcem.bin','w'); fwrite(fid,t,'float'); fclose(fid); fid = fopen('vfcem.bin','w'); fwrite(fid,vfcem,'float'); fclose(fid); fid = fopen('TMR0.bin','w');
85
fwrite(fid,TMR0,'float'); fclose(fid); fid = fopen('duty.bin','w'); fwrite(fid,duty,'float'); fclose(fid); fid = fopen('t.bin','w'); fwrite(fid,t,'float'); fclose(fid); end fclose(s);
86
Apêndice C – Programa MATLAB para análise
dos dados do ensaio de calibração do motor
%INICIALIZAÇÃO clear all; close all; clc scrsz = get(0,'ScreenSize'); %CARREGA VARIÁVEIS DO ENSAIO DE CALIBRAÇÃO fid = fopen('vfcem0.bin','r'); vfcem0 = fread(fid,'float'); fclose(fid); fid = fopen('k.bin','r'); k_pic = fread(fid,'float'); fclose(fid); fid = fopen('vfcem.bin','r'); vfcem = fread(fid,'float'); fclose(fid); fid = fopen('TMR0.bin','r'); TMR0 = fread(fid,'float'); fclose(fid); fid = fopen('duty.bin','r'); duty = fread(fid,'float'); fclose(fid); fid = fopen('t.bin','r'); t = fread(fid,'float'); fclose(fid); dt = t(2); pos_encoder = TMR0/26;%rotações %CALCULA VELOCIDADE DO MECANISMO PERISTÁLTICO A PARTIR DA TENSÃO MEDIDA %USANDO DADOS DO FABRICANTE E CONSTANTES DE PROJETO %ESPERA-SE QUE ESSA VELOCIDADE SEJA DIFERENTE DA REAL EM VISTA DA INEXATIDÃO %DOS DADOS DO MOTOR, ASSIM COMO OCORRE COM OS VALORES DOS RESISTORES E A %TENSÃO DA FONTE DE ALIMENTAÇÃO, QUE PODEM DIFERIR DE SEUS VALORES NOMINAIS %HÁ TAMBÉM O OFFSET DO AMPOP ke = 0.00142;%V/rpm - dado do fabricante ref_ad = 3.36;%V - tensão medida R2 = 33000;%ohms - valor nominal do resistor R6 = 5860;%ohms - valor medido R5 = 6800;%ohms - valor nominal do resistor val_max_ad = 1023;%valor máximo para resolução de 10 bits v_fonte = 12;%V - valor de tensão nominal da fonte utilizada fat_div_tensao = (R5+R6)/(R5+R6+R2); reducao = 121;
87
fat_conv_dig_analog = (ref_ad/val_max_ad); fat_conv_rpm_rps = 1/60; vel_teorica_motor = fat_conv_rpm_rps*fat_conv_dig_analog*(1023 - vfcem)/(fat_div_tensao*ke);%rps vel_teorica_mec_per = vel_teorica_motor/reducao;%rps %PLOTA OS SINAIS DO ENSAIO %figure('Position',scrsz) figure(1) plot(t,duty) ylabel('Sinal de entrada(duty cycle)'); xlabel('tempo(s)') title('Sinais do ensaio de calibração') figure(2) plot(t,vfcem); ylabel('V_A_N_0_D_I_G - Tensão medida pelo CAD(0-1023)'); xlabel('tempo(s)') title('Sinais do ensaio de calibração') figure(3) plot(t,TMR0) ylabel('TMR0 - Posição do mec. peristáltico(pulsos)'); xlabel('tempo(s)') title('Sinais do ensaio de calibração') %% MÉTODO 1 %INTEGRA O SINAL DE VELOCIDADE TEÓRICA NO MECANISMO PERISTÁLTICO PELO MÉTODO %DOS TRAPÉZIOS ENCONTRANDO A POSIÇÃO trapezios=dt*(vel_teorica_mec_per(1:length(vel_teorica_mec_per)-1)+vel_teorica_mec_per(2:length(vel_teorica_mec_per)))/2; trapezios2 = t*0; trapezios2(2:length(trapezios2)) = trapezios; pos_mec_per_integral_vel_teorica = trapezios2; for i=2:length(t) pos_mec_per_integral_vel_teorica(i) = pos_mec_per_integral_vel_teorica(i-1) + trapezios2(i);%rotações end %figure('Position',scrsz) figure(4) plot(t,pos_encoder,t,pos_mec_per_integral_vel_teorica) legend('Posição pelo encoder(rotações)','Posição pela integral da velocidade teórica(rotações)'); xlabel('tempo(s)') %DETERMINA A POSIÇÃO DO MECANISMO PERISTÁLTICO USANDO OS PULSOS DO ENCODER %EM COMBINAÇÃO COM A POSIÇÃO OBTIDA PELA INTEGRAÇÃO DA VELOCIDADE CALIBRADA vel_cal = vel_teorica_mec_per(1); pos_mec_per_encoder_e_integral_vel_teorica = pos_encoder; pos_mec_per_encoder_e_integral_vel_teorica(1)=pos_encoder(1); ind_erro_encoder_calib=1; erro_encoder_calibracao = zeros(1,TMR0(length(TMR0))); erro_calibracao = zeros(1,TMR0(length(TMR0))); t_erro_encoder_calibracao = zeros(1,TMR0(length(TMR0))); for i=2:length(t) vel_cal_ant = vel_cal; vel_cal = vel_teorica_mec_per(i); if(pos_encoder(i)==pos_encoder(i-1)) pos_mec_per_encoder_e_integral_vel_teorica(i) = pos_mec_per_encoder_e_integral_vel_teorica(i-1) + dt*(vel_cal+vel_cal_ant)/2;
88
else pos_mec_per_encoder_e_integral_vel_teorica(i) = pos_encoder(i); erro_encoder_calibracao(ind_erro_encoder_calib) = 100*(pos_encoder(i) - (pos_mec_per_encoder_e_integral_vel_teorica(i-1) + dt*(vel_cal+vel_cal_ant)/2))/(1/26);% percentual erro_calibracao(ind_erro_encoder_calib) = 100*(pos_encoder(i) - pos_mec_per_integral_vel_teorica(i))/(1/26);% percentual t_erro_encoder_calibracao(ind_erro_encoder_calib) = t(i); ind_erro_encoder_calib = ind_erro_encoder_calib + 1; end end %figure('Position',scrsz) figure(5) plot(t,pos_encoder,t,pos_mec_per_encoder_e_integral_vel_teorica) legend('Posição pelo encoder(rotações)','Posição pelo encoder em combinação com a integral da velocidade teórica(rotações)'); xlabel('tempo(s)') erro1 = sum(erro_encoder_calibracao); sprintf('Erro1: %f',erro1) %figure('Position',scrsz) figure(6) plot(t_erro_encoder_calibracao,erro_calibracao,t_erro_encoder_calibracao,erro_encoder_calibracao) title('Erros percentuais utilizando a velocidade teórica'); legend('Sem zerar erros acumulados','Zerando erros acumulados'); xlabel('tempo(s)') %% MÉTODO 2 %PROCESSO DE CALIBRAÇÃO USANDO O MÉTODO DOS MÍNIMOS QUADRADOS n_trechos_mmq = 30; tam_trechos_mmq = floor(length(t)/n_trechos_mmq); for i=1:n_trechos_mmq lim_inf_int = 1+(i-1)*tam_trechos_mmq; lim_sup_int = i*tam_trechos_mmq; integral_vfcem = sum(dt*(vfcem(lim_inf_int:lim_sup_int-1) + vfcem(lim_inf_int+1:lim_sup_int))/2); X(i) = integral_vfcem/(t(lim_sup_int)-t(lim_inf_int)); Y(i) = (pos_encoder(lim_sup_int)-pos_encoder(lim_inf_int))/(t(lim_sup_int)-t(lim_inf_int)); end %figure('Position',scrsz) figure(7) plot(X,Y) title('X vs Y'); ylabel('Y'); xlabel('X'); n = length(X); a0 = (sum(X.^2)*sum(Y)-sum(X.*Y)*sum(X))/(n*sum(X.^2)-sum(X)^2); a1 = (n*sum(X.*Y)-sum(X)*sum(Y))/(n*sum(X.^2)-sum(X)^2); vel_calibrada_mec_per = a0 + a1*vfcem;%rps %INTEGRA O SINAL DE VELOCIDADE CALIBRADA NO MECANISMO PERISTÁLTICO PELO MÉTODO %DOS TRAPÉZIOS ENCONTRANDO A POSIÇÃO trapezios=dt*(vel_calibrada_mec_per(1:length(vel_calibrada_mec_per)-1)+vel_calibrada_mec_per(2:length(vel_calibrada_mec_per)))/2; trapezios2 = t*0; trapezios2(2:length(trapezios2)) = trapezios; pos_mec_per_integral_vel_calibrada = trapezios2;
89
for i=2:length(t) pos_mec_per_integral_vel_calibrada(i) = pos_mec_per_integral_vel_calibrada(i-1) + trapezios2(i);%rotações end %figure('Position',scrsz) figure(8) plot(t,pos_encoder,t,pos_mec_per_integral_vel_calibrada) legend('Posição pelo encoder(rotações)','Posição pela integral da velocidade calibrada pelo MMQ(rotações)'); xlabel('tempo(s)') %DETERMINA A POSIÇÃO DO MECANISMO PERISTÁLTICO USANDO OS PULSOS DO ENCODER %EM COMBINAÇÃO COM A POSIÇÃO OBTIDA PELA INTEGRAÇÃO DA VELOCIDADE CALIBRADA %pelo MMQ vel_cal = vel_calibrada_mec_per(1); pos_mec_per_encoder_e_integral_vel_calibrada = pos_encoder; pos_mec_per_encoder_e_integral_vel_calibrada(1)=pos_encoder(1); ind_erro_encoder_calib=1; erro_encoder_calibracao = zeros(1,TMR0(length(TMR0))); erro_calibracao = zeros(1,TMR0(length(TMR0))); t_erro_encoder_calibracao = zeros(1,TMR0(length(TMR0))); for i=2:length(t) vel_cal_ant = vel_cal; vel_cal = vel_calibrada_mec_per(i); if(pos_encoder(i)==pos_encoder(i-1)) pos_mec_per_encoder_e_integral_vel_calibrada(i) = pos_mec_per_encoder_e_integral_vel_calibrada(i-1) + dt*(vel_cal+vel_cal_ant)/2; else pos_mec_per_encoder_e_integral_vel_calibrada(i) = pos_encoder(i); erro_encoder_calibracao(ind_erro_encoder_calib) = 100*(pos_encoder(i) - (pos_mec_per_encoder_e_integral_vel_calibrada(i-1) + dt*(vel_cal+vel_cal_ant)/2))/(1/26);% percentual erro_calibracao(ind_erro_encoder_calib) = 100*(pos_encoder(i) - pos_mec_per_integral_vel_calibrada(i))/(1/26);% percentual t_erro_encoder_calibracao(ind_erro_encoder_calib) = t(i); ind_erro_encoder_calib = ind_erro_encoder_calib + 1; end end %figure('Position',scrsz) figure(9) plot(t,pos_encoder,t,pos_mec_per_encoder_e_integral_vel_calibrada) legend('Posição pelo encoder(rotações)','Posição pelo encoder em combinação com a integral da velocidade calibrada pelo MMQ(rotações)'); xlabel('tempo(s)') erro = sum(erro_encoder_calibracao); sprintf('Erro2: %f',erro) %figure('Position',scrsz) figure(10) plot(t_erro_encoder_calibracao,erro_calibracao,t_erro_encoder_calibracao,erro_encoder_calibracao) title('Erros percentuais utilizando a velocidade calibrada pelo MMQ'); legend('Sem zerar erros acumulados','Zerando erros acumulados'); xlabel('tempo(s)') %% MÉTODO 3 %ENCONTRA CONSTANTES DE CALIBRAÇÃO DA MEDIÇÃO DE VELOCIDADE A PARTIR DA %FORÇA CONTRA-ELETROMOTRIZ DO MOTOR integral_vfcem=sum(dt*(vfcem(1:length(vfcem)-1)+vfcem(2:length(vfcem)))/2); k = (vfcem0*t(length(t))-integral_vfcem)/pos_encoder(length(pos_encoder));
90
%ENCONTRA A VELOCIDADE DO MOTOR A PARTIR DAS CONSTANTES DE CALIBRAÇÃO vel_calibrada_mec_per = (vfcem0 - vfcem)/k;%rps %INTEGRA O SINAL DE VELOCIDADE CALIBRADA NO MECANISMO PERISTÁLTICO PELO MÉTODO %DOS TRAPÉZIOS ENCONTRANDO A POSIÇÃO trapezios=dt*(vel_calibrada_mec_per(1:length(vel_calibrada_mec_per)-1)+vel_calibrada_mec_per(2:length(vel_calibrada_mec_per)))/2; trapezios2 = t*0; trapezios2(2:length(trapezios2)) = trapezios; pos_mec_per_integral_vel_calibrada = trapezios2; for i=2:length(t) pos_mec_per_integral_vel_calibrada(i) = pos_mec_per_integral_vel_calibrada(i-1) + trapezios2(i);%rotações end %figure('Position',scrsz) figure(11) plot(t,pos_encoder,t,pos_mec_per_integral_vel_calibrada) legend('Posição pelo encoder(rotações)','Posição pela integral da velocidade calibrada(rotações)'); xlabel('tempo(s)') %DETERMINA A POSIÇÃO DO MECANISMO PERISTÁLTICO USANDO OS PULSOS DO ENCODER %EM COMBINAÇÃO COM A POSIÇÃO OBTIDA PELA INTEGRAÇÃO DA VELOCIDADE CALIBRADA vel_cal = vel_calibrada_mec_per(1); pos_mec_per_encoder_e_integral_vel_calibrada = pos_encoder; pos_mec_per_encoder_e_integral_vel_calibrada(1)=pos_encoder(1); ind_erro_encoder_calib=1; erro_encoder_calibracao = zeros(1,TMR0(length(TMR0))); erro_calibracao = zeros(1,TMR0(length(TMR0))); t_erro_encoder_calibracao = zeros(1,TMR0(length(TMR0))); for i=2:length(t) vel_cal_ant = vel_cal; vel_cal = vel_calibrada_mec_per(i); if(pos_encoder(i)==pos_encoder(i-1)) pos_mec_per_encoder_e_integral_vel_calibrada(i) = pos_mec_per_encoder_e_integral_vel_calibrada(i-1) + dt*(vel_cal+vel_cal_ant)/2; else pos_mec_per_encoder_e_integral_vel_calibrada(i) = pos_encoder(i); erro_encoder_calibracao(ind_erro_encoder_calib) = 100*(pos_encoder(i) - (pos_mec_per_encoder_e_integral_vel_calibrada(i-1) + dt*(vel_cal+vel_cal_ant)/2))/(1/26);% percentual erro_calibracao(ind_erro_encoder_calib) = 100*(pos_encoder(i) - pos_mec_per_integral_vel_calibrada(i))/(1/26);% percentual t_erro_encoder_calibracao(ind_erro_encoder_calib) = t(i); ind_erro_encoder_calib = ind_erro_encoder_calib + 1; end end %figure('Position',scrsz) figure(12) plot(t,pos_encoder,t,pos_mec_per_encoder_e_integral_vel_calibrada) legend('Posição pelo encoder(rotações)','Posição pelo encoder em combinação com a integral da velocidade calibrada(rotações)'); xlabel('tempo(s)') erro1 = sum(erro_encoder_calibracao); sprintf('Erro3: %f',erro1) %figure('Position',scrsz) figure(13) plot(t_erro_encoder_calibracao,erro_calibracao,t_erro_encoder_calibracao,erro_encoder_calibracao)
91
title('Erros percentuais utilizando a velocidade calibrada pelo método alternativo'); legend('Sem zerar erros acumulados','Zerando erros acumulados'); xlabel('tempo(s)')
92
Apêndice D – Programa MATLAB para
aquisição de dados do ensaio de controle
%INICIALIZAÇÃO clear all; close all; clc scrsz = get(0,'ScreenSize'); t_contr_des = 60;%s ta = 256*(256-150)/12000000; imax = floor(t_contr_des/ta)+1; pos = zeros(1,imax); pos_TMR0 = zeros(1,imax); pos_ref = zeros(1,imax); u = zeros(1,imax); t = zeros(1,imax); s = serial('COM4'); fopen(s); %Entra no programa de controle pelo computador fwrite(s,3); %Define velocidade de referência Q = 100;%mL/h vel_ref = Q/(0.2*3600); multiplicador_vel_ref = floor(vel_ref/0.001) vel_ref = multiplicador_vel_ref*0.001 Q = vel_ref*(0.2*3600) mh = floor(multiplicador_vel_ref/256) ml = mod(multiplicador_vel_ref,256) fwrite(s,[ml mh]) for i=1:imax t(i) = (i-1)*ta; [buff_com,n_bytes_lidos,msg] = fread(s,14); disp(msg); if n_bytes_lidos<14 disp('Tempo de amostragem excedido!\n'); break; else %converte do ponto flutuante do PIC para o do computador expoente = buff_com(1)-127; if(buff_com(2)>=128) sinal = -1; else sinal = 1; buff_com(2) = buff_com(2)+128; end pos(i) = sinal*(buff_com(2)*65536 + buff_com(3)*256 + buff_com(4))/(2^(23-expoente));
93
pos_TMR0(i) = (buff_com(5) + buff_com(6)*256)/26; %converte do ponto flutuante do PIC para o do computador expoente = buff_com(7)-127; if(buff_com(8)>=128) sinal = -1; else sinal = 1; buff_com(8) = buff_com(8)+128; end pos_ref(i) = sinal*(buff_com(8)*65536 + buff_com(9)*256 + buff_com(10))/(2^(23-expoente)); %converte do ponto flutuante do PIC para o do computador expoente = buff_com(11)-127; if(buff_com(12)>=128) sinal = -1; else sinal = 1; buff_com(12) = buff_com(12)+128; end u(i) = sinal*(buff_com(12)*65536 + buff_com(13)*256 + buff_com(14))/(2^(23-expoente)); end end fwrite(s,1); fid = fopen('pos.bin','w'); fwrite(fid,pos,'float'); fclose(fid); fid = fopen('pos_TMR0.bin','w'); fwrite(fid,pos_TMR0,'float'); fclose(fid); fid = fopen('pos_ref.bin','w'); fwrite(fid,pos_ref,'float'); fclose(fid); fid = fopen('u.bin','w'); fwrite(fid,u,'float'); fclose(fid); fid = fopen('t.bin','w'); fwrite(fid,t,'float'); fclose(fid); fclose(s);
94
Apêndice E – Programa MATLAB para análise
dos dados do ensaio de controle
%INICIALIZAÇÃO clear all; close all; clc scrsz = get(0,'ScreenSize'); %% CARREGA DADOS DO ENSAIO fid = fopen('pos.bin','r'); pos = fread(fid,'float'); fclose(fid); fid = fopen('pos_TMR0.bin','r'); pos_TMR0 = fread(fid,'float'); fclose(fid); fid = fopen('pos_ref.bin','r'); pos_ref = fread(fid,'float'); fclose(fid); fid = fopen('u.bin','r'); u = fread(fid,'float'); fclose(fid); fid = fopen('t.bin','r'); t = fread(fid,'float'); fclose(fid); %% %pos = pos_TMR0 + pos; figure(1) plot(t,pos_ref,t,pos) title('Ensaio de controle com vazão de referência de 99,36ml/h') legend('Posição de referência(rotações)','Posição medida(rotações)') xlabel('t(s))') figure(2) plot(t, pos_ref+pos_TMR0, t, pos+pos_TMR0) figure(3) plot(t,pos_ref-pos) title('Ensaio de controle com vazão de referência de 99,36ml/h') ylabel('Erro(rotações)') xlabel('t(s))') figure(4) plot(t,u) title('Ensaio de controle com vazão de referência de 99,36ml/h') ylabel('Sinal de controle (V)') xlabel('t(s))')
95
figure(5) plot(t,pos_TMR0,t,pos+pos_TMR0)
96
Apêndice F – Programa do microcontrolador
em C do compilador CCS
#include <18F4550.h> #device adc=10 #use delay(clock=48000000) #include <usb_cdc.h> //Remapeamento dos vetores de reset e interrupção devido à presença do bootloader //#build (reset=0x1100, interrupt=0x1108) //#org 0x0000, 0x10FF #FUSES MCLR,PLL3,CPUDIV2,USBDIV,HSPLL,PUT,BROWNOUT,BORV28,VREGEN,NOWDT,CCP2C1,NOLPT1OSC,STVREN,NOLVP,NOICPRT,NOXINST,NOPROTECT,NODEBUG,NOCPB,NOCPD,NOWRT,NOWRTC,NOWRTB,NOWRTD,NOEBTR,NOEBTRB #use fast_io(A) #use fast_io(B) #use fast_io(C) #use fast_io(D) #use fast_io(E) union int16_2int8 int16 var16; int var8[2]; ; union int32_4int8 int32 var32; int var8[4]; ; union float_4int8 float varfloat; int var8[4]; ; float a0 = 1.112846494373772; float a1 = -0.001105231613236; union float_4int8 k;// constante de calibração da medição de velocidade union int16_2int8 i100mA,i1A,vfcem,pressao;
97
union int32_4int8 conta_ciclos; union int16_2int8 duty,buff_usb; int flags=0; int var_aux; //São definidas: //a variável de tempo utilizada para gerar uma rampa de tensão a fim de //executar a calibração considerando toda a faixa de velocidades float t; //a variável correpondente à tensão gerada pelo motor para velocidade nula union float_4int8 vfcem0; //a variável auxiliar para cálculo da integral da vfcem pelo método dos trapézios int16 vfcem_ant; //a variável que guarda a integral da vfcem union float_4int8 integral_vfcem; //a variável auxiliar para detecção do último pulso do encoder int TMR0L_ant; //a variável para salvar o valor final do TMR0 union int16_2int8 TMR0_final; int contador_tmr2; int TMR1H_salvo=0; #bit parar_controle = flags.0 #bit tempo_amostragem_excedido = flags.1 #bit flag_calibracao = flags.2 #byte TMR0L = 0x0FD6 #byte TMR0H = 0x0FD7 #byte TMR1L = 0x0FCE #byte TMR1H = 0x0FCF #byte TMR2 = 0x0FCC #byte PIR1 = 0X0F9E #bit TMR1IF = PIR1.0 #bit TMR2IF = PIR1.1 #define liga_led output_low(PIN_B0) #define desliga_led output_high(PIN_B0) #define VALOR_TMR1H_CALIBRACAO 210 //tempo de amostragem para calibração de (256-VALOR_TMR1H_CALIBRACAO)*256*(1/12MHz)=981,33333us #define VALOR_TMR1H_EXECUCAO 150 //tempo de amostragem para execução de (256-VALOR_TMR1H_EXECUCAO)*256*(1/12MHz)=981,33333us //#define VALOR_TMR1H_EXECUCAO 200 //tempo de amostragem para execução de (256-VALOR_TMR1H_EXECUCAO)*256*(1/12MHz)=0,0011946667s #define dt 0.00098133333333333333333333333333333333 #define dt_exec 0.00226133333333333333333333333333 //#define dt_exec 0.0011946667 #define duty_min 140 #define END_VFCEM0 0 //variável de duas posições na eeprom #define END_K 2 //variável de quatro posições na eeprom #INT_TIMER2 void trata_tmr2()
98
contador_tmr2++; void pisca_led_erro(int n) int i; for(i=0;i<n;i++) liga_led; delay_ms(1000); desliga_led; delay_ms(1000); while(true) void calibracao() //São definidas: float t; int iter; //a variável para salvar o valor final do TMR0 union int16_2int8 TMR0_final; //a variável utilizada para representação do tempo para geração da rampa de entrada conta_ciclos.var32 = 0; parar_controle=0; vfcem_ant=2000; //o motor começa sem tensão em seus terminais TMR2IF = 0; set_pwm2_duty(1023); while(!TMR2IF)//garante que o duty seja zerado //em seguida é feita a leitura do valor da tensão na entrada analógica para velocidade nula do motor vfcem0.varfloat = 0; for(iter=0; iter<100; iter++) vfcem0.varfloat = vfcem0.varfloat + read_adc(); vfcem0.varfloat = vfcem0.varfloat/100; //o menor valor de duty cycle necessário para que o motor gire sem parar é carregado duty.var16 = duty_min; set_pwm2_duty(1023-duty.var16); //espera até que ocorra um pulso para iniciar a calibração while(!TMR0L) //mantém a conexão USB usb_task();
99
if(!usb_enumerated()) pisca_led_erro(5); //o timer0, responsável pela contagem dos pulsos do encoder óptico de mouse, set_timer0(0); //o timer 1, responsável pela marcação precisa do tempo de amostragem, é zerado, set_timer1(0); //o flag de interrupção do timer1 é utilizado no mecanismo de marcação do tempo //tem nível lógico alto assim que passar o tempo de amostragem e começa zerado TMR1IF=0; //é atribuído à parte mais significativa do TMR1 o valor VALOR_TMR1H_CALIBRACAO que determina o //tempo de amostragem para calibração=(256-VALOR_TMR1H_CALIBRACAO)*256*(1/12MHz) //para a calibração foi utilizado VALOR_TMR1H_CALIBRACAO=210, resultando em um tempo //de amostragem de 0.0009813333333333s TMR1H=VALOR_TMR1H_CALIBRACAO; //o tempo inicial é 0 t=0; while(!parar_controle) set_adc_channel(0); //seleciona o canal de vfcem while(TMR2>230) //garante que o valor 1023(duty=0) seja carregado antes do overflow do TMR2 TMR2IF = 0; //zera o flag de interrupção do TMR2, que poderia estar setado set_pwm2_duty(1023); //abre o MOSFET para medição da tensão gerada pelo motor //há um inversor no caminho, por isso 1023 em vez de 0 while(!TMR2IF) //só passa quando o pwm for realmente zerado desliga_led; delay_us(200); //espera o tempo do transitório vfcem.var16 = read_adc();//le o sinal de tensão gerada pelo motor //desliga o sinal de indicação de trigger da tensão do motor liga_led; //volta às condições de operação normais do sinal PWM set_pwm2_duty(1023-duty.var16); //------------------------------------------------------------------------------------ //CALCULA A INTEGRAL DA VELOCIDADE PELO MÉTODO DOS TRAPÉZIOS if(vfcem_ant!=2000) integral_vfcem.varfloat = integral_vfcem.varfloat + dt*((float)(vfcem.var16 + vfcem_ant))/2; else integral_vfcem.varfloat = 0; vfcem_ant = vfcem.var16;
100
//CALCULA E APLICA SINAL DE DUTY CYCLE DESEJADO---------------------------------------- //gera rampa duty.var16 = duty_min + t; //saturação if(duty.var16>1023) duty.var16 = 1023; set_pwm2_duty(1023-duty.var16); //----------------------------------------------------------------------------------- //ENVIA DADOS PELA SERIAL/USB------------------------------------------------------------- usb_cdc_putc(vfcem.var8[0]); usb_cdc_putc(vfcem.var8[1]); usb_cdc_putc(TMR0L); usb_cdc_putc(TMR0H); usb_cdc_putc(duty.var8[0]); usb_cdc_putc(duty.var8[1]); //------------------------------------------------------------------------------------- //termina a calibração depois de 120s assim que houver um novo pulso do encoder if(t<120) TMR0L_ant=TMR0L; else if(TMR0L!=TMR0L_ant) parar_controle=1; TMR0_final.var16 = get_timer0(); set_pwm2_duty(1023);//MOSFET abre //verifica se o tempo de amostragem foi excedido if(TMR1IF) parar_controle=1; //Espera o tempo de amostragem while(!TMR1IF) TMR1IF=0; TMR1H=VALOR_TMR1H_CALIBRACAO; //mantém a conexão USB usb_task();
101
if(!usb_enumerated()) pisca_led_erro(5); conta_ciclos.var32++; t = ((float)conta_ciclos.var32)*dt; while(!usb_cdc_kbhit()) usb_cdc_getc(); //constante que relaciona a variação da tensão medida com a variação da velocidade k.varfloat = 26*(vfcem0.varfloat*((float)conta_ciclos.var32)*dt - integral_vfcem.varfloat)/((float)TMR0_final.var16); //Envia dados para cálculo da constante k no computador usb_cdc_putc(vfcem0.var8[0]); usb_cdc_putc(vfcem0.var8[1]); usb_cdc_putc(vfcem0.var8[2]); usb_cdc_putc(vfcem0.var8[3]); usb_cdc_putc(TMR0_final.var8[0]); usb_cdc_putc(TMR0_final.var8[1]); usb_cdc_putc(conta_ciclos.var8[0]); usb_cdc_putc(conta_ciclos.var8[1]); //Salva constantes na eeprom //write_eeprom(END_VFCEM0,vfcem0.var8[0]); //write_eeprom(END_VFCEM0+1,vfcem0.var8[1]); //write_eeprom(END_K,k.var8[0]); //write_eeprom(END_K+1,k.var8[1]); //write_eeprom(END_K+2,k.var8[2]); //write_eeprom(END_K+3,k.var8[3]); //Envia valores calculados ao computador para verificação da precisão usb_cdc_putc(integral_vfcem.var8[0]); usb_cdc_putc(integral_vfcem.var8[1]); usb_cdc_putc(integral_vfcem.var8[2]); usb_cdc_putc(integral_vfcem.var8[3]); usb_cdc_putc(k.var8[0]); usb_cdc_putc(k.var8[1]); usb_cdc_putc(k.var8[2]); usb_cdc_putc(k.var8[3]); void tcc(int opcao) //DECLARAÇÃO DE VARIÁVEIS int iter; int16 vfcem0, duty_aplicado,vfcem_ant=0,TMR0_ini; int32 conta_ciclos_inicial=0; //float Kp = 158.4, Ki = 240, Kd = 23.23, Tt = 0.311;
102
float Kp = 1584, Ki = 24000, Kd = 23.23, Tt = 0.0311, Kc; float up=0, ui=0, ud=0, uds=0; float vel=0, vel_ant=0, vel_ref = 0.001; float erro=0, erro_ant=0, integrando=0, integrando_ant=0; float vel_ref_aux; union int16_2int8 TMR0_aux; union float_4int8 u, posicao, pos_ref; float integral_vfcem=0; pos_ref.varfloat = 0; posicao.varfloat = 0; u.varfloat = 0; vel_ref_aux = vel_ref; buff_usb.var8[0] = usb_cdc_getc(); buff_usb.var8[1] = usb_cdc_getc(); vel_ref = 0.001*((float)(256*buff_usb.var8[1]+buff_usb.var8[0])); Kp = Kp*1; Ki = Ki*1; Kd = Kd*1; //INICIAÇÃO DA VARIÁVEIS PARA O LOOP DE CONTROLE //Leitura das constantes de calibração da velocidade //A partir de valores previamente armazenados na eeprom //vfcem0.var8[0] = read_eeprom(END_VFCEM0); //vfcem0.var8[1]= read_eeprom(END_VFCEM0+1); //k.var8[0] = read_eeprom(END_K); //k.var8[1] = read_eeprom(END_K+1); //k.var8[2] = read_eeprom(END_K+2); //k.var8[3] = read_eeprom(END_K+3); //Ou, então,a partir da leitura da tensão para velocidade nula set_pwm2_duty(1023); set_adc_channel(0); //seleciona o canal de vfcem delay_ms(100); vfcem0 = read_adc(); iter=0; while(iter<10) if(vfcem0==read_adc()) iter++; else iter=0; vfcem0 = read_adc();
103
//e de parâmetro de ensaio de calibração k.varfloat = 607.22; //valor resultante de ensaio de calibração 917.59 flag_calibracao=0; conta_ciclos.var32=0; set_timer0(0); TMR0L_ant = 0; set_timer1(0); TMR1IF=0; TMR1H=VALOR_TMR1H_EXECUCAO; parar_controle=0; t=0; duty.var16=0; //LAÇO DE CONTROLE while(!usb_cdc_kbhit()&&!parar_controle) //mantém conexão usb usb_task(); if(!usb_enumerated()) pisca_led_erro(5); set_adc_channel(0); //seleciona o canal de vfcem while(TMR2>230) //garante que o valor 1023(duty real=0) seja carregado antes do overflow do TMR2 TMR2IF = 0; set_pwm2_duty(1023); //abre o MOSFET para medição da tensão gerada pelo motor //há um inversor no caminho, por isso 1023 em vez de 0 while(!TMR2IF) //só passa quando o pwm for realmente zerado //liga o sinal de indicação de trigger da tensão do motor desliga_led; //inicializa contador do número de ciclos PWM usados para leitura do transitório da indutância contador_tmr2 = 0; //habilita contagem de ciclos PWM. A cada interrupção contador_tmr2 é incrementado. enable_interrupts(INT_TIMER2); //espera o tempo do transitório delay_us(80); vfcem_ant = vfcem.var16; //le tensão após o transitório vfcem.var16=read_adc(); //desliga o sinal de indicação de trigger da tensão do motor liga_led; //volta às condições de operação normais do sinal PWM set_pwm2_duty(1023-duty_aplicado);
104
//desabilita a contagem de ciclos PWM disable_interrupts(INT_TIMER2); //mostra pelo LED o número de ciclo mínimo utilizado para leitura da vfcem //pisca_led_erro(contador_tmr2); //------------------------------------------------------------------------------------ integral_vfcem = integral_vfcem + 0.00113066666*((float)vfcem_ant + (float)vfcem.var16);//dt_exec/2 = 0.00113066666 //CALCULA POSIÇÃO PELO MÉTODO COMBINANDO ENCODER E FCEM------------------------------- vel_ant = vel; vel = ((float)vfcem0 - (float)vfcem.var16)/(k.varfloat); //vel = a0 + a1*(float)vfcem.var16; TMR0_aux.var16 = get_timer0(); if(TMR0_aux.var8[0]!=TMR0L_ant) posicao.varfloat = 0; pos_ref.varfloat = pos_ref.varfloat + vel_ref*dt_exec - 0.03846153846;//0.03846153846 = 1/26 if(TMR0_aux.var16 - TMR0_ini==26) k.varfloat = (float)vfcem0*(float)(conta_ciclos.var32-conta_ciclos_inicial)*dt_exec - integral_vfcem; flag_calibracao = 0; if(flag_calibracao) k.varfloat = 26*((float)vfcem0*(float)(conta_ciclos.var32-conta_ciclos_inicial)*dt_exec - integral_vfcem)/((float)(TMR0_aux.var16 - TMR0_ini)); else flag_calibracao=1; conta_ciclos_inicial=conta_ciclos.var32; integral_vfcem = 0; TMR0_ini = TMR0_aux.var16; else pos_ref.varfloat = pos_ref.varfloat + vel_ref*dt_exec; posicao.varfloat = posicao.varfloat + 0.00113066666*(vel + vel_ant);//dt_exec/2 = 0.00113066666 if(posicao.varfloat>=0.03846153846) posicao.varfloat = 0.03846153846;
105
TMR0L_ant=TMR0_aux.var8[0]; //CALCULA E APLICA SINAL DE DUTY CYCLE DESEJADO---------------------------------------- t=(float)conta_ciclos.var32*dt_exec; conta_ciclos.var32++; if(((int)t)%2>0) liga_led; else desliga_led; switch(opcao) case 1: //teste da calibracão usb_cdc_putc(posicao.var8[0]); usb_cdc_putc(posicao.var8[1]); usb_cdc_putc(posicao.var8[2]); usb_cdc_putc(posicao.var8[3]); usb_cdc_putc(TMR0_aux.var8[0]); usb_cdc_putc(TMR0_aux.var8[1]); u.varfloat = 3 + 0.11666666*t; break; case 2: //resposta ao degrau usb_cdc_putc(posicao.var8[0]); usb_cdc_putc(posicao.var8[1]); usb_cdc_putc(posicao.var8[2]); usb_cdc_putc(posicao.var8[3]); usb_cdc_putc(TMR0_aux.var8[0]); usb_cdc_putc(TMR0_aux.var8[1]); usb_cdc_putc(vfcem.var8[0]); usb_cdc_putc(vfcem.var8[1]); if(t<1) u.varfloat = 0; else if(t<5) u.varfloat = 10; else if(t<8) u.varfloat = 5; else u.varfloat = 0; break; case 3: //Controle PID de posição //A entrada do controlador é o erro erro_ant = erro;
106
erro = pos_ref.varfloat - posicao.varfloat; //sinal proporcional up = Kp*erro; //sinal integral com mecanismo de anti wind-up do tipo back calculation and tracking integrando_ant = integrando; integrando = Ki*erro + (uds-u.varfloat)/Tt; ui = ui + (integrando+integrando_ant)*0.00113066666;//dt_exec/2 = 0.00113066666; /* integrando_ant = integrando; integrando = Ki*erro; //integração condicional if((u.varfloat<10&&u.varfloat>0)||(u.varfloat>10&&erro<0)||(u.varfloat<0&&erro>0)) ui = ui + (integrando+integrando_ant)*0.00113066666;//dt_exec/2 = 0.00113066666; */ //sinal derivativo: erro = pos_ref - posicao; derivada do erro = derivada da pos_ref - derivada da posicao ud = Kd*(vel_ref - vel); u.varfloat = up + ui + ud; usb_cdc_putc(posicao.var8[0]); usb_cdc_putc(posicao.var8[1]); usb_cdc_putc(posicao.var8[2]); usb_cdc_putc(posicao.var8[3]); usb_cdc_putc(TMR0_aux.var8[0]); usb_cdc_putc(TMR0_aux.var8[1]); usb_cdc_putc(pos_ref.var8[0]); usb_cdc_putc(pos_ref.var8[1]); usb_cdc_putc(pos_ref.var8[2]); usb_cdc_putc(pos_ref.var8[3]); usb_cdc_putc(u.var8[0]); usb_cdc_putc(u.var8[1]); usb_cdc_putc(u.var8[2]); usb_cdc_putc(u.var8[3]); break; case 4: //Controlador PI de velocidade Kp = 11; Ki = 500; Kc = 3;
107
Tt = 0.01; vel_ref_aux = vel_ref + Kc*(pos_ref.varfloat - posicao.varfloat); //A entrada do controlador é o erro erro_ant = erro; erro = vel_ref_aux - vel; //Sinal proporcional up = Kp*erro; //sinal integral com mecanismo de anti wind-up do tipo back calculation and tracking integrando_ant = integrando; integrando = Ki*erro + (uds-u.varfloat)/Tt; ui = ui + (integrando+integrando_ant)*0.00113066666;//dt_exec/2 = 0.00113066666; u.varfloat = up + ui; usb_cdc_putc(posicao.var8[0]); usb_cdc_putc(posicao.var8[1]); usb_cdc_putc(posicao.var8[2]); usb_cdc_putc(posicao.var8[3]); usb_cdc_putc(TMR0_aux.var8[0]); usb_cdc_putc(TMR0_aux.var8[1]); usb_cdc_putc(pos_ref.var8[0]); usb_cdc_putc(pos_ref.var8[1]); usb_cdc_putc(pos_ref.var8[2]); usb_cdc_putc(pos_ref.var8[3]); usb_cdc_putc(u.var8[0]); usb_cdc_putc(u.var8[1]); usb_cdc_putc(u.var8[2]); usb_cdc_putc(u.var8[3]); break; default: break; uds = u.varfloat; //saturação if(u.varfloat>10) uds = 10;//u depois da saturação if(u.varfloat<0) uds = 0;//u depois da saturação //u é dado em V. O código abaixo calcula o duty a ser aplicado //compensando o tempo perdido para leitura da vfcem //duty_real = duty_aplicado*(dt_exec-7*256/12000000)/dt_exec; //duty_real = 1023*u/12;
108
duty_aplicado = (int16)((85.25*uds)*1.07070707);//(int16)(1023*uds/12)*(106/(106-7)) set_pwm2_duty(1023-duty_aplicado); //----------------------------------------------------------------------------------- TMR1H_salvo = TMR1H; //Espera o tempo de amostragem if(TMR1IF) parar_controle=1; while(!TMR1IF) TMR1IF=0; TMR1H=VALOR_TMR1H_EXECUCAO; set_pwm2_duty(1023);//MOSFET aberto usb_cdc_getc(); void main() setup_adc_ports(AN0_TO_AN5|VSS_VREF); setup_adc(ADC_CLOCK_DIV_64); setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1); setup_timer_1((T1_INTERNAL|T1_DIV_BY_1)&0b01111111); setup_timer_2(T2_DIV_BY_1,255,1); SETUP_CCP1(CCP_OFF); SETUP_CCP2(CCP_PWM); set_pwm2_duty(1023);//MOSFET aberto usb_cdc_init(); usb_init(); //Determina a direção dos pinos de IO set_tris_a(0b11111111);//Entradas para medição de: velocidade por fcem(an0), corrente100mA(an1), corrente1A(an4), pressão(an5), encoder incremental(RA4) set_tris_b(0b11111110);//O PORTB apresenta a chave de bootloader em RB4, led; set_tris_c(0b11111101);//O pino RC1 será a saída do sinal PWM para o motor //RC3 não é implementado //RC5-D+, RC4-D- são usados apenas pelo módulo USB, então TRISC4,5 não são implementados, ou seja, tanto faz o valor desses bits set_tris_d(0b11111110); set_tris_e(0b00000111); while(!usb_cdc_connected()||!usb_enumerated()) while (TRUE) usb_task(); if (usb_enumerated())
109
if(usb_cdc_kbhit()) buff_usb.var8[0] = usb_cdc_getc(); switch(buff_usb.var8[0]) case 0: calibracao(); break; case 1: tcc(1);//teste da calibracao break; case 2: tcc(2);//resposta ao degrau break; case 3: tcc(3);//controlador PID break; case 4: tcc(4);//controlador PID break; case 20: usb_cdc_putc(TMR1H_salvo); break; default: break; else pisca_led_erro(3);
110
Anexo A – Características do motor DC 16N78-
212E
111
Anexo B – Características da redução R16