Universidade do Minho Escola de Engenharia Victor Manuel Oliveira da Silva Desenvolvimento de duas aplicações de controlo da velocidade de um motor de corrente contínua: Industrial e Pedagógica Tese para a obtenção do grau de Mestre em Engenharia Electrónica Industrial e Computadores Trabalho realizado sob a orientação de: Professora Dr.ª Filomena Soares Professora Dr.ª Rosa Vasconcelos Setembro de 2008
205
Embed
Escola de Engenharia - intranet.dei.uminho.ptintranet.dei.uminho.pt/gdmi/galeria/temas/pdf/26266.pdf · 1.2.1.1.1 Motor de CC Composto (Compound) ... Motores Síncronos ... FIGURA
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Universidade do Minho
Escola de Engenharia
Victor Manuel Oliveira da Silva
Desenvolvimento de duas aplicações de controlo da velocidade de um motor de corrente contínua:
Industrial e Pedagógica
Tese para a obtenção do grau de Mestre em Engenharia Electrónica Industrial e Computadores
Trabalho realizado sob a orientação de:
Professora Dr.ª Filomena Soares Professora Dr.ª Rosa Vasconcelos
Setembro de 2008
ii
iii
Agradecimentos
A realização de todo este trabalho, só foi possível devido ao apoio incondicional de algumas
pessoas.
Não querendo esquecer ninguém, aqui ficam os meus agradecimentos:
§ Desejo agradecer aos meus orientadores à Dra. Filomena Soares e à Dra. Rosa
Vasconcelos, bem como ao Eng.º Vítor Carvalho por todo o acompanhamento e apoio
prestados ao longo deste trabalho.
§ Quero também agradecer, mencionando o importantíssimo trabalho prestado pelo Sr.
Carlos Torres e restantes funcionários das oficinas do Departamento de Electrónica
Industrial, que contribuíram para a realização das placas de circuito impresso.
§ A todos os que, de uma forma directa ou indirecta contribuíram para a finalização deste
trabalho, o meu “Muito Obrigado”.
Victor Silva
iv
v
Desenvolvimento de duas aplicações de controlo da velocidade de um motor de corrente contínua: industrial e pedagógica
Resumo
Neste trabalho foram desenvolvidas duas aplicações: uma de carácter industrial e outra de
carácter pedagógico. A realização deste trabalho teve como principal objectivo o controlo da
velocidade de um motor de corrente contínua, através da aplicação prática da teoria de controlo,
recorrendo à utilização de microcontroladores, tanto para a aplicação de carácter industrial como
para a aplicação de carácter pedagógico.
Relativamente à aplicação industrial, este trabalho está englobado num outro projecto de
investigação e desenvolvimento, intitulado “Medição de irregularidades e pilosidades no fio têxtil”
(Parametrização da qualidade do fio) e consistiu no desenvolvimento de um sistema de tracção
de fio para doze níveis de velocidade.
O sistema de tracção de fio têxtil utilizado no projecto onde esta dissertação se insere era
efectuado através de um motor de corrente contínua, no entanto, sem a implementação de um
algoritmo de controlo, ou seja em malha aberta. Deste modo, com este projecto de investigação
pretende-se implementar um algoritmo de controlo da velocidade de tracção do motor,
recorrendo à utilização de um microcontrolador.
Relativamente à aplicação de carácter pedagógico, de modo a que o presente trabalho de
investigação possa dar o seu contributo para a clarificação da implementação do processo de
controlo da velocidade de rotação de um motor, foi desenvolvido um equipamento para fins
didácticos, que possibilita definir o valor da velocidade de rotação pretendida, seleccionar
diferentes algoritmos de controlo PID, definir os parâmetros do controlador (Kp, Ki, Kd), bem
como, monitorizar os valores da velocidade de rotação do motor e do módulo do valor do erro do
sistema.
vi
vii
Development of two applications for velocity control of a DC motor: industrial and educational
Abstract
In this work were developed two applications for a DC motor speed control: an industrial
application and an educational application.
The development of this work has as main goal the velocity control of a DC motor, through the
practical application of control theory, using microcontrollers, for an industrial application as well
as for an educational application.
Concerning the industrial application, this work is part of another R&D project, entitled "Yarn
Irregularities and Hairiness Measurement" (Yarn quality parameterization) and consisted of the
development of a yarn traction system for twelve levels of velocity.
The yarn traction system where this dissertation is inserted is performed trough a DC motor,
however, without the implementation of a control algorithm, it works in open loop. With this
research project it is required to implement a control algorithm, using a microcontroller, for the
motor traction velocity.
Concerning the educational application and with the purpose that the present work could give a
contribution for the clarification of the process implementation of velocity control of a motor, it
was developed an equipment for teaching purposes, which allows setting up the desired value of
rotation speed, selecting different PID control algorithms, setting up the controller parameters
(Kp, Ki, Kd), as well as, monitoring the motor velocity values and the module system error value.
viii
ix
Índice Geral
AGRADECIMENTOS ...................................................................................................................... III RESUMO............................................................................................................................................. V ABSTRACT...................................................................................................................................... VII ÍNDICE GERAL................................................................................................................................IX ÍNDICE DE FIGURAS E TABELAS ................................................................................................XI INTRODUÇÃO....................................................................................................................................1 CAPITULO I 1. SUPORTE TEÓRICO......................................................................................................................3
1.2. MOTORES ELÉCTRICOS ................................................................................................................4 1.2.1. MOTORES DE CORRENTE CONTÍNUA ..........................................................................................5 1.2.1.1. MOTOR DE CC CONVENCIONAL ..............................................................................................5
1.2.1.2 Tipos de Excitação........................................................................................................... 11 1.2.1.2.1 Motor de Excitação Independente ................................................................................. 11 1.2.1.2.2 Motor de CC Série ........................................................................................................ 12 1.2.1.2.3 Motor de CC Shunt (Paralelo)....................................................................................... 12 1.2.1.1.1 Motor de CC Composto (Compound) ............................................................................ 13
1.2.1.2. MOTOR DE CC DE ÍMAN PERMANENTE .................................................................................. 14 1.2.1.3. MOTOR DE CC SEM NÚCLEO ................................................................................................. 15 1.2.1.4. MOTOR DE CC SEM ESCOVAS ............................................................................................... 17 1.2.2. MOTORES DE CORRENTE ALTERNADA (CA)............................................................................. 20
1.6.1 Controlo ON-OFF .............................................................................................................. 46 1.6.2. Controlo Proporcional....................................................................................................... 47 1.6.2.1 Erro em estado estacionário ............................................................................................ 48 1.6.3. Controlo PI ....................................................................................................................... 49 1.6.3.1 Erro em estado estacionário ............................................................................................ 50 1.6.3.2 Incapacidade de reagir à derivada do erro....................................................................... 50 1.6.4. Controlo PID..................................................................................................................... 51 1.6.4.1 Acção Diferencial (Análise Qualitativa) ........................................................................... 51 1.6.5. PID – Implementação Computacional................................................................................ 52 1.6.5.1 Discretização da expressão do controlador ...................................................................... 52 1.6.5.2 Termo proporcional......................................................................................................... 53 1.6.5.3 Termo Integral................................................................................................................. 53 1.6.5.4 Termo Derivativo............................................................................................................. 53 1.6.5.5 Controlador a 3 Termos................................................................................................... 54 1.6.5.6 Problemas de ruído.......................................................................................................... 54
x
CAPITULO II 2. DESENVOLVIMENTO DO HARDWARE................................................................................... 55
2.1 Motor DC utilizado................................................................................................................ 55 2.2 Encoder utilizado .................................................................................................................. 56 2.3 Microcontrolador utilizado.................................................................................................... 57 2.4. Esquemas eléctricos ............................................................................................................. 59 2.4.1 Esquema eléctrico da placa de controlo para a aplicação industrial.................................... 59 2.4.3 Esquema eléctrico da placa de controlo para o módulo didáctico........................................ 61 2.5. Programação do microcontrolador....................................................................................... 63 2.5.1 Determinação do período mínimo de amostragem............................................................... 63 2.5.2 Considerações a ter para obtenção da velocidade pretendida.............................................. 64 2.5.3 Implementação do algoritmo de controlo PID..................................................................... 65
CAPITULO III 3. DESENVOLVIMENTO DO SOFTWARE DE INTERFACE ...................................................... 79
3.1 Software de interface para a placa de controlo industrial....................................................... 79 3.2 Software de interface para a placa do módulo didáctico......................................................... 80
CAPITULO IV 4. RESULTADOS OBTIDOS............................................................................................................. 81 CONCLUSÃO.................................................................................................................................... 83 BIBLIOGRAFIA................................................................................................................................ 85 ANEXO I - DOCUMENTAÇÃO TÉCNICA DOS COMPONENTES ANEXO II - PROGRAMA DO MICROCONTROLADOR RELATIVO À APLICAÇÃO INDUSTRIAL ANEXO III - PROGRAMA DO MICROCONTROLADOR RELATIVO À APLICAÇÃO PEDAGÓGICA
xi
Índice de Figuras e Tabelas
FIGURA 1.1 – CONSTITUIÇÃO DO MOTOR DE CC (CORRENTE CONTÍNUA)...................................................5 FIGURA 1.2 – CONSTITUIÇÃO DO ROTOR DE UM MOTOR DE CC. ................................................................6 FIGURA 1.3 – CONSTITUIÇÃO DO MOTOR DE CORRENTE CONTÍNUA COM 2 PÓLOS. .....................................6 FIGURA 1.3 – CAMPO MAGNÉTICO DE UM CONDUTOR E DE UMA ESPIRA DO ROTOR. ...................................7 FIGURA 1.4 - CAMPO MAGNÉTICO DO ESTATOR E DO ROTOR DE UM MOTOR BIPOLAR. ................................7 FIGURA 1.5 - ALIMENTAÇÃO DOS ENROLAMENTOS DO ROTOR. .................................................................8 FIGURA 1.6 – REGRA ALIMENTAÇÃO DOS ENROLAMENTOS DO ROTOR. .....................................................8 FIGURA 1.7 - FORÇAS QUE ACTUAM SOBRE UMA ESPIRA. ..........................................................................9 FIGURA 1.8 - ESQUEMA DOS ENROLAMENTOS DE UM MOTOR DE CC. ...................................................... 10 FIGURA 1.9 - ESQUEMA DA LIGAÇÃO DOS ENROLAMENTOS DE UM MOTOR DE CC DE EXCITAÇÃO
INDEPENDENTE. ........................................................................................................................... 11 FIGURA 1.10 - ESQUEMA DA LIGAÇÃO DOS ENROLAMENTOS DE UM MOTOR DE CC DE EXCITAÇÃO SÉRIE. . 12 FIGURA 1.11 - ESQUEMA DA LIGAÇÃO DOS ENROLAMENTOS DE UM MOTOR DE CC DE EXCITAÇÃO
PARALELA (SHUNT). ..................................................................................................................... 13 FIGURA 1.12 - ESQUEMA DA LIGAÇÃO DOS ENROLAMENTOS DE UM MOTOR DE CC DE EXCITAÇÃO
COMPOSTA (COMPOUND).............................................................................................................. 13 FIGURA 1.13 - MOTORES DE CC DE ÍMAN PERMANENTE. ........................................................................ 14 FIGURA 1.14 - MOTORES DE CC DE ÍMAN PERMANENTE DE 5 PÓLOS. ...................................................... 15 FIGURA 1.15 – LIGAÇÃO DO MOTOR DE ÍMAN PERMANENTE. .................................................................. 15 FIGURA 1.16 - MOTORES DE CC SEM NÚCLEO. ....................................................................................... 16 FIGURA 1.17 - MOTORES DE CC COM ÍMAN PERMANENTE NO EXTERIOR DO ROTOR. ................................ 16 FIGURA 1.18 - CONSTITUIÇÃO DE UM MOTOR DE CC SEM ESCOVAS. ....................................................... 17 FIGURA 1.19 – ASPECTO DO ESTATOR DE UM MOTOR INDUSTRIAL DE CC SEM ESCOVAS. ......................... 18 FIGURA 1.20 - CIRCUITO DE COMANDO TÍPICO DE UM MOTOR BRUSHLESS COM TRÊS FASES. ..................... 19 FIGURA 1.21 – ROTOR EM GAIOLA DE ESQUILO. ..................................................................................... 21 FIGURA 1.22 – FLUXO MAGNÉTICO DO MOTOR DE INDUÇÃO MONOFÁSICO DE DOIS PÓLOS. ..................... 21 FIGURA 1.23 – MOTOR DE INDUÇÃO MONOFÁSICO. ................................................................................ 22 FIGURA 1.24 – ESQUEMAS DE LIGAÇÃO DO MOTOR DE INDUÇÃO MONOFÁSICO. ..................................... 23 FIGURA 1.25 – FUNCIONAMENTO DO CAMPO GIRANTE DO MOTOR DE INDUÇÃO TRIFÁSICO....................... 24 FIGURA 1.26 – ESQUEMAS DE LIGAÇÃO DO MOTOR DE INDUÇÃO TRIFÁSICO. ......................................... 25 FIGURA 1.27 – BINÁRIO E CORRENTE DE UM MOTOR DE INDUÇÃO TRIFÁSICO. ......................................... 26 FIGURA 1.28 – ASPECTO DE UM MOTOR DE PASSO-A-PASSO. ................................................................... 29 FIGURA 1.29 – MOTOR DE ÍMAN PERMANENTE....................................................................................... 30 FIGURA 1.30 – CONSTITUIÇÃO DO MOTOR DE ÍMAN PERMANENTE........................................................... 30 FIGURA 1.31 – ROTOR DO MOTOR DE ÍMAN PERMANENTE....................................................................... 30 TABELA 1.1 – SEQUÊNCIA DE ALIMENTAÇÃO DOS ENROLAMENTOS DO MOTOR DE ÍMAN PERMANENTE. .... 31 FIGURA 1.32 - FUNCIONAMENTO DO MOTOR DE ÍMAN PERMANENTE. ...................................................... 31 FIGURA 1.33 - MODELOS COMERCIAIS DE MOTORES DE RELUTÂNCIA VARIÁVEL...................................... 33 FIGURA 1.34 - ASPECTO INTERIOR DE UM MOTOR DE RELUTÂNCIA VARIÁVEL COM TRÊS FASES. ............... 33 TABELA 1.2 – SEQUÊNCIA DE ALIMENTAÇÃO DOS ENROLAMENTOS DO MOTOR DE RELUTÂNCIA VARIÁVEL.
................................................................................................................................................... 34 FIGURA 1.35 – FUNCIONAMENTO DO MOTOR DE RELUTÂNCIA VARIÁVEL. ............................................... 34 FIGURA 1.36 - MOTORES HÍBRIDOS COMERCIAIS. ................................................................................... 36 FIGURA 1.37 - CONSTITUIÇÃO DO MOTOR HÍBRIDO................................................................................. 36 FIGURA 1.38 – VISTA EM CORTE DO MOTOR HÍBRIDO. ............................................................................ 37 TABELA 1.3 – SEQUÊNCIA DE ALIMENTAÇÃO DOS ENROLAMENTOS DO MOTOR HÍBRIDO. ......................... 37 FIGURA 1.39 -FUNCIONAMENTO DO MOTOR HÍBRIDO. ............................................................................ 37 FIGURA 1.40 - DENTES DAS MASSAS POLARES SEPARADOS DE MEIO PASSO DE DENTE. ............................. 38 FIGURA1.41 - ENROLAMENTOS DO MOTOR COM ALIMENTAÇÃO UNIPOLAR.............................................. 39 FIGURA 1.42 – DISPOSIÇÃO DOS ENROLAMENTOS DE UM MOTOR COM ALIMENTAÇÃO BIPOLAR. ............... 40 FIGURA 1.43 – EVOLUÇÃO DO BINÁRIO DO MOTOR EM FUNÇÃO DA CARGA MECÂNICA............................. 42 FIGURA 1.44 – SINAL DE PWM PARA 0%, 25%, 50%, 75% E 100% DE DUTY-CYCLE. ............................... 43 FIGURA 1.45 – MOSFET DO TIPO MODO DE ENRIQUECIMENTO A) NÃO POLARIZADO; B) POLARIZADO. .... 45 FIGURA 1.46 – SÍMBOLOS GRÁFICOS DO EMOS A) N-MOSFET; B) P-MOSFET. ..................................... 45 FIGURA 1.47 – SINAL DE CONTROLO DO ALGORITMO ON-OFF. .............................................................. 46 FIGURA 1.48 – CONTROLADOR ON-OFF. .............................................................................................. 47 FIGURA 1.49 – COMPORTAMENTO DO CONTROLADOR ON-OFF COM HISTERESE. .................................... 47
xii
FIGURA 1.50 – CONTROLADOR ON-OFF. .............................................................................................. 47 FIGURA 1.51 – COMPORTAMENTO DO ALGORITMO PROPORCIONAL. ........................................................ 48 FIGURA 1.52 – CONTROLADOR PROPORCIONAL. .................................................................................... 48 FIGURA 1.53 – CONTROLADOR PI.......................................................................................................... 49 FIGURA 1.54 – DERIVADA DO ERRO....................................................................................................... 50 FIGURA 1.55 – CONTROLADOR PID....................................................................................................... 51 FIGURA 1.56 – EVOLUÇÃO DO ERRO NUM CONTROLADOR PID................................................................ 52 FIGURA 2.1 – DIAGRAMA DE BLOCOS DO HARDWARE DESENVOLVIDO..................................................... 55 FIGURA 2.2 – ASPECTO DO MOTOR DC “MAXON RE36”........................................................................ 55 FIGURA 2.3 – CARACTERÍSTICAS TÉCNICAS DO MOTOR DC RE36 DA “MAXON”...................................... 56 FIGURA 2.4 – CURVA CARACTERÍSTICA DE FUNCIONAMENTO DO MOTOR RE36. ...................................... 56 FIGURA 2.5 – ASPECTO DO ENCODER HEDS-5540 A11 DA “HEWLETT PACKARD”. ................................. 56 TABELA 2.1 – CONDIÇÕES MÁXIMAS ADMISSÍVEIS DO ENCODER. ............................................................ 57 FIGURA 2.6 – APLICAÇÃO DE RESISTÊNCIAS DE PULL-UP NOS CANAIS DO ENCODER. ................................ 57 FIGURA 2.7 – PINOS DO MICROCONTROLADOR PIC16F876..................................................................... 58 FIGURA 2.8 – ESQUEMÁTICO DA PLACA DE CONTROLO DA VELOCIDADE DO MOTOR................................. 59 FIGURA 2.9 – CURVA CARACTERÍSTICAS DO MOSFET (BUZ100). ......................................................... 60 FIGURA 2.10 – ASPECTO DO PCB CONCEBIDO DA PLACA DE CONTROLO.................................................. 61 FIGURA 2.11 – ESQUEMÁTICO DA PLACA DO MÓDULO DIDÁCTICO. ......................................................... 62 FIGURA 2.12 – ASPECTO DO PCB CONCEBIDO DA PLACA DE CONTROLO.................................................. 62 FIGURA 2.13 – FREQUÊNCIA MÁXIMA DE AMOSTRAGEM OBTIDA. ........................................................... 63 FIGURA 2.14 – FLUXOGRAMA DO CÓDIGO FONTE DESENVOLVIDO PARA A PLACA DE CONTROLO. ............. 67 FIGURA 2.15 – FLUXOGRAMA DA ROTINA PARA A IMPLEMENTAÇÃO DO CONTROLO PID. ......................... 68 FIGURA 2.16 – FLUXOGRAMA DO CÓDIGO FONTE DESENVOLVIDO PARA O MÓDULO DIDÁCTICO. .............. 69 FIGURA 2.17 – FLUXOGRAMA DA ROTINA QUE SELECCIONA UM DOS ALGORITMOS DE CONTROLO PID. .... 70 FIGURA 2.18 – FLUXOGRAMA DA ROTINA PARA A IMPLEMENTAÇÃO DO ALGORITMO 1 DO CONTROLO PID.
................................................................................................................................................... 71 FIGURA 2.19 – FLUXOGRAMA DA ROTINA PARA A IMPLEMENTAÇÃO DO ALGORITMO 2 DO CONTROLO PID.
................................................................................................................................................... 72 FIGURA 2.20 – FLUXOGRAMA DA ROTINA PARA A IMPLEMENTAÇÃO DO ALGORITMO 3 DO CONTROLO PID.
................................................................................................................................................... 73 FIGURA 2.21 – FLUXOGRAMA DA ROTINA PARA A IMPLEMENTAÇÃO DO ALGORITMO 4 DO CONTROLO PID.
................................................................................................................................................... 74 FIGURA 2.22 – FLUXOGRAMA DA ROTINA RESPONSÁVEL PELO CÁLCULO DO ERRO ACTUAL DO SISTEMA. . 75 FIGURA 2.23 – FLUXOGRAMA DA ROTINA RESPONSÁVEL PELO CÁLCULO DO TERMO PROPORCIONAL. ....... 75 FIGURA 2.24 – FLUXOGRAMA DA ROTINA RESPONSÁVEL PELO CÁLCULO DO TERMO PROPORCIONAL_1. ... 75 FIGURA 2.25 – FLUXOGRAMA DA ROTINA RESPONSÁVEL PELO CÁLCULO DO TERMO INTEGRAL. ............... 76 FIGURA 2.26 – FLUXOGRAMA DA ROTINA RESPONSÁVEL PELO CÁLCULO DO TERMO INTEGRAL 1. ............ 76 FIGURA 2.27 – FLUXOGRAMA DA ROTINA RESPONSÁVEL PELO CÁLCULO DO TERMO INTEGRAL 2. ............ 77 FIGURA 2.28 – FLUXOGRAMA DA ROTINA RESPONSÁVEL PELO CÁLCULO DO TERMO INTEGRAL 3. ............ 77 FIGURA 2.29 – FLUXOGRAMA DA ROTINA RESPONSÁVEL PELO CÁLCULO DO TERMO DERIVATIVO. ........... 78 FIGURA 2.30 – FLUXOGRAMA DA ROTINA RESPONSÁVEL PELO CÁLCULO DO TERMO DERIVATIVO_1......... 78 FIGURA 3.1 – ASPECTO DA APLICAÇÃO DE INTERFACE PARA A PLACA DE CONTROLO INDUSTRIAL. ........... 79 FIGURA 3.2 – ASPECTO DA APLICAÇÃO DE INTERFACE PARA O MÓDULO DIDÁCTICO. ............................... 80 FIGURA 4.1 – IMAGEM DO EQUIPAMENTO DESENVOLVIDO PARA A TRACÇÃO DE FIO TÊXTIL (À ESQUERDA) E
DO MÓDULO DIDÁCTICO (Á DIREITA). ........................................................................................... 81
1
Introdução
Neste capítulo apresenta-se a motivação e o enquadramento deste trabalho assim como a
definição de objectivos propostos e a estrutura do documento.
Motivação e enquadramento
Este trabalho está inserido num projecto de investigação e desenvolvimento, intitulado
“Medição de irregularidades e pilosidades no fio têxtil” (Parametrização da qualidade do fio). O
sistema de tracção de fio têxtil utilizado no projecto onde esta dissertação se insere era
efectuado através de um motor DC, funcionando em malha aberta, sem a implementação de um
algoritmo de controlo, para quatro níveis de velocidades. Deste modo, com este trabalho
pretende-se implementar um algoritmo de controlo da velocidade de tracção, recorrendo à
utilização de um microcontrolador.
Objectivos e desenvolvimento do trabalho
Este trabalho tem com principal objectivo a implementação dos algoritmos de controlo
recorrendo à utilização de microcontroladores. Foi desenvolvida uma aplicação industrial e em
paralelo, implementou-se uma aplicação de carácter pedagógico, cuja finalidade é dar o seu
contributo para a clarificação da implementação do processo de controlo da velocidade de
rotação de um motor.
Relativamente à aplicação industrial, implementou-se um algoritmo de controlo para a
velocidade de tracção do motor, recorrendo à utilização de um microcontrolador. Para além do
algoritmo de controlo também é desenvolvido o programa de controlo para 12 velocidades de
tracção de fio seleccionáveis por entradas digitais do microcontrolador. Os valores acordados
para esses níveis de velocidade foram os seguintes: 6m/min, 12m/min, 24m/min, 50m/min,
75m/min, 100m/min, 150m/min, 200m/min, 250m/min, 300m/m, 350m/min e 400m/min.
Para estabelecer os níveis de velocidade propostos, foi necessário ter em consideração o
diâmetro do rolo de tracção de fio, acoplado ao veio do motor, que neste caso possui 3.09cm de
diâmetro. A selecção destes níveis de velocidade é feita através de um programa desenvolvido
em LabVIEW que também possibilita ao utilizador monitorizar a velocidade de rotação do motor
bem como iniciar e finalizar o processo utilizando a porta paralela do PC.
Relativamente ao trabalho de âmbito pedagógico, foi desenvolvido um equipamento que
possibilita definir o valor da velocidade de rotação do motor pretendida, seleccionar diferentes
2
algoritmos de controlo PID, definir os parâmetros do controlador (Kp, Ki, Kd), bem como,
monitorizar o valores da velocidade de rotação do motor e o módulo do valor do erro do sistema.
A ligação ao computador neste caso é estabelecida através da porta série, que obedece ao
protocolo de comunicação RS-232. Para a comunicação série foi definido um “Baude Rate” de
9600 bits/s, 8 bits de dados, paridade par e um “Stop Bit”.
Para interface deste equipamento para com o utilizador, foi desenvolvida uma outra aplicação
em LabVIEW.
Estrutura da dissertação
Este documento está dividido em seis partes. A primeira parte é relativa à Introdução e são
apresentados os objectivos e o enquadramento do trabalho. Na segunda parte são abordados os
conceitos teóricos necessários à implementação do trabalho. Na terceira e quarta partes,
respectivamente, é elaborada uma descrição pormenorizada sobre a implementação prática do
hardware e do software de interface, relativo aos equipamentos industrial e pedagógico
desenvolvido. Os resultados obtidos são apresentados na parte cinco e as conclusões na última
parte.
3
Capitulo I
1. Suporte Teórico
Neste capítulo são abordados conceitos e noções básicas de elementos e processos utilizados
ao longo deste trabalho.
1.1.Tipos de Encoders
Actualmente no mercado existem fundamentalmente dois tipos de encoders:
Ø Encoders absolutos;
Ø Encoders incrementais.
1.1.1 Encoders Absolutos
A principal diferença dos encoders absolutos em relação aos encoders incrementais é que as
posições dos discos dos encoders absolutos já estão codificadas em binário, variando entre 8,
10, 12, 16 bits.
O sistema binário é codificado em código Gray, ou binário puro.
Não necessita de referência ou zero, pois o sistema lê a posição directamente em binário.
Como vantagem tem o facto de não necessitar de referência, pois o sistema reconhece a
posição imediatamente actual após a sua inicialização.
Como desvantagens tem o seu custo elevado e a sua dimensão.
1.1.2 Encoders incrementais
São discos perfurados ou com ranhuras, igualmente distribuídas pela sua circunferência,
normalmente dividindo-o em 100, 360, 500, 720, 1000 ou mais partes iguais e uma perfuração
de referência chamada de "zero" do encoder. Possuem um sensor óptico, que lê as ranhuras.
Os encoders são normalmente alimentados de 5 a 30VDC.
Como vantagem o encoder incremental tem o facto de a sua construção ser simples e
compacta.
Apresenta como desvantagem, o facto de que, quando alimentado, o sistema de controlo que
o lê, deve girar o eixo até a posição de referência, e a partir daí determina sua a posição, pois a
posição é contada a partir da referência.
Suporte Teórico
4
Existem encoders incrementais de forma Linear, também conhecidos como “Transdutores
ópticos lineares”, que são usados no lugar das réguas potenciómetricas. Para além da detecção
da posição angular de eixos, podem também ser usados como sensores para tacómetros e
qualquer medição angular ou linear.
1.2. Motores Eléctricos
No mundo de hoje, o motor eléctrico é um elemento imprescindível ao progresso. As
máquinas eléctricas, nos tempos actuais, podem-se considerar como parte recorrente do nosso
dia-a-dia. O motor eléctrico é o mais usado de todos os tipos de motores, pois combina as
vantagens da utilização da energia eléctrica: facilidade de transporte e facilidade de comando,
sendo, para além disso trata-se de uma máquina de construção simples, alto rendimento e baixo
custo.
Os motores eléctricos possuem praticamente os mesmos elementos principais, contudo com
diferenças importantes entre eles. Em alguns casos a bobina da armadura está no estator e não
no rotor, o mesmo acontece com a bobina de campo. Outros não possuem escovas, outros
ainda não possuem bobina de armadura, e assim por diante. Porém, os nomes dados aos
componentes da máquina são gerais e valem para a maioria das máquinas eléctricas.
De forma geral os motores eléctricos são classificados como:
Ø Motores de Corrente Contínua
§ Motor de CC Convencional;
§ Motor de CC de Íman Permanente;
§ Motor de CC sem Núcleo;
§ Motor de CC sem Escovas (Brushless).
Ø Motores de Corrente Alternada
§ Motores Síncronos;
§ Motores Assíncronos.
Ø Motores Especiais
§ Servomotores;
§ Motores de Passo.
Todos os motores apresentam as suas principais características eléctricas escritas sobre o
mesmo ou numa placa de identificação. Os principais dados eléctricos são: tipo de motor,
Suporte Teórico
5
tensão nominal, corrente nominal, frequência, potência mecânica, velocidade nominal, esquema
de ligação, grau de protecção, temperatura máxima de funcionamento e factor de potência.
1.2.1. Motores de Corrente Contínua
O motor de CC (corrente contínua) foi a primeira máquina eléctrica a ser utilizada
industrialmente. A principal razão para tal deve-se ao facto de no início da distribuição da
eléctrica, a mesma ser feita em corrente contínua.
Actualmente, existem diferentes tipos de motores de corrente contínua, vão desde os
pequenos motores, para os mais variados accionamentos, até aos motores convencionais,
utilizados em accionamentos industriais, com potências que podem chegar às várias centenas
de KW (Kilowatts).
1.2.1.1. Motor de CC Convencional
O motor de CC (corrente contínua) convencional representado na figura 1 é uma máquina que
tem como principal característica o controlo preciso, entre amplos limites, da velocidade.
Actualmente, a sua regulação é feita recorrendo a controladores electrónicos.
Figura 1.1 – Constituição do motor de CC (corrente contínua).
Uma máquina eléctrica rotativa é constituída, fundamentalmente, por duas partes distintas,
uma que se designa de indutor e outra de induzido.
No indutor, também designado por campo, é gerado o campo magnético, e no induzido
também denominado por armadura, processam-se fenómenos electromagnéticos. Uma das
partes é fixa e a outra é móvel. À parte fixa dá-se o nome de estator e à parte móvel, de rotor
representado na figura 1.2.
Suporte Teórico
6
Figura 1.2 – Constituição do rotor de um motor de CC.
Nas máquinas convencionais de corrente contínua, o circuito indutor encontra-se no estator e
o circuito induzido, no rotor. Esta disposição não é igual em todas as máquinas.
Na figura 1.3 é possível identificar as diferentes partes internas de um máquina de corrente
contínua básica, bem como a sua representação eléctrica.
(a) Partes internas. (b) Representação eléctrica.
Figura 1.3 – Constituição do motor de corrente contínua com 2 Pólos.
O motor de corrente contínua apresenta quatro terminais acessíveis, dois para as bobinas de
campo (terminais 3 e 4) e dois para as bobinas da armadura (terminais 1 e 2). Em alguns
motores de baixa potência, as bobinas de campo são substituídas por ímãs permanentes. Neste
caso, o motor apresenta apenas dois terminais de acesso (terminais 1 e 2).
O princípio de funcionamento elementar de um motor de corrente contínua está baseado na
força mecânica que actua sobre um condutor imerso num campo magnético, quando sobre ele
circula uma corrente eléctrica. O motor de CC gira em consequência da interacção do campo
magnético do estator com o campo magnético do rotor.
O campo principal, o do estator, é criado pelos seus enrolamentos (electroímanes), quando
são percorridos por corrente. O segundo campo, o do rotor, é criado pela circulação da corrente
nos condutores dos enrolamentos do rotor. Cada condutor do rotor contribui com um campo
magnético que roda à sua volta e cujo sentido é determinado pela regra do saca-rolhas.
Suporte Teórico
7
Figura 1.3 – Campo magnético de um condutor e de uma espira do rotor.
Os vários campos magnéticos dos condutores do rotor, alimentados num lado por uma escova
e no outro lado por outra escova, têm como resultante um pólo N e um pólo S, em lados opostos
do núcleo do rotor, representados na figura 1.4.
Figura 1.4 - Campo magnético do estator e do rotor de um motor bipolar.
Analisando a figura verifica-se que o pólo S do rotor neste caso, localizado na parte superior,
será atraído pelo pólo N do estator e o pólo N do rotor, pelo pólo S do estator.
Esta atracção exerce uma força continuada sobre o rotor, provocando a sua rotação.
O rotor roda uma vez que os enrolamentos vão sendo sucessivamente alimentados, uma vez
que estão ligados a pares de lâminas sucessivas do colector.
Apesar do rotor estar permanentemente em movimento, o seu campo magnético resultante
permanece fixo, tal como está representado na figura 1.4, o pólo S na parte de cima e pólo N na
parte de baixo.
A disposição das escovas assegura a correcta alimentação dos enrolamentos do rotor. Os
condutores que estão situados sob um mesmo pólo do estator são percorridos por correntes
com o mesmo sentido.
Suporte Teórico
8
Figura 1.5 - Alimentação dos enrolamentos do rotor.
O binário do motor será tanto maior quanto maiores forem as forças de atracção e repulsão
entre os campos magnéticos do estator e do rotor.
De modo a se compreender melhor os fenómenos até agora descritos recorre-se aos
seguintes princípios:
Lei de Laplace
Sempre que um condutor de comprimento l é percorrido por uma corrente eléctrica I está sob
a acção de um campo magnético de indução B, exerce-se sobre ele uma força F que o faz
movimentar; num determinado sentido, perpendicularmente ao plano definido pelo sentido da
corrente I e pelo sentido da indução B.
lIBF ××= (eq. 1.1)
Regra dos Três Dedos da Mão Direita
O sentido da força electromagnética (F) exercida sobre o condutor é obtido, fazendo coincidir
três dedos da mão direita, formando entre si ângulos de 90º, com a direcção e sentido das
grandezas.
Figura 1.6 – Regra Alimentação dos enrolamentos do rotor.
Suporte Teórico
9
Regra do Saca-Rolhas
O sentido das linhas de força do campo magnético produzido pela corrente eléctrica é aquele
que corresponde à rotação de um saca-rolhas, de modo que a sua progressão corresponda ao
sentido da corrente eléctrica.
A figura 1.7 mostra o sentido da força electromagnética (F) que actua sobre uma espira quando
a mesma é percorrida por uma corrente (I) e é submetida a um campo magnético (B).
Sob a acção da força, a espira movimenta-se para a posição vertical, onde a força resultante é
nula, não dando continuidade ao movimento. Para que a espira rode, torna-se então necessária
a inversão do sentido da corrente que a atravessa. Essa inversão é efectuada pelo colector
quando a espira atinge a posição vertical.
Assim, e recorrendo à regra dos três dedos da mão direita, como o sentido da corrente se
inverte, o sentido da força também se inverte. O campo tem sempre o mesmo sentido e a espira
roda continuamente.
Figura 1.7 - Forças que actuam sobre uma espira.
Também se pode afirmar que o funcionamento de um motor de corrente contínua tem como
base as forças resultantes da interacção do campo magnético gerado no indutor com a corrente
que circula no induzido. Desta interacção resulta uma força (lei de Laplace) que faz mover o
rotor num sentido que depende do sentido do campo magnético do indutor e do sentido da
corrente do induzido (regra da mão direita), Explicação idêntica à anterior, uma vez que a
corrente que circula nos condutores induzido cria o campo magnético que serviu de fundamento
à explicação através da interacção entre os campos magnéticos do estator e do rotor.
Suporte Teórico
10
Reacção Magnética do Induzido
A corrente que percorre o induzido cria um campo magnético que, ao interagir com o campo
magnético indutor, altera as linhas de força deste, distorcendo-o tratando-se da reacção
magnética do induzido. Esta distorção é proporcional à carga a que o motor está sujeito e
provoca o aparecimento de faíscas entre o colector e as escovas, sendo por isso prejudicial para
a máquina, uma vez que degrada mais rapidamente as escovas e o colector. De modo a reduzir
ou anular este efeito, as escovas têm de ser deslocadas para outra posição, todavia, como o
ângulo de deslocação depende da carga aplicada ao motor, este processo não é viável, daí o
facto dos motores de CC possuírem pólos de comutação auxiliares ou enrolamento de
compensação cuja finalidade é criarem um campo magnético de sentido contrário ao campo da
reacção magnética do induzido, reduzindo ou anulando-o.
Na figura 1.8 apresenta-se, esquematicamente, os enrolamentos de um motor de CC. A não
referência ao enrolamento derivação E1-E2 deve-se ao facto de se poder utilizar o enrolamento
independente F1-F2 como substituição.
Figura 1.8 - Esquema dos enrolamentos de um motor de CC.
Os motores de CC inicialmente eram alimentados por geradores de corrente contínua, o que
exigia o uso de três máquinas (sistema Ward-Leonard). Actualmente, utilizam-se conversores
estáticos que fornecem tensão contínua variável a partir da rede eléctrica.
Para se proceder ao arranque do motor, em vazio, aplica-se, em primeiro lugar, tensão ao
campo e de seguida à armadura. O motor deve arrancar de forma suave, sem faiscamento ou
ruídos excessivos.
Motores pequenos, até l kW, podem arrancar à tensão plena. Acima deste valor devem possuir
um sistema de arranque que limite a corrente, pois esta pode danificar o colector.
Suporte Teórico
11
A rotação do motor pode ser regulada mantendo o fluxo indutor constante e variando a tensão
de alimentação do induzido (controlo pela armadura), ou mantendo a tensão de alimentação do
induzido fixa e alterando o fluxo indutor (controlo pelo campo).
Para se parar o motor é necessário desligar primeiro a armadura e só depois o campo, caso
contrário, existe o risco de perda do controlo do motor, em função do disparo do rotor por falta
de campo.
Para se inverter o sentido de rotação, troca-se a polaridade da tensão de alimentação do
induzido ou do indutor (não ambas).
1.2.1.2 Tipos de Excitação
Os motores de CC são divididos de acordo com o tipo de ligação entre as bobinas do rotor e
do estator.
A cada tipo de ligação corresponde um tipo de motor associado ao tipo de excitação
magnética. A classificação é a seguinte:
−
−
(Composto) CompondMotor (Paralelo)Shunt Motor
SérieMotor açãoAuto-excit
teindependenExcitação
1.2.1.2.1 Motor de Excitação Independente
Neste tipo de ligação, o motor necessita de duas fontes de alimentação; uma para alimentar o
indutor e outra para alimentar o induzido. Apesar desta desvantagem, este tipo de excitação
possibilita o controlo da velocidade de forma independente, através da armadura e do campo.
Rotação horária: Rotação anti-horária:
Figura 1.9 - Esquema da ligação dos enrolamentos de um motor de CC de excitação independente.
Suporte Teórico
12
1.2.1.2.2 Motor de CC Série
O motor série é um motor com auto-excitação. Como o seu nome indica, o
enrolamento do indutor e do induzido estão ligados em série, por isso, são
percorridos pela mesma corrente. Este motor necessita de uma só tensão de
alimentação. O motor série tem o enrolamento do indutor formado por fio de secção
elevada e com poucas espiras. Esta constituição tem por finalidade baixar a
resistência do indutor, uma vez que está em série com o induzido.
Rotação horária: Rotação anti-horária:
Figura 1.10 - Esquema da ligação dos enrolamentos de um motor de CC de excitação série.
No motor série, o binário é proporcional ao quadrado da corrente. Portanto, o motor série pode
trabalhar em situações de sobrecarga mecânica, mantendo um consumo de corrente
relativamente moderado. Devido a esta característica, o motor série é com frequência em
tracção eléctrica.
Este tipo de motor possui um elevado binário de arranque e, sem carga, uma velocidade
relativamente elevada. A regulação da velocidade é um pouco difícil.
1.2.1.2.3 Motor de CC Shunt (Paralelo)
Neste motor, o enrolamento do indutor é ligado em paralelo com o enrolamento do induzido.
No motor Shunt, o enrolamento indutor é formado por um elevado número de espiras de fio de
pequena secção, sendo a resistência deste enrolamento elevada para que a corrente consumida
seja baixa.
Suporte Teórico
13
Rotação horária: Rotação anti-horária:
Figura 1.11 - Esquema da ligação dos enrolamentos de um motor de CC de excitação paralela (shunt).
No caso da máquina não possuir na sua constituição o enrolamento shunt, utiliza-se para sua
substituição, nesta ligação, o enrolamento independente F1-F2.
O motor shunt possui a particularidade da sua velocidade variar pouco com a carga, daí,
apresentar uma boa regulação da mesma. O seu binário de arranque é menor que o do motor
série.
1.2.1.1.1 Motor de CC Composto (Compound)
Este motor possui dois enrolamentos indutores. Um está ligado em série e o outro em
paralelo com o induzido, normalmente o enrolamento independente.
O enrolamento ligado em série é o que apresenta menor resistência. Na maioria das
situações, os dois enrolamentos são acoplados de forma que os fluxos magnéticos se
adicionem.
Rotação horária: Rotação anti-horária:
Figura 1.12 - Esquema da ligação dos enrolamentos de um motor de CC de excitação composta (Compound).
Suporte Teórico
14
O motor de CC composto reúne as qualidades do motor série e do motor shunt, é por isso um
motor com um elevado binário de arranque e uma boa regulação de velocidade.
Os motores de corrente contínua têm vindo a perder terreno relativamente aos motores de
indução. A sua grande vantagem que era a facilidade na regulação de velocidade, nos dias
actuais está facilmente ao alcance dos motores de indução com o controlo electrónico de
velocidade.
O preço dos motores de corrente contínua também é bem mais elevado que o dos motores de
indução e como possuem colector e escovas, órgãos sujeitos a desgaste, a sua manutenção é
mais frequente. Apesar disso, o motor de corrente contínua mantém a sua utilização dadas as
suas características específicas.
O desenvolvimento dos motores de CC sem escovas (Brushless) e a sua utilização em
accionamentos industriais também tem contribuído para a diminuição do uso do motor de CC
convencionais.
1.2.1.2. Motor de CC de Íman Permanente
O motor de íman permanente (Permanent Magnet DC Motor) é normalmente fabricado para
pequenas potências. O seu rotor possui uma constituição idêntica ao do motor de CC
convencional, sendo o seu estator significativamente diferente, uma vez que não possui qualquer
enrolamento. O campo magnético indutor é criado por ímans permanentes.
Figura 1.13 - Motores de CC de íman permanente.
O indutor é constituído por dois ou mais ímans permanentes, sendo o induzido constituído por
um núcleo ferromagnético, tipicamente, com três, cinco ou sete pólos e respectivos
enrolamentos. A carcaça do motor completa o circuito magnético.
Suporte Teórico
15
Figura 1.14 - Motores de CC de íman permanente de 5 pólos.
O funcionamento do motor de íman permanente é igual ao do motor de CC convencional, a
diferença está na forma de como se gera o campo magnético do indutor. Em vez de ser gerado
pela corrente eléctrica, como é o caso dos motores de CC convencionais, é gerado através dos
ímans permanentes. Não possuindo estes motores enrolamentos no indutor, para a sua
alimentação basta ligar os dois condutores que ligam os enrolamentos do induzido, através do
conjunto escovas/colector.
Figura 1.15 – Ligação do motor de íman permanente.
Alimentando o motor, ele roda num determinado sentido. Invertendo a polaridade da tensão de
alimentação, ele roda em sentido contrário. Aumentando ou diminuindo a tensão de
alimentação, a velocidade do motor aumenta ou diminui, respectivamente.
Este tipo de motor é de fácil construção e por isso têm um custo baixo. São utilizados em
accionamentos de baixa potência, nomeadamente em electrodomésticos, carros eléctricos,
comboios eléctricos entre outros.
1.2.1.3. Motor de CC sem Núcleo
O motor de CC sem núcleo (Coreless DC Motor) é assim designado porque o rotor não possui
ferro no núcleo, não é, portanto, magnético.
Este motor destina-se, tipicamente, a accionamentos de pequena potência.
Suporte Teórico
16
Figura 1.16 - Motores de CC sem núcleo.
Este tipo de motor não possui núcleo magnético, o seu rotor é formado apenas pelas bobinas,
sendo estas, geralmente, auto-suportadas num invólucro de fibra de vidro de forma a constituir
uma estrutura rígida. O rotor é oco com a finalidade de se tornar mais leve e ágil.
O estator é constituído por íman permanente, podendo o mesmo ser colocado no exterior ou
interior do rotor. O conjunto é alojado na carcaça do motor que completa o circuito magnético.
Figura 1.17 - Motores de CC com íman permanente no exterior do rotor.
O princípio de funcionamento deste tipo de motor é igual ao do motor de CC convencional. A
diferença, tal como no motor de íman permanente, está na forma como o campo magnético do
estator é gerado. Em vez de ser gerado pela corrente eléctrica, como é nos casos dos motores
de CC convencionais, é gerado por íman permanente. Como estes motores não possuem
enrolamentos no estator, para a sua alimentação basta ligar os dois condutores que ligam os
enrolamentos do rotor, através do conjunto escovas/colector.
Estes motores são bastante mais rápidos que os motores de CC com núcleo de ferro.
O rotor tem uma baixa inércia, o que possibilita arranques, paragens e variações de velocidade
muito rápidas, assim como mudança de sentido de rotação num curto espaço de tempo.
Comparativamente com o motor de íman equivalente, este tipo de motor possui um conjunto
escovas/colector de menor dimensão e de melhor qualidade, estando, por isso, estes órgãos
sujeitos a menos desgaste. Também o ruído eléctrico é menor, a velocidade mais suave e a
indutância mais baixa devido à não existência de ferro no núcleo.
Suporte Teórico
17
A desvantagem do motor sem núcleo (Coreless) é o seu reduzido binário, pois como o fluxo
magnético, não é o rotor magnético, não é concentrado e tem de atravessar um entreferro
maior.
Também possuem baixa refrigeração. O calor gerado nas espiras do rotor, dado que o motor
não possui núcleo de ferro, que dissipa grande parte do calor, quando o mesmo é sujeito a um
esforço, aquece rapidamente e pode danificar-se. Os motores Coreless também são mais
frágeis. Nos motores com íman no interior do rotor, a abertura entre o íman permanente e a
carcaça é muito pequena, por isso, as espiras do rotor estão sujeitas a uma densidade de fluxo
elevada, o que se traduz num motor mais eficiente.
Este tipo de motor destina a accionamentos onde se pretenda um arranque rápido e
velocidades elevadas. São utilizados com muita frequência em equipamentos de modelismo,
actualmente equipando a nova geração dos servomotores de radiocomando.
1.2.1.4. Motor de CC sem Escovas
O motor de CC sem escovas (Brushless DC Motor) é uma máquina eléctrica em que a
operação de comutação, realizada mecanicamente pelo colector no motor de CC, é aqui
efectuada por um comutador electrónico, daí este tipo de motor não possuir colector nem
escovas.
Este tipo de motor possui um rotor com ímans permanentes, que podem estar colocados no
interior ou no exterior do estator, e um estator de material ferromagnético com os respectivos
enrolamentos. Esta configuração, relativamente ao motor de íman permanente, está invertida.
Figura 1.18 - Constituição de um motor de CC sem escovas.
O estator de um motor de CC sem escovas, para accionamentos industriais, é constituído por
lâminas de chapa de aço empilhadas, com os enrolamentos colocados nos entalhes e dispostos
Suporte Teórico
18
axialmente na periferia interna, tal como está representado na figura 1.19. O estator assemelha-
se ao de um motor de indução, contudo, os enrolamentos são distribuídos deforma diferente.
Os sensores indicados na figura 1.18 detectam o campo magnético, são de efeito Hall, ou seja
estando na presença de um campo magnético geram aos seus terminais uma tensão eléctrica,
de modos a informar neste caso o controlador electrónico sobre a posição dos pólos do rotor.
Figura 1.19 – Aspecto do estator de um motor industrial de CC sem escovas.
Tipicamente, os motores industriais de CC sem escovas têm enrolamentos de três fases
ligadas em estrela, sendo cada fase constituída por várias bobinas e respectivos pólos
magnéticos. O rotor de um motor de CC sem escovas é constituído por íman permanente e pode
possuir vários pares do pólo, alternadamente N-S.
Ao contrário de um motor de CC com escovas, a comutação do motor sem escovas é realizada
electronicamente. Para que o motor rode, os enrolamentos do estator têm de ser alimentados
com tensão contínua com uma determinada sequência. Deste modo, são criados
sequencialmente pares de pólos N-S no estator que atraem os pólos S-N do rotor, e este entra
em rotação.
A sequência a aplicar terá de fazer rodar o rotor, num sentido ou noutro, para tal, é necessário
conhecer-se a sua posição para determinar qual ou quais os enrolamentos que devem ser
alimentados.
A posição do rotor é detectada, tipicamente, por sensores de efeito de Hall. Normalmente em
motores industriais existem três destes sensores colocados no estator. Sempre que os pólos
magnéticos do rotor são detectados por estes sensores a electrónica de comando é informada
sobre a posição do rotor.
Baseado na combinação dos sinais fornecidos pelos três sensores (H1, H2 e H3), o
controlador electrónico determina a sequência de alimentação a aplicar aos enrolamentos (fases)
do estator para que o rotor rode no sentido desejado e à velocidade pretendida.
Suporte Teórico
19
O circuito de controlo destes motores permite a regulação de vários parâmetros do motor, tais
como: velocidade, sentido de rotação e binário.
Na figura 1.20 está representado um circuito de comando típico de um motor Brushless com
um estator com três fases ligadas em estrela.
Figura 1.20 - Circuito de comando típico de um motor Brushless com três fases.
Estes motores apresentam uma baixa manutenção, uma operação silenciosa, um bom
rendimento, uma vida útil longa, gama extensa de velocidades e devido ao facto de não
possuírem escovas, um desgaste mecânico reduzido e interferências electromagnéticas (EMI)
muito baixas. Pelo facto de serem constituídos por um rotor mais leve, constituído por ímans
permanentes, a inércia, comparada com rotores em núcleo de ferro, é menor. Isto melhora as
características de aceleração, de travagem e a eficiência energética. A necessidade de um
controlador electrónico para funcionarem é a sua desvantagem, uma vez que aumenta o custo
do projecto.
As aplicações dos motores sem escovas incluem entre outras: compressores, bomba
ventoinhas, máquinas de lavar, etc.
Actualmente, estes motores, com o respectivo controlador, também dominam muito o
hardware existente no computador, nomeadamente os discos duros, leitores de CD, leitores de
DVD e ventoinhas para refrigeração.
A eficiência elevada, baixa manutenção e o tamanho reduzido destes motores torna-os
especialmente indicados para aplicações em que a fiabilidade seja um ponto importante.
Devido às suas características, os motores de CC sem escovas têm vindo a substituir os
motores de CC com escovas em variadíssimas aplicações.
Suporte Teórico
20
1.2.2. Motores de Corrente Alternada (CA)
Neste tipo de motor, o fluxo magnético do estator é gerado nas bobinas de campo pela
corrente alternada da fonte de alimentação monofásica ou trifásica, portanto trata-se de um
campo magnético cuja a intensidade varia continuamente e cuja polaridade é invertida
periodicamente.
Relativamente ao rotor, há dois casos a considerar: os Motores Síncronos e os Motores
Assíncronos.
1.2.2.1. Motores Síncronos
No motor síncrono, o rotor é constituído por um íman permanente ou bobinas alimentadas em
corrente contínua mediante anéis colectores. Neste caso, o rotor gira com uma velocidade
directamente proporcional à frequência da corrente no estator e inversamente proporcional ao
número de pólos magnéticos do motor.
São motores de velocidade constante e são utilizados somente para grandes potências devido
ao seu alto custo de fabricação.
A seguinte equação define a velocidade síncrona nS deste tipo de motor:
pfns
.120= (eq.1.2)
Onde:
§ nS- velocidade de sincronismo ( rpm );
§ f- frequência da corrente do rotor (Hz);
§ p- número de pólos magnéticos do motor.
1.2.2.2. Motores Assíncronos
No motor assíncrono ou de indução, o rotor possui vários condutores conectados em curto-
circuito no formato de uma “gaiola de esquilo”, conforme mostra a figura 1.21.
Suporte Teórico
21
Figura 1.21 – Rotor em gaiola de esquilo.
O campo magnético variável no estator, figura 1.22, induz correntes sinusoidais nos
condutores da gaiola do rotor. Estas correntes induzidas, por sua vez, criam um campo
magnético no rotor que se opõe ao campo indutor do estator (Lei de Lenz). Como os pólos se
com a mesma polaridade se repelem, então há uma força no sentido de rotação do rotor. O rotor
gira com uma velocidade n um pouco inferior à velocidade síncrona, isto é, a velocidade da
corrente do campo. Como é um pouco inferior, este motor é conhecido por motor assíncrono,
isto é, sem sincronismo.
Desta forma este motor não consegue arrancar, isto é, acelerar desde a velocidade zero até a
nominal pois as forças que actuam nas barras curto-circuitadas opõem-se umas às outras,
impedindo o seu arranque. Para que este motor possa arrancar é usual, utilizar-se uma bobina
de campo auxiliar, desfasada de 90 graus das bobinas de campo principais, que cria um campo
magnético auxiliar no arranque. Assim, o fluxo resultante inicial está desfasado em relação ao
eixo das abcissas, e produz um binário de arranque. Após o arranque, enrolamento auxiliar deixa
de ser necessário, pois a própria inércia do rotor compõem as forças necessárias para manter a
rotação.
Figura 1.22 – Fluxo magnético do motor de Indução Monofásico de dois Pólos.
Suporte Teórico
22
A diferença em valores percentuais entre a velocidade síncrona e a velocidade do motor de
indução é conhecida como deslizamento, simbolizada pela letra S. O deslizamento dos motores
de indução é variável em função da carga a ser accionada pelo motor, ou seja, é mínimo em
vazio (sem carga) e máximo com a carga nominal. O deslizamento dos motores de indução é
expresso através da seguinte equação:
100×−
=s
s
nnnS (eq.1.3)
§ n - velocidade do eixo do motor (rpm).
Através das duas últimas equações é possível verificar que a velocidade dos motores síncronos
e assíncronos pode ser controlada através do ajuste do valor da frequência da corrente nas
bobinas do estator. Este tipo de accionamento é realizado através de um conversor estático de
frequência.
Ao contrário dos motores síncronos e de corrente contínua; o motor assíncrono ou de indução
é largamente utilizado nas indústrias pela sua simplicidade construtiva, pouca manutenção e
baixo custo.
Os motores de indução podem ser monofásicos ou trifásicos.
1.2.2.2.1. Motores de Indução Monofásico
É um motor eléctrico de pequena ou média potência, geralmente menores que 5 CV. Para a
produção do conjugado de partida o motor de indução monofásico necessita de um segundo
enrolamento de partida auxiliar (Ea) desfasado de 90º construtivamente do enrolamento de
trabalho (Et), conforme é indicado na figura 1.23.
Figura 1.23 – Motor de indução monofásico.
Suporte Teórico
23
O resultado da acção das correntes nos enrolamentos de trabalho e auxiliar é um campo
magnético girante no estator, que faz o motor arrancar. Após o arranque o enrolamento auxiliar é
desligado através de uma chave centrífuga que opera a cerca de 75% da velocidade síncrona. O
conjugado de partida, neste caso, é moderado. Para aumentar o conjugado de partida é usado
um condensador, ligado em série com o enrolamento auxiliar e a chave centrífuga. Esta técnica
é utilizada para cargas de partida difíceis, tais como: compressores, bombas, equipamentos de
refrigeração, etc.
O motor de indução monofásico normalmente utilizado apresenta seis terminais acessíveis,
sendo quatro para os dois enrolamentos de trabalho Et (1,2,3 e 4), bobinas projectadas para
tensão de 127 V, e dois para o circuito auxiliar de partida (5 e 6), também projectado para a
tensão de 127 V. A figura 9 mostra o esquema de ligação do motor de indução monofásico para
as tensões de alimentação de 127 e 230 V entre fase e neutro.
(a) Ligação em paralelo para 127V. (a) Ligação em série para 230V.
Figura 1.24 – Esquemas de Ligação do Motor de Indução Monofásico.
Em alguns motores de baixa potência, o circuito auxiliar de partida é substituído por espiras
curto-circuitadas, chamadas de bobinas de arraste. Neste caso, a máquina apresenta dois ou
quatro terminais para as bobinas de trabalho.
Para a inversão do sentido de rotação no motor de indução monofásico basta inverter as
ligações do circuito auxiliar, ou seja, trocar o terminal 5 pelo 6.
No motor com bobina de arraste não é possível inverter o sentido de rotação.
1.2.2.2.2. Motores de Indução Trifásico
É um motor eléctrico de pequena, média ou grande potência que não necessita de circuito
auxiliar de partida, ou seja, é mais simples, menor, e mais leve que o motor de indução
Suporte Teórico
24
monofásico de mesma potência, por isso apresenta um custo menor. A figura 1.25 mostra o
princípio de funcionamento do campo girante do mesmo.
Figura 1.25 – Funcionamento do campo girante do motor de indução trifásico.
O motor de indução trifásico apresenta seis terminais acessíveis, dois para cada enrolamento
de trabalho Et e, a tensão de alimentação destas bobinas é projectada para 230V. Para o
sistema de alimentação 220/127 V-50Hz este motor deve ser ligado em triângulo e para o
sistema 380/220V-50Hz o motor deve ser ligado em estrela conforme mostra a figura 1.26.
Suporte Teórico
25
(a) Ligação em triângulo (Δ) -220V (b) Ligação em estrela (Ү) – 380V
Figura 1.26 – Esquemas de Ligação do Motor de Indução Trifásico.
Para a inversão no sentido de rotação nos motores de indução trifásicos basta inverter duas
das ligações do motor com as fontes de alimentação. A potência eléctrica PE absorvida da rede
para o funcionamento do motor é maior que a potência mecânica PM fornecida no eixo
especificado pelo fabricante, pois existe um determinado rendimento η do motor a ser
considerado, isto é:
(%) 100cos..3 .
×==φ
ηLL
M
E
M
IVP
PP (eq.1.4)
A potência mecânica no eixo PM do motor (em W) está relacionada com o momento de torção
M ou conjugado (em N.m) e com a velocidade do rotor n (em rpm) através da seguinte
operação.
)(.602 WMnPMπ
= (eq.1.5)
A figura 1.27 mostra as curvas do binário do motor, binário da carga e da corrente absorvida
pelo mesmo, ambas em função da velocidade do rotor.
Suporte Teórico
26
Figura 1.27 – Binário e corrente de um motor de indução trifásico.
Sem accionar nenhuma carga no eixo, em vazio, o motor garante um valor reduzido de
potência mecânica somente para vencer o atrito causado pela ventilação e pelos rolamentos. O
binário do motor neste caso é próximo de zero, a corrente io também é mínima e a velocidade do
rotor é máxima no mas inferior à velocidade síncrona nS.
O motor ao accionar uma carga nominal acoplada ao seu eixo a corrente aumenta para o valor
nominal iN e a velocidade diminui até o valor nominal nN, onde se obtém a igualdade de binário,
isto é, o binário do motor é igual ao binário de carga.
Podemos aumentar a carga no eixo do motor (binário de carga) além da carga nominal, mas
este procedimento compromete a vida útil da máquina, até o ponto em que o binário do motor é
máximo MM, a velocidade do motor irá diminuir para nK e a corrente irá aumentar para iK.
No arranque, velocidade igual a zero, o motor de indução absorve uma corrente muito elevada
iP da ordem de até dez vezes a corrente iN e seu binário de partida é baixo MP dificultando com
isso o accionamento de cargas que necessitam de um alto binário para o arranque, como por
exemplo: tapetes de transporte com carga.
Suporte Teórico
27
1.2.3. Motores Especiais
Os motores especiais são máquinas construídas para serem aplicadas no controlo de precisão
relativamente à posição e velocidade dos processos. São motores mais rápidos que os
convencionais, os seus enrolamentos são dimensionados para suportarem picos de corrente, em
contrapartida o rotor de uma máquina especial é projectado para uma baixa inércia, isto é
pequeno diâmetro e grande comprimento.
1.2.3.1. Servomotores
De forma geral, os servomotores são classificados em servomotores de corrente contínua (CC)
e de corrente alternada (CA).
1.2.3.1.1. Servomotores CC
O estator é formado por ímãs permanentes e pelas escovas e o rotor é constituído pelas
bobinas da armadura e pelo comutador. O controlo da velocidade ou posição é feito através da
regulação da corrente das bobinas da armadura.
Apresentam como vantagens os seguintes aspectos:
- Baixo custo, os motores CC são produzidos actualmente com baixos custos de fabricação;
- Suavidade em baixas rotações, esta característica é obtida através de modelos com um
grande número de ranhuras (lamelas) no rotor, tornando-o a melhor opção relativamente a esta
característica;
- Drivers de baixo custo, um driver de corrente contínua pode ser tão simples como uma
ponte de transístores;
- Sem consumo nas paragens, sem carga estática no motor não haverá consumo de
corrente para manter uma posição;
- Alto binário de pico, em aplicações com ciclo de trabalho intermitente particularmente no
posicionamento de cargas de elevada inércia, o motor pode operar com sobre intensidades;
- Evolução linear da curva binário/velocidade, permite obter óptimos desempenhos através
da simples geração de rampas de aceleração;
- Grandes variedades de modelos disponíveis, os motores CC estão disponíveis com uma
grande variedade de opções, incluindo motores com baixa inércia para aplicações de alta
dinâmica;
Suporte Teórico
28
- Operação a altas velocidades, os motores CC podem operar sem problemas a velocidades
até 5000 rpm.
Apresentam como desvantagens os seguintes aspectos:
- Manutenção das escovas, não chega a ser um problema se o motor estiver em local de
fácil acesso, caso contrário inviabiliza a aplicação. Há que se considerar também a emissão de
pó por parte do carvão das escovas, o que inviabiliza o seu uso em locais extremamente limpos;
- Risco de explosão, devido aos arcos eléctricos gerados nas escovas torna-se inviável o seu
uso em ambientes sujeitos a explosão (ou no vácuo);
- Comutações limitadas, a repetição de movimentos curtos (menor do que uma rotação) fica
limitada devido a comutação mecânica;
- Baixa dissipação térmica, todo o calor é gerado internamente no rotor, o que dificulta sua
dissipação para o meio;
- Pode ser desmagnetizado, elevadas correntes podem resultar na desmagnetização parcial
do motor;
- Custo de instalação, os servomotores CC apresentam maiores custos de instalação quando
comparados aos motores de passo.
1.2.3.1.2. Servomotores CA
O estator é formado pelas bobinas de campo que são alimentadas por uma fonte trifásica e o
rotor é constituído por ímãs permanentes. O controlo da velocidade ou posição é feito através da
regulação da frequência das correntes nas bobinas de campo.
Apresentam como vantagens os seguintes aspectos:
- Estão isentos de manutenção, devido ao facto de não possuírem escovas para a
comutação;
- Boa dissipação térmica, pois todo calor é gerado no estator o que facilita sua dissipação
para o meio;
- Altíssimas velocidades, não há comutadores mecânicos para limitarem a velocidade,
pequenos motores sem escovas podem facilmente atingir velocidades até 12000 rpm;
- Insensíveis ao ambiente, não emitem ruídos, pós, faíscas, ou outros tipos de resíduo ao
ambiente. Além disto, podem suportar elevadas temperaturas bem como ambientes em vácuo.
Suporte Teórico
29
Apresentam como desvantagens os seguintes aspectos:
- Elevado custo, principalmente devido ao uso de materiais magnéticos compostos por terras
raras;
- Controladores mais caros e complexos, controladores do tipo seis estados, trapezoidais não
são tão mais caros como os controladores para motores DC com escovas, porém os
controladores para a geração de ondas sinusoidais podem apresentar valores mais elevados.
1.2.3.2. Motores de Passo-a-passo
Os motores de passo ou (passo-a-passo) representado na figura 1.28, são dispositivos
mecânicos electromagnéticos que podem ser controlados digitalmente através de um hardware
específico ou através de software. A cada impulso de comando o eixo do motor roda um
pequeno ângulo (passo) e permanece estável nessa posição se mais nenhum impulso for
aplicado.
São usados em larga escala em impressoras, scanners, leitores de disquetes, discos rígidos
etc. Este tipo de motor é utilizado quando existe a necessidade de precisão. Os motores de
passo têm um número fixo de pólos magnéticos que determinam o número de passos por volta.
Existem vários modelos de motores de passos disponíveis no mercado, os mais comuns têm
entre 2 a 72 passos/volta, significando que levam de 2 a 72 passos para completar uma volta.
Figura 1.28 – Aspecto de um motor de passo-a-passo.
Tipos de Motores de Passo
Existem basicamente três tipos de motores passo-a-passo: íman permanente, relutância
variável e híbrido.
Todos possuem estator e rotor, diferindo principalmente na constituição do rotor.
Suporte Teórico
30
Ø MOTOR DE ÍMAN PERMANENTE
Figura 1.29 – Motor de íman permanente.
O estator dos motores de íman permanente (figura 1.30), de utilização corrente, é formado
normalmente por duas secções, cada uma com o seu enrolamento e vários conjuntos de pólos
magnéticos (dentes) dispostos radialmente em torno do rotor.
Figura 1.30 – Constituição do motor de íman permanente.
O rotor representado na figura 1.31, é cilíndrico, não possui dentes, sendo formado por
conjuntos de ímans permanentes N-S dispostos radialmente em torno do veio.
Figura 1.31 – Rotor do motor de íman permanente.
Suporte Teórico
31
Princípio de funcionamento
O motor de íman permanente tem como princípio de funcionamento as leis de atracção e
repulsão entre pólos magnéticos. Quando os enrolamentos do estator são alimentados, criam
pólos magnéticos N e S nos dentes de cada secção. Por exemplo, em todos os dentes
superiores, de cada secção, pólos N, e em todos os inferiores, pólos S. Como os pólos contrários
se atraem, os pólos N dos imanes permanentes do rotor que estiverem mais próximos são
atraídos pelos dentes do estator com pólos S e os pólos S do rotor pelos dentes com pólos N,
rodando o rotor no sentido de alinhamento dos campos magnéticos.
É neste princípio que se baseia o funcionamento do motor passo-a-passo de íman permanente.
Portanto, para fazer rodar o rotor, basta criar um campo magnético rotativo, alimentando
sucessivamente os dois enrolamentos do estator (A e B), como se indica na tabela 1.1.
Tabela 1.1 – Sequência de alimentação dos enrolamentos do motor de íman permanente.
Figura 1.32 - Funcionamento do motor de íman permanente.
Suporte Teórico
32
Passo 1: O enrolamento A é alimentado, passando a corrente no sentido indicado. São
criados pólos magnéticos N-S no estator que atraem os pólos S-N do rotor, como mostrado em
1.
Passo 2: Idem para o enrolamento B, deslocando-se o rotor 90° no sentido anti-horário
Passo 3: A corrente passa novamente no enrolamento A, mas em sentido contrário. Agora os
pólos magnéticos criados no estator têm sinais contrários aos do passo 1. O rotor é
novamente atraído, deslocando-se mais 90°.
Passo 4: A corrente passa novamente no enrolamento B, agora em sentido contrário. Os
pólos magnéticos criados no estator têm nome contrário aos do passo 2. O rotor é novamente
atraído e desloca-se mais 90°.
Uma rotação completa é realizada em quatro passos. Se a sequência de alimentação de
alimentação dos enrolamentos for invertida (l, 4, 3, 2), o rotor roda em sentido horário.
Um motor de íman permanente de uso comum não roda por passos de 90º, a sua capacidade
de posicionamento seria muito baixa. Um motor, como os utilizados nas impressoras, roda
normalmente por passos de 7,5º. Estes motores possuem um rotor formado por 12 conjuntos
de pólos N-S e duas secções no estator com 12 +12 pólos cada. No total existem 48 pólos no
estator, o que corresponde, em 360º, a 48 passos 7,5º.
Quando se alimentam as bobinas, de cada um dos enrolamentos são criados alternadamente
em cada secção do estator 12 pólos N e 12 pólos S. Os pólos criados vão interagir com os pólos
do rotor (12 pólos N + 12 pólos S) e este desloca-se com passos de 7,5º. Alimentando
sequencialmente os enrolamentos, num sentido ou noutro, o rotor desloca-se no sentido horário
ou no sentido anti-horário.
O motor de íman permanente apresenta um bom binário e distinguem-se dos de relutância
variável porque no movimento manual do veio, mesmo com os enrolamentos desligados,
apresenta um ligeiro binário de retenção. Este é devido ao íman do rotor.
Estes motores são de construção simples e baixo custo, são usados, principalmente em
aplicações não industriais.
O seu grande campo de utilização é em periféricos de computadores: impressora,
fotocopiadoras e scanners.
Suporte Teórico
33
Ø MOTOR DE RELUTÂNCIA VARIÁVEL
Este tipo de motor (figura 1.33), possui um rotor constituído por material de boa
permeabilidade magnética e um estator com três ou mais enrolamentos. Tanto o estator como o
rotor possuem pólos salientes (dentes).
Figura 1.33 - Modelos comerciais de motores de relutância variável.
Princípio de funcionamento
Quando se alimentam os enrolamentos do estator, os dentes deste magnetizam-se e atraem
os dentes salientes do rotor que estiverem mais próximos, o rotor roda alinhando os seus dentes
com os dentes do estator. O alinhamento dos dentes corresponde a uma posição de relutância
mínima, ou seja, corresponde ao mais fácil caminho para as linhas de força do campo
magnético.
Figura 1.34 - Aspecto interior de um motor de relutância variável com três fases.
A relutância do circuito magnético, no equivalente magnético da resistência de um circuito
eléctrico, é mínima quando a distância entre os dentes do estator e do rotor também o for.
A indutância do enrolamento que está alimentado varia enquanto o rotor gira. Se os dentes
não estão alinhados, a indutância é baixa e a corrente aumenta rapidamente. Quando os dentes
estão alinhados, a indutância é grande e a corrente diminui. Esta é uma dificuldade no controlo
do motor de relutância variável.
No estator destes motores existem, tipicamente, três conjuntos de enrolamentos, A, B e C,
cada qual com duas bobinas colocadas em pólos diametralmente opostos e ligadas em série,
Suporte Teórico
34
formando uma fase. Alimentando sequencialmente os enrolamentos do estator com uma tensão
contínua como está representado na tabela 1.2, o rotor roda como está representado na
figura1.35.
Tabela 1.2 – Sequência de alimentação dos enrolamentos do motor de relutância variável.
Figura 1.35 – Funcionamento do motor de relutância variável.
Neste caso o motor possui três fases (enrolamentos A, B e C) e, consequentemente, três
conjuntos de pólos magnéticos. O rotor, constituído por material ferromagnético, possui quatro
dentes (1,2, 3 e 4). O seu funcionamento é o seguinte:
Suporte Teórico
35
Passo 1: Quando a fase A (bobina A) é alimentada, os dentes do rotor procuram uma posição
de relutância mínima, no exemplo, os dentes l e 3 alinham-se com ou pólos N-S do enrolamento
A.
Passo 2: Passando a alimentação para a fase B, são atraídos pelos pólos do enrolamento B os
dentes do rotor que estiverem mais próximos, no caso, dentes 2 e 4. O rotor desloca-se 30°
para a nova posição de relutância mínima.
Passo 3: Desligada a fase B e ligada a fase C, são atraídos os dentes l e 3 e o rotor desloca-se
mais 30°.
Passo 4: Desligada a fase B e ligada a fase A, são atraídos os dentes 2 e 4 e o rotor desloca-se
mais 30°.
Continuando a alimentar sucessivamente as bobinas A, B e C, o rotor desloca-se por por passo
de 30º no sentido anti-horário. Uma rotação completa do rotor corresponde a 12
Caso se pretenda que o rotor rode no sentido horário, as bobinas têm de ser alimentadas pela
ordem inversa: A, C e B.
Como o motor de relutância variável não se baseia nas leis da atracção e repulsão entre pólos
magnéticos, mas sim no princípio da relutância mínima, o sentido de passagem da corrente nos
enrolamentos é indiferente. Estes motores não possuem íman permanente no rotor, por isso, o
rotor move-se livremente, não tendo binário de retenção. Esta é uma das formas de distinguir
este motor dos motores de íman permanente e híbridos; nestes, o rotor possui um pequeno
binário de retenção.
Os motores de relutância são menos utilizados do que os motores de íman permanente. A sua
principal utilização é em aplicações de precisão com binários muito reduzidos.
Ø MOTOR HÍBRIDO
A construção dos motores de íman permanentes com ângulos de passo abaixo de 7,5° é de
alguma complexidade; esta situação é ultrapassada com o motor híbrido, representado na figura
1.36. Este combina os princípios do motor de íman permanente e do motor de relutância
variável. O motor híbrido tem um pequeno ângulo de passo (tipicamente 1,8°) e um binário
elevado num motor relativamente pequeno.
Suporte Teórico
36
Figura 1.36 - Motores híbridos comerciais.
O motor híbrido possui um rotor constituído por um íman permanente e massas polares, com
dentes, acopladas aos pólos do íman.
O estator possui tipicamente dois enrolamentos com várias bobinas e pólos magnéticos com
dentes. Estes pólos estão dispostos em frente dos dentes das massas polares do rotor.
Figura 1.37 - Constituição do motor híbrido.
Este motor possibilita realizar passos muito reduzidos com um binário bastante elevado,
reunindo as vantagens do motor de íman permanente e do motor de relutância variável,
tornando-se por isso, dos motores de passo-a-passo mais utilizados em aplicações industriais.
Princípio de funcionamento
O motor híbrido combina o modo de funcionamento do motor de íman permanente e do motor
de relutância variável.
O seu rotor como é constituído por massas polares acopladas a um íman permanente,
possuem: uma, um pólo N, e outra, um pólo S.
Suporte Teórico
37
Figura 1.38 – Vista em corte do motor híbrido.
O estator deste motor possui quatro dentes e dois enrolamentos. O rotor tem um total de seis
dentes: três nas massas polares anteriores, com polaridade N, acoplados ao pólo N do íman
permanente, e três, nas massas polares posteriores, com polaridade S, acoplados ao pólo S do
íman. Os dentes posteriores estão posicionados a meio do intervalo dos anteriores. Se os
enrolamentos do estator forem alimentados com a sequência de impulsos indicados na seguinte
tabela, a sequência da sua rotação é indicada na figura 1.39.
Tabela 1.3 – Sequência de alimentação dos enrolamentos do motor híbrido.
Figura 1.39 -Funcionamento do motor híbrido.
Suporte Teórico
38
Passo 1: Alimentando o enrolamento A do estator, no sentido indicado, é criado no dente
superior um pólo S e no dente inferior um pólo N. Pelo pólo S é atraído o dente anterior N do
rotor e pelo pólo N o dente posterior S.
Passo 2: Alimentando o enrolamento B, no sentido indicado, é criado no dente lateral direito do
estator um pólo S e no dente lateral esquerdo um pólo N. Pelo pólo S é atraído o dente anterior
N do rotor que estiver mais próximo e pelo pólo N o dente posterior S do rotor que estiver mais
próximo. O rotor desloca-se 30º no sentido anti-horário.
Passo 3: Alimentando novamente o enrolamento A, mas agora com corrente em sentido
contrário, é criado no dente superior um pólo N e no dente inferior um pólo S. Pelo pólo
N é atraído o dente posterior S que estiver mais próximo e pelo pólo S o dente anterior N
mais próximo. O rotor desloca-se mais 30° no sentido anti-horário.
Passo 4: Alimentando agora o enrolamento B com corrente em sentido contrário, é criado
no dente lateral direito um pólo N e no dente lateral esquerdo um pólo S. Pelo pólo N é
atraído o dente posterior S que estiver mais próximo e pelo pólo S o dente anterior N
que estiver mais próximo. O rotor desloca-se mais 30º no sentido anti-horário.
Nesta fase, o rotor deslocou-se no sentido anti-horário 90°. Continuando a alimentar os
enrolamentos com a mesma ordem (l, 2, 3, 4), o rotor continua a rodar no anti-horário.
Uma rotação completa do rotor corresponde a 12 passos.
Caso se pretenda que o rotor rode em sentido horário, basta trocar a sequência de
alimentação dos enrolamentos, ou seja, alimentar os enrolamentos pela seguinte ordem
(1,4,3,2).
Figura 1.40 - Dentes das massas polares separados de meio passo de dente.
Suporte Teórico
39
Os motores híbridos utilizados nas aplicações práticas possuem um número de dentes
muito superior ao utilizado no exemplo para explicar o funcionamento; é vulgar
apresentarem 200 dentes ou mais. Também podem possuir um rotor com vários ímanes
permanentes intercalados entre massas polares. Neste caso, os dentes de cada
massa polar estão fisicamente desencontrados, o que possibilita ângulos de passo
extremamente pequenos.
Os motores híbridos, tal como os de íman permanente, apresentam um pequeno binário
de retenção. O veio ao ser rodado manualmente apresenta uma força que de oposição
ao movimento, que se deve à atracção entre o íman permanente do rotor e os pólos do
estator.
MODOS DE ALIMENTAÇÃO DOS MOTORES DE PASSO-A-PASSO
Ø Unipolares:
Neste tipo de alimentação (figura 1.41), a corrente de excitação que circula nos enrolamentos
do estator do motor é sempre no mesmo sentido.
Este tipo de motor pode possuir cinco, seis ou oito condutores, ligados como se mostra na
figura seguinte. Os usuais possuem cinco ou seis condutores e são formados por dois
enrolamentos iguais com ponto médio comum (cinco condutores) ou separado (seis condutores).
São motores de quatro fases.
Figura1.41 - Enrolamentos do motor com alimentação unipolar
O ponto médio dos enrolamentos destes motores é ligado a tensão positiva da fonte de
alimentação e os terminais dos extremos à tensão negativa. A corrente circula do comum para
os terminais dos extremos.
Nos motores com seis terminais de ligação, não utilizando o ponto médio, os enrolamentos
ficam ligados em série, podendo o motor funcionar como bipolar. Nos motores com oito
Suporte Teórico
40
terminais é possível a ligação em série ou em paralelo entre os enrolamentos. A configuração
unipolar nos enrolamentos simplifica, quando se utilizam componentes discretos no circuito de
comando do motor.
Ø Motores Bipolares:
Neste modo de alimentação o estator do motor possui dois enrolamentos iguais, circulando a
corrente de excitação neles, ora num, ora noutro sentido. Estes motores possuem quatro
condutores de ligação, duas fases.
Figura 1.42 – Disposição dos enrolamentos de um motor com alimentação bipolar.
Dado que a corrente pode circular, em cada enrolamento, nos dois sentidos, uma vez cria um
campo magnético com uma polaridade, outra vez com polaridade contrária. O motor com
alimentação bipolar é de construção mais simples que o motor unipolar e para o mesmo
tamanho, possui um binário mais elevado.
Apresentam como vantagens os seguintes aspectos:
- Menor custo, se a aplicação puder ser realizada com motor de passo;
- Isento de Manutenção, não há escovas ou outras partes sujeitas a desgastes, não
necessitando portanto de manutenções periódicas;
- Estabilidade nas paragens, sem comutação na corrente de fase o rotor permanece
completamente parado. Não há a tendência do rotor se agitar em torno de uma posição do
encoder;
- Industrialmente padronizado, são fabricados com eixo ou face padronizados (Norma NEMA
ou Métrico) sendo portanto facilmente substituíveis;
- Baixa limitação pelo ambiente, podem ser usados em quase todos os ambientes (inclusive
no vácuo);
Suporte Teórico
41
- Isento de erros, não há erros no drive de modo a gerar a perda de controlo do movimento.
Pelo contrário, em tais situações há a tendência do rotor parar (ao contrário do que pode
acontecer nos sistemas servo controlados);
- Dificilmente desmagnetizável, elevados níveis de corrente não causam desmagnetização de
seus materiais (ao contrário do que pode ocorrer com os motores com escova);
- Seguros e fiáveis, os motores de passo são bastante simples sob o ponto de vista
construtivo, praticamente isentos de falhas;
- Resistente a sobrecargas, não há elevação da corrente no motor quando em situações de
sobrecarga como ocorrem nos servomotores;
- Relação (binário/dimensão), comparativamente com os motores DC (com escovas), do
mesmo tamanho, o motor de passo pode fornecer altos binários de saída em baixas velocidades;
- Ligação simples, são necessárias apenas quatro vias de alimentação, o que pode ser uma
vantagem em situações onde as conexões tenham elevados custos.
Apresentam como desvantagens os seguintes aspectos:
- Perda de suavidade para baixas velocidades, sendo o maior problema dos motores de
passo. Pode, porem ser solucionado com drivers de micro-passo;
- Perda de posicionamento em malha aberta, pode ocorrer em situações de sobrecarga. Um
encoder para confirmação de passo poderia resolver o problema, porém neste caso seria
preferível o uso de um servomotor;
- Corrente nominal mesmo quando parado, como o binário de retenção exige circulação de
corrente, isto causa aquecimento do motor mesmo quando parado;
- Possibilidade de ocorrência de fenómenos de ressonância, a baixas velocidades;
- O binário diminui com o aumento da velocidade.
1.2.4. Binário
O binário do motor é a medida do esforço necessário para fazer girar um eixo, e é dado pela
seguinte equação:
(N.m) raio F.T = (eq. 1.6)
No caso de qualquer motor, o binário de arranque deve ser maior do que o binário existente
acoplado ao eixo. Após um certo tempo do motor ter arrancado à velocidade nominal, este
alcança a velocidade nominal, há o encontro das curvas de Binário do motor e do binário
Suporte Teórico
42
resistente. Na curva representada a seguir verifica-se que, quando a carga mecânica no eixo
varia por algum motivo, o binário motor também varia, e consequentemente a velocidade de
rotação do motor também varia.
Por exemplo, se a carga mecânica diminui, o binário do motor também diminui e a velocidade
aumenta, estabilizando num novo regime.
Figura 1.43 – Evolução do binário do motor em função da carga mecânica.
1.3. Microcontrolador
O surgimento do microprocessador teve um grande impacto no mercado da electrónica
digital. Os desenhos de equipamento dos mais variados tipos foram revolucionados e conseguiu-
se fornecer aos equipamentos que eram convencionais, aquilo que é normalmente apelidado de
inteligência, flexibilizando a operação e aumentando as capacidades e a performance do
equipamento.
Hoje em dia já se torna bastante difícil encontrar dispositivos que não possuam alguma
espécie de microprocessador. De facto, integrando numa pequena pastilha de silício um
conjunto de recursos muito variado (CPU, memória, unidade aritmética, I/O digitais e/ou
analógicas, comunicação série/paralelo, entre outros), o projecto de sistemas baseados em
microprocessador tornou-se económico, flexível e comparativamente mais rápido do que até
então se conseguia fazer.
A revolução que o microprocessador provocou nos novos equipamentos foi acompanhada por
uma revolução na metodologia de projecto que passou a envolver fases até então inexistentes.
O projecto de uma arquitectura baseada em microprocessador é dividido em três grandes
áreas:
- O desenho do hardware necessário para que o microprocessador possa desempenhar
normalmente as suas funções (base de tempo, memória, I/O, entre outros);
Suporte Teórico
43
- O desenho do hardware específico que define a natureza do equipamento e que deverá
ser desenhado para poder dialogar directamente com o sistema de controlo do ponto
anterior;
- O desenho do software que funcionará no sistema de controlo e que permitirá que o
sistema seja utilizado por um utilizador humano com maior ou menor flexibilidade e
segurança.
Neste trabalho utilizou-se um microcontrolador. Embora a análise da estrutura que
distingue um microprocessador de um microcontrolador fique fora dos objectivos deste trabalho,
pode-se adiantar que, de uma maneira simples, o microcontrolador integra muitas
características funcionais de um sistema baseado num microprocessador, juntando todas essas
características num único circuito integrado, o que proporciona o desenho com microcontrolador
mais económico e muito mais compacto.
1.4. PWM (Pulse Width Modulation)
Esta técnica consiste na modulação da largura de impulso, variando a largura do impulso ou
Duty-Cycle, mas mantendo o período e a amplitude do sinal constantes, tal como está
representado na figura 1.44.
Esta técnica é muito utilizada para o controlo da velocidade de motores, em fontes comutadas,
para o controlo da intensidade do brilho de LEDS e lâmpadas, entre outras, sendo estas apenas
algumas das aplicações deste tipo de técnica.
Figura 1.44 – Sinal de PWM para 0%, 25%, 50%, 75% e 100% de duty-cycle.
A grande vantagem do uso de circuitos PWM como controladores em relação aos circuitos
resistivos é a sua eficiência. Enquanto a eficiência da técnica do PWM é de praticamente 1,
possuindo menos de 1% de perda, o circuito resistivo trabalha a 50% da carga (50% vai
realmente para alimentação da carga e 21% é dissipado por aquecimento nas resistências).
Suporte Teórico
44
Uma outra grande vantagem consiste no facto de na modulação de largura de pulso, os pulsos
estarem com o valor nominal de pico, gerando um maior binário nos motores ao contrário de um
controlador resistivo, já que deverá ter uma tensão reduzida, podendo causar a paragem do
motor devido ao binário reduzido. Além disso, podem usar-se potenciómetros menores para
controlar cargas variadas, ao contrário dos resistivos que usam potenciómetros de maior
dimensão e mais dispendiosos.
Uma das desvantagens do PWM é a possibilidade de gerar ruído electromagnético mais
conhecido como EMI.
Este efeito indesejado pode ser minimizada colocando o controlador perto da carga e em
alguns casos recorrendo a filtros adicionais.
1.5. MOSFET
O transístor de efeito de campo de porta isolada (“Metal Oxide Semiconductor Field Effect
Transístor”, MOSFET) é um dos dispositivos mais utilizados em aplicações de electrónica na
indústria devido à sua elevada eficiência em aplicações que exijam frequências de comutação
muito elevadas. A tecnologia FET foi inventada em 1930, cerca de 20 anos antes do transístor
bipolar. Actualmente, milhões de MOSFETS são integrados em dispositivos electrónicos. Exemplo
disso é a sua integração num dos dispositivos actuais mais vulgarmente utilizados, os
microprocessadores.
O MOSFET é um dispositivo unipolar (ou seja a corrente é devida só a um tipo de portadores
maioritários) com três terminais, em que o eléctrodo de comando ou porta (G -“Gate”) é
electricamente isolado do material semicondutor por uma fina camada de óxido de Silício. Nos
outros dois terminais são aplicados os sinais de potência a controlar, designando-se dreno (D –
“Drain”) e fonte (S -“Souce”).
Existem dois tipos de MOSFETs: um do tipo modo de depleção e outro do tipo modo de
enriquecimento. À excepção de algumas aplicações especiais, maioritariamente utiliza-se o
MOSFET do tipo de enriquecimento, tanto nos circuitos discretos como nos integrados. A
principal utilização nos circuitos discretos verifica-se na comutação de potência, para elevados
níveis de correntes. A utilização em principal nos circuitos integrados ocorre na comutação
digital, processo básico em que assentam os computadores modernos.
O MOSFET do tipo modo de depleção constitui parte da evolução para o MOSFET do tipo
modo de enriquecimento, também conhecido por E-MOSFET, representado na figura 1.45.
Suporte Teórico
45
Figura 1.45 – MOSFET do tipo modo de enriquecimento a) Não polarizado; b) Polarizado.
Quando a tensão aplicada na porta deste tipo de MOSFET, é zero a corrente entre a fonte e o
dreno é zero, garantindo que o MOSFET está desligado, sendo este o seu estado por defeito. A
única forma de garantir a passagem de corrente é através da aplicação de uma tensão de porta
positiva (VGS). Quando VGS for positiva, os electrões livres são atraídos para a região P, que se irão
recombinar nas lacunas existentes junto ao silício. Se VGS for suficientemente positiva todas as
lacunas que tocam no dióxido de silício são preenchidas e os electrões livres começam a fluir da
fonte para o dreno. O efeito é o mesmo que criar uma fina camada de material do tipo N junto
ao dióxido de silício. A esta fina camada condutora atribui-se a designação de camada de
inversão do tipo N. Quando existe, os electrões livres flúem facilmente da fonte para o dreno. Ao
valor mínimo de VGS que cria a camada de inversão do tipo N designa-se tensão de limiar e
simboliza-se por VGS,lim . Quando o valor de VGS for inferior a VGS,lim, a corrente do dreno é nula, o
mesmo não acontece quando o valor de VGS é maior que VGS,lim, dado que a camada de inversão
tipo N gerado, garante a ligação da fonte ao dreno, podendo assim a corrente fluir.
Na figura 1.46a é possível verificar a representação gráfica que VGS,lim está geralmente associada
a este tipo de MOSFET, estando a seta existente na figura a apontar para a camada de inversão
que se comporta como um canal N quando o dispositivo conduz.
Também existe o E-MOSFET de canal P. O seu símbolo gráfico muito semelhante ao do tipo N,
diferindo apenas no sentido da seta, como é possível verificar na figura 1.46b.
Figura 1.46 – Símbolos gráficos do EMOS a) N-MOSFET; b) P-MOSFET.
Suporte Teórico
46
1.6. Controladores
Neste capítulo é feita uma breve descrição sobre alguns tipos de controladores mais utilizados.
1.6.1 Controlo ON-OFF
O algoritmo de controlo mais simples é o do controlador ON-OFF, também conhecido por
controlador Bang-Bang. Neste tipo de controlador o sinal de erro é aplicado na entrada de um
comparador cuja saída actua directamente na entrada do sistema.
O sinal de controlo u(t) para este tipo de controlador é dado por:
(eq.17)
Onde e(t) é o sinal de erro definido como e(t)=r(t) - y(t), em que r(t) é o sinal de referência e
y(t) é o sinal medido da variável controlada. umax e umin são, respectivamente o valor máximo e
mínimo que o sinal de controlo u(t) pode tomar. Finalmente, y(t) corresponde ao sinal de saída.
O comportamento do controlador ON-OFF pode ser descrito de forma gráfica pela figura 1.47.
Dependendo do sinal do erro e(t) o sinal de controlo toma o valor máximo ou mínimo.
Figura 1.47 – Sinal de controlo do algoritmo ON-OFF.
Partindo do princípio que o ganho estático do sistema a controlar é positivo tem-se:
• Se e(t) é negativo significa que o sinal de saída y(t) é superior ao sinal de referência r(t) e
o sinal de controlo toma o valor mínimo.
• Se e(t) é positivo significa que o sinal de saída y(t) é inferior ao sinal de referência e o
sinal controlo toma o valor máximo.
É imediato concluir que face a um processo real, o sinal de controlo vai exibir uma oscilação
permanente. Esta oscilação terá, forçosamente de se reflectir também no sinal de saída.
O diagrama de blocos de um sistema de controlo utilizando um controlador ON-OFF é
apresentado na figura 1.48.
<⇒
>⇒=
0)(0)(
)(min
max
teuteu
tu
Suporte Teórico
47
Figura 1.48 – Controlador ON-OFF.
É conhecido que este tipo de algoritmo apresenta limitações quando é utilizado para comparar
sinais afectados de ruído. Para evitar estes problemas utiliza-se um comparador com histerese.
O comportamento do controlador ON-OFF com histerese pode ser descrito, de forma gráfica pela
figura 1.49.
Figura 1.49 – Comportamento do controlador ON-OFF com histerese.
O diagrama de blocos de um sistema de controlo utilizando um controlador ON-OFF com
histerese está representado na figura 1.50.
Figura 1.50 – Controlador ON-OFF.
1.6.2. Controlo Proporcional
Uma solução capaz de evitar as oscilações inerentes ao princípio de funcionamento do
controlador ON-OFF consiste em utilizar um controlador cujo ganho seja reduzido para pequenos
valores do erro. Este objectivo pode ser alcançado utilizando uma “banda proporcional” ou
Controlador Proporcional.
O sinal de controlo para este tipo de controlador é dado por:
Suporte Teórico
48
×+=
min
0
max
ue(t)Ku
uu(t) p
0
00
0
ee(t)ee(t)e
ee(t)
−<⇒+≤≤−⇒
+>⇒ (eq.1.8)
Em que u0 é a amplitude do sinal de controlo correspondente a um sinal de erro e(t) nulo, -e0 e
+e0 são os valores máximos do sinal de erro, umax e umin são, respectivamente a maior e a menor
amplitudes do sinal de controlo e Kp é o ganho do controlador. O comportamento do algoritmo
proporcional pode ser descrito da forma gráfica pela figura 1.51.
Figura 1.51 – Comportamento do algoritmo proporcional.
O diagrama de blocos de um sistema de controlo utilizando um controlador Proporcional é
apresentado na figura 1.52.
Figura 1.52 – Controlador Proporcional.
1.6.2.1 Erro em estado estacionário
Utilizando um algoritmo proporcional é possível eliminar a oscilação permanente intrínseca ao
algoritmo ON-OFF. Este objectivo origina, contudo o aparecimento de um outro problema: não é
possível garantir que o erro em estado estacionário seja igual a zero.
É fácil provar esta última afirmação. Supondo que o erro e(t) é pequeno temos que o sinal de
controlo u(t) é dado pela seguinte expressão:
)()( 0 teKputu ×+= (eq.1.9)
Isto significa que o sinal de erro e(t) é:
Suporte Teórico
49
Kputu
te 0)()(
−= (eq.1.10)
No estado estacionário o erro é nulo se e só se uma das seguintes condições for verdadeira:
• Kp é infinito
• u0 = u(t)
A primeira condição conduz a um controlador cujo comportamento é semelhante ao do
algoritmo ON-OFF. A segunda condição implica que o sinal u0 varia de modo a que o erro em
estado estacionário seja sempre nulo para qualquer valor da entrada de referência.
A obtenção automática de um sinal u0 variável capaz de proporcionar um erro estacionário nulo
para todo e qualquer valor da entrada de referência conduz ao algoritmo Proporcional Integral
(PI).
1.6.3. Controlo PI
O controlador, cujo diagrama de blocos é apresentado na figura 1.53, é composto por um
bloco subtractivo (obtenção do sinal de erro), um bloco integrador (cálculo do integral do sinal de
erro), um bloco somador e um bloco de ganho.
Figura 1.53 – Controlador PI.
Os sinais r(t), u(t), y(t) e e(t) são, respectivamente, o valor de referência, o sinal de controlo, o
sinal de saída e o sinal de erro do controlador.
As constantes Kp (ganho), Ti (constante de tempo de integração) são coeficientes associados
respectivamente ao ganho e acção integral do controlador.
O sinal de controlo é definido pela seguinte expressão:
+= ∫ dtte
TiteKptu )(1)()( (eq.1.11)
Suporte Teórico
50
O sinal de controlo depende do ganho do controlador (Kp), do valor instantâneo do erro e do
integral do erro afectado do valor de escala (1/Ti). Por outras palavras, o sinal de controlo é
directamente proporcional ao sinal de erro e à sua evolução passada (acção integral).
1.6.3.1 Erro em estado estacionário
É possível provar que este tipo de algoritmo elimina o erro em regime estacionário.
Supondo que o sinal r(t) está fixo:
1. Se por hipótese o sinal e(t) está fixo e é diferente de 0;
2. O sinal de controlo u(t) devido ao integral está a subir (ou a descer), se o sinal e(t) é fixo
então o produto Kp×e(t) também é fixo;
3. Se o sinal u(t) está a subir (ou a descer) então o sinal y(t) também está a subir (ou a
descer);
4. Então o sinal e(t)=y(t)-r(t) não pode ser constante e contradiz 2;
O que significa que e(t) fixo tem de ser igual a zero.
1.6.3.2 Incapacidade de reagir à derivada do erro
Apesar do algoritmo PI eliminar o erro em estado estacionário é incapaz de reagir com base na
derivada do erro. Esta limitação é evidente na análise da figura 1.54.
Figura 1.54 – Derivada do erro.
Supondo que as duas áreas são iguais: No instante t, nas duas situações, os sinais de controlo
são iguais.
Contudo existe uma grande diferença entre as duas situações:
ü Na curva da esquerda o erro está a diminuir.
ü Na curva da direita o erro está a aumentar.
Suporte Teórico
51
1.6.4. Controlo PID
Num sistema de controlo do tipo proporcional integral derivativo (PID), cujo diagrama de
blocos é apresentado na figura 1.55. O controlador é um composto por cinco componentes: um
bloco subtractivo (responsável pela obtenção do sinal de erro), um bloco integrador (responsável
pelo cálculo do integral do sinal do erro), um bloco diferenciador (responsável pelo cálculo da
derivada do erro), um bloco somador e um bloco de ganho.
Figura 1.55 – Controlador PID.
O sinal de controlo, u(t), é definido pela seguinte expressão:
++= ∫ dt
tdeTddtteTi
teKptu )()(1)()( (eq.1.12)
O sinal de controlo depende do ganho do controlador (Kp), do valor instantâneo do sinal de
erro, do integral e da derivada desse mesmo erro afectados respectivamente dos factores de
escala (1/Ti) e Td.
Ao parâmetro Ti dá-se, como já foi referido anteriormente, o nome de constante de tempo de
integral.
Ao parâmetro Td dá-se o nome de constante de tempo derivativo.
1.6.4.1 Acção Diferencial (Análise Qualitativa)
Com o auxílio da figura 1.54 é possível fazer uma análise qualitativa da acção diferencial do
controlador PID: No instante t o sinal do erro da figura da direita está a aumentar pelo que o
controlador deve actuar rapidamente deve actuar rapidamente para obrigar o sinal de erro a
voltar a zero. Na figura da esquerda o sinal de erro está a diminuir pelo que o controlador não
deve modificar o seu comportamento.
Suporte Teórico
52
A utilização da derivada do erro na expressão do sinal de controlo permite este tipo de
compensação. O sinal de controlo possui, também uma componente proporcional à taxa de
variação do erro.
Assim, o sinal de controlo é, tal como se representa na figura 1.56 proporcional ao: valor
instantâneo do erro (P); integral do erro (I); derivada do erro (D).
Figura 1.56 – Evolução do erro num controlador PID.
Na prática não se utiliza a derivada do sinal de erro mas antes a derivada do sinal de saída. A
expressão do sinal de controlo será:
++= ∫ dt
tdyTddtteTi
teKptu )()(1)()( (eq.1.13)
Para evitar os efeitos do ruído o sinal de saída é ainda filtrado antes de ser calculada a sua
derivada.
1.6.5. PID – Implementação Computacional
Como já foi apresentado anteriormente um controlador PID possui a seguinte expressão
relacionando no domínio do tempo a entrada com a saída:
++= ∫ dt
tdeTddtteTi
teKptu )()(1)()( (eq.1.14)
É possível discretizar esta expressão de modo a implementá-la directamente num computador
digital.
1.6.5.1 Discretização da expressão do controlador
No sentido de simplificar a discretização da expressão do controlador pode separar-se a
expressão anterior em três partes:
)()()()( tdtitptu ++= (eq.1.15)
Suporte Teórico
53
onde p(t) corresponde ao termo proporcional , i(t) corresponde ao termo integral e d(t)
corresponde ao termo diferencial.
Tendo portanto:
Ø )()( teKptp ×= (eq.1.16)
Ø ∫= dtteTiKpti )()( (eq.1.17)
Ø dt
tdeTdKptd )()( ×= (eq.1.18)
Partindo do pressuposto que ∆t é o intervalo de amostragem é possível discretizar os diversos
termos de modo a implementar o algoritmo PID directamente num computador.
1.6.5.2 Termo proporcional
A discretização do termo proporcional é simples bastando para o efeito substituir e(t) pelo seu
O termo integral pode ser obtido aproximando o integral por um método trapezoidal.
Diferenciando ambos os lados da equação:
)()( teTiKp
dttdi
= (eq.1.20)
Substituindo e(t) por e(k) e aproximando a derivada por diferenciais tem-se:
)()1()( keTiKp
tkiki
=Λ
−− (eq.1.21)
Simplificando:
)()1()( keTi
tKpkiki ∆×+−= (eq.1.22)
O termo integral é deste modo facilmente implementável utilizando um método recursivo.
1.6.5.4 Termo Derivativo
Suporte Teórico
54
O termo derivativo pode de um modo semelhante ao termo integrador, ser relativamente bem
aproximado do seguinte modo:
tkekeTdKpkd
∆−−
×=)1()()( (eq.1.23)
1.6.5.5 Controlador a 3 Termos
Juntando os três termos, proporcional, integral e derivativo, vem:
tkekeTdKpke
TitKpkikeKpku
∆−−
×+∆×
+−+×=)1()()()1()()( (eq.1.24)
1.6.5.6 Problemas de ruído
A existência de um termo derivativo tende a dar relevo a componentes de ruído, uma vez que a
diferenciação de um sinal tem sempre como consequência enfatizar os termos de alta-frequência
desse mesmo sinal. Existem alguns métodos capazes de combater este problema. Um deles
será filtrar o sinal de erro com um filtro passa-baixo cuja banda de passagem inclua apenas as
frequências consideradas significativas para o desempenho do controlador. Outra solução
consiste em incluir um filtro passa-baixo no termo diferenciador.
Como comentário adicional, refira-se que os filtros passa-baixo podem ser implementados
segundo o método tradicional, com condensadores e resistências (tipo passivo) ou com
amplificadores operacionais (filtros activos) ou directamente no computador utilizando um dos
muitos métodos conhecidos do Processamento Digital de Sinal (por exemplo através de um filtro
FIR).
55
Capitulo II
2. Desenvolvimento do Hardware
Neste capítulo é abordado o processo de desenvolvimento da parte de hardware (figura 2.1),
necessário para implementar o controlo da velocidade do um motor DC bem como do código
desenvolvido para o microcontrolador.
Assim, é feita uma análise detalhada de todo o equipamento utilizado, em função das suas
características técnicas nominais, de modo a que na fase de desenvolvimento do hardware estas
características sejam respeitadas, garantindo a integridade de todo o equipamento.
Figura 2.1 – Diagrama de blocos do hardware desenvolvido.
2.1 Motor DC utilizado
O motor utilizado é um motor DC de íman permanente da “Maxon” representado na figura
2.2.
Figura 2.2 – Aspecto do Motor DC “Maxon RE36”.
As características técnicas deste motor estão representadas nas figuras 2.3 e 2.4.
Desenvolvimento do Hardware
56
Figura 2.3 – Características técnicas do motor DC RE36 da “Maxon”.
Figura 2.4 – Curva característica de funcionamento do motor RE36.
2.2 Encoder utilizado
O encoder utilizado para efectuar a leitura da velocidade do motor, foi o encoder incremental
HEDS-5540 A11 da “Hewlett Packard” como é possível visualizar na figura 2.5.
Figura 2.5 – Aspecto do encoder HEDS-5540 A11 da “Hewlett Packard”.
Desenvolvimento do Hardware
57
As características técnicas do encoder HEDS-5540 A11 são:
ü Resolução de 500 passos por volta;
ü 3 Canais de saída (2 canais em quadratura de fase + 1 canal de índex);
ü Diâmetro do veio de 4mm, adequado ao motor Maxon RE36;
ü Tensão de alimentação +5V.
As condições máximas admissíveis deste encoder estão referidas na tabela 2.1:
Parâmetro: HEDS-5540 Temperatura de funcionamento -40 a 100°C Tensão de alimentação, VCC -0,5 até 7 V Tensão de saída, Vo -0.5 a Vcc Corrente de saída por canal, Iout -1.0mA a 5mA Vibração 20g, 5 a 1000Hz Velocidade 30.000 RPM Aceleração 250.000 rad/seg2
Tabela 2.1 – Condições máximas admissíveis do encoder.
A qualidade dos sinais, provenientes dos canais do encoder mantém-se estável até uma
frequência de amostragem máxima de 100 KHz. Para frequências superiores é necessário
utilizar resistências de pull-up de 2,7 kΩ, como está representado na figura 2.6.
Figura 2.6 – Aplicação de resistências de pull-up nos canais do encoder.
2.3 Microcontrolador utilizado
O microcontrolador escolhido para implementar o controlo em malha fechada da velocidade de
rotação do motor DC foi o PIC16F876 da “Microchip”, representado na figura 2.7. Trata-se um
microcontrolador de 8 bits baseado numa EEPROM de baixo custo e alta performance. Este tipo
de microcontrolador é também denominado como RISC (Reduce Instructions Construction Set),
uma vez que possui um número de instruções limitado. Isto constitui uma vantagem uma vez
que quanto menor for o número de instruções disponíveis mais simples e mais rápida será a
Desenvolvimento do Hardware
58
compilação do código, tornando o seu funcionamento muito rápido. A dificuldade, surge na
complexidade da sua programação dado o número reduzido de instruções.
Figura 2.7 – Pinos do microcontrolador PIC16F876.
Os principais factores que contribuíram para a sua escolha foram o facto de este disponibilizar
todos os recursos necessários para a implementação do controlo da velocidade do motor,
nomeadamente:
v Frequência de relógio de 20 MHz;
v 8 K de memória de programa FLASH;
v 368 Bytes de memória de dados (RAM);
v 256 Bytes de memória EEPROM;
v 3 Temporizadores, sendo apenas um necessário para a leitura de um canal proveniente
do encoder;
v 2 Saídas de PWM, sendo apenas uma necessária para aplicar à Gate do MOSFET;
v 1 USART “Universal Synchronous Asynchronous Receiver Transmitter” necessária para
estabelecer a comunicação RS-232;
v 13 Interrupções, sendo algumas delas externas;
v 1 ADC de 10bits, com cinco canais;
v Existência de um Watchdog Timer;
v 3 Portos de I/O digitais;
v Possui apenas 35 instruções.
Desenvolvimento do Hardware
59
2.4. Esquemas eléctricos
Neste tópico são apresentados os esquemas eléctricos desenvolvidos.
2.4.1 Esquema eléctrico da placa de controlo para a aplicação industrial
Na figura 2.8, está representado o esquemático da placa responsável pelo controlo da
velocidade do motor relativo à aplicação industrial. Uma vez que a tracção de fio têxtil se vai
realizar num único sentido, não é necessário mais do que um MOSFET para a sua
implementação.
12
J1
Power
123
J2
Encoder
D1
1N4001
123
J3
Motor
10KR0
10KR1
10KR3
10KR4
10KR6
10KR5
10KR7
10KR8
10KR2
+5
RA0/AN0 2
RA1/AN1 3
RA2/AN2/VREF- 4
RA3/AN3/VREF+ 5
RA4/T0CKI 6
RA5/AN4/SS 7
RB0/INT 21
RB1 22
RB2 23
RB3/PGM 24
RB4 25
RB5 26
RB6/PGC 27
RB7/PGD 28
RC0/T1OSO/T1CKI11
RC1/T1OSI/CCP212
RC2/CCP113
RC3/SCK/SCL14
RC4/SDI/SDA15
RC5/SDO16
RC6/TX/CK17
RC7/RX/DT18
VSS8
VSS19
MCLR/VPP1
OSC1/CLKIN9
OSC2/CLKOUT10
VDD 20
U1
PIC16F876-20I/SP
+5
+5
+5
+5
D0D1D2D3D4D5D6D7
D0D1D2D3D4D5D6D7
A0A1A2
Encoder
Encoder
A0A1A2
22pFC1
22pFC2 LED1
1KR9
12345678
J5
CON8
12345
J4
CON5
A3
A3
+24VM+M-
2
1
3
Q1
MOSFET-N
1 2Y1
20MHz
100nFC0
10rR10
F1
100mA
Figura 2.8 – Esquemático da placa de controlo da velocidade do motor.
A saída de PWM do microcontrolador pode ser directamente ligada à base do MOSFET
BUZ100, de forma a controlar a velocidade do motor, uma vez que a tensão aplicada na Gate,
necessária para o MOSFET conduzir é de aproximadamente +5V, tal como pode ser verificado na
figura 2.9.
Desenvolvimento do Hardware
60
Figura 2.9 – Curva características do MOSFET (BUZ100).
Sempre que a saída de PWM apresenta um valor nulo de tensão, este valor ao ser aplicado na Gate do MOSFET irá
garantir que este não conduz, impedindo que seja aplicada tensão ao motor. Uma vez que a tensão da “Source” do N-
MOSFET é de 0V, logo a tensão Vgs (Vgs=Vg-Vs), é de 0V, impedindo o N-MOSFET de conduzir.
Quando na saída do PWM é gerado o valor de tensão +5V, e é aplicado na “Gate” do MOSFET,
como a tensão da “Source” do MOSFET é de 0V, então a tensão Vgs (Vgs=Vg-Vs) é de +5V,
colocando o MOSFET a conduzir, garantindo assim que são aplicados +24V ao motor,
colocando-o em funcionamento.
No esquema eléctrico estão definidas 4 entradas digitais, de forma a ser possível definir os 12
níveis de velocidade de rotação do motor.
Foram também incluídas 8 saídas digitais de forma disponibilizar para o PC, o valor percentual
da velocidade de rotação do motor.
Placa de circuito impresso realizada
Uma vez obtido o esquemático da placa de controlo, passou-se então à concepção da sua
placa de circuito impresso, representada na figura 2.10.
Desenvolvimento do Hardware
61
Figura 2.10 – Aspecto do PCB concebido da placa de controlo.
2.4.3 Esquema eléctrico da placa de controlo para o módulo didáctico
Na figura 2.11, está representado o esquemático eléctrico da placa para o módulo didáctico.
Este módulo tal como já referido, possibilita controlar a velocidade de rotação de um motor DC,
podendo o utilizador definir qual o valor da velocidade pretendida, o algoritmo de controlo a ser
aplicado, definir os parâmetros Kp, Ki e Kd do controlador, bem como monitorizar o valor da
velocidade de rotação e o valor em módulo do erro do sistema.
Para este módulo optou-se pela implementação do protocolo de comunicação RS232 para
interface com o computador, dado que é bastante simples de desenvolver do ponto de vista
eléctrico e bastante mais económico, devido ao reduzido número de componentes necessários
para a sua implementação.
O protocolo RS-232 foi definido com uma taxa de transferência de dados ou baud rate de
9600 bits/s, 1 start-bit, 8 bits de dados, 1 bit de paridade par e um stop-bit.
Para converter os níveis de tensão TTL (0 e +5V), utilizados pelo microcontrolador, em níveis
de tensão adequados ao protocolo RS-232 utilizou-se o componente MAX232 da MAXIM.
Desenvolvimento do Hardware
62
12
J1
12VAC
123
J2
Encoder
12
J3
Motor+5
+5
+5
+5
Encoder
Encoder
1 2Y1
20MHz22pFC4
22pFC5 LED1
+5
100nFC1
100nFC6
100nFC7
100nFC8
100nF
C9
162738495
J4
DB9
1000uF/35V
C0
Vin VoutGND
VR1
7805 100nFC2
+12
+12
F1
3
2
1
4
D1
F2
2.5A
F3
100mA
C1+1 VDD 2
C1-3
C2+4
C2-5
VEE 6
T2OUT 7
R2IN 8R2OUT9
T2IN10 T1IN11
R1OUT12 R1IN 13
T1OUT 14
GND15
VCC 16
U2
MAX232ACPE
RA0/AN0 2
RA1/AN1 3
RA2/AN2/VREF- 4
RA3/AN3/VREF+ 5
RA4/T0CKI 6
RA5/AN4/SS 7
RB0/INT 21
RB1 22
RB2 23
RB3/PGM 24
RB4 25
RB5 26
RB6/PGC 27
RB7/PGD 28
RC0/T1OSO/T1CKI11
RC1/T1OSI/CCP212
RC2/CCP113
RC3/SCK/SCL14
RC4/SDI/SDA15
RC5/SDO16
RC6/TX/CK17
RC7/RX/DT18
VSS8
VSS19
MCLR/VPP1
OSC1/CLKIN9
OSC2/CLKOUT10
VDD 20
U1
PIC16F876-20/SP
RXD
RXD
TXD
TXD
21
3Q1
1KR1
10rR2
10KR0
100nFC10
+5 Figura 2.11 – Esquemático da placa do módulo didáctico.
Placa de circuito impresso realizada
Obtido o esquema eléctrico da placa do módulo didáctico de controlo, passou-se à concepção
da sua placa de circuito impresso, representada na figura 2.12.
Figura 2.12 – Aspecto do PCB concebido da placa de controlo.
Desenvolvimento do Hardware
63
2.5. Programação do microcontrolador
Neste capítulo são identificadas e descritas as etapas consideradas necessárias para a
implementação do controlo PID digital no microcontrolador.
2.5.1 Determinação do período mínimo de amostragem
Para implementar o controlo da velocidade do motor é necessário determinar a velocidade de
rotação do mesmo.
Deste modo, numa fase inicial é necessário alimentar o motor à tensão nominal e estando este
a trabalhar sem carga, com o auxílio de um osciloscópio medir o período de um pulso
proveniente do encoder que se encontra acoplado ao veio do motor.
Neste caso, o motor “Maxon RE36” foi alimentado com uma tensão de 24VDC e analisou-se o
sinal proveniente do encoder “HEDS-5540 A11” através de um osciloscópio, a partir do qual, se
obteve a forma de onda representada na figura 2.13.
Figura 2.13 – Frequência máxima de amostragem obtida.
Tal como é possível constatar pela análise da forma de onda obtida o período de um impulso
ou passo do encoder corresponde a 20 µs.
Uma vez que se pretende definir o valor da velocidade entre 0 e 100%, para o valor máximo,
corresponde um período de amostragem de:
msss 2200020100 ==× µµ
Este será o tempo a ser considerado para o cálculo da velocidade.
Desenvolvimento do Hardware
64
2.5.2 Considerações a ter para obtenção da velocidade pretendida
Dado que o período de amostragem para o cálculo da velocidade é de 2ms, este será um dos
factores mais importantes a considerar.
Um dos objectivos deste projecto consiste em definir 12 níveis distintos de velocidade de
tracção de fio, sendo eles: 6m/min, 12m/min, 24m/min, 50m/min, 75m/min, 100m/min,
150m/min, 200m/min, 250m/min, 300m/m, 350m/min e 400m/min.
Como exemplo, para o nível de velocidade de tracção de fio igual a 6m/min é necessário
executar os seguintes cálculos:
Perímetro do rolo = diâmetror ×=×× ππ2 (eq.2.1)
Como o diâmetro do rolo de tracção de fio é igual a 3,09cm
Perímetro do rolo = m097.00309.0 =×π
Ou seja, 1 rotação do motor corresponde a 0.097m
1 Rotação _____________ 0.097m x _____________ 6m
Rotações86.61097.0
16x =×
=⇒
Sabendo que o encoder utilizado possui 500 passos e que correspondem a uma volta
completa do veio do motor, obtém-se:
1 Rotação _____________ 500 Passos
61.86 Rotações _____________ x
Passos309301
50086.61x =×
=⇒
A fórmula para o cálculo da velocidade é:
)/( smtxv
∆∆
= (eq.2.2)
Correspondendo neste caso ∆x ao número de passos do encoder e ∆t ao período de
amostragem que é 2ms. Logo, para se obter o valor da velocidade pretendida (6m/min) em (nº
de passos/2ms), tem-se:
30930 Passos _____________ 60000ms x _____________ 2ms
Passo160000
309302x ≅×
=⇒
Desenvolvimento do Hardware
65
Sendo portanto, este o valor a ser definido como velocidade de referência (“Vel_ref”), no
algoritmo de controlo.
2.5.3 Implementação do algoritmo de controlo PID
Para a implementação do controlo da velocidade do motor, foi utilizada a seguinte expressão
Typ. forward transconductance gfs = f (ID)parameter: tp = 80 µs,VDS≥2 x ID x RDS(on)max
0 10 20 30 40 A 60 ID
0
5
10
15
20
25
30
S
40
gfs
7 07/96Semiconductor Group
BUZ 100
Gate threshold voltage VGS (th) = ƒ(Tj)
parameter: VGS = VDS, ID = 1 mA
0.0
0.4
0.8
1.2
1.6
2.0
2.4
2.8
3.2
3.6
4.0
V
4.6
VGS(th)
-60 -20 20 60 100 °C 180Tj
2%
typ
98%
Drain-source on-resistance RDS (on) = ƒ(Tj)
parameter: ID = 60 A, VGS = 10 V
-60 -20 20 60 100 °C 180Tj
0.000
0.005
0.010
0.015
0.020
0.025
0.030
0.035
0.040
Ω
0.050
RDS (on)
typ
98%
Typ. capacitances
C = f (VDS)parameter:VGS = 0V, f = 1MHz
0 5 10 15 20 25 30 V 40 VDS
2 10
3 10
4 10
pF C
Ciss
Coss
Crss
Forward characteristics of reverse diode IF = ƒ(VSD)
parameter: Tj, tp = 80 µs
0 10
1 10
2 10
3 10
A
IF
0.0 0.4 0.8 1.2 1.6 2.0 2.4 V 3.0VSD
Tj = 25 °C typ
Tj = 25 °C (98%)
Tj = 175 °C typ
Tj = 175 °C (98%)
Semiconductor Group 8 07/96
BUZ 100
Avalanche energy EAS = ƒ(Tj)
parameter: ID = 60 A, VDD = 25 V
RGS = 25 Ω, L = 70 µH
20 40 60 80 100 120 140 °C 180Tj
0
20
40
60
80
100
120
140
160
180
200
220
mJ
260
EAS
Typ. gate charge VGS = ƒ(QGate)
parameter: ID puls = 90 A
0 10 20 30 40 50 60 70 80 nC 100QGate
0
2
4
6
8
10
12
V
16
VGS
DS maxV0,8
DS maxV0,2
Drain-source breakdown voltage V(BR)DSS = ƒ(Tj)
-60 -20 20 60 100 °C 180Tj
47 48
49
50
51
52
53
54
55
56
57
58
59
60
V
62
V(BR)DSS
Semiconductor Group 9 07/96
BUZ 100
Package OutlinesTO-220 ABDimension in mm
maxon motormaxon motor control Encoder HEDS 550_Technical Documentation April 2000 edition
H
Quick AssemblyTwo and Three Channel OpticalEncoders
Technical Data
Features• Two Channel Quadrature
Output with Optional IndexPulse
• Quick and Easy Assembly• No Signal Adjustment
Required• External Mounting Ears
Available• Low Cost• Resolutions Up to 1024
Counts Per Revolution• Small Size• -40°C to 100°C Operating
Temperature• TTL Compatible• Single 5 V Supply
DescriptionThe HEDS-5500/5540, HEDS-5600/5640, and HEDM-5500/5600 are high performance, lowcost, two and three channeloptical incremental encoders.These encoders emphasize highreliability, high resolution, andeasy assembly.
Each encoder contains a lensedLED source, an integrated circuit
with detectors and outputcircuitry, and a codewheel whichrotates between the emitter anddetector IC. The outputs of theHEDS-5500/5600 and HEDM-5500/ 5600 are two square wavesin quadrature. The HEDS-5540and 5640 also have a third chan-nel index output in addition to thetwo channel quadrature. Thisindex output is a 90 electricaldegree, high true index pulsewhich is generated once for eachfull rotation of the codewheel.
The HEDS series utilizes metalcodewheels, while the HEDMseries utilizes a film codewheelallowing for resolutions to 1024CPR. The HEDM series is nontavailable with a third channelindex.
These encoders may be quicklyand easily mounted to a motor.For larger diameter motors, theHEDM-5600, and HEDS-5600/5640 feature external mountingears.
The quadrature signals and theindex pulse are accessed through
five 0.025 inch square pinslocated on 0.1 inch centers.
Standard resolutions between 96and 1024 counts per revolutionare presently available. Consultlocal Hewlett-Packard sales repre-sentatives for other resolutions.
ApplicationsThe HEDS-5500, 5540, 5600,5640, and the HEDM-5500, 5600provide motion detection at a lowcost, making them ideal for highvolume applications. Typicalapplications include printers,plotters, tape drives, positioningtables, and automatic handlers.
HEDM-550X/560XHEDS-550X/554XHEDS-560X/564X
ESD WARNING: NORMAL HANDLING PRECAUTIONS SHOULB BE TAKEN TO AVOID STATIC DISCHARGE
The latest edition of these operating instructions may also be found in the internet under:http://www.maxonmotor.com/Service&Support/Downloads/Tacho.htmalso refer to: http://www.semiconductor.agilent.com/motion/hedm550x.html
April 2000 edition / subject to change maxon motor control 3
Theory of OperationThe HEDS-5500, 5540, 5600,5640, and HEDM-5500, 5600translate the rotary motion of ashaft into either a two- or a three-channel digital output.
As seen in the block diagram,these encoders contain a singleLight Emitting Diode (LED) as itslight source. The light iscollimated into a parallel beam bymeans of a single polycarbonatelens located directly over theLED. Opposite the emitter is theintegrated detector circuit. ThisIC consists of multiple sets ofphotodetectors and the signalprocessing circuitry necessary toproduce the digital waveforms.
The codewheel rotates betweenthe emitter and detector, causingthe light beam to be interruptedby the pattern of spaces and barson the codewheel. Thephotodiodes which detect theseinterruptions are arranged in apattern that corresponds to theradius and design of thecodewheel. These detectors arealso spaced such that a lightperiod on one pair of detectorscorresponds to a dark period onthe adjacent pair of detectors. Thephotodiode outputs are then fedthrough the signal processingcircuitry resulting in A, A, B and B(also I and I in the HEDS-5540and 5640). Comparators receivethese signals and produce thefinal outputs for channels A andB. Due to this integrated phasingtechnique, the digital output ofchannel A is in quadrature withthat of channel B (90 degrees outof phase).
In the HEDS-5540 and 5640, theoutput of the comparator for Iand I is sent to the indexprocessing circuitry along withthe outputs of channels A and B.
Block Diagram
revolution.
Pulse Width (P): The number ofelectrical degrees that an outputis high during 1 cycle. This valueis nominally 180°e or 1/2 cycle.
Pulse Width Error ( ∆P): Thedeviation, in electrical degrees, ofthe pulse width from its idealvalue of 180°e.
State Width (S): The number ofelectrical degrees between atransition in the output of channelA and the neighboring transitionin the output of channel B. Thereare 4 states per cycle, eachnominally 90°e.
State Width Error ( ∆S): Thedeviation, in electrical degrees, ofeach state width from its idealvalue of 90°e.
Phase (φ): The number ofelectrical degrees between thecenter of the high state of channelA and the center of the high stateof channel B. This value isnominally 90°e for quadratureoutput.
Phase Error (∆φ): The deviationof the phase from its ideal valueof 90°e.
The final output of channel I is anindex pulse PO which is generatedonce for each full rotation of thecodewheel. This output PO is aone state width (nominally 90electrical degrees), high trueindex pulse which is coincidentwith the low states of channels Aand B.
DefinitionsCount (N): The number of barand window pairs or counts perrevolution (CPR) of thecodewheel.
One Cycle (C): 360 electricaldegrees (°e), 1 bar and windowpair.
One Shaft Rotation: 360mechanical degrees, N cycles.
Position Error ( ∆Θ): Thenormalized angular differencebetween the actual shaft positionand the position indicated by theencoder cycle count.
Cycle Error (∆C): An indicationof cycle uniformity. The differ-ence between an observed shaftangle which gives rise to oneelectrical cycle, and the nominalangular increment of 1/N of a
4 maxon motor control April 2000 edition / subject to change
MO
TIO
N S
ENSI
NG
AN
D C
ON
TRO
L
Absolute Maximum Ratings
Parameter HEDS-55XX/56XX HEDM-550X/560X
Storage Temperature, TS -40°C to 100°C -40°C to +70°COperating Temperature, TA -40°C to 100°C -40°C to +70°CSupply Voltage, VCC -0.5 V to 7 V -0.5 V to 7 V
Output Voltage, VO -0.5 V to VCC -0.5 V to VCC
Output Current per Channel, IOUT -1.0 mA to 5 mA -1.0 mA to 5 mA
Vibration 20 g, 5 to 1000 Hz 20 g, 5 to 1000 Hz
Shaft Axial Play ± 0.25 mm (± 0.010 in.) ± 0.175 mm (± 0.007 in.)
Shaft Eccentricity Plus Radial Play 0.1 mm (0.004 in.) TIR 0.04 mm (0.0015 in.) TIR
Velocity 30,000 RPM 30,000 RPM
Acceleration 250,000 rad/sec2 250,000 rad/sec2
Output WaveformsDirection of Rotation: When thecodewheel rotates in the counter-clockwise direction (as viewedfrom the encoder end of themotor), channel A will leadchannel B. If the codewheelrotates in the clockwise direction,channel B will lead channel A.
Index Pulse Width (PO): Thenumber of electrical degrees thatan index output is high duringone full shaft rotation. This valueis nominally 90°e or 1/4 cycle.
CH. I rise after -25°C to +100°C t1 10 100 250 nsCH. A or CH. B fall -40°C to +100°C t1 -300 100 250 ns
CH. I fall after -25°C to +100°C t2 70 150 300 nsCH. B or CH. A rise -40°C to +100°C t2 70 150 1000 ns
Note: See Mechanical Characteristics for mounting tolerances.*Typical values specified at VCC = 5.0 V and 25°C.
Encoding CharacteristicsEncoding Characteristics over Recommended Operating Range and Recommended Mounting Tolerancesunless otherwise specified. Values are for the worst error over the full rotation.
6 maxon motor control April 2000 edition / subject to change
MO
TIO
N S
ENSI
NG
AN
D C
ON
TRO
L
Electrical CharacteristicsElectrical Characteristics over Recommended Operating Range.
Part No. Parameter Sym. Min. Typ.* Max. Units Notes
HEDS-5500 Supply Current ICC 17 40 mAHEDS-5600 High Level Output Voltage VOH 2.4 V IOH = -40 µA max.
Low Level Output Voltage VOL 0.4 V IOL = 3.2 mA
Rise Time tr 200 ns CL = 25 pFFall Time tf 50 ns RL = 11 kΩ pull-up
HEDS-5540 Supply Current ICC 30 57 85 mAHEDS-5640 High Level Output Voltage VOH 2.4 V IOH = -200 µA max.HEDM-5500 Low Level Output Voltage VOL 0.4 V IOL = 3.86 mA
Rise Time tr 180 ns CL = 25 pFFall Time tf 40 ns RL = 2.7 kΩ pull-up
HEDM-5500 Supply Current ICC 30 57 85 mAHEDM-5600 High Level Output Voltage VOH 2.4 V IOH = -40 µA max.
Low Level Output Voltage VOL 0.4 V IOL = 3.86 mA
Rise Time tr 180 ns CL = 25 pFFall Time tf 40 ns RL = 3.2 kΩ pull-up
*Typical values specified at VCC = 5.0 V and 25°C.
April 2000 edition / subject to change maxon motor control 7
Electrical InterfaceTo insure reliable encodingperformance, the HEDS-5540 and5640 three channel encodersrequire 2.7 kΩ (± 10%) pull-upresistors on output pins 2, 3, and5 (Channels I, A, and B) as shownin Figure 1. These pull-upresistors should be located as
close to the encoder as possible(within 4 feet). Each of the threeencoder outputs can drive a singleTTL load in this configuration.
The HEDS-5500, 5600, andHEDM-5500, 5600 two channelencoders do not normally requirepull-up resistors. However, 3.2 kΩ
pull-up resistors on output pins 3and 5 (Channels A and B) arerecommended to improve risetimes, especially when operatingabove 100 kHz frequencies.
Mounting Screw Size[4] 2 screwmounting M 2.5 or (2-56) mm (in.)
3 screwmounting M 1.6 or (0-80) mm (in.)
externalmounting ears M 2.5 or (2-56) mm (in.)
Encoder Base Plate 0.33 (0.130) mm (in.)Thickness
Hub Set Screw (2-56) (in.)
Notes:1. These are tolerances required of the user.2. The HEDS-55X5 and 56X5, HEDM-5505, 5605 provide an 8.9 mm (0.35 inch) diameter hole through the housing for longer motorshafts. See Ordering Information.3. The HEDS-5540 and 5640 must be aligned using the aligning pins as specified in Figure 3, or using the alignment tool as shown in“Encoder Mounting and Assembly”. See also “Mounting Considerations.”4. The recommended mounting screw torque for 2 screw and external ear mounting is 1.0 kg-cm (0.88 in-lbs). The recommendedmounting screw torque for 3 screw mounting is 0.50 kg-cm (0.43 in-lbs).
8 maxon motor control April 2000 edition / subject to change
MO
TIO
N S
ENSI
NG
AN
D C
ON
TRO
L
Mounting ConsiderationsThe HEDS-5540 and 5640 threechannel encoders and the HEDMSeries high resolution encodersmust be aligned using the aligningpins as specified in Figure 3, orusing the HEDS-8910 AlignmentTool as shown in EncoderMounting and Assembly.
The use of aligning pins oralignment tool is recommendedbut not required to mount theHEDS-5500 and 5600. If these
two channel encoders areattached to a motor with the screwsizes and mounting tolerancesspecified in the mechanicalcharacteristics section withoutany additional mounting bosses,the encoder output errors will bewithin the maximums specified inthe encoding characteristicssection.
The HEDS-5500 and 5540 can bemounted to a motor using eitherthe two screw or three screw
mounting option as shown inFigure 2. The optional aligningpins shown in Figure 3 can beused with either mounting option.
The HEDS-5600, 5640, andHEDM-5600 have externalmounting ears which may be usedfor mounting to larger motor baseplates. Figure 4 shows thenecessary mounting holes withoptional aligning pins and motorboss.
Figure 1. Pull-up Resistors on HEDS-5X40 Encoder Outputs.
10 maxon motor control April 2000 edition / subject to change
MO
TIO
N S
ENSI
NG
AN
D C
ON
TRO
L
3a. Push the hex wrench into the body of the encoder toensure that it is properly seated into the code wheel hub setscrews. Then apply a downward force on the end of the hexwrench. This sets the code wheel gap by levering the codewheel hub to its upper position.
3b. While continuing to apply a downward force, rotate thehex wrench in the clockwise direction until the hub setscrew is tight against the motor shaft. The hub set screwattaches the code wheel to the motor's shaft.
3c. Remove the hex wrench by pulling it straight out of theencoder body.
4. Use the center screwdriver slot, or either of the two sideslots, to rotate the encoder cap dot clockwise from the onedot position to the two dot position. Do not rotate theencoder cap counterclockwise beyond the one dot position.
The encoder is ready for use!
Encoder Mounting and Assembly
1. For HEDS-5500 and 5600: Mount encoder base plate ontomotor. Tighten screws. Go on to step 2.
1a. For HEDS-5540, 5640 and HEDM-5500, 5600: Slipalignment tool onto motor shaft. With alignment tool inplace, mount encoder baseplate onto motor as shown above.Tighten screws. Remove alignment tool.
2. Snap encoder body onto base plate locking all 4 snaps.
General DescriptionThe LM78XX series of three terminal regulators is available
with several fixed output voltages making them useful in a
wide range of applications. One of these is local on card
regulation, eliminating the distribution problems associated
with single point regulation. The voltages available allow
these regulators to be used in logic systems, instrumenta-
tion, HiFi, and other solid state electronic equipment. Al-
though designed primarily as fixed voltage regulators these
devices can be used with external components to obtain
adjustable voltages and currents.
The LM78XX series is available in an aluminum TO-3 pack-
age which will allow over 1.0A load current if adequate heat
sinking is provided. Current limiting is included to limit the
peak output current to a safe value. Safe area protection for
the output transistor is provided to limit internal power dissi-
pation. If internal power dissipation becomes too high for
the heat sinking provided, the thermal shutdown circuit
takes over preventing the IC from overheating.
Considerable effort was expanded to make the LM78XX se-
ries of regulators easy to use and mininize the number
of external components. It is not necessary to bypass the
output, although this does improve transient response. Input
bypassing is needed only if the regulator is located far from
the filter capacitor of the power supply.
For output voltage other than 5V, 12V and 15V the LM117
series provides an output voltage range from 1.2V to 57V.
FeaturesY Output current in excess of 1AY Internal thermal overload protectionY No external components requiredY Output transistor safe area protectionY Internal short circuit current limitY Available in the aluminum TO-3 package
Voltage RangeLM7805C 5V
LM7812C 12V
LM7815C 15V
Schematic and Connection Diagrams
TL/H/7746–1
Metal Can Package
TO-3 (K)
Aluminum
TL/H/7746–2
Bottom View
Order Number LM7805CK,
LM7812CK or LM7815CK
See NS Package Number KC02A
Plastic Package
TO-220 (T)
TL/H/7746–3
Top View
Order Number LM7805CT,
LM7812CT or LM7815CT
See NS Package Number T03B
C1995 National Semiconductor Corporation RRD-B30M115/Printed in U. S. A.
Absolute Maximum RatingsIf Military/Aerospace specified devices are required,
please contact the National Semiconductor Sales
Office/Distributors for availability and specifications.
Input Voltage (VO e 5V, 12V and 15V) 35V
Internal Power Dissipation (Note 1) Internally Limited
Operating Temperature Range (TA) 0§C to a70§C
Maximum Junction Temperature
(K Package) 150§C(T Package) 150§C
Storage Temperature Range b65§C to a150§CLead Temperature (Soldering, 10 sec.)
TO-3 Package K 300§CTO-220 Package T 230§C
Electrical Characteristics LM78XXC (Note 2) 0§C s Tj s 125§C unless otherwise noted.
Output Voltage 5V 12V 15V
Input Voltage (unless otherwise noted) 10V 19V 23V Units
Symbol Parameter Conditions Min Typ Max Min Typ Max Min Typ Max
VO Output Voltage Tj e 25§C, 5 mA s IO s 1A 4.8 5 5.2 11.5 12 12.5 14.4 15 15.6 V
PD s 15W, 5 mA s IO s 1A 4.75 5.25 11.4 12.6 14.25 15.75 V
VMIN s VIN s VMAX (7.5 s VIN s 20) (14.5 s VIN s 27) (17.5 s VIN s 30) V
DVO Line Regulation IO e 500 mA Tj e 25§C 3 50 4 120 4 150 mV
DVIN (7 s VIN s 25) 14.5 s VIN s 30) (17.5 s VIN s 30) V
0§C s Tj s a125§C 50 120 150 mV
DVIN (8 s VIN s 20) (15 s VIN s 27) (18.5 s VIN s 30) V
IO s 1A Tj e 25§C 50 120 150 mV
DVIN (7.5 s VIN s 20) (14.6 s VIN s 27) (17.7 s VIN s 30) V
0§C s Tj s a125§C 25 60 75 mV
DVIN (8 s VIN s 12) (16 s VIN s 22) (20 s VIN s 26) V
DVO Load Regulation Tj e 25§C 5 mA s IO s 1.5A 10 50 12 120 12 150 mV
250 mA s IO s 750 mA 25 60 75 mV
5 mA s IO s 1A, 0§C s Tj s a125§C 50 120 150 mV
IQ Quiescent Current IO s 1A Tj e 25§C 8 8 8 mA
0§C s Tj s a125§C 8.5 8.5 8.5 mA
DIQ Quiescent Current 5 mA s IO s 1A 0.5 0.5 0.5 mA
ChangeTj e 25§C, IO s 1A 1.0 1.0 1.0 mA
VMIN s VIN s VMAX (7.5 s VIN s 20) (14.8 s VINs 27) (17.9 s VIN s 30) V
IO s 500 mA, 0§C s Tj s a125§C 1.0 1.0 1.0 mA
VMIN s VIN s VMAX (7 s VIN s 25) (14.5 s VINs 30) (17.5 s VIN s 30) V
VN Output Noise Voltage TA e25§C, 10 Hz s f s 100 kHz 40 75 90 mV
DVIN
DVOUT
Ripple Rejection IO s 1A, Tj e 25§C or 62 80 55 72 54 70 dB
f e 120 Hz IO s 500 mA 62 55 54 dBÐ 0§C s Tj s a125§CVMIN s VIN s VMAX (8 s VIN s 18) (15 s VIN s 25) (18.5 s VIN s 28.5) V
RO Dropout Voltage Tj e 25§C, IOUT e 1A 2.0 2.0 2.0 V
Output Resistance f e 1 kHz 8 18 19 mX
Short-Circuit Current Tj e 25§C 2.1 1.5 1.2 A
Peak Output Current Tj e 25§C 2.4 2.4 2.4 A
Average TC of VOUT 0§C s Tj s a125§C, IO e 5 mA 0.6 1.5 1.8 mV/§C
VIN Input Voltage
Required to Maintain Tj e 25§C, IO s 1A 7.5 14.6 17.7 V
Line Regulation
Note 1: Thermal resistance of the TO-3 package (K, KC) is typically 4§C/W junction to case and 35§C/W case to ambient. Thermal resistance of the TO-220
package (T) is typically 4§C/W junction to case and 50§C/W case to ambient.
Note 2: All characteristics are measured with capacitor across the input of 0.22 mF, and a capacitor across the output of 0.1mF. All characteristics except noise
voltage and ripple rejection ratio are measured using pulse techniques (tw s 10 ms, duty cycle s 5%). Output voltage changes due to changes in internal
temperature must be taken into account separately.
2
Typical Performance Characteristics
Dissipation
Maximum Average Power
Dissipation
Maximum Average Power
Peak Output Current
to 1V at Tj e 25§C)
Output Voltage (Normalized
Ripple Rejection Ripple Rejection
Output Impedance Dropout Voltage Dropout Characteristics
NATIONAL’S PRODUCTS ARE NOT AUTHORIZED FOR USE AS CRITICAL COMPONENTS IN LIFE SUPPORT
DEVICES OR SYSTEMS WITHOUT THE EXPRESS WRITTEN APPROVAL OF THE PRESIDENT OF NATIONAL
SEMICONDUCTOR CORPORATION. As used herein:
1. Life support devices or systems are devices or 2. A critical component is any component of a life
systems which, (a) are intended for surgical implant support device or system whose failure to perform can
into the body, or (b) support or sustain life, and whose be reasonably expected to cause the failure of the life
failure to perform, when properly used in accordance support device or system, or to affect its safety or
with instructions for use provided in the labeling, can effectiveness.
be reasonably expected to result in a significant injury
to the user.
National Semiconductor National Semiconductor National Semiconductor National SemiconductorCorporation Europe Hong Kong Ltd. Japan Ltd.1111 West Bardin Road Fax: (a49) 0-180-530 85 86 13th Floor, Straight Block, Tel: 81-043-299-2309Arlington, TX 76017 Email: cnjwge@ tevm2.nsc.com Ocean Centre, 5 Canton Rd. Fax: 81-043-299-2408Tel: 1(800) 272-9959 Deutsch Tel: (a49) 0-180-530 85 85 Tsimshatsui, KowloonFax: 1(800) 737-7018 English Tel: (a49) 0-180-532 78 32 Hong Kong
National does not assume any responsibility for use of any circuitry described, no circuit patent licenses are implied and National reserves the right at any time without notice to change said circuitry and specifications.
General DescriptionThe MAX220–MAX249 family of line drivers/receivers isintended for all EIA/TIA-232E and V.28/V.24 communica-tions interfaces, particularly applications where ±12V isnot available. These parts are especially useful in battery-powered sys-tems, since their low-power shutdown mode reducespower dissipation to less than 5µW. The MAX225,MAX233, MAX235, and MAX245/MAX246/MAX247 useno external components and are recommended for appli-cations where printed circuit board space is critical.
____________________________FeaturesSuperior to Bipolar♦ Operate from Single +5V Power Supply
(+5V and +12V—MAX231/MAX239)♦ Low-Power Receive Mode in Shutdown
(MAX223/MAX242)♦ Meet All EIA/TIA-232E and V.28 Specifications♦ Multiple Drivers and Receivers♦ 3-State Driver and Receiver Outputs♦ Open-Line Detection (MAX243)
Ordering Information
Ordering Information continued at end of data sheet.*Contact factory for dice specifications.
Note 1: Input voltage measured with TOUT in high-impedance state, SHDN or VCC = 0V.Note 2: For the MAX220, V+ and V- can have a maximum magnitude of 7V, but their absolute difference cannot exceed 13V.Stresses beyond those listed under “Absolute Maximum Ratings” may cause permanent damage to the device. These are stress ratings only, and functionaloperation of the device at these or any other conditions beyond those indicated in the operational sections of the specifications is not implied. Exposure toabsolute maximum rating conditions for extended periods may affect device reliability.
Supply Voltage (VCC) ...............................................-0.3V to +6VInput VoltagesTIN..............................................................-0.3V to (VCC - 0.3V)RIN (Except MAX220) ........................................................±30VRIN (MAX220).....................................................................±25VTOUT (Except MAX220) (Note 1) .......................................±15VTOUT (MAX220)...............................................................±13.2V
Output VoltagesTOUT...................................................................................±15VROUT.........................................................-0.3V to (VCC + 0.3V)
Driver/Receiver Output Short Circuited to GND.........ContinuousContinuous Power Dissipation (TA = +70°C)16-Pin Plastic DIP (derate 10.53mW/°C above +70°C)....842mW18-Pin Plastic DIP (derate 11.11mW/°C above +70°C)....889mW
VCC...........................................................................-0.3V to +6VV+................................................................(VCC - 0.3V) to +14VV- ............................................................................+0.3V to -14VInput VoltagesTIN ............................................................-0.3V to (VCC + 0.3V)RIN......................................................................................±30V
Output VoltagesTOUT ...................................................(V+ + 0.3V) to (V- - 0.3V)ROUT.........................................................-0.3V to (VCC + 0.3V)
Operating Temperature RangesMAX2 _ _ C _ _......................................................0°C to +70°CMAX2 _ _ E _ _ ...................................................-40°C to +85°CMAX2 _ _ M _ _ ...............................................-55°C to +125°C
Storage Temperature Range .............................-65°C to +160°CLead Temperature (soldering, 10sec) .............................+300°C
Stresses beyond those listed under “Absolute Maximum Ratings” may cause permanent damage to the device. These are stress ratings only, and functionaloperation of the device at these or any other conditions beyond those indicated in the operational sections of the specifications is not implied. Exposure toabsolute maximum rating conditions for extended periods may affect device reliability.
CONDITIONS MIN TYP MAX UNITS
Output Voltage Swing All transmitter outputs loaded with 3kΩ to ground ±5.0 ±7.3 V
Note 4: Input voltage measured with transmitter output in a high-impedance state, shutdown, or VCC = 0V.Stresses beyond those listed under “Absolute Maximum Ratings” may cause permanent damage to the device. These are stress ratings only, and functionaloperation of the device at these or any other conditions beyond those indicated in the operational sections of the specifications is not implied. Exposure toabsolute maximum rating conditions for extended periods may affect device reliability.
Supply Voltage (VCC) ...............................................-0.3V to +6VInput VoltagesTIN‚ ENA, ENB, ENR, ENT, ENRA,ENRB, ENTA, ENTB..................................-0.3V to (VCC + 0.3V)RIN .....................................................................................±25VTOUT (Note 3).....................................................................±15VROUT ........................................................-0.3V to (VCC + 0.3V)
Short Circuit (one output at a time)TOUT to GND............................................................ContinuousROUT to GND............................................................Continuous
Operating Temperature RangesMAX225C_ _, MAX24_C_ _ ..................................0°C to +70°CMAX225E_ _, MAX24_E_ _ ...............................-40°C to +85°C
Storage Temperature Range .............................-65°C to +160°CLead Temperature (soldering,10sec) ..............................+300°C
Note 5: The 300Ω minimum specification complies with EIA/TIA-232E, but the actual resistance when in shutdown mode or VCC =0V is 10MΩ as is implied by the leakage specification.
0 0 0 0 Normal Operation All Active All Active All Active All Active
0 0 0 1 Normal Operation All Active All Active All ActiveAll 3-State, exceptRB5 stays active onMAX247
0 0 1 0 Normal Operation All Active All Active All 3-State All Active
0 0 1 1 Normal Operation All Active All Active All 3-StateAll 3-State, exceptRB5 stays active onMAX247
0 1 0 0 Normal Operation All Active All 3-State All Active All Active
0 1 0 1 Normal Operation All Active All 3-State All ActiveAll 3-State, exceptRB5 stays active onMAX247
0 1 1 0 Normal Operation All Active All 3-State All 3-State All Active
0 1 1 1 Normal Operation All Active All 3-State All 3-StateAll 3-State, exceptRB5 stays active onMAX247
1 0 0 0 Normal Operation All 3-State All Active All Active All Active
1 0 0 1 Normal Operation All 3-State All Active All ActiveAll 3-State, exceptRB5 stays active onMAX247
1 0 1 0 Normal Operation All 3-State All Active All 3-State All Active
1 0 1 1 Normal Operation All 3-State All Active All 3-StateAll 3-State, exceptRB5 stays active onMAX247
1 1 0 0 Shutdown All 3-State All 3-StateLow-PowerReceive Mode
Low-PowerReceive Mode
1 1 0 1 Shutdown All 3-State All 3-StateLow-PowerReceive Mode
All 3-State, exceptRB5 stays active onMAX247
1 1 1 0 Shutdown All 3-State All 3-State All 3-StateLow-PowerReceive Mode
1 1 1 1 Shutdown All 3-State All 3-State All 3-StateAll 3-State, exceptRB5 stays active onMAX247
Table 1d. MAX247/MAX248/MAX249 Control Pin Configurations
MAX248OPERATION
STATUSENRBMAX247 TA1–TA4 TB1–TB4 RA1–RA4 RB1–RB5
TRANSMITTERS
ENRAENTBENTA
MAX249 TA1–TA3 TB1–TB3 RA1–RA5 RB1–RB5
RECEIVERS
MA
X2
20
–MA
X2
49 _______________Detailed Description
The MAX220–MAX249 contain four sections: dualcharge-pump DC-DC voltage converters, RS-232 dri-vers, RS-232 receivers, and receiver and transmitterenable control inputs.
Dual Charge-Pump Voltage ConverterThe MAX220–MAX249 have two internal charge-pumpsthat convert +5V to ±10V (unloaded) for RS-232 driveroperation. The first converter uses capacitor C1 to dou-ble the +5V input to +10V on C3 at the V+ output. Thesecond converter uses capacitor C2 to invert +10V to -10V on C4 at the V- output.
A small amount of power may be drawn from the +10V(V+) and -10V (V-) outputs to power external circuitry(see the Typical Operating Characteristics section),except on the MAX225 and MAX245–MAX247, wherethese pins are not available. V+ and V- are not regulated,so the output voltage drops with increasing load current.Do not load V+ and V- to a point that violates the mini-mum ±5V EIA/TIA-232E driver output voltage whensourcing current from V+ and V- to external circuitry.
When using the shutdown feature in the MAX222,MAX225, MAX230, MAX235, MAX236, MAX240,MAX241, and MAX245–MAX249, avoid using V+ and V-to power external circuitry. When these parts are shutdown, V- falls to 0V, and V+ falls to +5V. For applica-tions where a +10V external supply is applied to the V+pin (instead of using the internal charge pump to gen-erate +10V), the C1 capacitor must not be installed andthe SHDN pin must be tied to VCC. This is because V+is internally connected to VCC in shutdown mode.
RS-232 DriversThe typical driver output voltage swing is ±8V whenloaded with a nominal 5kΩ RS-232 receiver and VCC =+5V. Output swing is guaranteed to meet the EIA/TIA-232E and V.28 specification, which calls for ±5V mini-mum driver output levels under worst-case conditions.These include a minimum 3kΩ load, VCC = +4.5V, andmaximum operating temperature. Unloaded driver out-put voltage ranges from (V+ -1.3V) to (V- +0.5V).
Input thresholds are both TTL and CMOS compatible.The inputs of unused drivers can be left unconnectedsince 400kΩ input pull-up resistors to VCC are built in(except for the MAX220). The pull-up resistors force theoutputs of unused drivers low because all drivers invert.The internal input pull-up resistors typically source 12µA,except in shutdown mode where the pull-ups are dis-abled. Driver outputs turn off and enter a high-imped-ance state—where leakage current is typicallymicroamperes (maximum 25µA)—when in shutdown
mode, in three-state mode, or when device power isremoved. Outputs can be driven to ±15V. The power-supply current typically drops to 8µA in shutdown mode.The MAX220 does not have pull-up resistors to force theoutputs of the unused drivers low. Connect unusedinputs to GND or VCC.
The MAX239 has a receiver three-state control line, andthe MAX223, MAX225, MAX235, MAX236, MAX240,and MAX241 have both a receiver three-state controlline and a low-power shutdown control. Table 2 showsthe effects of the shutdown control and receiver three-state control on the receiver outputs.
The receiver TTL/CMOS outputs are in a high-imped-ance, three-state mode whenever the three-state enableline is high (for the MAX225/MAX235/MAX236/MAX239–MAX241), and are also high-impedance whenever theshutdown control line is high.
When in low-power shutdown mode, the driver outputsare turned off and their leakage current is less than 1µAwith the driver output pulled to ground. The driver outputleakage remains less than 1µA, even if the transmitteroutput is backdriven between 0V and (VCC + 6V). Below-0.5V, the transmitter is diode clamped to ground with1kΩ series impedance. The transmitter is also zenerclamped to approximately VCC + 6V, with a seriesimpedance of 1kΩ.
The driver output slew rate is limited to less than 30V/µsas required by the EIA/TIA-232E and V.28 specifica-tions. Typical slew rates are 24V/µs unloaded and10V/µs loaded with 3Ω and 2500pF.
RS-232 ReceiversEIA/TIA-232E and V.28 specifications define a voltagelevel greater than 3V as a logic 0, so all receivers invert.Input thresholds are set at 0.8V and 2.4V, so receiversrespond to TTL level inputs as well as EIA/TIA-232E andV.28 levels.
The receiver inputs withstand an input overvoltage upto ±25V and provide input terminating resistors with
nominal 5kΩ values. The receivers implement Type 1interpretation of the fault conditions of V.28 andEIA/TIA-232E.
The receiver input hysteresis is typically 0.5V with aguaranteed minimum of 0.2V. This produces clear out-put transitions with slow-moving input signals, evenwith moderate amounts of noise and ringing. Thereceiver propagation delay is typically 600ns and isindependent of input swing direction.
Low-Power Receive ModeThe low-power receive-mode feature of the MAX223,MAX242, and MAX245–MAX249 puts the IC into shut-down mode but still allows it to receive information. Thisis important for applications where systems are periodi-cally awakened to look for activity. Using low-powerreceive mode, the system can still receive a signal thatwill activate it on command and prepare it for communi-cation at faster data rates. This operation conservessystem power.
Negative Threshold—MAX243The MAX243 is pin compatible with the MAX232A, differ-ing only in that RS-232 cable fault protection is removedon one of the two receiver inputs. This means that controllines such as CTS and RTS can either be driven or leftfloating without interrupting communication. Differentcables are not needed to interface with different pieces ofequipment.
The input threshold of the receiver without cable faultprotection is -0.8V rather than +1.4V. Its output goespositive only if the input is connected to a control linethat is actively driven negative. If not driven, it defaultsto the 0 or “OK to send” state. Normally‚ the MAX243’sother receiver (+1.4V threshold) is used for the data line(TD or RD)‚ while the negative threshold receiver is con-nected to the control line (DTR‚ DTS‚ CTS‚ RTS, etc.).
Other members of the RS-232 family implement theoptional cable fault protection as specified by EIA/TIA-232E specifications. This means a receiver output goeshigh whenever its input is driven negative‚ left floating‚or shorted to ground. The high output tells the serialcommunications IC to stop sending data. To avoid this‚the control lines must either be driven or connectedwith jumpers to an appropriate positive voltage level.
Shutdown—MAX222–MAX242On the MAX222‚ MAX235‚ MAX236‚ MAX240‚ andMAX241‚ all receivers are disabled during shutdown.On the MAX223 and MAX242‚ two receivers continue tooperate in a reduced power mode when the chip is inshutdown. Under these conditions‚ the propagationdelay increases to about 2.5µs for a high-to-low inputtransition. When in shutdown, the receiver acts as aCMOS inverter with no hysteresis. The MAX223 andMAX242 also have a receiver output enable input (ENfor the MAX242 and EN for the MAX223) that allowsreceiver output control independent of SHDN (SHDNfor MAX241). With all other devices‚ SHDN (SHDN forMAX241) also disables the receiver outputs.
The MAX225 provides five transmitters and fivereceivers‚ while the MAX245 provides ten receivers andeight transmitters. Both devices have separate receiverand transmitter-enable controls. The charge pumpsturn off and the devices shut down when a logic high isapplied to the ENT input. In this state, the supply cur-rent drops to less than 25µA and the receivers continueto operate in a low-power receive mode. Driver outputsenter a high-impedance state (three-state mode). Onthe MAX225‚ all five receivers are controlled by theENR input. On the MAX245‚ eight of the receiver out-puts are controlled by the ENR input‚ while the remain-ing two receivers (RA5 and RB5) are always active.RA1–RA4 and RB1–RB4 are put in a three-state modewhen ENR is a logic high.
Receiver and Transmitter Enable Control Inputs
The MAX225 and MAX245–MAX249 feature transmitterand receiver enable controls.
The receivers have three modes of operation: full-speedreceive (normal active)‚ three-state (disabled)‚ and low-power receive (enabled receivers continue to functionat lower data rates). The receiver enable inputs controlthe full-speed receive and three-state modes. Thetransmitters have two modes of operation: full-speedtransmit (normal active) and three-state (disabled). Thetransmitter enable inputs also control the shutdownmode. The device enters shutdown mode when alltransmitters are disabled. Enabled receivers function inthe low-power receive mode when in shutdown.
MA
X2
20
–MA
X2
49 Tables 1a–1d define the control states. The MAX244
has no control pins and is not included in these tables.
The MAX246 has ten receivers and eight drivers withtwo control pins, each controlling one side of thedevice. A logic high at the A-side control input (ENA)causes the four A-side receivers and drivers to go intoa three-state mode. Similarly, the B-side control input(ENB) causes the four B-side drivers and receivers togo into a three-state mode. As in the MAX245, one A-side and one B-side receiver (RA5 and RB5) remainactive at all times. The entire device is put into shut-down mode when both the A and B sides are disabled(ENA = ENB = +5V).
The MAX247 provides nine receivers and eight driverswith four control pins. The ENRA and ENRB receiverenable inputs each control four receiver outputs. TheENTA and ENTB transmitter enable inputs each controlfour drivers. The ninth receiver (RB5) is always active.The device enters shutdown mode with a logic high onboth ENTA and ENTB.
The MAX248 provides eight receivers and eight driverswith four control pins. The ENRA and ENRB receiverenable inputs each control four receiver outputs. TheENTA and ENTB transmitter enable inputs control fourdrivers each. This part does not have an always-activereceiver. The device enters shutdown mode and trans-mitters go into a three-state mode with a logic high onboth ENTA and ENTB.
The MAX249 provides ten receivers and six drivers withfour control pins. The ENRA and ENRB receiver enableinputs each control five receiver outputs. The ENTAand ENTB transmitter enable inputs control three dri-vers each. There is no always-active receiver. Thedevice enters shutdown mode and transmitters go intoa three-state mode with a logic high on both ENTA andENTB. In shutdown mode, active receivers operate in alow-power receive mode at data rates up to20kbits/sec.
__________Applications InformationFigures 5 through 25 show pin configurations and typi-cal operating circuits. In applications that are sensitiveto power-supply noise, VCC should be decoupled toground with a capacitor of the same value as C1 andC2 connected as close as possible to the device.
___________________________________________Ordering Information (continued)
PART
MAX222CPN 0°C to +70°C
TEMP. RANGE PIN-PACKAGE
18 Plastic DIP
MAX222CWN 0°C to +70°C 18 Wide SO
MAX222C/D 0°C to +70°C Dice*
MAX222EPN -40°C to +85°C 18 Plastic DIP
MAX222EWN -40°C to +85°C 18 Wide SO
MAX222EJN -40°C to +85°C 18 CERDIP
MAX222MJN -55°C to +125°C 18 CERDIP
MAX223CAI 0°C to +70°C 28 SSOP
MAX223CWI 0°C to +70°C 28 Wide SO
MAX223C/D 0°C to +70°C Dice*
MAX223EAI -40°C to +85°C 28 SSOP
MAX223EWI -40°C to +85°C 28 Wide SO
MAX225CWI 0°C to +70°C 28 Wide SO
MAX225EWI -40°C to +85°C 28 Wide SO
MAX230CPP 0°C to +70°C 20 Plastic DIP
MAX230CWP 0°C to +70°C 20 Wide SO
MAX230C/D 0°C to +70°C Dice*
MAX230EPP -40°C to +85°C 20 Plastic DIP
MAX230EWP -40°C to +85°C 20 Wide SO
MAX230EJP -40°C to +85°C 20 CERDIP
MAX230MJP -55°C to +125°C 20 CERDIP
MAX231CPD 0°C to +70°C 14 Plastic DIP
MAX231CWE 0°C to +70°C 16 Wide SO
MAX231CJD 0°C to +70°C 14 CERDIP
MAX231C/D 0°C to +70°C Dice*
MAX231EPD -40°C to +85°C 14 Plastic DIP
MAX231EWE -40°C to +85°C 16 Wide SO
MAX231EJD -40°C to +85°C 14 CERDIP
MAX231MJD -55°C to +125°C 14 CERDIP
MAX232CPE 0°C to +70°C 16 Plastic DIP
MAX232CSE 0°C to +70°C 16 Narrow SO
MAX232CWE 0°C to +70°C 16 Wide SO
MAX232C/D 0°C to +70°C Dice*
MAX232EPE -40°C to +85°C 16 Plastic DIP
MAX232ESE -40°C to +85°C 16 Narrow SO
MAX232EWE -40°C to +85°C 16 Wide SO
MAX232EJE -40°C to +85°C 16 CERDIP
MAX232MJE -55°C to +125°C 16 CERDIP
MAX232MLP -55°C to +125°C 20 LCC
MAX232ACPE 0°C to +70°C 16 Plastic DIP
MAX232ACSE 0°C to +70°C 16 Narrow SO
MAX232ACWE 0°C to +70°C 16 Wide SO
MAX232AC/D
MAX232AEPE -40°C to +85°C 16 Plastic DIP
MAX232AESE
0°C to +70°C Dice*
-40°C to +85°C 16 Narrow SO
MAX232AEWE -40°C to +85°C 16 Wide SO
MAX232AEJE -40°C to +85°C 16 CERDIP
MAX232AMJE -55°C to +125°C 16 CERDIP
MAX232AMLP -55°C to +125°C 20 LCC
MAX233CPP 0°C to +70°C 20 Plastic DIP
MAX233EPP -40°C to +85°C 20 Plastic DIP
MAX233ACPP 0°C to +70°C 20 Plastic DIP
MAX233ACWP 0°C to +70°C 20 Wide SO
MAX233AEPP -40°C to +85°C 20 Plastic DIP
MAX233AEWP -40°C to +85°C 20 Wide SO
MAX234CPE 0°C to +70°C 16 Plastic DIP
MAX234CWE 0°C to +70°C 16 Wide SO
MAX234C/D 0°C to +70°C Dice*
MAX234EPE -40°C to +85°C 16 Plastic DIP
MAX234EWE -40°C to +85°C 16 Wide SO
MAX234EJE -40°C to +85°C 16 CERDIP
MAX234MJE -55°C to +125°C 16 CERDIP
MAX235CPG 0°C to +70°C 24 Wide Plastic DIP
MAX235EPG -40°C to +85°C 24 Wide Plastic DIP
MAX235EDG -40°C to +85°C 24 Ceramic SB
MAX235MDG -55°C to +125°C 24 Ceramic SB
MAX236CNG 0°C to +70°C 24 Narrow Plastic DIP
MAX236CWG 0°C to +70°C 24 Wide SO
MAX236C/D 0°C to +70°C Dice*
MAX236ENG -40°C to +85°C 24 Narrow Plastic DIP
MAX236EWG -40°C to +85°C 24 Wide SO
MAX236ERG -40°C to +85°C 24 Narrow CERDIP
MAX236MRG -55°C to +125°C 24 Narrow CERDIP
MAX237CNG 0°C to +70°C 24 Narrow Plastic DIP
MAX237CWG 0°C to +70°C 24 Wide SO
MAX237C/D 0°C to +70°C Dice*
MAX237ENG -40°C to +85°C 24 Narrow Plastic DIP
MAX237EWG -40°C to +85°C 24 Wide SO
MAX237ERG -40°C to +85°C 24 Narrow CERDIP
MAX237MRG -55°C to +125°C 24 Narrow CERDIP
MAX238CNG 0°C to +70°C 24 Narrow Plastic DIP
MAX238CWG 0°C to +70°C 24 Wide SO
MAX238C/D 0°C to +70°C Dice*
MAX238ENG -40°C to +85°C 24 Narrow Plastic DIP
* Contact factory for dice specifications.
MA
X2
20
–MA
X2
49
+5V-Powered, Multichannel RS-232Drivers/Receivers___________________________________________Ordering Information (continued)
* Contact factory for dice specifications.
18 CERDIP-55°C to +125°CMAX242MJN
18 CERDIP-40°C to +85°CMAX242EJN
18 Wide SO-40°C to +85°CMAX242EWN
18 Plastic DIP-40°C to +85°CMAX242EPN
Dice*0°C to +70°CMAX242C/D
18 Wide SO0°C to +70°CMAX242CWN
18 Plastic DIP0°C to +70°CMAX242CPN
20 SSOP0°C to +70°CMAX242CAP
28 Wide SO-40°C to +85°CMAX241EWI
28 SSOP-40°C to +85°CMAX241EAI
Dice*0°C to +70°CMAX241C/D
28 Wide SO0°C to +70°CMAX241CWI
28 SSOP0°C to +70°CMAX241CAI
Dice*0°C to +70°CMAX240C/D
44 Plastic FP0°C to +70°CMAX240CMH
24 Narrow CERDIP-55°C to +125°CMAX239MRG
24 Narrow CERDIP-40°C to +85°CMAX239ERG
24 Wide SO-40°C to +85°CMAX239EWG
24 Narrow Plastic DIP-40°C to +85°CMAX239ENG
Dice*0°C to +70°CMAX239C/D
24 Wide SO0°C to +70°CMAX239CWG
24 Narrow Plastic DIP0°C to +70°CMAX239CNG
24 Narrow CERDIP-55°C to +125°C
24 Wide SO
PIN-PACKAGETEMP. RANGE
-40°C to +85°C
MAX238MRG
24 Narrow CERDIP-40°C to +85°CMAX238ERG
MAX238EWG
PART
44 PLCC-40°C to +85°CMAX249EQH
44 PLCC0°C to +70°CMAX249CQH
44 PLCC-40°C to +85°CMAX248EQH
Dice*0°C to +70°CMAX248C/D
44 PLCC0°C to +70°CMAX248CQH
40 Plastic DIP-40°C to +85°CMAX247EPL
Dice*0°C to +70°CMAX247C/D
40 Plastic DIP0°C to +70°CMAX247CPL
40 Plastic DIP-40°C to +85°CMAX246EPL
Dice*0°C to +70°CMAX246C/D
40 Plastic DIP0°C to +70°CMAX246CPL
40 Plastic DIP-40°C to +85°CMAX245EPL
Dice*0°C to +70°CMAX245C/D
40 Plastic DIP0°C to +70°CMAX245CPL
44 PLCC-40°C to +85°CMAX244EQH
Dice*0°C to +70°CMAX244C/D
44 PLCC0°C to +70°CMAX244CQH
16 CERDIP-55°C to +125°CMAX243MJE
16 CERDIP-40°C to +85°CMAX243EJE
16 Wide SO-40°C to +85°CMAX243EWE
16 Narrow SO-40°C to +85°CMAX243ESE
16 Plastic DIP-40°C to +85°CMAX243EPE
Dice*0°C to +70°CMAX243C/D
16 Wide SO0°C to +70°C
16 Plastic DIP0°C to +70°C
MAX243CWE
16 Narrow SO0°C to +70°CMAX243CSE
MAX243CPE
Maxim cannot assume responsibility for use of any circuitry other than circuitry entirely embodied in a Maxim product. No circuit patent licenses areimplied. Maxim reserves the right to change the circuitry and specifications without notice at any time.
36 __________________Maxim Integrated Products, 120 San Gabriel Drive, Sunnyvale, CA 94086 (408) 737-7600
Anexo II - Programa do microcontrolador relativo à aplicação
industrial
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
1 ;************************************************************************************2 ; NOME: PID_LPT.asm *3 ; DATA: 01-08-2008 *4 ; VERSÃO: 1.0 *5 ; AUTOR: Victor Silva *6 ;************************************************************************************7 ; FICHEIRO NECESSÁRIO: p16f876.inc *8 ;************************************************************************************9 ; DESCRIÇÃO: Este programa recebe do PC através da porta paralela a velocidade *10 ; desejada para o motor e implementa o controlo PID da velocidade. *11 ; Disponibiliza ao PC o valor da velocidade de rotação actual através da porta *12 ; paralela. *13 ; - O cristal de quartzo utilizado é de 20MHz. *14 ; - O Watchdog Timer está configurado para reiniciar ao fim de 18ms. *15 ; - A frequência do PWM é de 50KHz. *16 ; - Controlo PID da velocidade do motor. *17 ;************************************************************************************18 ; \\|// *19 ; |º|º| *20 ; \-/ *21 ; /|.|\ Inicio *22 ;************************************************************************************23 #include <p16f876.inc> ; Definições específicas do uC.2425 __CONFIG _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON &
_HS_OSC 26 errorlevel -302 ; Para eliminar as mensagens relacionadas com o bank 0.2728 ;************************************************************************************29 ; CONSTANTES: *30 ;************************************************************************************31 ; >> Atenção, são endereços e não valores.(movlw e não movfw) <<32 OPTIONVAL EQU B'00000000' ; Valor para o registo OPTION_REG.33 INTCONVAL EQU B'11000000' ; Valor para o registo INTCON.34 PIE1VAL EQU B'00000010' ; Valor para o registo PIE1.35 PIE2VAL EQU B'00000000' ; Valor para o registo PIE2.36 ADCON1VAL EQU B'00000110' ; Valor para o registo ADCON1 (Analógico/Digital).37 SSPCONVAL EQU B'00000000' ; Valor para o registo SSPCON (SPI/I2C).38 CCP1CONVAL EQU B'00001100' ; Valor para o registo CCP1CON (PWM).3940 ; Constantes para a frequência do PWM e o tempo de amostragem41 ; -----------------------------------------------------------42 PR2VAL EQU D'99' ; O Timer 2 conta até (PR2VAL+1)×1×1×0,2µs=20us => f=50KHz43 COMPTVAL1_tmr2 EQU D'99' ; Número de passagem no tmr2:44 COMPTVAL2_tmr2 EQU D'1' ; Número de
passagem=(COMPTVAL1_tmr2+COMPTVAL2_tmr2)×20us=2000us45 ; V=12V=> Tmin(encoder)=40us=> 100*40us=4000us46 ; V=24V=> Tmin(encoder)=20us=> 100*20us=2000us4748 ; Constantes para o controlo PID49 ; ------------------------------50 Kp EQU D'3' ; Constante proporcional.51 Ki EQU D'1' ; Constante integral.52 Kd EQU D'0' ; Constante derivativa.5354 ; DIRECÇÃO DOS PORTOS I/O55 ; -----------------------56 DIRPORTA EQU B'00001111' ; Direcção do PORTA (1=input/0=output)57 DIRPORTB EQU B'00000000' ; Direcção do PORTB (1=input/0=output)58 DIRPORTC EQU B'11111001' ; Direcção do PORTC (1=input/0=output)5960 ;************************************************************************************61 ; DEFINIÇÕES: *62 ;************************************************************************************63 #DEFINE LED_Vida PORTA,5 ; LED ligado ao RA5.64 #DEFINE Sentido PORTC,1 ; Linha Sentido.65 #DEFINE PWM PORTC,2 ; Linha PWM.66 #DEFINE Oscilator_value .567 ; Oscilator_value=5 para um oscilador de 20 MHz68 ; Oscilator_value=4 para um oscilador de 16 MHz69 ; Oscilator_value=3 para um oscilador de 12 MHz70 ; Oscilator_value=2 para um oscilador de 8 MHz71 ; Oscilator_value=1 para um oscilador de 4 MHz7273 ;************************************************************************************74 ; MACROS: *75 ;************************************************************************************76 BANK0 macro ; Aceder ao banco 077 bcf STATUS,RP078 bcf STATUS,RP1
1
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
79 endm8081 BANK1 macro ; Aceder ao banco 1 82 bsf STATUS,RP083 bcf STATUS,RP184 endm8586 BANK2 macro ; Aceder ao banco 287 bcf STATUS,RP088 bsf STATUS,RP189 endm9091 BANK3 macro ; Aceder ao banco 392 bsf STATUS,RP093 bsf STATUS,RP194 endm9596 SHIFT macro ; Divisão por 297 bcf STATUS,C98 rrf L_byte,f99 bcf STATUS,C100 rrf H_byte,f101 btfsc STATUS,C102 bsf L_byte,7103 endm104105 ;************************************************************************************106 ; DECLARAÇÃO DE VARIÁVEIS DO BANCO 0 *107 ;************************************************************************************108 ; Zona de 80 bytes109 ; ----------------110 CBLOCK 0x20 ; Inicio da zona de variáveis (0x20 à 0x6Fh).111112 ; >> Conj de variáveis necessárias à rotina msDelay <<113 MsDelayCounter : 2 ; Var. para a rotina de tempo msDelay.114 Time_value : 1 ; Var. para a rotina de tempo msDelay.115 Counter : 1 ; Var. para contabilizar as passagens na rotina de tempo
msDelay.116117 ; >> Conj de variáveis com os dados<<118 MoR_value : 1 ; Var. com o valor a escrever no registo Mode (Speed).119 Old_MoR_value : 1 ; Var. com o valor antigo do registo Mode (Speed).120 SpR_value : 1 ; Var. com o valor a escrever no registo Speed.121 122 Status_flag : 1 ; Conjunto de flags de estado: 123 ; 2 - Flag de chegada de dados (Sense+Speed).124 ; 4 - Flag de leitura da velocidade do encoder.125 ; 5 - Flag de tempo de amostragem.126 ; 6 - Flag do factor tempo de amostragem.127 ; >> Conj de variáveis necessárias para implementar o controlo PID <<128 Velocidade : 1 ; Var. com o valor da velocidade.129 Vel_actual : 1 ; Var. com o valor da velocidade actual do encoder.130 Vel_ref : 1 ; Var. com o valor da velocidade de referência.131 Contador1_tmr2 : 1 ; Var. para controlar as passagens pela interrupção do Timer2.132 Contador2_tmr2 : 1 ; Var. para controlar as passagens pela interrupção do Timer2.133 erro_actual : 1 ; Var. com o valor do erro do sistema |Vref-Vreal|.134 erro_antigo : 1 ; Var. com o valor do erro anterior do sistema.135 erro_acum : 1 ; Var. com o valor do erro acumulado.136 de_dt : 1 ; Var. com o valor de/dt.137 SUMLO : 1 ; Var. para guardar o valor do somatório do sistema. 138 SUMHI : 1 ; Var. para guardar o valor do somatório do sistema. 139 PID_flag : 1 ; Conjunto de flags para o controlo PID:140 ; 0 - Flag de sinal do valor erro_actual141 ; 1 - Flag de sinal do valor erro_antigo142 ; 2 - Flag de sinal do valor do de/dt143 ; 3 - Flag de sinal do valor erro_acum144145 ; >> Conj de variáveis necessárias para as operações aritméticas <<146 mulcnd : 1 ; Var. com o valor do multiplicando de 8 bits.147 mulplr : 1 ; Var. com o valor do multiplicador de 8 bits.148 H_byte : 1 ; Var. para guardar o MSB do resultado da multiplicação.149 L_byte : 1 ; Var. para guardar o LSB do resultado da multiplicação.150 count : 1 ; Var. para contabilizar as passagens na multiplicação.151 ACCaLO : 1 ; Var. com o LSB de A para a adição. 152 ACCaHI : 1 ; Var. com o MSB de A para a adição.153 ACCbLO : 1 ; Var. com o LSB de B para a adição.154 ACCbHI : 1 ; Var. com o MSB de B para a adição.155 ENDC ; Fim da zona de variáveis. 156157 ;************************************************************************************
2
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
158 ; DECLARAÇÃO DE VARIÁVEIS NA ZONA COMUM *159 ;************************************************************************************160 ; Zona de 16 bytes161 ; ----------------162 CBLOCK 0x70 ; Inicio da zona de variáveis (0x70 à 0x7Fh).163 W_temp : 1 ; Backup do registo W.164 STATUS_temp : 1 ; Backup do registo STATUS.165 FSR_temp : 1 ; Backup do registo FSR. 166 PCLATH_temp : 1 ; Backup do registo PCLATH (se o programa>2K).167 Temp : 1 ; Var. temporária. 168 ENDC ; Fim da zone de variáveis.169170 ;------------------------------------------------------------------------------------171 ;************************* VECTOR DE ARRANQUE APÓS RESET ****************************172 ;------------------------------------------------------------------------------------173 org 0x00 ; Endereço de partida após RESET174 movlw high main_init175 movwf PCLATH ; Inicialização do PCLATH.176 goto main_init ; Salto para a rotina de inicio.177178 ;////////////////////////////////////////////////////////////////////////////////////179 ; I N T E R R U P Ç Õ E S180 ;////////////////////////////////////////////////////////////////////////////////////181182 ;************************************************************************************183 ; ROTINA DAS INTERRUPÇÕES: *184 ;************************************************************************************185 ; Se não for utilizado o endereçamento indirecto nas interrupções não é necessário 186 ;fazer backup do registo FSR.187 ; Se o programa não ocupar mais de 2K, não é necessário fazer backup do registo 188 ;PCLATH.189 ;------------------------------------------------------------------------------------190 org 0x04 ; Endereço de partida após interrupção191192 ; Backup dos registos193 ; -------------------194 backup_reg:195 movwf W_temp ; Guardar o registo w.196 swapf STATUS, w ; Swap do SATUS e passar para o w.197 movwf STATUS_temp ; Guardar o valor de w em STATUS_temp.198 movf FSR , w ; Passar o valor do FSR para o w.199 movwf FSR_temp ; Guardar o valor do w(FSR) em FSR_temp.200 movf PCLATH , w ; Passar o valor do PCLATH para o w.201 movwf PCLATH_temp ; Guardar o valor do w(PCLATH)em PCLATH_temp.202 clrf PCLATH ; Posicionamento na página de memória 0.203204 ; Tratamento das interrupções205 ; ---------------------------206 sw_tmr2: ; Interrupção TMR2:207 bsf STATUS,RP0 ; Aceder ao banco 1.208 btfss PIE1,TMR2IE ; Verificar se a interrupcção foi autorizada.209 goto restore_reg ; Se não, testar outra interrupção.210 bcf STATUS,RP0 ; Se sim, aceder ao banco 0.211 btfss PIR1,TMR2IF ; Verifivar se a flag foi activada.212 goto restore_reg ; Se a flag não está activada testar outra interrupção.213 call int_tmr2 ; Se sim, executar a interrupção.214 bcf PIR1,TMR2IF ; Apagar a flag de interrupção.215 goto restore_reg ; Restaurar os registos.216217 ; Restauro dos registos218 ; ---------------------219 restore_reg:220 movf PCLATH_temp , w ; Carrega o antigo PCLATH.221 movwf PCLATH ; Restaura o PCLATH.222 movf FSR_temp , w ; Carrega o antigo FSR. 223 movwf FSR ; Restaura o FSR.224 swapf STATUS_temp,w ; Swap do W_temp e guarda-o em w.225 movwf STATUS ; Restauro do registo STATUS.226 swapf W_temp,f ; Inversão do L e do H no antigo w, sem alterar o Z.227 swapf W_temp,w ; Reinversão do L e do H no antigo w. 228 ; w restaurado sem modificar o status.229 retfie ; Return from interrupt.230231 ; ///////////////////////////////////////////////////////////////////////////////////232 ; S U B - R O T I N A S :233 ; ///////////////////////////////////////////////////////////////////////////////////234235 ;************************************************************************************236 ; >INTERRUPÇÃO TIMER 2< *237 ;************************************************************************************
3
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
238 int_tmr2239 BANK0240 ; Actualizar o valor do PWM241 ; ------------------------242 movfw SpR_value ; SpR_value -> w243 movwf CCPR1L ; w -> CCPR1L244 ; Obter o valor da Velocidade real de rotação245 ; -------------------------------------------246 btfsc Status_flag,5 ; A flag de tempo de amostragem foi activada?247 goto Count_loop ; Sim então, ir para...248 bcf T1CON,TMR1ON ; Não então, parar contagem do TMR1249 bsf Status_flag,5 ; Activar a flag de tempo de amostragem.250 clrf TMR1L ; Limpar o TMR1L251 clrf TMR1H ; Limpar o TMR1H252 bsf T1CON,TMR1ON ; Iniciar a contagem do TMR1253 Count_loop254 btfsc Status_flag,6 ; A flag do factor tempo de amostragem foi activada?255 goto Count_loop1256 decfsz Contador1_tmr2257 return258 Count_loop1259 bsf Status_flag,6 ; Activar a flag do factor tempo de amostragem.260 decfsz Contador2_tmr2261 return262 bcf T1CON,TMR1ON ; Parar contagem do TMR1263 movf TMR1L,w ; TMR1L -> w264 movwf Vel_actual ; w -> Vel_actual265 movlw COMPTVAL1_tmr2 ; Reiniciar o valor do contador de passagens,266 movwf Contador1_tmr2 ; pela interrupção do TMR2.267 movlw COMPTVAL2_tmr2 ; Reiniciar o valor do contador de passagens,268 movwf Contador2_tmr2 ; pela interrupção do TMR2.269 bcf Status_flag,6 ; Reiniciar a flag do factor tempo de amostragem.270 bcf Status_flag,5 ; Reiniciar a flag de tempo de amostragem.271 bsf Status_flag,4 ; Activar a flag de leitura da velocidade do encoder.272 return ; fim da sub-rotina de interrupção TMR2273 ;************************************************************************************274 ; FUNÇÃO PARA LER A ORDEM DO PC *275 ;************************************************************************************276 Read_order ; Ler os 4 bits provenientes do PC 277 ; --------------------------------278 movfw PORTA ; PORTA -> w279 andlw 0x0F ; Para obter apenas o valor dos 4 LSb. 280 movwf MoR_value ; w -> MoR_value281 return282283 ;************************************************************************************284 ; FUNÇÃO PARA DISPONIBILIZAR O VALOR DO ERRO *285 ;************************************************************************************286 Write_error287 movfw erro_actual ; erro_actual -> w288 movwf PORTB ; w -> PORTB289 return290 ;************************************************************************************291 ; FUNÇÃO PARA DISPONIBILIZAR O VALOR DA VELOCIDADE REAL *292 ;************************************************************************************293 Write_velocity294 movfw Vel_actual ; Vel_actual -> w295 movwf PORTB ; w -> PORTB296 return297298 ;************************************************************************************299 ; FUNÇÃO PARA VERIFICAR SE O VALOR RECEBIDO É NOVO *300 ;************************************************************************************301 Test_value302 movfw MoR_value ; MoR_value -> w.303 xorwf Old_MoR_value,w ; (w)xor(f)-> w.304 btfss STATUS,Z ; O valor lido é diferente?305 call Det_valor ; Sim, então chamar a função Det_valor306 return ; Não, então sair.307308 ;************************************************************************************309 ; FUNÇÃO PARA DETERMINAR O VALOR A APLICAR *310 ;************************************************************************************311 Det_valor312 ; Determinar o valor aplicar313 ; ---------------------------314 movfw MoR_value ; MoR_value -> w.315 movwf Old_MoR_value ; Actualizar o valor antigo.316 xorlw 0x00317 btfsc STATUS,Z ; O valor lido é igual a 0x00?
4
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
318 goto Valor_00 ; Sim, então ir para...319 movfw MoR_value ; Não então, MoR_value -> w.320 xorlw 0x01321 btfsc STATUS,Z ; O valor lido é igual a 0x01?322 goto Valor_01 ; Sim, então ir para...323 movfw MoR_value ; Não então, MoR_value -> w.324 xorlw 0x02325 btfsc STATUS,Z ; O valor lido é igual a 0x02?326 goto Valor_02 ; Sim, então ir para...327 movfw MoR_value ; Não então, MoR_value -> w.328 xorlw 0x03329 btfsc STATUS,Z ; O valor lido é igual a 0x03?330 goto Valor_03 ; Sim, então ir para...331 movfw MoR_value ; Não então, MoR_value -> w.332 xorlw 0x04333 btfsc STATUS,Z ; O valor lido é igual a 0x04?334 goto Valor_04 ; Sim, então ir para...335 movfw MoR_value ; Não então, MoR_value -> w.336 xorlw 0x05337 btfsc STATUS,Z ; O valor lido é igual a 0x05?338 goto Valor_05 ; Sim, então ir para...339 movfw MoR_value ; Não então, MoR_value -> w.340 xorlw 0x06341 btfsc STATUS,Z ; O valor lido é igual a 0x06?342 goto Valor_06 ; Sim, então ir para...343 movfw MoR_value ; Não então, MoR_value -> w.344 xorlw 0x07345 btfsc STATUS,Z ; O valor lido é igual a 0x07?346 goto Valor_07 ; Sim, então ir para...347 movfw MoR_value ; Não então, MoR_value -> w.348 xorlw 0x08349 btfsc STATUS,Z ; O valor lido é igual a 0x08?350 goto Valor_08 ; Sim, então ir para...351 movfw MoR_value ; Não então, MoR_value -> w.352 xorlw 0x09353 btfsc STATUS,Z ; O valor lido é igual a 0x09?354 goto Valor_09 ; Sim, então ir para...355 movfw MoR_value ; Não então, MoR_value -> w.356 xorlw 0x0A357 btfsc STATUS,Z ; O valor lido é igual a 0x0A?358 goto Valor_0A ; Sim, então ir para...359 movfw MoR_value ; Não então, MoR_value -> w.360 xorlw 0x0B361 btfsc STATUS,Z ; O valor lido é igual a 0x0B?362 goto Valor_0B ; Sim, então ir para...363 movfw MoR_value ; Não então, MoR_value -> w.364 xorlw 0x0C365 btfsc STATUS,Z ; O valor lido é igual a 0x0C?366 goto Valor_0C ; Sim, então ir para...367 return368 Valor_00369 movlw .0370 movwf Velocidade ; w -> Velocidade371 goto Det_valor_EXIT372 Valor_01373 movlw .1374 movwf Velocidade ; w -> Velocidade375 goto Det_valor_EXIT376 Valor_02377 movlw .2378 movwf Velocidade ; w -> Velocidade379 goto Det_valor_EXIT380 Valor_03381 movlw .4382 movwf Velocidade ; w -> Velocidade383 goto Det_valor_EXIT384 Valor_04385 movlw .9386 movwf Velocidade ; w -> Velocidade387 goto Det_valor_EXIT388 Valor_05389 movlw .13390 movwf Velocidade ; w -> Velocidade391 goto Det_valor_EXIT392 Valor_06393 movlw .17394 movwf Velocidade ; w -> Velocidade395 goto Det_valor_EXIT396 Valor_07397 movlw .26
5
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
398 movwf Velocidade ; w -> Velocidade399 goto Det_valor_EXIT400 Valor_08401 movlw .34402 movwf Velocidade ; w -> Velocidade403 goto Det_valor_EXIT404 Valor_09405 movlw .43406 movwf Velocidade ; w -> Velocidade407 goto Det_valor_EXIT408 Valor_0A409 movlw .52410 movwf Velocidade ; w -> Velocidade411 goto Det_valor_EXIT412 Valor_0B413 movlw .60414 movwf Velocidade ; w -> Velocidade415 goto Det_valor_EXIT416 Valor_0C417 movlw .69418 movwf Velocidade ; w -> Velocidade419 Det_valor_EXIT420 movfw Velocidade421 movwf Vel_ref ; Actualizar a velocidade de referência.422 movwf SpR_value ; Speed (0-127).423 bcf Status_flag,2 ; Reiniciar a flag de chegada de dados (Sense+Speed).424 clrf erro_acum ; Limpar o valor da variável erro_acum.425 clrf erro_antigo ; Limpar o valor da variável erro_antigo.426 clrf PID_flag ; Limpar as flags de controlo.427 return428 ;************************************************************************************429 ; FUNÇÃO PARA IMPLEMENTAR O CONTROLO PID DA VELOCIDADE *430 ;************************************************************************************431 ; Partindo da expressão simplificada:432 ; u(k)=p(k)+i(k)+d(k) onde p(k) é o termo proporcional, i(k) é o termo integral e 433 ; d(k) é o termo derivativo. 434 ; p(k)= (Kp × erro_actual)435 ; i(k)= ((Ki × erro_actual) + erro_acum)) 436 ; d(k)= (Kd × (erro_actual - erro_antigo))437 ;------------------------------------------------------------------------------------438 Controlo439 ; clrwdt ; Limpar o Watchdog Timer440 clrf SUMHI ; Iniciarlizar o MSB do somatório.441 clrf SUMLO ; Iniciarlizar o LSB do somatório.442443 ; Cálculo do erro do sistema: 444 ; ------------------------------------------------------------------------445 ; NOTA: O valor do erro do sistema obtem-se calculando a diferença entre o 446 ; valor de referência e o valor no instante k ou valor actual.447 ; erro_actual=(Vel_ref - Vel_actual) 448 ; ------------------------------------------------------------------------449 C_ERROR450 movfw Vel_actual ; Vel_actual -> w 451 subwf Vel_ref,w ; Vel_ref - w -> w452 btfss STATUS,C ; O erro é positivo?453 goto MNS_ER ; Não, então ir para "MNS_ER".454 PLS_ER ; Sim, então executar "PLS_ER".455 movwf erro_actual ; Passar o resultado para a variável erro_actual.456457 ; Verificar se o valor do erro_actual é igual a zero458 ; --------------------------------------------------459 movfw erro_actual460 btfsc STATUS,Z ; erro_actual = 0?461 goto ERROR_BKP ; Sim, então ir para "ERROR_BKP".462 bcf PID_flag,0 ; Não, então activar a flag indicadora de erro 463 goto CE_EXIT ; positivo e aplicar o controlo.464 MNS_ER465 movfw Vel_ref ; Vel_ref -> w466 subwf Vel_actual,w467 movwf erro_actual468 bsf PID_flag,0 ; Activar a flag indicadora de erro negativo.469 CE_EXIT470471 ; Cálculo do termo proporcional: 472 ; ------------------------------------------------------------------------473 ; NOTA: O termo proporcional obtem-se através do produto do ganho do 474 ; termo proporcional pelo erro do sistema (Kp × erro_actual). Este termo 475 ; está limitado entre +/-100. Quanto maior for o ganho proporcional menor 476 ; será o tempo de subida do sistema, mas em contrapartida, maiores terão 477 ; que ser os ganhos integral e derivativo de modo a tornar o sistema
6
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
478 ; estável.479 ; p(t)=(Kp × erro_actual)480 ; ------------------------------------------------------------------------ 481 C_PROP482 movfw erro_actual ; erro_actual -> w 483 movwf mulcnd 484 movlw Kp485 movwf mulplr486 call mpy8x8_S ; Multiplicar Kp x erro_actual.487 ;call DIV_LMT ; Dividir por 16 e limitar entre 0 e 100.488 call LMT100 ; Limitar o valor entre 0 e 100.489 RESTORE_SGN490 btfss PID_flag,0 ; O erro calculado é positivo?491 goto ADDPROP ; Sim, então ir para...492 comf L_byte,f ; Não, então cálcular o complemento 493 incf L_byte,f ; para 2 do L_byte.494495 ; Adicionar o valor do termo proporcional ao somatório 496 ; ----------------------------------------------------497 ADDPROP498 movfw L_byte ; Adicionar o valor do ganho proporcional499 addwf SUMLO,f ; ao somatório.500 btfsc STATUS,C ; Foi gerado um "CARRY-OUT"?501 incf SUMHI,f ; Sim, então...502 movlw 0x00 ; Não, então...503 btfsc SUMLO,7 ; O MSbit de SUMLO é 1?504 movlw 0xFF ; Sim, então 0xFF -> w505 addwf SUMHI,f ; SUMHI + w -> SUMHI506 CP_EXIT507508 ; Cálcular o termo integral: 509 ; ------------------------------------------------------------------------510 ; NOTA: O termo integral advém do valor do erro acumulado durante o 511 ; processo. Por mais pequeno que seja o erro se este persistir durante 512 ; algum tempo irá originar um valor considerável no acumulador, de modo a 513 ; actuar o sistema. O valor do termo integral pode ser obtido através do 514 ; produto do Ki pelo somatório do erro (Ki × erro_acum). Tal como no 515 ; termo proporcional o termo integral também está limitado para +/-100.516 ; i(k)= ((Ki × erro_actual) + erro_acum)) 517 ; ------------------------------------------------------------------------ 518 C_INT519 btfss PID_flag,3 ; O erro acumulado é positivo?520 goto ACUM_P ; Sim, então ir para...521 ACUM_N ; Não, então...522 btfsc PID_flag,0 ; Verificar o sinal do valor do erro_actual.523 goto MNS_0 ; É negativo, então ir para...524 PLS_0 ; É positivo, então...525 ; erro_actual positivo e erro_acum negativo:526 ; -----------------------------------------527 movfw erro_actual ; erro_actual -> w 528 movwf mulcnd 529 movlw Ki530 movwf mulplr531 call mpy8x8_S ; Multiplicar Ki x erro_actual.532 call LMT100 ; Limitar o valor entre 0 e 100.533 movfw L_byte ; L_byte -> w534 comf erro_acum,f ; Cálcular o complemento para 2 do 535 incf erro_acum,f ; erro_acum.536 movfw L_byte ; L_byte -> w537 addwf erro_acum,f ; erro_acum= erro_acum + (Ki x erro_actual) 538 btfss erro_acum,7 ; Verificar o sinal do acumulador de erro.539 bcf PID_flag,3 ; É positivo, então definir o sinal.540 btfss erro_acum,7 ; Verificar o sinal do acumulador de erro.541 goto SIGN_TI ; É positivo, então...542 bsf PID_flag,3 ; É negativo, então definir o sinal.543 comf erro_acum,f ; Cálcular o complemento para 2 544 incf erro_acum,f ; do erro_acum.545 movfw erro_acum ; |erro_acum| -> w546 movwf L_byte ; w -> L_byte547 call LMT100 ; Limitar o valor entre 0 e 100.548 movfw L_byte ; L_byte - > w549 movwf erro_acum ; w -> erro_acum550 goto SIGN_TI ; Aplicar o sinal no termo integral.551 MNS_0 552 ; erro_actual negativo e erro_acum negativo:553 ; -----------------------------------------554 bsf PID_flag,3 ; Definir o erro_acum como sendo negativo.555 movfw erro_actual ; erro_actual -> w 556 movwf mulcnd 557 movlw Ki
7
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
558 movwf mulplr559 call mpy8x8_S ; Multiplicar Ki x erro_actual.560 call LMT100 ; Limitar o valor entre 0 e 100.561 movfw L_byte ; L_byte -> w562 addwf erro_acum,f ; erro_acum= |erro_acum|+(Ki × |erro_actual|)563 movfw erro_acum ; |erro_acum| -> w564 movwf L_byte ; w -> L_byte565 call LMT100 ; Limitar o valor entre 0 e 100.566 movfw L_byte ; L_byte - > erro_acum567 movwf erro_acum ;568 goto SIGN_TI ; Aplicar o sinal no termo integral.569 ACUM_P570 btfsc PID_flag,0 ; Verificar o sinal do valor do erro_actual.571 goto MNS_1 ; É negativo, então ir para...572 PLS_1 ; É positivo, então...573 ; erro_actual positivo e erro_acum positivo:574 ; -----------------------------------------575 bcf PID_flag,3 ; Definir o erro_acum como sendo positivo.576 movfw erro_actual577 movfw erro_actual ; erro_actual -> w 578 movwf mulcnd 579 movlw Ki580 movwf mulplr581 call mpy8x8_S ; Multiplicar Ki x erro_actual.582 call LMT100 ; Limitar o valor entre 0 e 100.583 movfw L_byte ; L_byte -> w584 addwf erro_acum,f ; erro_acum= |erro_acum|+(Ki × |erro_actual|)585 movfw erro_acum ; erro_acum -> w586 movwf L_byte ; w -> L_byte587 call LMT100 ; Limitar o valor entre 0 e 100.588 movfw L_byte ; L_byte - > erro_acum589 movwf erro_acum ;590 goto SIGN_TI ; Aplicar o sinal no termo integral.591 MNS_1 592 ; erro_actual negativo e erro_acum positivo:593 ; ----------------------------------------- 594 movfw erro_actual ; erro_actual -> w 595 movwf mulcnd 596 movlw Ki597 movwf mulplr598 call mpy8x8_S ; Multiplicar Ki x erro_actual.599 call LMT100 ; Limitar o valor entre 0 e 100.600 movfw L_byte ; L_byte -> w601 comf L_byte,f ; Cálcular o complemento para 2 do 602 incf L_byte,f ; L_byte.603 movfw L_byte ; L_byte -> w604 addwf erro_acum,f ; erro_acum= erro_acum + (-Ki x erro_actual) 605 btfss erro_acum,7 ; Verificar o sinal do acumulador de erro.606 bcf PID_flag,3 ; É positivo, então definir o sinal.607 btfss erro_acum,7 ; Verificar o sinal do acumulador de erro.608 goto SIGN_TI ; É positivo, então...609 bsf PID_flag,3 ; É negativo, então definir o sinal.610 comf erro_acum,f ; Cálcular o complemento para 2 611 incf erro_acum,f ; do erro_acum.612 movfw erro_acum ; |erro_acum| -> w613 movwf L_byte ; w -> L_byte614 call LMT100 ; Limitar o valor entre 0 e 100.615 movfw L_byte ; L_byte - > w616 movwf erro_acum ; w -> erro_acum617 goto SIGN_TI ; Aplicar o sinal no termo integral.618 SIGN_TI619 btfsc PID_flag,3 ; O sinal do acumulador de erro é positivo?620 goto TI_N ; Não, então ir para ...621 TI_P ; Sim, então...622 movfw erro_acum623 movwf L_byte624 call LMT100 ; Limitar o valor entre 0 e 100.625 movfw L_byte ; L_byte - > erro_acum626 movwf erro_acum ;627 movwf L_byte628 goto ADDINT629 TI_N630 movfw erro_acum631 movwf L_byte632 call LMT100 ; Limitar o valor entre 0 e 100.633 movfw L_byte ; L_byte - > erro_acum634 movwf erro_acum ;635 comf L_byte,f ; Cálcular o complemento para 2 636 incf L_byte,f ; desse valor.637
8
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
638 ; Adicionar o valor do termo integral ao somatório 639 ; ------------------------------------------------640 ADDINT641 movfw L_byte ; L_byte -> w642 addwf SUMLO,f ; SUMLO= SUMLO + w 643 btfsc STATUS,C ; Foi gerado um "CARRY-OUT"?644 incf SUMHI,f ; Sim, então...645 movlw 0x00 ; Não, então...646 btfsc PID_flag,3 ; O erro_acum é negativo?647 movlw 0xFF ; Sim, então 0xFF -> w648 addwf SUMHI,f ; SUMHI + w -> SUMHI 649 CI_EXIT650651 ; Cálculo do termo derivativo: 652 ; ------------------------------------------------------------------------653 ; NOTA: O termo derivativo baseia-se na análise da variação do valor do 654 ; erro em relação ao seu valor anterior. Básicamente consiste em subtrair 655 ; o antigo valor do erro ao erro actual. Uma vez que o tempo de ciclo do 656 ; programa é práticamente constante pode usar-se como sendo o "dt" do 657 ; desejado "de/dt". Esta derivada do erro é então multiplicada pelo ganho 658 ; do termo diferencial Kd, obtendo desta forma o valor do termo derivativo.659 ; d(t)= (Kd × (erro_actual - erro_antigo))660 ; ------------------------------------------------------------------------661 C_DIFF662 movfw erro_actual ; Passar o valor do erro_actual para o registo w. 663 btfss PID_flag,0 ; O valor do erro_actual é positivo?664 goto LO_BYTE ; Sim, então ir para... 665 comf erro_actual,f ; Não, então cálcular o complemento para 2 666 incf erro_actual,w ; desse valor.667 comf erro_actual,f ; Restaurar o valor do erro_actual. 668 LO_BYTE669 movwf ACCbLO ; Para subtração670 movlw 0x00671 btfsc PID_flag,0 ; Passar o sinal para o Byte mais significativo.672 movlw 0xFF673 movwf ACCbHI674 movfw erro_antigo ; Passar o valor do erro_antigo para o registo w. 675 btfss PID_flag,1 ; O valor do erro_antigo é positivo?676 goto LO_BYTEO ; Sim, então ir para... 677 comf erro_antigo,f ; Não, então cálcular o complemento para 2 678 incf erro_antigo,w ; desse valor.679 comf erro_antigo,f ; Restaurar o valor do erro_antigo. 680 LO_BYTEO681 movwf ACCaLO ; Para subtração682 movlw 0x00683 btfsc PID_flag,1 ; Passar o sinal para o Byte mais significativo.684 movlw 0xFF685 movwf ACCaHI686 call D_sub ; erro_actual - erro_antigo687 STRIP_SGN688 btfsc ACCbHI,7 ; O sinal do resultado é positivo?689 goto NEG_ABS ; Não, então ir para...690 goto POS_ABS ; Sim, então ir para... 691 NEG_ABS692 bsf PID_flag,2 ; O resultado é negativo, então colocar a flag a 1 e693 comf ACCbLO,f ; cálcular o complemento para 2 do resultado.694 incf ACCbLO,w695 movwf de_dt 696 goto MULT_Kd697 POS_ABS698 bcf PID_flag,2 ; O resultado é positivo, então colocar a flag a 0 e699 movfw ACCbLO ; guardar o resultado.700 movwf de_dt701702 ; Multiplicar o resultado por Kd703 ; ------------------------------704 MULT_Kd705 movfw de_dt ; Passar o valor do de/dt para o multiplicando.706 movwf mulcnd ; 707 movlw Kd ; Passar o valor do Kd para o multiplicador.708 movwf mulplr ; 709 call mpy8x8_S ; Multiplicar (de_dt) x Kd710 ;call DIV_LMT ; Dividir por 16 e limitar entre 0 e 100.711 call LMT100 ; Limitar o valor entre 0 e 100.712 RE_SGN713 ;---------714 movfw L_byte715 btfsc STATUS,Z ; O termo derivativo é nulo?716 goto CD_EXIT ; Sim, então ir para...717 ;---------
9
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
718 btfss PID_flag,2 ; O sinal do valor de_dt é positivo?719 goto ADDDIF ; Sim, então ir para...720 comf L_byte,f ; Não, então 721 incf L_byte,f722723 ; Adicionar o valor do termo derivativo ao somatório 724 ; ----------------------------------------------------725 ADDDIF726 movlw 0x00727 btfsc PID_flag,2 ; O sinal do valor de_dt é positivo? 728 movlw 0xFF ; Não, então aplicar o sinal negativo ao MSB.729 movwf ACCbHI ; Sim, então aplicar o sinal positivo ao MSB.730 movfw L_byte ; Passar o resultado de Kd*(DE/DT) -> w. 731 movwf ACCbLO ; w -> ACCbLO732 movfw SUMLO ; Passar o valor actual do SUMLO -> w.733 movwf ACCaLO ; w -> ACCaLO. 734 movfw SUMHI ; Passar o valor actual do SUMHI -> w.735 movwf ACCaHI ; w -> ACCaHI.736 call D_add ; Chamar a função de adição.737 movfw ACCbLO ; Guardar os valores resultantes em738 movwf SUMLO ; SUMLO e SUMHI respectivamente.739 movfw ACCbHI740 movwf SUMHI741 CD_EXIT742743 ; Limitar o somatório final para um valor entre 0 e 100%744 ; ------------------------------------------------------745 L_SUMM746 btfss SUMHI,7 ; O sinal do somatório é positivo? 747 goto POS_LM ; Sim, então ir para...748 ; comf SUMHI,1 ; Não, então...749 ; comf SUMLO,1750 ; incf SUMLO,1751 clrf SUMHI ; Não, então...752 clrf SUMLO753 POS_LM 754 movlw 0x01 ; Subtrair 1 ao SUMHI, 755 subwf SUMHI,w ; para ver se este possui algum valor.756 btfss STATUS,C ; O SUMHI possui algum valor?757 goto LB_L ; Não, então validar apenas o LOW BYTE.758 movlw .100 ; Sim, então limitar o SUMLO a 100.759 movwf SUMLO 760 goto LP_EXIT761 LB_L762 movlw .100 ; Limitar a amplitude do valor para 100 em décimal. 763 subwf SUMLO,w ; (SUMLO - w) -> w 764 btfss STATUS,C ; O resultado é positivo?765 goto LP_EXIT ; Sim, então saltar para LP_EXIT 766 movlw .100 ; Não, então limitar o SUMLO a 100.767 movwf SUMLO768 LP_EXIT769770 ; Passar o valor final do somatório para o registo SpR_value771 ; ----------------------------------------------------------772 WRITE_RESULT773 movfw SUMLO774 movwf SpR_value ; Speed (0-100). 775776 ; Backup do erro777 ; --------------778 ERROR_BKP779 movfw erro_actual ; Passar o valor do erro_actual780 movwf erro_antigo ; para o erro_antigo. 781 bcf PID_flag,1 ; Colocar a flag do erro_antigo a 0.782 btfsc PID_flag,0 ; O sinal do erro actual é positivo? 783 bsf PID_flag,1 ; Não então colocar a flag do erro_antigo a 1.784785 Controlo_EXIT786 bcf Status_flag,4 ; Reiniciar a flag de leitura da velocidade do encoder.787 return788789 ;************************************************************************************790 ; FUNÇÕES ARITMÉTICAS *791 ;************************************************************************************792 ; Multiplicação 8x8 793 ; -----------------794 mpy8x8_S795 clrf H_byte796 clrf L_byte797 movlw .8
10
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
798 movwf count ; Count = 8799 movfw mulcnd800 bcf STATUS,C ; Limpar o carry.801 loop 802 rrf mulplr,f803 btfsc STATUS,C804 addwf H_byte,f805 rrf H_byte,f806 rrf L_byte,f807 decfsz count,f808 goto loop809 return810811 ; Subtracção de dupla precisão ( ACCb-ACCa->ACCb)812 ; -----------------------------------------------813 D_sub 814 call neg_A ; Obter o comp2 do valor e depois adiciona-lo.815816 ; Adição de dupla precisão ( ACCb+ACCa->ACCb )817 ; --------------------------------------------818 D_add 819 movfw ACCaLO820 addwf ACCbLO,f ; Adicionar o LSB821 btfsc STATUS,C 822 incf ACCbHI,f823 movfw ACCaHI 824 addwf ACCbHI,f ; Adicionar o MSB825 return826 neg_A 827 comf ACCaLO,f ; Complemento para 1 do valor do ACCa.828 incf ACCaLO,f ; Complemento para 2 do valor do ACCa.829 btfsc STATUS,Z830 decf ACCaHI,f831 comf ACCaHI,f832 return833834 ; Dividir o resultado por 16 e limita-lo entre 0 e 100 835 ; ----------------------------------------------------836 DIV_LMT837 SHIFT ; Dividir o resultado por 2.838 SHIFT ; Dividir o resultado por 2.839 SHIFT ; Dividir o resultado por 2.840 SHIFT ; Dividir o resultado por 2. 841 LMT100842 movlw 0x01 ; Subtrair 1 ao HIGH BYTE, 843 subwf H_byte,w ; para ver se este possui algum valor.844 btfss STATUS,C ; O HIGH BYTE possui algum valor?845 goto L8_E ; Não, então validar apenas o LOW BYTE.846 movlw .100 ; Limitar o L_byte a 100.847 movwf L_byte 848 goto LMT100_EXIT849 L8_E850 movlw .100 ; Limitar a amplitude do valor para 100 em décimal. 851 subwf L_byte,w ; (L_byte - w) -> w 852 btfss STATUS,C ; O resultado é positivo?853 goto LMT100_EXIT ; Sim, então saltar para LMT_EXIT 854 movlw .100 ; Não, então limitar o L_byte a 100.855 movwf L_byte856 LMT100_EXIT857 return858859 ;************************************************************************************860 ; TEMPORIZAÇÃO (ms) *861 ;************************************************************************************862 msDelay863 movwf MsDelayCounter+1864 movwf Time_value ; Guardar o valor de w865 movlw Oscilator_value ; Inicializar o contador (segundo o oscilador usado)866 movwf Counter ; w -> Counter 867 Loop_Quartz_xxMHz868 movfw Time_value ; Time_value -> w869 movwf MsDelayCounter+1870 clrf MsDelayCounter+0871 ;1ms após um ciclo interno872 msDelayLoop873 clrwdt ; Limpar o Watchdog Timer.874 decfsz MsDelayCounter+0,F875 goto msDelayLoop876 clrwdt ; Limpar o Watchdog Timer.877 decfsz MsDelayCounter+1,F
11
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
878 goto msDelayLoop879 decfsz Counter,F880 goto Loop_Quartz_xxMHz881 return882883 ;************************************************************************************884 ; INICIALIZAÇÃO DOS PORTOS *885 ;************************************************************************************886 init_ports887 ; Inicializar PORTS (banco 0 e 1)888 ; -------------------------------889 BANK0 ; Aceder ao banco 0.890 clrf PORTA ; Saídas do PORTA a 0.891 clrf PORTB ; Saídas do PORTB a 0.892 clrf PORTC ; Saídas do PORTC a 0.893 clrf PIR1894 BANK1 ; Aceder ao banco 1.895 movlw ADCON1VAL ; PORTA no modo A/D.896 movwf ADCON1 ; Escrever no registo ADCON1.897 movlw DIRPORTA ; Direcção do PORTA.898 movwf TRISA ; Escrever no registo de direcção TRISA.899 movlw DIRPORTB ; Direcção do PORTB.900 movwf TRISB ; Escrever no registo de direcção TRISB.901 movlw DIRPORTC ; Direcção do PORTC.902 movwf TRISC ; Escrever no registo de direcção TRISC.903904 ; Registo de opções (banco 1)905 ; ---------------------------906 movlw OPTIONVAL ; copiar o valor da constante para o w.907 movwf OPTION_REG ; configurar o registo OPTION_REG com esse valor.908909 ; Limpar RAM banco 0910 ; ------------------911 bcf STATUS,RP0 ; Aceder ao banco 0.912 movlw 0x20 ; Inicialização do apontador,913 movwf FSR ; de endereçamento indirecto.914 init_ram915 clrf INDF ; Limpar a RAM.916 incf FSR,f ; Apontar para o proximo.917 btfss FSR,7 ; Verificar se chegou ao fim(>7Fh).918 goto init_ram ; Se não chegou, continuar no ciclo.919 return920921 ;************************************************************************************922 ; INICIALIZAÇÃO DO TIMER1 *923 ;************************************************************************************924 init_tmr1925 BANK0 ; Aceder ao banco 0.926 movlw B'00000110' ; Configurar o TMR1 no modo contador assíncrono.927 movwf T1CON ; Configurar o registo T1CON com esse valor.928 return929930 ;************************************************************************************931 ; INICIALIZAÇÃO DO TIMER2 *932 ;************************************************************************************933 init_tmr2934 BANK1 ; Aceder ao banco 1.935 movlw PR2VAL ; PR2VAL - > w936 movwf PR2 ; w -> PR2937 BANK0 ; Aceder ao banco 0.938 movlw B'0000100' ; Pós-divisor a 1, pré-divisor a 1, timer ON939 movwf T2CON ; Configurar o registo T2CON com esse valor.940 movlw CCP1CONVAL ; Copiar o valor da constante para o w.941 movwf CCP1CON ; Configurar o registo SSPCON com esse valor.942 clrf CCPR1L ; Inicializar o PWM com o valor zero.943944 ; Inicializar a variável945 ; -----------------------946 movlw COMPTVAL1_tmr2 ; Definir o valor do contador de passagens,947 movwf Contador1_tmr2 ; pela interrupção do TMR2.948 movlw COMPTVAL2_tmr2 ; Definir o valor do contador de passagens,949 movwf Contador2_tmr2 ; pela interrupção do TMR2.950 return951952 ; ///////////////////////////////////////////////////////////////////////////////////953954 ; P R O G R A M A955956 ; ///////////////////////////////////////////////////////////////////////////////////957
12
C:\Documents and Settings\Victor Silva\Ambiente de trabalho\Dissertação\Anexos\PID_LPT.asm
958 ;************************************************************************************959 ; Inicializações *960 ;************************************************************************************961 main_init962 pagesel init_ports963 call init_ports ; Inicialização dos Portos.964965 pagesel init_tmr1966 call init_tmr1 ; Inicialização do TMR1.967 pagesel init_tmr2968 call init_tmr2 ; Inicialização do TMR2.969970 ; Definir o registos de interrupções (banco 1)971 ; --------------------------------------------972 BANK1973 clrf SSPSTAT ; Limpar o registo SSPSTAT.974 movlw PIE1VAL ; Copiar o valor da constante para o w. 975 movwf PIE1 ; Activar as interrupções SSPIE.976 movlw PIE2VAL ; Copiar o valor da constante para o w.977 movwf PIE2 ; Configurar o registo PIE2 com esse valor.978 movlw INTCONVAL ; Copiar o valor da constante para o w.979 movwf INTCON ; Activar as interrupções periféricas e globais.980 BANK0981 goto main982 983 ;************************************************************************************984 ; Corpo principal do programa *985 ;************************************************************************************986 main987 BANK0988 bsf LED_Vida989 main_loop990 BANK0991 clrwdt ; Limpar o Watchdog Timer.992 call Read_order993 call Test_value ; Chamar a função Test_value.994 btfss Status_flag,4 ; O valor da velocidade real foi obtido?995 goto main_loop ; Não, então ...996 call Write_velocity ; Sim, então ... 997 call Controlo 998 goto main_loop999 END1000 ;************************************************************************************1001 ; _/ \_ Fim *1002 ;************************************************************************************1003
13
Anexo III - Programa do microcontrolador relativo à aplicação
pedagógica
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
1 ;************************************************************************************2 ; NOME: PID_RS232.asm *3 ; DATA: 21-08-2008 *4 ; VERSÃO: 1.0 *5 ; AUTOR: Victor Silva *6 ;************************************************************************************7 ; FICHEIRO NECESSÁRIO: p16f876.inc *8 ;************************************************************************************9 ; DESCRIÇÃO: Este estabelece uma comunicação série assíncrona com a porta RS232 * 10 ; do PC através de um MAX232. *11 ; Recebe do PC o valor da velocidade pretendida para o motor, bem como os *12 ; parâmetros para o controlo PID e transmite para o PC o valor da velocidade real *13 ; do motor e o erro actual. * 14 ; - 1 start-bit, 8 bits de dados; 1 bit de paridade par, 1 stop-bit) *15 ; - Velocidade da comunicação definida a 9600 bits/s (9615 bits/s reais). *16 ; - Utilização do modulo USART; *17 ; - O cristal de quartzo utilizado é de 20MHz. *18 ; - A frequência do PWM é de 50KHz. *19 ; - Controlo PID da velocidade do motor. *20 ;************************************************************************************21 ; \\|// *22 ; |º|º| *23 ; \-/ *24 ; /|.|\ Início *25 ;************************************************************************************26 #include <p16f876.inc> ; Definições específicas do uC.2728 __CONFIG _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON &
_HS_OSC 29 errorlevel -302 ; Para eliminar as mensagens relacionadas com o bank 0.3031 ;************************************************************************************32 ; CONSTANTES: *33 ;************************************************************************************34 ; >> Atenção, são endereços e não valores.(movlw e não movfw) <<35 OPTIONVAL EQU B'00000000' ; Valor para o registo OPTION_REG.36 INTCONVAL EQU B'11000000' ; Valor para o registo INTCON.37 PIE1VAL EQU B'00110010' ; Valor para o registo PIE1.38 PIE2VAL EQU B'00000000' ; Valor para o registo PIE2.39 CCP1CONVAL EQU B'00001100' ; Valor para o registo CCP1CON (PWM).40 SSPCONVAL EQU B'00000000' ; Valor para o registo SSPCON (SPI/I2C).41 TXSTAVAL EQU B'01000100' ; Valor para o registo TXSTA (USART). 42 RCSTAVAL EQU B'11010000' ; Valor para o registo RCSTA (USART).43 ADCON1VAL EQU B'00000110' ; Valor para o registo ADCON1 (Analógico/Digital).4445 ; Constante para o Baude Rate46 ; ---------------------------47 SPBRGVAL EQU D'129' ; Para definir o Baud Rate a 9600 bps no modo High Speed.48 ; Baude Rate=Fosc/(16(X+1))=> X=12949 ; Constantes para as dimensões dos buffers (recepção e transmissão)50 ; -----------------------------------------------------------------51 RX_BUF_LEN EQU .96 ; Dimensão do buffer de recepção.52 TX_BUF_LEN EQU RX_BUF_LEN ; Dimensão do buffer de emissão.5354 ; Constantes para a frequência do PWM e o tempo de amostragem55 ; -----------------------------------------------------------56 PR2VAL EQU D'99' ; O Timer 2 conta até (PR2VAL+1)×1×1×0,2µs=20us => f=50KHz57 COMPTVAL1_tmr2 EQU D'99' ; Número de passagem no tmr2:58 COMPTVAL2_tmr2 EQU D'1' ; Número de
passagem=(COMPTVAL1_tmr2+COMPTVAL2_tmr2)×20us=2000us59 ; V=12V=> Tmin(encoder)=40us=> 100*40us=4000us60 ; V=24V=> Tmin(encoder)=20us=> 100*20us=2000us6162 ; DIRECÇÃO DOS PORTOS I/O63 ; -----------------------64 DIRPORTA EQU B'00001111' ; Direcção do PORTA (1=input/0=output)65 DIRPORTB EQU B'00000000' ; Direcção do PORTB (1=input/0=output)66 DIRPORTC EQU B'10111001' ; Direcção do PORTC (1=input/0=output)6768 ;************************************************************************************69 ; DEFINIÇÕES: *70 ;************************************************************************************71 #DEFINE LED_Vida PORTA,5 ; LED ligado ao RA5.72 #DEFINE PARIDADE Serial_flag,0 ; Paridade calculada.73 #DEFINE ER_RX Serial_flag,1 ; Erro de recepção.74 #DEFINE Rec_Start Serial_flag,2 ; Chegada do caracter ''.75 #DEFINE Rec_Stop Serial_flag,3 ; Chegada do caracter ''.76 #DEFINE PWM PORTC,2 ; Linha PWM.77 #DEFINE Oscilator_value .578 ; Oscilator_value=5 para um oscilador de 20 MHz
1
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
79 ; Oscilator_value=4 para um oscilador de 16 MHz80 ; Oscilator_value=3 para um oscilador de 12 MHz81 ; Oscilator_value=2 para um oscilador de 8 MHz82 ; Oscilator_value=1 para um oscilador de 4 MHz8384 ;************************************************************************************85 ; MACROS: *86 ;************************************************************************************87 BANK0 macro ; Aceder ao banco 088 bcf STATUS,RP089 bcf STATUS,RP190 endm9192 BANK1 macro ; Aceder ao banco 1 93 bsf STATUS,RP094 bcf STATUS,RP195 endm9697 BANK2 macro ; Aceder ao banco 298 bcf STATUS,RP099 bsf STATUS,RP1100 endm101102 BANK3 macro ; Aceder ao banco 3103 bsf STATUS,RP0104 bsf STATUS,RP1105 endm106107 SHIFT macro ; Divisão por 2108 bcf STATUS,C109 rrf L_byte,f110 bcf STATUS,C111 rrf H_byte,f112 btfsc STATUS,C113 bsf L_byte,7114 endm115 ;************************************************************************************116 ; DECLARAÇÃO DE VARIÁVEIS DO BANCO 0 *117 ;************************************************************************************118 ; Zona de 80 bytes119 ; ----------------120 CBLOCK 0x20 ; Inicio da zona de variáveis (0x20 à 0x6Fh).121 bufinptr : 1 ; Apontador para o caracter actual do buffer de entrada.122 bufoutptr : 1 ; Apontador para o caracter actual do buffer de saída.123 Serial_flag : 1 ; Conjunto de flags para a comunicação série:124 ; 0 : Paridade calculada.125 ; 1 : Erro na recepção.126 ; 2 : Flag de chegada do caracter ''127 ; 3 : Flag de chegada do caracter ''128129 ; >> Conj. de variáveis necessárias à rotina msDelay <<130 MsDelayCounter : 2 ; Var. para a rotina de tempo msDelay.131 Time_value : 1 ; Var. para a rotina de tempo msDelay.132 Counter : 1 ; Var. para contabilizar as passagens na rotina de tempo
msDelay.133 134 ; >> Conj. de variáveis com os dados<<135 Old_MoR_value : 1 ; Var. com o valor antigo do registo Mode (Speed).136 SpR_value : 1 ; Var. com o valor a escrever no registo Speed.137 Status_flag : 1 ; Conjunto de Flags de estado: 138 ; 2 - Flag de chegada de dados (Sense+Speed).139 ; 4 - Flag de leitura da velocidade do encoder.140 ; 5 - Flag de tempo de amostragem.141 ; 6 - Flag do factor tempo de amostragem.142 143 ; >> Conj. de variáveis necessárias para implementar o controlo PID <<144 Velocidade : 1 ; Var. com o valor da velocidade.145 Vel_ref : 1 ; Var. com o valor da velocidade de referência.146 Contador1_tmr2 : 1 ; Var. para controlar as passagens pela interrupção do Timer2.147 Contador2_tmr2 : 1 ; Var. para controlar as passagens pela interrupção do Timer2.148 erro_antigo : 1 ; Var. com o valor do erro anterior do sistema.149 erro_acum : 1 ; Var. com o valor do erro acumulado.150 erro_medio : 1 ; Var. com o valor do erro medio |erro_actual+erro_antigo|/2.151 erro_2 : 1 ; Var. com o valor do erro(k-2) do sistema.152 de_dt : 1 ; Var. com o valor de/dt.153 SUMLO : 1 ; Var. para guardar o valor do somatório do sistema. 154 SUMHI : 1 ; Var. para guardar o valor do somatório do sistema. 155 PID_flag : 1 ; Conjunto de Flags para o controlo PID:156 ; 0 - Flag de sinal do valor erro_actual157 ; 1 - Flag de sinal do valor erro_antigo
2
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
158 ; 2 - Flag de sinal do valor do de/dt159 ; 3 - Flag de sinal do valor erro_acum160 ; 4 - Flag de sinal do valor erro_medio161 ; 5 - Flag indicadora de erro nulo.162 ; 6 - Flag de sinal do erro(k-2). 163 ; 7 - Flag de sinal do resultado.164 ; >> Conj. de variáveis necessárias para as operações aritméticas <<165 mulcnd : 1 ; Var. com o valor do multiplicando de 8 bits.166 mulplr : 1 ; Var. com o valor do multiplicador de 8 bits.167 H_byte : 1 ; Var. para guardar o MSB do resultado da multiplicação.168 L_byte : 1 ; Var. para guardar o LSB do resultado da multiplicação.169 count : 1 ; Var. para contabilizar as passagens na multiplicação.170 ACCaLO : 1 ; Var. com o LSB de A para a adição. 171 ACCaHI : 1 ; Var. com o MSB de A para a adição.172 ACCbLO : 1 ; Var. com o LSB de B para a adição.173 ACCbHI : 1 ; Var. com o MSB de B para a adição.174 ENDC ; Fim da zona de variáveis. 175176 ;************************************************************************************177 ; DECLARAÇÃO DE VARIÁVEIS NA ZONA COMUM *178 ;************************************************************************************179 ; Zona de 16 bytes180 ; ----------------181 CBLOCK 0x70 ; Inicio da zona de variáveis (0x70 à 0x7Fh).182 ;---------------------------------------------------------------------------183 ; Atenção:184 ; Como agora os parâmetros já não são constantes, a sua leitura na rotina 185 ; de controlo é diferente (movfw e não movlw).186 ;---------------------------------------------------------------------------187 Algoritmo : 1 ; Var. com o valor do algoritmo a aplicar.188 Kp : 1 ; Var. com o valor do termo proporcional.189 Ki : 1 ; Var. com o valor do termo intergral.190 Kd : 1 ; Var. com o valor do termo derivativo.191 MoR_value : 1 ; Var. com o valor a escrever no registo Mode (Speed).192 Vel_actual : 1 ; Var. com o valor da velocidade actual do encoder.193 erro_actual : 1 ; Var. com o valor do erro do sistema |Vref-Vreal|.194 Octeto : 1 ; Var. temporária para colocar os dados no buffer.195 W_temp : 1 ; Backup do registo W.196 STATUS_temp : 1 ; Backup do registo STATUS.197 FSR_temp : 1 ; Backup do registo FSR. 198 PCLATH_temp : 1 ; Backup do registo PCLATH (se o programa>2K).199 Temp : 1 ; Variável temporária200 ENDC ; Fim da zona de variáveis.201202 ;************************************************************************************203 ; DECLARAÇÃO DE VARIÁVEIS DO BANCO 1 *204 ;************************************************************************************205 ; Zona de 80 bytes206 ; ----------------207 CBLOCK 0xA0 ; Inicio da zona de variáveis (0xA0 à 0xEFh).208 ENDC ; Fim da zona de variáveis. 209210 ;************************************************************************************211 ; DECLARAÇÃO DE VARIÁVEIS DO BANCO 2 *212 ;************************************************************************************213 ; Zona de 96 bytes214 ; ----------------215 CBLOCK 0x110 ; Inicio da zona de variáveis (0x110 à 0x16Fh).216 bufin : RX_BUF_LEN ; Zona para o armazenamento dos dados recebidos. 217 ENDC ; Fim da zona de variáveis. 218219 ;************************************************************************************220 ; DECLARAÇÃO DE VARIÁVEIS DO BANCO 3 *221 ;************************************************************************************222 ; Zona de 96 bytes223 ; ----------------224 CBLOCK 0x190 ; Inicio da zona de variáveis (0x190 à 0x1EFh).225 bufout : TX_BUF_LEN ; Zona para o armazenamento dos dados a enviar.226 ENDC ; Fim da zona de variáveis. 227 228 ;------------------------------------------------------------------------------------229 ; ********************** VECTOR DE ARRANQUE APÓS RESET ****************************230 ;------------------------------------------------------------------------------------231 ORG 0x000 ; Endereço de partida após RESET232 clrf PCLATH ; Para seleccionar a página 0 da memória de programa.233 goto main_init ; Salto para a rotina de inicio.234235 ;////////////////////////////////////////////////////////////////////////////////////236 ; I N T E R R U P Ç Õ E S237 ;////////////////////////////////////////////////////////////////////////////////////
3
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
238 ;************************************************************************************239 ; ROTINA DAS INTERRUPÇÕES: *240 ;************************************************************************************241 ; Se não for utilizado o endereçamento indirecto nas interrupções não é necessário 242 ;fazer backup do registo FSR.243 ; Se o programa não ocupar mais de 2K, não é necessário fazer backup do registo 244 ;PCLATH.245 ;------------------------------------------------------------------------------------246 org 0x04 ; Endereço de partida após interrupção247248 ;Backup dos registos249 ;--------------------250 backup_reg:251 movwf W_temp ; Guardar o registo w.252 swapf STATUS,w ; Swap do SATUS e passar para o w.253 movwf STATUS_temp ; Guardar o valor de w em STATUS_temp.254 movf FSR,w ; Passar o valor do FSR para o w.255 movwf FSR_temp ; Guardar o valor do w(FSR) em FSR_temp.256 movf PCLATH,w ; Passar o valor do PCLATH para o w.257 movwf PCLATH_temp ; Guardar o valor do w(PCLATH)em PCLATH_temp.258 clrf PCLATH ; Posicionamento na página de memória 0.259 BANK0 ; Aceder ao banco 0.260261 sw_tmr2: ; Interrupção TMR2:262 bsf STATUS,RP0 ; Aceder ao banco 1.263 btfss PIE1,TMR2IE ; Verificar se a interrupcção foi autorizada.264 goto sw_rusart ; Se não, testar outra interrupção.265 bcf STATUS,RP0 ; Se sim, aceder ao banco 0.266 btfss PIR1,TMR2IF ; Verifivar se a flag foi activada.267 goto sw_rusart ; Se a flag não está activada testar outra interrupção.268 call int_tmr2 ; Se sim, executar a interrupção.269 bcf PIR1,TMR2IF ; Apagar a flag de interrupção.270 goto restore_reg ; Restaurar os registos.271272 sw_rusart: ;Interrupção recepção USART:273 bsf STATUS,RP0 ; Aceder ao banco 1.274 btfss PIE1,RCIE ; Verificar se a interrupcção foi autorizada.275 goto sw_tusart ; Se não, testar outra interrupção.276 bcf STATUS,RP0 ; Se sim, aceder ao banco 0.277 btfss PIR1,RCIF ; Verifivar se a flag foi activada.278 goto sw_tusart ; Se a flag não está activada testar outra interrupção.279 call int_rusart ; Se sim, executar a interrupção.280 ; ESTA FLAG NÂO DEVE SER COLOCADA A 0. A LEITURA DO RCREG OCUPA-SE DISSO.281 goto restore_reg ; Restaurar os registos.282283 sw_tusart: ; Interrupção transmissão USART:284 bsf STATUS,RP0 ; Aceder ao banco 1.285 btfss PIE1,TXIE ; Verificar se a interrupcção foi autorizada.286 goto restore_reg ; Se não, testar outra interrupção.287 bcf STATUS,RP0 ; Se sim, aceder ao banco 0.288 btfss PIR1,TXIF ; Verifivar se a flag foi activada.289 goto restore_reg ; Se a flag não está activada testar outra interrupção.290 call int_tusart ; Se sim, executar a interrupção.291 ; ESTA FLAG NÂO DEVE SER COLOCADA A 0. A LEITURA DO TXREG OCUPA-SE DISSO.292 goto restore_reg ; Restaurar os registos.293294 ;Restauro dos registos295 ;---------------------296 restore_reg:297 movf PCLATH_temp,w ; Carrega o antigo PCLATH.298 movwf PCLATH ; Restaura o PCLATH.299 movf FSR_temp,w ; Carrega o antigo FSR. 300 movwf FSR ; Restaura o FSR.301 swapf STATUS_temp,w ; Swap do W_temp e guarda-o em w.302 movwf STATUS ; Restauro do registo STATUS.303 swapf W_temp,f ; Inversão do L e do H no antigo w, sem alterar o Z.304 swapf W_temp,w ; Reinversão do L e do H no antigo w. 305 ; w restaurado sem modificar o status.306 retfie ; Return from interrupt.307308 ; ///////////////////////////////////////////////////////////////////////////////////309 ; S U B - R O T I N A S :310 ; ///////////////////////////////////////////////////////////////////////////////////311312 ;************************************************************************************313 ; >INTERRUPÇÃO TIMER 2< *314 ;************************************************************************************315 int_tmr2316317 BANK0
4
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
318 ; Actualizar o valor do PWM319 ; ------------------------320 movfw SpR_value ; SpR_value -> w321 movwf CCPR1L ; w -> CCPR1L322 ; Obter o valor da Velocidade real de rotação323 ; -------------------------------------------324 btfsc Status_flag,5 ; A flag de tempo de amostragem foi activada?325 goto Count_loop ; Sim então, ir para...326 bcf T1CON,TMR1ON ; Não então, parar contagem do TMR1327 bsf Status_flag,5 ; Activar a flag de tempo de amostragem.328 clrf TMR1L ; Limpar o TMR1L329 clrf TMR1H ; Limpar o TMR1H330 bsf T1CON,TMR1ON ; Iniciar a contagem do TMR1331 Count_loop332 btfsc Status_flag,6 ; A flag do factor tempo de amostragem foi activada?333 goto Count_loop1334 decfsz Contador1_tmr2335 return336 Count_loop1337 bsf Status_flag,6 ; Activar a flag do factor tempo de amostragem.338 decfsz Contador2_tmr2339 return340 bcf T1CON,TMR1ON ; Parar contagem do TMR1341 movf TMR1L,w ; TMR1L -> w342 movwf Vel_actual ; w -> Vel_actual343 movlw COMPTVAL1_tmr2 ; Reiniciar o valor do contador de passagens,344 movwf Contador1_tmr2 ; pela interrupção do TMR2.345 movlw COMPTVAL2_tmr2 ; Reiniciar o valor do contador de passagens,346 movwf Contador2_tmr2 ; pela interrupção do TMR2.347 bcf Status_flag,6 ; Reiniciar a flag do factor tempo de amostragem.348 bcf Status_flag,5 ; Reiniciar a flag de tempo de amostragem.349 bsf Status_flag,4 ; Activar a flag de leitura da velocidade do encoder.350 return ; fim da sub-rotina de interrupção TMR2351352 ;************************************************************************************353 ; >INTERRUPÇÃO RECEPÇÃO USART< *354 ;************************************************************************************355 ;-----------------------------------------------------------------------------356 ; Recebe o caracter da USART e é colocado no buffer de entrada.357 ; Se a dimensão actual do buffer for igual á máxima definida, não é armazenado 358 ; mais nenhum valor e é colocado na ultima posição posição o caracter ''.359 ; Se a recepção terminou (comprimento máximo ou '' recebido, as interrupções 360 ; de recepção são interrompidas e o apontador é redireccionado para o inicio 361 ; do buffer.362 ; Os erros são detectados e assinalados.363 ;-----------------------------------------------------------------------------364 int_rusart365 BANK0 ; Aceder ao banco 0.366367 ; Verificar se ocorreu um erro de trama368 ; -------------------------------------369 btfsc RCSTA,FERR ; Ocorreu um erro de trama?370 bsf ER_RX ; Sim, então assinalar o erro de trama.371 ; Não então continuar.372 ; Obter o octeto recebido373 ; -----------------------374 movf RCREG,w ; Carregar o octeto375 movwf Octeto ; Guardar na variável temporária.376377 ; Verificar a paridade378 ; --------------------379 movf Octeto,w ; Carregar o octeto recebido.380 call calcpar ; Calcular a paridade.381 movf RCSTA,w ; Carregar o valor recebido.382 xorwf Serial_flag,w ; Comparar a paridade recebida com a calculada.383 andlw 0x01 ; 384 btfss STATUS,Z ; b0 = b1? (Paridade calculada = paridade recebida?)385 bsf ER_RX ; Não, então assinalar o erro de paridade.386387 ; Verificar se ocorreu algum erro388 ; -------------------------------389 BANK0390 btfss ER_RX ; Ocorreu algum erro durante a recepção? 391 goto rusart_1 ; Não, então...392 goto intrcend ; Sim, então...393394 ; O caracter '' já foi recebido395 ; -------------------------------396 rusart_1397 btfss Rec_Start ; O caracter '' já foi recebido?
5
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
398 goto rusart_2 ; Não, então...399 goto rusart_3 ; Sim, então...400401 ; Verificar se o caracter recebido é igual a ''402 ; -----------------------------------------------403 rusart_2404 movf Octeto,w ; Carregar o caracter recebido.405 xorlw '' ; Compara-lo com o caracter ''406 btfss STATUS,Z ; É igual?407 goto intrcend ; Não, então... 408 bsf Rec_Start ; Sim, então...409410 ; Guardar o octeto recebido no buffer 411 rusart_3 ; -----------------------------------412 bsf STATUS,IRP ; Aceder aos bancos 2 e 3 no modo de endereçamento indirecto.413 movf bufinptr,w ; Carregar o apontador de destino,414 movwf FSR ; no apontador de endereço.415 movf Octeto,w ; Carregar o octeto recebido.416 movwf INDF ; Guarda-lo no buffer.417418 ; Verificar se o caracter recebido é igual a ''419 ; -----------------------------------------------420 movf Octeto,w ; Carregar o caracter recebido.421 xorlw '' ; Compara-lo com o caracter ''.422 btfss STATUS,Z ; É igual?423 goto rusart_4 ; Não então,...424 bsf Rec_Stop ; Sim, então...425 goto intrcend426427 ; Verificar se o buffer está cheio428 rusart_4 ; --------------------------------429 incf bufinptr,f ; Incrementar o apontador de carateres.430 movf FSR,w ; Carregar o apontador.431 xorwf (RX_BUF_LEN +.15),W ; Comparar com a última posição possivel.432 btfss STATUS,Z ; É igual?433 return ; Não, então fim da recepção.434 incf FSR,f ; Sim, então apontar para a última posição435 movlw '' ; Carregar o caracter ''.436 movwf INDF ; Guarda-lo na última posição do buffer.437438 ; Fim da recepção439 ; ---------------440 intrcend441 BANK0442 movlw LOW bufin ; Endereço da primeira posição do buffer de entrada.443 movwf bufinptr ; O próximo caracter será o primeiro.444 return ; Fim da sub-rotina de interrupção RUSART445446 ;************************************************************************************447 ; >INTERRUPÇÃO TRANSMISSÃO USART< *448 ;************************************************************************************449 ;-----------------------------------------------------------------------------450 ; Envio do caracter apontado pelo bufoutptr, e é incrementado o apontador.451 ; Se o caracter recebido for o '' a transmissão é interrompida e é apontado 452 ; novamente o inicio do buffer.453 ;-----------------------------------------------------------------------------454 int_tusart455 ; Obter o octeto a enviar456 ; -----------------------457 bsf STATUS,IRP ; Apontar para os bancos 3 e 4 no modo endereçamento indirecto. 458 movf bufoutptr,w ; Passar o apontador de octetos459 movwf FSR ; para o apontador.460 movf INDF,w ; Carregar o octeto a enviar.461462 ; Calcular a paridade463 ; -------------------464 call calcpar ; Calcular a paridade.465 bsf STATUS,RP0 ; Aceder ao banco 1.466 bcf TXSTA,TX9D ; Definir por defeito, paridade= 0467 btfsc PARIDADE ; Paridade = 1?468 bsf TXSTA,TX9D ; Sim, então definir a paridade= 1.469 ; Não, então manter a paridade= 0. 470 ; Envio do octeto471 ; ---------------472 movf INDF,w ; Carregar o octeto a enviar.473 bcf STATUS,RP0 ; Aceder ao banco 0.474 movwf TXREG ; Enviar o octeto + paridade.475 incf bufoutptr,f ; Apontar para o octeto seguinte.476477 ; Verificar se se trata do último octeto
6
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
478 ; --------------------------------------479 xorlw '' ; Comparar o octeto enviado com o caracter ''.480 btfss STATUS,Z ; É igual?481 return ; Não, então sair da interrupção.482 ; Sim, então tratar do fim da emissão.483 ; Fim da transmissão484 ; ------------------485 bsf STATUS,RP0 ; Aceder ao banco 1.486 bcf PIE1,TXIE ; Fim das interrupções de emissão USART.487 bcf STATUS,RP0 ; Voltar ao banco 0.488 movlw LOW bufout ; Endereço da primeira posição do buffer de saída.489 movwf bufoutptr ; O próximo caracter será primeiro.490 return ; Fim da sub-rotina de interrupção TUSART491492 ;************************************************************************************493 ; CALCULO DA PARIDADE *494 ;************************************************************************************495 calcpar496 movwf Temp ; Guardar na variável(temporária)497 bcf PARIDADE ; Definir a paridade como sendo par.498 calcparl499 andlw 0x01 ; Testar o bit 0 do octeto recebido.500 xorwf Serial_flag,f ; Se " 1 ", inverter a polaridade.501 bcf STATUS,C ; Limpar o carry para deslocamento.502 rrf Temp,f ; Deslocar o bit seguinte para a posição 0.503 movf Temp,w ; Carregar o que resta do octeto.504 btfss STATUS,Z ; Ainda possui bits a " 1 "?505 goto calcparl ; Sim, então continuar.506 return ; Não, então sair.507508 ;************************************************************************************509 ; OBTER OS DADOS RECEBIDOS *510 ;************************************************************************************511 ReceiveSerial512 bsf STATUS,IRP ; Apontar para os bancos 3 e 4 no modo endereçamento indirecto. 513 movf bufinptr,w ; Passar o apontador de octetos514 movwf FSR ; para o apontador.515 GetData_1516 movf INDF,w ; Carregar o octeto.517 xorlw '' ; Compara-lo com o caracter ''518 btfsc STATUS,Z ; É igual?519 goto GetData_2 ; Sim, então...520 incf FSR,f ; Não, então incrementar o apontador.521 goto GetData_1 ;522 GetData_2523 incf FSR,f ; Incrementar o apontador.524 movf INDF,w ; Carregar o octeto.525 movwf Algoritmo526 incf FSR,f ; Incrementar o apontador.527 movf INDF,w ; Carregar o octeto.528 movwf Kp529 incf FSR,f ; Incrementar o apontador.530 movf INDF,w ; Carregar o octeto.531 movwf Ki532 incf FSR,f ; Incrementar o apontador.533 movf INDF,w ; Carregar o octeto.534 movwf Kd535 incf FSR,f ; Incrementar o apontador.536 movf INDF,w ; Carregar o octeto.537 movwf MoR_value538 BANK0539 bsf Status_flag,2 ; Activar a flag de chegada de dados (Parâmetros+Speed)540 bcf Rec_Start541 bcf Rec_Stop542 movlw LOW bufin ; Endereço da primeira posição do buffer de entrada.543 movwf bufinptr ; O próximo caracter será o primeiro.544 return545 ;************************************************************************************546 ; TRANSMITIR OS DADOS PARA O PC *547 ;************************************************************************************548 TransmitSerial549550 ; Transmissão para o PC551 ; ----------------------552 BANKSEL bufout ; Aceder ao banco 3553 movlw ""554 movwf bufout555 movfw Vel_actual556 movwf bufout+1557 movlw "|"
7
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
558 movwf bufout+2559 movfw erro_actual560 movwf bufout+3561 movlw ""562 movwf bufout+4563564 ; Proceder ao envio da mensagem565 ; ------------------------------566 BANK1567 bsf TXSTA,TXEN ; Activar a interrupção.568 bsf PIE1,TXIE ;569570 ; Aguardar o fim da emissão571 ; -------------------------572 clrwdt573 btfsc PIE1,TXIE ; Ainda existem caracteres para enviar?574 goto $-2 ; Sim, então aguardar.575 btfss TXSTA,TRMT ; O buffer de saída está vazio?576 goto $-4 ; Não, então aguardar.577 BANK0578 return579580 ;************************************************************************************581 ; FUNÇÃO PARA VERIFICAR SE O VALOR RECEBIDO É NOVO *582 ;************************************************************************************583 Test_value584 BANK0585 movfw MoR_value ; MoR_value -> w.586 xorwf Old_MoR_value,w ; (w)xor(f)-> w.587 btfss STATUS,Z ; O valor lido é diferente?588 call Det_valor ; Sim, então chamar a função Det_valor589 return ; Não, então sair.590 ;************************************************************************************591 ; FUNÇÃO PARA DETERMINAR O VALOR A APLICAR *592 ;************************************************************************************593 Det_valor594 ; Determinar o valor aplicar595 ; ---------------------------596 movfw MoR_value ; MoR_value -> w.597 movwf Old_MoR_value ; Actualizar o valor antigo.598 movwf Velocidade ; w -> Velocidade599 call Sentido_directo ; Chamar a função Sentido directo600 bcf Status_flag,2 ; Reiniciar a flag de chegada de dados (Sense+Speed).601 clrf erro_acum ; Limpar o erro acumulado.602 clrf erro_antigo ; Limpar o valor da variável erro_antigo.603 clrf PID_flag ; Limpar as flags de controlo.604 return605606 ;************************************************************************************607 ; FUNÇÃO SENTIDO DIRECTO *608 ;************************************************************************************609 Sentido_directo610 movfw Velocidade611 movwf Vel_ref ; Actualizar a velocidade de referência.612 movwf SpR_value ; Speed (0-127). 613 return614615 ;************************************************************************************616 ; FUNÇÃO PARA IMPLEMENTAR O CONTROLO PID DA VELOCIDADE *617 ;************************************************************************************618 Controlo619 clrwdt ; Limpar o Watchdog Timer620 bcf PID_flag,5 ; Inicializar a flag de erro nulo.621 movfw Algoritmo ; Algoritmo -> w.622 xorlw 0x01623 btfsc STATUS,Z ; O valor lido é igual a 0x01?624 goto Algoritmo_1 ; Sim, então ir para...625 movfw Algoritmo ; Não então, Algoritmo -> w.626 xorlw 0x02627 btfsc STATUS,Z ; O valor lido é igual a 0x02?628 goto Algoritmo_2 ; Sim, então ir para...629 movfw Algoritmo ; Não então, Algoritmo -> w.630 xorlw 0x03631 btfsc STATUS,Z ; O valor lido é igual a 0x03?632 goto Algoritmo_3 ; Sim, então ir para...633 movfw Algoritmo ; Não então, Algoritmo -> w.634 xorlw 0x04635 btfsc STATUS,Z ; O valor lido é igual a 0x04?636 goto Algoritmo_4 ; Sim, então ir para...637 movfw Algoritmo ; Não então, Algoritmo -> w.
8
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
638 bcf Status_flag,4 ; Reiniciar a flag de leitura da velocidade do encoder.639 return640641 ;************************************************************************************642 ; FUNÇÃO PARA IMPLEMENTAR O ALGORITMO DE CONTROLO 1 *643 ;************************************************************************************644 ; Partindo da expressão simplificada:645 ; u(k)=p(k)+i(k)+d(k) onde p(k) é o termo proporcional, i(k) é o termo integral e 646 ; d(k) é o termo derivativo. 647 ; p(k)= (Kp × erro_actual)648 ; i(k)= ((Ki × erro_actual) + erro_acum))649 ; d(k)= (Kd × (erro_actual - erro_antigo))650 ;------------------------------------------------------------------------------------651 Algoritmo_1652 clrf SUMHI ; Iniciarlizar MSB do somatório.653 clrf SUMLO ; Iniciarlizar LSB do somatório.654 call C_ERROR ; Calcular o erro.655 btfsc PID_flag,5 ; O erro actual do sitema é nulo?656 return ; Sim, então sair.657 call C_PROP ; Calcular o termo proporcional.658 call C_INT ; Calcular o termo integral.659 call C_DIFF ; Calcular o termo diferencial.660 goto L_SUMM661662 ;************************************************************************************663 ; FUNÇÃO PARA IMPLEMENTAR O ALGORITMO DE CONTROLO 2 *664 ;************************************************************************************665 ; Partindo da expressão simplificada:666 ; u(k)=p(k)+i(k)+d(k) onde p(k) é o termo proporcional, i(k) é o termo integral e 667 ; d(k) é o termo derivativo. 668 ; p(k)= Kp × erro_actual669 ; i(k)= Ki (((erro_actual + erro_antigo)/2) + erro_acum) 670 ; d(k)= Kd × (erro_actual - erro_antigo)671 ;------------------------------------------------------------------------------------672 Algoritmo_2673 clrf SUMHI ; Iniciarlizar MSB do somatório.674 clrf SUMLO ; Iniciarlizar LSB do somatório.675 call C_ERROR ; Calcular o erro.676 btfsc PID_flag,5 ; O erro actual do sitema é nulo?677 return ; Sim, então sair.678 call C_PROP ; Calcular o termo proporcional.679 call C_INT_1 ; Calcular o termo integral_1.680 call C_DIFF ; Calcular o termo diferencial.681 goto L_SUMM682683 ;************************************************************************************684 ; FUNÇÃO PARA IMPLEMENTAR O ALGORITMO DE CONTROLO 3 *685 ;************************************************************************************686 ; Partindo da expressão simplificada:687 ; u(k)=p(k)+i(k)+d(k) onde p(k) é o termo proporcional, i(k) é o termo integral e 688 ; d(k) é o termo derivativo. 689 ; p(k)= Kp × erro_actual690 ; i(k)= SUM(Ki) 691 ; d(k)= Kd × (erro_actual - erro_antigo)692 ;------------------------------------------------------------------------------------693 Algoritmo_3694 clrf SUMHI ; Iniciarlizar MSB do somatório.695 clrf SUMLO ; Iniciarlizar LSB do somatório.696 call C_ERROR ; Calcular o erro.697 btfsc PID_flag,5 ; O erro actual do sitema é nulo?698 return ; Sim, então sair.699 call C_PROP ; Calcular o termo proporcional.700 call C_INT_2 ; Calcular o termo integral_2.701 call C_DIFF ; Calcular o termo diferencial.702 goto L_SUMM703704 ;************************************************************************************705 ; FUNÇÃO PARA IMPLEMENTAR O ALGORITMO DE CONTROLO 4 *706 ;************************************************************************************707 ; u(k)= Kp×[erro_actual-erro_antigo] + Ki×erro_actual + 708 ; + Kd×[erro_actual - 2×erro_antigo + erro_antigo_2] + u(k-1) onde p(k) é o termo 709 ; proporcional, i(k) é o termo integral e d(k) é o termo derivativo.710 ; p(k)= Kp×[erro_actual-erro_antigo]711 ; i(k)= Ki×erro_actual 712 ; d(k)= Kd×[erro_actual - 2×erro_antigo + erro_antigo_2] + u(k-1)713 ;------------------------------------------------------------------------------------714 Algoritmo_4715 call C_ERROR ; Calcular o erro.716 btfsc PID_flag,5 ; O erro actual do sitema é nulo?717 return ; Sim, então sair.
9
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
718 call C_PROP_1 ; Calcular o termo proporcional.719 call C_INT_3 ; Calcular o termo integral_2.720 call C_DIFF_1 ; Calcular o termo diferencial.721 goto L_SUMM722723 ; Cálculo do erro do sistema: 724 ; ------------------------------------------------------------------------725 ; NOTA: O valor do erro do sistema obtem-se calculando a diferença entre o 726 ; valor de referência e o valor no instante k ou valor actual.727 ; erro_actual=(Vel_ref - Vel_actual) 728 ; ------------------------------------------------------------------------729 C_ERROR730 movfw Vel_actual ; Vel_actual -> w 731 subwf Vel_ref,w ; Vel_ref - w -> w732 btfss STATUS,C ; O erro é positivo?733 goto MNS_ER ; Não, então ir para "MNS_ER".734 PLS_ER ; Sim, então executar "PLS_ER".735 movwf erro_actual ; Passar o resultado para a variável erro_actual.736737 ; Verificar se o valor do erro_actual é igual a zero738 ; --------------------------------------------------739 movfw erro_actual740 btfsc STATUS,Z ; erro_actual = 0?741 bsf PID_flag,5 ; Sim, então activar a flag de erro nulo.742 btfsc STATUS,Z ; erro_actual = 0?743 goto ERROR_BKP ; Sim, então ir para "ERROR_BKP".744 bcf PID_flag,0 ; Não, então activar a flag indicadora de erro 745 goto CE_EXIT ; positivo e aplicar o controlo.746 MNS_ER747 movfw Vel_ref ; Vel_ref -> w748 subwf Vel_actual,w749 movwf erro_actual750 bsf PID_flag,0 ; Activar a flag indicadora de erro negativo.751 CE_EXIT752 return753754 ; Cálculo do termo proporcional: 755 ; ------------------------------------------------------------------------756 ; NOTA: O termo proporcional obtem-se através do produto do ganho do 757 ; termo proporcional pelo erro do sistema (Kp × erro_actual). Este termo 758 ; está limitado entre +/-100. Quanto maior for o ganho proporcional menor 759 ; será o tempo de subida do sistema, mas em contrapartida, maiores terão 760 ; que ser os ganhos integral e derivativo de modo a tornar o sistema 761 ; estável.762 ; p(t)= Kp × erro_actual763 ; ------------------------------------------------------------------------ 764 C_PROP765 movfw erro_actual ; erro_actual -> w 766 movwf mulcnd 767 movfw Kp768 movwf mulplr769 call mpy8x8_S ; Multiplicar Kp x erro_actual.770 call LMT100 ; Limitar o valor entre 0 e 100.771 RESTORE_SGN772 btfss PID_flag,0 ; O erro calculado é positivo?773 goto ADDPROP ; Sim, então ir para...774 comf L_byte,f ; Não, então cálcular o complemento 775 incf L_byte,f ; para 2 do L_byte.776777 ; Adicionar o valor do termo proporcional ao somatório 778 ; ----------------------------------------------------779 ADDPROP780 movfw L_byte ; Adicionar o valor do ganho proporcional781 addwf SUMLO,f ; ao somatório.782 btfsc STATUS,C ; Foi gerado um "CARRY-OUT"?783 incf SUMHI,f ; Sim, então...784 movlw 0x00 ; Não, então...785 btfsc SUMLO,7 ; O MSbit de SUMLO é 1?786 movlw 0xFF ; Sim, então 0xFF -> w787 addwf SUMHI,f ; SUMHI + w -> SUMHI788 CP_EXIT789 return790791 ; Cálculo do termo proporcional_1: 792 ; ------------------------------------------------------------------------793 ; p(t)=( Kp×[erro_actual-erro_antigo])794 ; ------------------------------------------------------------------------ 795 C_PROP_1796 movfw erro_actual ; Passar o valor do erro_actual para o registo w. 797 btfss PID_flag,0 ; O valor do erro_actual é positivo?
10
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
798 goto LO_BYTE_P ; Sim, então ir para... 799 comf erro_actual,f ; Não, então cálcular o complemento para 2 800 incf erro_actual,w ; desse valor.801 comf erro_actual,f ; Restaurar o valor do erro_actual. 802 LO_BYTE_P803 movwf ACCbLO ; Para subtração804 movlw 0x00805 btfsc PID_flag,0 ; Passar o sinal para o Byte mais significativo.806 movlw 0xFF807 movwf ACCbHI808 movfw erro_antigo ; Passar o valor do erro_antigo para o registo w. 809 btfss PID_flag,1 ; O valor do erro_antigo é positivo?810 goto LO_BYTEO_P ; Sim, então ir para... 811 comf erro_antigo,f ; Não, então cálcular o complemento para 2 812 incf erro_antigo,w ; desse valor.813 comf erro_antigo,f ; Restaurar o valor do erro_antigo. 814 LO_BYTEO_P815 movwf ACCaLO ; Para subtração816 movlw 0x00817 btfsc PID_flag,1 ; Passar o sinal para o Byte mais significativo.818 movlw 0xFF819 movwf ACCaHI820 call D_sub ; erro_actual - erro_antigo821 STRIP_SGN1822 btfsc ACCbHI,7 ; O sinal do resultado é positivo?823 goto NEG_ABS1 ; Não, então ir para...824 goto POS_ABS1 ; Sim, então ir para... 825 NEG_ABS1826 bsf PID_flag,2 ; O resultado é negativo, então colocar a flag a 1 e827 comf ACCbLO,f ; cálcular o complemento para 2 do resultado.828 incf ACCbLO,w829 movwf de_dt 830 goto MULT_Kp831 POS_ABS1832 bcf PID_flag,2 ; O resultado é positivo, então colocar a flag a 0 e833 movfw ACCbLO ; guardar o resultado.834 movwf de_dt835836 ; Multiplicar o resultado por Kp837 ; ------------------------------838 MULT_Kp839 movfw de_dt ; Passar o valor do de/dt para o multiplicando.840 movwf mulcnd ; 841 movfw Kp ; Passar o valor do Kp para o multiplicador.842 movwf mulplr ; 843 call mpy8x8_S ; Multiplicar (de_dt) x Kp844 call LMT100 ; Limitar o valor entre 0 e 100.845 RE_SGN1846 ;---------847 movfw L_byte848 btfsc STATUS,Z ; O termo derivativo é nulo?849 goto CP1_EXIT ; Sim, então ir para...850 ;---------851 btfss PID_flag,2 ; O de_dt é positivo?852 goto ADDPROP1 ; Sim, então ir para...853 comf L_byte,f ; Não, então cálcular o complemento 854 incf L_byte,f ; para 2 do L_byte.855856 ; Adicionar o termo proporcional ao somatório 857 ; -------------------------------------------858 ADDPROP1859 movlw 0x00860 btfsc PID_flag,2 ; O sinal do valor de_dt é positivo? 861 movlw 0xFF ; Não, então aplicar o sinal negativo ao MSB.862 movwf ACCbHI ; Sim, então aplicar o sinal positivo ao MSB.863 movfw L_byte ; Passar o valor de L_byte -> w. 864 movwf ACCbLO ; w -> ACCbLO865 movfw SUMLO ; Passar o valor actual do SUMLO -> w.866 movwf ACCaLO ; w -> ACCaLO. 867 movfw SUMHI ; Passar o valor actual do SUMHI -> w.868 movwf ACCaHI ; w -> ACCaHI.869 call D_add ; Chamar a função de adição.870 movfw ACCbLO ; Guardar os valores resultantes em871 movwf SUMLO ; SUMLO e SUMHI respectivamente.872 movfw ACCbHI873 movwf SUMHI874 CP1_EXIT875 return876877 ; Cálcular o termo integral:
11
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
878 ; ------------------------------------------------------------------------879 ; NOTA: O termo integral advém do valor do erro acumulado durante o 880 ; processo. Por mais pequeno que seja o erro se este persistir durante 881 ; algum tempo irá originar um valor considerável no acumulador, de modo a 882 ; actuar o sistema. O valor do termo integral pode ser obtido através do 883 ; produto do Ki pelo somatório do erro (Ki × erro_acum). Tal como no 884 ; termo proporcional o termo integral também está limitado para +/-100.885 ; i(k)= (Ki × erro_actual) + erro_acum886 ; ------------------------------------------------------------------------ 887 C_INT888 btfss PID_flag,3 ; O erro acumulado é positivo?889 goto ACUM_P ; Sim, então ir para...890 ACUM_N ; Não, então...891 btfsc PID_flag,0 ; Verificar o sinal do valor do erro_actual.892 goto MNS_0 ; É negativo, então ir para...893 PLS_0 ; É positivo, então...894 ; erro_actual positivo e erro_acum negativo:895 ; -----------------------------------------896 movfw erro_actual ; erro_actual -> w 897 movwf mulcnd 898 movfw Ki899 movwf mulplr900 call mpy8x8_S ; Multiplicar Ki x erro_actual.901 call LMT100 ; Limitar o valor entre 0 e 100.902 movfw L_byte ; L_byte -> w903 comf erro_acum,f ; Cálcular o complemento para 2 do 904 incf erro_acum,f ; erro_acum.905 movfw L_byte ; L_byte -> w906 addwf erro_acum,f ; erro_acum= erro_acum + (Ki x erro_actual) 907 btfss erro_acum,7 ; Verificar o sinal do acumulador de erro.908 bcf PID_flag,3 ; É positivo, então definir o sinal.909 btfss erro_acum,7 ; Verificar o sinal do acumulador de erro.910 goto SIGN_TI ; É positivo, então...911 bsf PID_flag,3 ; É negativo, então definir o sinal.912 comf erro_acum,f ; Cálcular o complemento para 2 913 incf erro_acum,f ; do erro_acum.914 goto SIGN_TI ; Aplicar o sinal no termo integral.915 MNS_0 916 ; erro_actual negativo e erro_acum negativo:917 ; -----------------------------------------918 bsf PID_flag,3 ; Definir o erro_acum como sendo negativo.919 movfw erro_actual ; erro_actual -> w 920 movwf mulcnd 921 movfw Ki922 movwf mulplr923 call mpy8x8_S ; Multiplicar Ki x erro_actual.924 call LMT100 ; Limitar o valor entre 0 e 100.925 movfw L_byte ; L_byte -> w926 addwf erro_acum,f ; erro_acum= |erro_acum|+(Ki × |erro_actual|)927 goto SIGN_TI ; Aplicar o sinal no termo integral.928 ACUM_P929 btfsc PID_flag,0 ; Verificar o sinal do valor do erro_actual.930 goto MNS_1 ; É negativo, então ir para...931 PLS_1 ; É positivo, então...932 ; erro_actual positivo e erro_acum positivo:933 ; -----------------------------------------934 bcf PID_flag,3 ; Definir o erro_acum como sendo positivo.935 movfw erro_actual936 movfw erro_actual ; erro_actual -> w 937 movwf mulcnd 938 movfw Ki939 movwf mulplr940 call mpy8x8_S ; Multiplicar Ki x erro_actual.941 call LMT100 ; Limitar o valor entre 0 e 100.942 movfw L_byte ; L_byte -> w943 addwf erro_acum,f ; erro_acum= |erro_acum|+(Ki × |erro_actual|)944 goto SIGN_TI ; Aplicar o sinal no termo integral.945 MNS_1 946 ; erro_actual negativo e erro_acum positivo:947 ; ----------------------------------------- 948 movfw erro_actual ; erro_actual -> w 949 movwf mulcnd 950 movfw Ki951 movwf mulplr952 call mpy8x8_S ; Multiplicar Ki x erro_actual.953 call LMT100 ; Limitar o valor entre 0 e 100.954 movfw L_byte ; L_byte -> w955 comf L_byte,f ; Cálcular o complemento para 2 do 956 incf L_byte,f ; L_byte.957 movfw L_byte ; L_byte -> w
12
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
958 addwf erro_acum,f ; erro_acum= erro_acum + (-Ki x erro_actual) 959 btfss erro_acum,7 ; Verificar o sinal do acumulador de erro.960 bcf PID_flag,3 ; É positivo, então definir o sinal.961 btfss erro_acum,7 ; Verificar o sinal do acumulador de erro.962 goto SIGN_TI ; É positivo, então...963 bsf PID_flag,3 ; É negativo, então definir o sinal.964 comf erro_acum,f ; Cálcular o complemento para 2 965 incf erro_acum,f ; do erro_acum.966 SIGN_TI967 movfw erro_acum ; |erro_acum| -> w968 movwf L_byte ; w -> L_byte969 call LMT100 ; Limitar o valor entre 0 e 100.970 movfw L_byte ; L_byte - > w971 movwf erro_acum ; w -> erro_acum972 btfsc PID_flag,3 ; O sinal do acumulador de erro é positivo?973 goto TI_N ; Não, então ir para ...974 TI_P ; Sim, então...975 goto ADDINT976 TI_N977 comf L_byte,f ; Cálcular o complemento para 2 978 incf L_byte,f ; desse valor.979980 ; Adicionar o valor do termo integral ao somatório 981 ; ------------------------------------------------982 ADDINT983 movfw L_byte ; L_byte -> w984 addwf SUMLO,f ; SUMLO= SUMLO + w 985 btfsc STATUS,C ; Foi gerado um "CARRY-OUT"?986 incf SUMHI,f ; Sim, então...987 movlw 0x00 ; Não, então...988 btfsc PID_flag,3 ; O erro_acum é negativo?989 movlw 0xFF ; Sim, então 0xFF -> w990 addwf SUMHI,f ; SUMHI + w -> SUMHI 991 CI_EXIT992 return993 994 ; Cálcular o termo integral_1: 995 ; ------------------------------------------------------------------------996 ; NOTA: O termo integral advém do valor do erro acumulado durante o 997 ; processo. Por mais pequeno que seja o erro se este persistir durante 998 ; algum tempo irá originar um valor considerável no acumulador, de modo a 999 ; actuar o sistema. Neste caso o termo integral advém do produto do KI 1000 ; pelo somatório do erro médio acumulado. Tal como no termo proporcional o 1001 ; termo integral também está limitado para +/-100.1002 ; i(k)= (Ki ((erro_actual + erro_antigo)/2) + erro_acum) 1003 ; ------------------------------------------------------------------------ 1004 C_INT_11005 btfsc PID_flag,1 ; Verificar o sinal do valor do erro_antigo.1006 goto erro_antigo_N ; É negativo, então ir para...1007 erro_antigo_P1008 btfsc PID_flag,0 ; Verificar o sinal do valor do erro_actual.1009 goto erro_actual_N ; É negativo, então ir para... 1010 erro_actual_P1011 ; Erro antigo positivo e erro actual positivo1012 ; -------------------------------------------1013 bcf PID_flag,4 ; Definir o sinal do erro_medio positivo.1014 movfw erro_actual ; É positivo, então: 1015 movwf L_byte ; erro_actual -> L_byte1016 movfw erro_antigo ; erro_antigo -> w1017 addwf L_byte,f ; L_byte= (erro_actual + erro_antigo) 1018 call LMT100 ; Limitar o valor entre 0 e 100.1019 goto ACUM_SIGN1020 erro_actual_N1021 ; Erro antigo positivo e erro actual negativo1022 ; -------------------------------------------1023 movfw erro_antigo ; erro_antigo -> w1024 movwf L_byte ; w -> L_byte1025 comf erro_actual,f ; Não, então cálcular o complemento para 2 1026 incf erro_actual,w ; desse valor.1027 comf erro_actual,f ; Restaurar o valor do erro_actual. 1028 addwf L_byte,f ; L_byte= (erro_antigo + erro_actual)1029 btfss L_byte,7 ; Verificar o sinal do resultado.1030 bcf PID_flag,4 ; É positivo, então definir o sinal.1031 btfss L_byte,7 ; Verificar o sinal do resultado.1032 goto ACUM_SIGN ; É positivo, então...1033 bsf PID_flag,4 ; É negativo, então definir o sinal.1034 comf L_byte,f ; Cálcular o complemento para 2 1035 incf L_byte,f ; do L_byte.1036 goto ACUM_SIGN1037 erro_antigo_N
13
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
1038 btfsc PID_flag,0 ; Verificar o sinal do valor do erro_actual.1039 goto erro_actual_N1 ; É negativo, então ir para...1040 erro_actual_P11041 ; Erro antigo negativo e erro actual positivo1042 ; -------------------------------------------1043 movfw erro_actual ; erro_actual -> w1044 movwf L_byte ; w -> L_byte1045 comf erro_antigo,f ; Não, então cálcular o complemento para 2 1046 incf erro_antigo,w ; desse valor.1047 comf erro_antigo,f ; Restaurar o valor do erro_actual. 1048 addwf L_byte,f ; L_byte= (erro_actual + erro_antigo)1049 btfss L_byte,7 ; Verificar o sinal do resultado.1050 bcf PID_flag,4 ; É positivo, então definir o sinal.1051 btfss L_byte,7 ; Verificar o sinal do resultado.1052 goto ACUM_SIGN ; É positivo, então...1053 bsf PID_flag,4 ; É negativo, então definir o sinal. 1054 comf L_byte,f ; Cálcular o complemento para 2 1055 incf L_byte,f ; do L_byte.1056 goto ACUM_SIGN1057 erro_actual_N11058 ; Erro antigo negativo e erro actual negativo1059 ; -------------------------------------------1060 bsf PID_flag,4 ; Definir o sinal do erro_médio negativo.1061 movfw erro_actual ; É positivo, então: 1062 movwf L_byte ; erro_actual -> L_byte1063 movfw erro_antigo ; erro_antigo -> w1064 addwf L_byte,f ; L_byte= (erro_actual + erro_antigo) 1065 call LMT100 ; Limitar o valor entre 0 e 100.1066 ACUM_SIGN1067 SHIFT ; Dividir o |L_byte| por 2.1068 movfw L_byte ; |L_byte|/2 -> w1069 movwf erro_medio ; w -> erro_medio1070 btfss PID_flag,3 ; O erro acumulado é positivo?1071 goto ACUM_P_1 ; Sim, então ir para...1072 ACUM_N_1 ; Não, então...1073 btfsc PID_flag,4 ; Verificar o sinal do valor do erro_medio1074 goto MNS_0_1 ; É negativo, então ir para...1075 PLS_0_1 ; É positivo, então...1076 ; erro_medio positivo e erro_acum negativo:1077 ; -----------------------------------------1078 movfw erro_medio ; erro_medio -> w 1079 movwf mulcnd 1080 movfw Ki1081 movwf mulplr1082 call mpy8x8_S ; Multiplicar Ki x erro_medio.1083 call LMT100 ; Limitar o valor entre 0 e 100.1084 movfw L_byte ; L_byte -> w1085 comf erro_acum,f ; Cálcular o complemento para 2 do 1086 incf erro_acum,f ; erro_acum.1087 movfw L_byte ; L_byte -> w1088 addwf erro_acum,f ; erro_acum= erro_acum + (Ki x erro_medio) 1089 btfss erro_acum,7 ; Verificar o sinal do acumulador de erro.1090 bcf PID_flag,3 ; É positivo, então definir o sinal.1091 btfss erro_acum,7 ; Verificar o sinal do acumulador de erro.1092 goto SIGN_TI_1 ; É positivo, então...1093 bsf PID_flag,3 ; É negativo, então definir o sinal.1094 comf erro_acum,f ; Cálcular o complemento para 2 1095 incf erro_acum,f ; do erro_acum.1096 goto SIGN_TI_1 ; Aplicar o sinal no termo integral.1097 MNS_0_1 1098 ; erro_medio negativo e erro_acum negativo:1099 ; -----------------------------------------1100 bsf PID_flag,3 ; Definir o erro_acum como sendo negativo.1101 movfw erro_medio ; erro_medio -> w 1102 movwf mulcnd 1103 movfw Ki1104 movwf mulplr1105 call mpy8x8_S ; Multiplicar Ki x erro_medio.1106 call LMT100 ; Limitar o valor entre 0 e 100.1107 movfw L_byte ; L_byte -> w1108 addwf erro_acum,f ; erro_acum= |erro_acum|+(Ki × |erro_medio|)1109 goto SIGN_TI_1 ; Aplicar o sinal no termo integral.1110 ACUM_P_11111 btfsc PID_flag,4 ; Verificar o sinal do valor do erro_medio.1112 goto MNS_1_1 ; É negativo, então ir para...1113 PLS_1_1 ; É positivo, então...1114 ; erro_medio positivo e erro_acum positivo:1115 ; -----------------------------------------1116 bcf PID_flag,3 ; Definir o erro_acum como sendo positivo.1117 movfw erro_medio ; erro_medio -> w
14
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
1118 movwf mulcnd 1119 movfw Ki1120 movwf mulplr1121 call mpy8x8_S ; Multiplicar Ki x erro_medio.1122 call LMT100 ; Limitar o valor entre 0 e 100.1123 movfw L_byte ; L_byte -> w1124 addwf erro_acum,f ; erro_acum= |erro_acum|+(Ki × |erro_medio|)1125 goto SIGN_TI_1 ; Aplicar o sinal no termo integral.1126 MNS_1_1 1127 ; erro_medio negativo e erro_acum positivo:1128 ; ----------------------------------------- 1129 movfw erro_medio ; erro_medio -> w 1130 movwf mulcnd 1131 movfw Ki1132 movwf mulplr1133 call mpy8x8_S ; Multiplicar Ki x erro_medio.1134 call LMT100 ; Limitar o valor entre 0 e 100.1135 movfw L_byte ; L_byte -> w1136 comf L_byte,f ; Cálcular o complemento para 2 do 1137 incf L_byte,f ; L_byte.1138 movfw L_byte ; L_byte -> w1139 addwf erro_acum,f ; erro_acum= erro_acum + (-Ki x erro_medio) 1140 btfss erro_acum,7 ; Verificar o sinal do acumulador de erro.1141 bcf PID_flag,3 ; É positivo, então definir o sinal.1142 btfss erro_acum,7 ; Verificar o sinal do acumulador de erro.1143 goto SIGN_TI_1 ; É positivo, então...1144 bsf PID_flag,3 ; É negativo, então definir o sinal.1145 comf erro_acum,f ; Cálcular o complemento para 2 1146 incf erro_acum,f ; do erro_acum.1147 SIGN_TI_11148 movfw erro_acum ; |erro_acum| -> w1149 movwf L_byte ; w -> L_byte1150 call LMT100 ; Limitar o valor entre 0 e 100.1151 movfw L_byte ; L_byte - > w1152 movwf erro_acum ; w -> erro_acum1153 btfsc PID_flag,3 ; O sinal do acumulador de erro é positivo?1154 goto TI_N_1 ; Não, então ir para ...1155 TI_P_1 ; Sim, então...1156 goto ADDINT_11157 TI_N_11158 comf L_byte,f ; Cálcular o complemento para 2 1159 incf L_byte,f ; desse valor.11601161 ; Adicionar o valor do termo integral ao somatório 1162 ; ------------------------------------------------1163 ADDINT_11164 movfw L_byte ; L_byte -> w1165 addwf SUMLO,f ; SUMLO= SUMLO + w 1166 btfsc STATUS,C ; Foi gerado um "CARRY-OUT"?1167 incf SUMHI,f ; Sim, então...1168 movlw 0x00 ; Não, então...1169 btfsc PID_flag,3 ; O erro_acum é negativo?1170 movlw 0xFF ; Sim, então 0xFF -> w1171 addwf SUMHI,f ; SUMHI + w -> SUMHI 1172 CI_EXIT_11173 return11741175 ; Cálcular o termo integral_2: 1176 ; ------------------------------------------------------------------------1177 ; NOTA: O termo integral advém do valor do erro acumulado durante o 1178 ; processo. Sempre que existe erro no sistema, é adicionado (erro_actual>0)1179 ; ou subtraido (erro_actual<0) um pequeno valor ao acumulador de erro do 1180 ; sistema, em cada passagem do ciclo do programa. Por mais pequeno que seja 1181 ; o erro se este persistir durante algum tempo irá originar um valor 1182 ; considerável no acumulador, de modo a actuar o sistema. O valor do termo 1183 ; integral é obtido através do produto do Ki pelo integral do erro ao longo 1184 ; do tempo (Ki × erro_acumulado). Tal como no termo proporcional o termo 1185 ; integral também está limitado para +/-100.1186 ; i(t)= (SUM(Ki))1187 ; ------------------------------------------------------------------------ 1188 C_INT_21189 btfsc PID_flag,0 ; Verificar o sinal do valor do erro.1190 goto MNS_2 ; É negativo, então ir para...1191 PLS_2 ; É positivo, então...1192 movfw Ki ; Adicionar o Ki ao acumulador1193 addwf erro_acum,f ; 1194 goto LMTACM ; Limitar o valor do acumulador para +/-1001195 MNS_2 1196 movfw Ki ; Se o erro é negativo subtrair o Ki,1197 subwf erro_acum,f ; ao acumulador de erro.
15
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
1198 LMTACM1199 btfsc erro_acum,7 ; Verificar a polaridade do acumulador de erro,1200 goto M_LMT ; e limitar esse mesmo valor.1201 P_LMT1202 movlw .156 ; Para o limite positivo adicionar 156 ao valor1203 addwf erro_acum,w ; do acumulador e verificar se foi gerado um "CARRY-OUT".1204 btfss STATUS,C ; Foi gerado um "CARRY-OUT"?1205 goto ADDINT_2 ; Não, então ir para ...1206 movlw .100 ; Sim, então forçar o valor do acumulador 1207 movwf erro_acum ; para 100 em décimal.1208 goto ADDINT_21209 M_LMT1210 movlw .156 ; Para o limite negativo subtrair 156 ao valor do1211 subwf erro_acum,w ; acumulador e verificar se não foi gerado um "CARRY-OUT".1212 btfsc STATUS,C ; Foi gerado um "CARRY-OUT"?1213 goto ADDINT_2 ; Sim, então não alterar o acumulador de erro.1214 movlw .156 ; Não, então limitar o valor do acunulador 1215 movwf erro_acum ; para -100 em décimal. 12161217 ; Adicionar o valor do termo integral ao somatório 1218 ; ------------------------------------------------1219 ADDINT_21220 movfw erro_acum ; Adicionar o valor do termo integral 1221 addwf SUMLO,f ; ao somatório.1222 btfsc STATUS,C ; Foi gerado um "CARRY-OUT"?1223 incf SUMHI,f ; Sim, então...1224 movlw 0x00 ; Não, então...1225 btfsc erro_acum,7 ; O MSbit de erro_acum é 1?1226 movlw 0xFF ; Sim, então 0xFF -> w1227 addwf SUMHI,f ; SUMHI + w -> SUMHI 1228 CI_EXIT_21229 return12301231 ; Cálculo do termo integral_3: 1232 ; ------------------------------------------------------------------------1233 ; Cálcular Ki×(erro_actual)1234 ; ------------------------------------------------------------------------1235 C_INT_31236 movfw erro_actual ; erro_actual -> w 1237 movwf mulcnd 1238 movfw Ki1239 movwf mulplr1240 call mpy8x8_S ; Multiplicar Kp x erro_actual.1241 call LMT100 ; Limitar o valor entre 0 e 100.1242 RE_SGN21243 btfss PID_flag,0 ; O erro_actual é positivo?1244 goto ADDINT_3 ; Sim, então ir para...1245 comf L_byte,f ; Não, então cálcular o complemento 1246 incf L_byte,f ; para 2 do L_byte.1247 ADDINT_31248 movlw 0x001249 btfsc PID_flag,0 ; O sinal do valor erro_actual é positivo? 1250 movlw 0xFF ; Não, então aplicar o sinal negativo ao MSB.1251 movwf ACCbHI ; Sim, então aplicar o sinal positivo ao MSB.1252 movfw L_byte ; Passar o valor de L_byte -> w. 1253 movwf ACCbLO ; w -> ACCbLO1254 movfw SUMLO ; Passar o valor actual do SUMLO -> w.1255 movwf ACCaLO ; w -> ACCaLO. 1256 movfw SUMHI ; Passar o valor actual do SUMHI -> w.1257 movwf ACCaHI ; w -> ACCaHI.1258 call D_add ; Chamar a função de adição.1259 movfw ACCbLO ; Guardar os valores resultantes em1260 movwf SUMLO ; SUMLO e SUMHI respectivamente.1261 movfw ACCbHI1262 movwf SUMHI1263 CI_EXIT_31264 return12651266 ; Cálculo do termo derivativo: d(t)= (Kd × (erro_actual - erro_antigo))1267 ; ------------------------------------------------------------------------1268 ; NOTA: O termo derivativo baseia-se na análise da variação do valor do 1269 ; erro em relação ao seu valor anterior. Básicamente consiste em subtrair 1270 ; o antigo valor do erro ao erro actual. Uma vez que o tempo de ciclo do 1271 ; programa é práticamente constante pode usar-se como sendo o "dt" do 1272 ; desejado "de/dt". Esta derivada do erro é então multiplicada pelo ganho 1273 ; do termo diferencial Kd, obtendo desta forma o valor do termo derivativo.1274 ; ------------------------------------------------------------------------1275 C_DIFF1276 movfw erro_actual ; Passar o valor do erro_actual para o registo w. 1277 btfss PID_flag,0 ; O valor do erro_actual é positivo?
16
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
1278 goto LO_BYTE ; Sim, então ir para... 1279 comf erro_actual,f ; Não, então cálcular o complemento para 2 1280 incf erro_actual,w ; desse valor.1281 comf erro_actual,f ; Restaurar o valor do erro_actual. 1282 LO_BYTE1283 movwf ACCbLO ; Para subtração1284 movlw 0x001285 btfsc PID_flag,0 ; Passar o sinal para o Byte mais significativo.1286 movlw 0xFF1287 movwf ACCbHI1288 movfw erro_antigo ; Passar o valor do erro_antigo para o registo w. 1289 btfss PID_flag,1 ; O valor do erro_antigo é positivo?1290 goto LO_BYTEO ; Sim, então ir para... 1291 comf erro_antigo,f ; Não, então cálcular o complemento para 2 1292 incf erro_antigo,w ; desse valor.1293 comf erro_antigo,f ; Restaurar o valor do erro_antigo. 1294 LO_BYTEO1295 movwf ACCaLO ; Para subtração1296 movlw 0x001297 btfsc PID_flag,1 ; Passar o sinal para o Byte mais significativo.1298 movlw 0xFF1299 movwf ACCaHI1300 call D_sub ; erro_actual - erro_antigo1301 STRIP_SGN1302 btfsc ACCbHI,7 ; O sinal do resultado é positivo?1303 goto NEG_ABS ; Não, então ir para...1304 goto POS_ABS ; Sim, então ir para... 1305 NEG_ABS1306 bsf PID_flag,2 ; O resultado é negativo, então colocar a flag a 1 e1307 comf ACCbLO,f ; cálcular o complemento para 2 do resultado.1308 incf ACCbLO,w1309 movwf de_dt 1310 goto MULT_Kd1311 POS_ABS1312 bcf PID_flag,2 ; O resultado é positivo, então colocar a flag a 0 e1313 movfw ACCbLO ; guardar o resultado.1314 movwf de_dt13151316 ; Multiplicar o resultado por Kd1317 ; ------------------------------1318 MULT_Kd1319 movfw de_dt ; Passar o valor do de/dt para o multiplicando.1320 movwf mulcnd ; 1321 movfw Kd ; Passar o valor do Kd para o multiplicador.1322 movwf mulplr ; 1323 call mpy8x8_S ; Multiplicar (de_dt) x Kd1324 call LMT100 ; Limitar o valor entre 0 e 100.1325 RE_SGN1326 ;---------1327 movfw L_byte1328 btfsc STATUS,Z ; O termo derivativo é nulo?1329 goto CD_EXIT ; Sim, então ir para...1330 ;---------1331 btfss PID_flag,2 ; O sinal do valor de_dt é positivo?1332 goto ADDDIF ; Sim, então ir para...1333 comf L_byte,f ; Não, então 1334 incf L_byte,f13351336 ; Adicionar o valor do termo derivativo ao somatório 1337 ; ----------------------------------------------------1338 ADDDIF1339 movlw 0x001340 btfsc PID_flag,2 ; O sinal do valor de_dt é positivo? 1341 movlw 0xFF ; Não, então aplicar o sinal negativo ao MSB.1342 movwf ACCbHI ; Sim, então aplicar o sinal positivo ao MSB.1343 movfw L_byte ; Passar o resultado de Kd*(DE/DT) -> w. 1344 movwf ACCbLO ; w -> ACCbLO1345 movfw SUMLO ; Passar o valor actual do SUMLO -> w.1346 movwf ACCaLO ; w -> ACCaLO. 1347 movfw SUMHI ; Passar o valor actual do SUMHI -> w.1348 movwf ACCaHI ; w -> ACCaHI.1349 call D_add ; Chamar a função de adição.1350 movfw ACCbLO ; Guardar os valores resultantes em1351 movwf SUMLO ; SUMLO e SUMHI respectivamente.1352 movfw ACCbHI1353 movwf SUMHI1354 CD_EXIT1355 return13561357 ; Cálculo do termo derivativo_1:
17
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
1358 ; ------------------------------------------------------------------------1359 ; d(t)= Kd×[erro_actual-2×erro_antigo+ erro_antigo_2]1360 ; ------------------------------------------------------------------------1361 C_DIFF_11362 movfw erro_actual ; Passar o valor do erro_actual para o registo w. 1363 btfss PID_flag,0 ; O valor do erro_actual é positivo?1364 goto LO_BYTE_P1 ; Sim, então ir para... 1365 comf erro_actual,f ; Não, então cálcular o complemento para 2 1366 incf erro_actual,w ; desse valor.1367 comf erro_actual,f ; Restaurar o valor do erro_actual. 1368 LO_BYTE_P11369 movwf ACCbLO ; Para subtração1370 movlw 0x001371 btfsc PID_flag,0 ; Passar o sinal para o Byte mais significativo.1372 movlw 0xFF1373 movwf ACCbHI1374 bcf STATUS,C 1375 rlf erro_antigo,w ; Multiplicar o erro_antigo por 2.1376 movwf L_byte ; 2×erro_antigo -> L_byte.1377 call LMT100 ; Limitar o resultado entre 0 e 100.1378 movfw L_byte1379 btfss PID_flag,1 ; O valor do erro_antigo é positivo?1380 goto LO_BYTEO_P1 ; Sim, então ir para... 1381 comf L_byte,f ; Não, então cálcular o complemento para 2 1382 incf L_byte,w ; desse valor.1383 comf L_byte,f ; Restaurar o valor do erro_antigo. 1384 LO_BYTEO_P11385 movwf ACCaLO ; Para subtração1386 movlw 0x001387 btfsc PID_flag,1 ; Passar o sinal para o Byte mais significativo.1388 movlw 0xFF1389 movwf ACCaHI1390 call D_sub ; erro_actual - 2×erro_antigo1391 STRIP_SGN21392 btfsc ACCbHI,7 ; O sinal do resultado é positivo?1393 goto NEG_ABS2 ; Não, então ir para...1394 goto POS_ABS2 ; Sim, então ir para... 1395 NEG_ABS21396 bsf PID_flag,7 ; O resultado é negativo, então colocar a flag a 1 e1397 movfw ACCbLO1398 movwf L_byte1399 comf L_byte,f ; Não, então cálcular o complemento para 2 1400 incf L_byte,f ; desse valor.1401 goto Ad_erro_21402 POS_ABS21403 bcf PID_flag,7 ; O resultado é positivo, então colocar a flag a 0 e1404 movfw ACCbLO ; guardar o resultado.1405 movwf L_byte1406 Ad_erro_21407 ; (L_byte + erro_2)1408 movfw L_byte ; Passar o valor do erro_actual para o registo w. 1409 btfss PID_flag,7 ; O valor do L_byte é positivo?1410 goto LO_BYTE_P2 ; Sim, então ir para... 1411 comf L_byte,f ; Não, então cálcular o complemento para 2 1412 incf L_byte,w ; desse valor.1413 comf L_byte,f ; Restaurar o valor do L_byte. 1414 LO_BYTE_P21415 movwf ACCbLO ; Para adição1416 movlw 0x001417 btfsc PID_flag,7 ; Passar o sinal para o Byte mais significativo.1418 movlw 0xFF1419 movwf ACCbHI1420 movfw erro_2 ; Passar o valor do erro_antigo para o registo w. 1421 btfss PID_flag,6 ; O valor do erro_2 é positivo?1422 goto LO_BYTEO_P2 ; Sim, então ir para... 1423 comf erro_2,f ; Não, então cálcular o complemento para 2 1424 incf erro_2,w ; desse valor.1425 comf erro_2,f ; Restaurar o valor do erro_antigo. 1426 LO_BYTEO_P21427 movwf ACCaLO ; Para subtração1428 movlw 0x001429 btfsc PID_flag,6 ; Passar o sinal para o Byte mais significativo.1430 movlw 0xFF1431 movwf ACCaHI1432 call D_add ; L_byte + erro_21433 STRIP_SGN31434 btfsc ACCbHI,7 ; O sinal do resultado é positivo?1435 goto NEG_ABS3 ; Não, então ir para...1436 goto POS_ABS3 ; Sim, então ir para... 1437 NEG_ABS3
18
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
1438 bsf PID_flag,7 ; O resultado é negativo, então colocar a flag a 1 e1439 comf ACCbLO,f ; cálcular o complemento para 2 do resultado.1440 incf ACCbLO,w1441 movwf L_byte 1442 goto MULT_Kd11443 POS_ABS31444 bcf PID_flag,7 ; O resultado é positivo, então colocar a flag a 0 e1445 movfw ACCbLO ; guardar o resultado.1446 movwf L_byte14471448 ; Multiplicar o resultado por Kd1449 ; ------------------------------1450 MULT_Kd11451 movfw L_byte ; Passar o valor do L_Byte para o multiplicando.1452 movwf mulcnd ; 1453 movfw Kd ; Passar o valor do Kd para o multiplicador.1454 movwf mulplr ; 1455 call mpy8x8_S ; Multiplicar (L_byte) x Kd1456 call LMT100 ; Limitar o valor entre 0 e 100.1457 RE_SGN31458 ;---------1459 movfw L_byte1460 btfsc STATUS,Z ; O resultado é nulo?1461 goto CD2_EXIT ; Sim, então ir para...1462 ;---------1463 btfss PID_flag,7 ; O sinal do valor L_byte é positivo?1464 goto ADDDIFF1 ; Sim, então ir para...1465 comf L_byte,f ; Não, então 1466 incf L_byte,f14671468 ; Adicionar o resultado ao somatório 1469 ; ----------------------------------1470 ADDDIFF11471 movlw 0x001472 btfsc PID_flag,7 ; O sinal do valor L_byte é positivo? 1473 movlw 0xFF ; Não, então aplicar o sinal negativo ao MSB.1474 movwf ACCbHI ; Sim, então aplicar o sinal positivo ao MSB.1475 movfw L_byte ; Passar o valor de L_byte -> w. 1476 movwf ACCbLO ; w -> ACCbLO1477 movfw SUMLO ; Passar o valor actual do SUMLO -> w.1478 movwf ACCaLO ; w -> ACCaLO. 1479 movfw SUMHI ; Passar o valor actual do SUMHI -> w.1480 movwf ACCaHI ; w -> ACCaHI.1481 call D_add ; Chamar a função de adição.1482 movfw ACCbLO ; Guardar os valores resultantes em1483 movwf SUMLO ; SUMLO e SUMHI respectivamente.1484 movfw ACCbHI1485 movwf SUMHI1486 CD2_EXIT1487 return14881489 ; Limitar o somatório final para um valor entre 0 e 100%1490 ; ------------------------------------------------------1491 L_SUMM1492 btfss SUMHI,7 ; O sinal do somatório é positivo? 1493 goto POS_LM ; Sim, então ir para...1494 clrf SUMHI ; Não, então...1495 clrf SUMLO1496 POS_LM 1497 movlw 0x01 ; Subtrair 1 ao SUMHI, 1498 subwf SUMHI,w ; para ver se este possui algum valor.1499 btfss STATUS,C ; O SUMHI possui algum valor?1500 goto LB_L ; Não, então validar apenas o LOW BYTE.1501 movlw .100 ; Sim, então limitar o SUMLO a 100.1502 movwf SUMLO 1503 goto LP_EXIT1504 LB_L1505 movlw .100 ; Limitar a amplitude do valor para 100 em décimal. 1506 subwf SUMLO,w ; (SUMLO - w) -> w 1507 btfss STATUS,C ; O resultado é positivo?1508 goto LP_EXIT ; Sim, então saltar para LP_EXIT 1509 movlw .100 ; Não, então limitar o SUMLO a 100.1510 movwf SUMLO1511 LP_EXIT15121513 ; Passar o valor final do somatório para o registo SpR_value1514 ; ----------------------------------------------------------1515 WRITE_RESULT1516 movfw SUMLO1517 movwf SpR_value ; Speed (0-100).
19
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
15181519 ; Backup do erro1520 ; --------------1521 ERROR_BKP1522 movfw erro_antigo1523 movwf erro_21524 bcf PID_flag,61525 btfsc PID_flag,11526 bsf PID_flag,61527 movfw erro_actual ; Passar o valor do erro_actual1528 movwf erro_antigo ; para o erro_antigo. 1529 bcf PID_flag,1 ; Colocar a flag do erro_antigo a 0.1530 btfsc PID_flag,0 ; O sinal do erro actual é positivo? 1531 bsf PID_flag,1 ; Não então colocar a flag do erro_antigo a 1.15321533 Controlo_EXIT1534 bcf Status_flag,4 ; Reiniciar a flag de leitura da velocidade do encoder.1535 return15361537 ;************************************************************************************1538 ; FUNÇÕES ARITMÉTICAS *1539 ;************************************************************************************1540 ; Multiplicação 8x8 1541 ; -----------------1542 mpy8x8_S1543 clrf H_byte1544 clrf L_byte1545 movlw .81546 movwf count ; Count = 81547 movfw mulcnd1548 bcf STATUS,C ; Limpar o carry.1549 loop 1550 rrf mulplr,f1551 btfsc STATUS,C1552 addwf H_byte,f1553 rrf H_byte,f1554 rrf L_byte,f1555 decfsz count,f 1556 goto loop1557 return15581559 ; Subtracção de dupla precisão ( ACCb-ACCa->ACCb)1560 ; -----------------------------------------------1561 D_sub 1562 call neg_A ; Obter o comp2 do valor e depois adiciona-lo.15631564 ; Adição de dupla precisão ( ACCb+ACCa->ACCb )1565 ; --------------------------------------------1566 D_add 1567 movfw ACCaLO1568 addwf ACCbLO,f ; Adicionar o LSB1569 btfsc STATUS,C 1570 incf ACCbHI,f1571 movfw ACCaHI 1572 addwf ACCbHI,f ; Adicionar o MSB1573 return1574 neg_A 1575 comf ACCaLO,f ; Complemento para 1 do valor do ACCa.1576 incf ACCaLO,f ; Complemento para 2 do valor do ACCa.1577 btfsc STATUS,Z1578 decf ACCaHI,f1579 comf ACCaHI,f1580 return15811582 ; Limitar o valor do resultado entre 0 e 100 1583 ; ------------------------------------------1584 LMT1001585 movlw 0x01 ; Subtrair 1 ao HIGH BYTE, 1586 subwf H_byte,w ; para ver se este possui algum valor.1587 btfss STATUS,C ; O HIGH BYTE possui algum valor?1588 goto L8_E ; Não, então validar apenas o LOW BYTE.1589 movlw .100 ; Limitar o L_byte a 100.1590 movwf L_byte 1591 goto LMT100_EXIT1592 L8_E1593 movlw .100 ; Limitar a amplitude do valor para 100 em décimal. 1594 subwf L_byte,w ; (L_byte - w) -> w 1595 btfss STATUS,C ; O resultado é positivo?1596 goto LMT100_EXIT ; Sim, então saltar para LMT_EXIT 1597 movlw .100 ; Não, então limitar o L_byte a 100.
20
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
1598 movwf L_byte1599 LMT100_EXIT1600 return16011602 ;************************************************************************************1603 ; TEMPORIZAÇÃO (ms) *1604 ;************************************************************************************1605 msDelay1606 movwf MsDelayCounter+11607 movwf Time_value ; Guardar o valor de w1608 movlw Oscilator_value ; Inicializar o contador (segundo o oscilador usado)1609 movwf Counter ; w -> Counter 1610 Loop_Quartz_xxMHz1611 movfw Time_value ; Time_value -> w1612 movwf MsDelayCounter+11613 clrf MsDelayCounter+01614 msDelayLoop1615 clrwdt ; Limpar o Watchdog Timer.1616 decfsz MsDelayCounter+0,F1617 goto msDelayLoop1618 clrwdt ; Limpar o Watchdog Timer.1619 decfsz MsDelayCounter+1,F1620 goto msDelayLoop1621 decfsz Counter,F1622 goto Loop_Quartz_xxMHz1623 return1624 ;************************************************************************************1625 ; INICIALIZAÇÃO DOS PORTOS *1626 ;************************************************************************************1627 init_ports16281629 ; Inicializar PORTS (banco 0 e 1)1630 ; -------------------------------1631 BANK0 ; Aceder ao banco 0.1632 clrf PORTA ; Saídas do PORTA a 0.1633 clrf PORTB ; Saídas do PORTB a 0.1634 clrf PORTC ; Saídas do PORTC a 0.1635 clrf PIR11636 BANK1 ; Aceder ao banco 1.1637 movlw ADCON1VAL ; PORTA no modo A/D.1638 movwf ADCON1 ; Escrever no registo ADCON1.1639 movlw DIRPORTA ; Direcção do PORTA.1640 movwf TRISA ; Escrever no registo de direcção TRISA.1641 movlw DIRPORTB ; Direcção do PORTB.1642 movwf TRISB ; Escrever no registo de direcção TRISB.1643 movlw DIRPORTC ; Direcção do PORTC.1644 movwf TRISC ; Escrever no registo de direcção TRISC.16451646 ; Registo de opções (banco 1)1647 ; ---------------------------1648 movlw OPTIONVAL ; copiar o valor da constante para o w.1649 movwf OPTION_REG ; configurar o registo OPTION_REG com esse valor.16501651 ; Limpar RAM (banco 0)1652 ; --------------------1653 bcf STATUS,RP0 ; Aceder ao banco 0.1654 movlw 0x20 ; Inicialização do apontador,1655 movwf FSR ; de endereçamento indirecto.1656 init_ram1657 clrf INDF ; Limpar a RAM.1658 incf FSR,f ; Apontar para o proximo.1659 btfss FSR,7 ; Verificar se chegou ao fim(>7Fh).1660 goto init_ram ; Se não chegou, continuar no ciclo.1661 return16621663 ;************************************************************************************1664 ; INICIALIZAÇÃO DO TIMER1 *1665 ;************************************************************************************1666 init_tmr11667 BANK0 ; Aceder ao banco 0.1668 movlw B'00000110' ; Configurar o TMR1 no modo contador assíncrono.1669 movwf T1CON ; Configurar o registo T1CON com esse valor.1670 return16711672 ;************************************************************************************1673 ; INICIALIZAÇÃO DO TIMER2 *1674 ;************************************************************************************1675 init_tmr21676 BANK1 ; Aceder ao banco 1.1677 movlw PR2VAL ; PR2VAL - > w
21
C:\Projectos\Microchip\Pic16F876\PID_RS232.asm
1678 movwf PR2 ; w -> PR21679 BANK0 ; Aceder ao banco 0.1680 movlw B'0000100' ; Pós-divisor a 1, pré-divisor a 1, timer ON1681 movwf T2CON ; Configurar o registo T2CON com esse valor.1682 movlw CCP1CONVAL ; Copiar o valor da constante para o w.1683 movwf CCP1CON ; Configurar o registo SSPCON com esse valor.1684 clrf CCPR1L ; Inicializar o PWM com o valor zero.16851686 ; Inicializar a variável1687 ; -----------------------1688 movlw COMPTVAL1_tmr2 ; Definir o valor do contador de passagens,1689 movwf Contador1_tmr2 ; pela interrupção do TMR2.1690 movlw COMPTVAL2_tmr2 ; Definir o valor do contador de passagens,1691 movwf Contador2_tmr2 ; pela interrupção do TMR2.1692 return16931694 ; ///////////////////////////////////////////////////////////////////////////////////16951696 ; P R O G R A M A16971698 ; ///////////////////////////////////////////////////////////////////////////////////16991700 ;************************************************************************************1701 ; Inicializações *1702 ;************************************************************************************1703 main_init1704 pagesel init_ports1705 call init_ports ; Inicialização dos Portos.1706 pagesel init_tmr11707 call init_tmr1 ; Inicialização do TMR1.1708 pagesel init_tmr21709 call init_tmr2 ; Inicialização do TMR2.17101711 ; Definir os registos de interrupções (banco 1)1712 ; --------------------------------------------1713 BANK11714 movlw PIE1VAL ; Copiar o valor da constante para o w. 1715 movwf PIE1 ; Activar as interrupções SSPIE.1716 movlw PIE2VAL ; Copiar o valor da constante para o w.1717 movwf PIE2 ; Configurar o registo PIE2 com esse valor.17181719 ; Inicializar a USART1720 ; -------------------1721 movlw TXSTAVAL ; Emissão de 9 bits, modo high speed.1722 movwf TXSTA ; Configurar o registo TXSTA com esse valor.1723 movlw SPBRGVAL ; Copiar o valor da constante para o w.1724 movwf SPBRG ; Configurar o registo SPBRG com esse valor.1725 BANK0 ; Aceder ao banco 0.1726 movlw RCSTAVAL ; Recepção de 9 bits, modo high speed.1727 movwf RCSTA ; Configurar o registo RCSTA com esse valor.17281729 ; Inicializar as variáveis1730 ; ------------------------1731 clrf Serial_flag ; Limpar as Flags1732 movlw LOW bufin ; Endereço do buffer de recepção,1733 movwf bufinptr ; para o apontador.1734 movlw LOW bufout ; Endereço do buffer de transmissão,1735 movwf bufoutptr ; para o apontador.17361737 ; Autorizar as interrupções periféricas e globais 1738 ; -----------------------------------------------1739 movlw INTCONVAL ; Activar as interrupções periféricas e globais.1740 movwf INTCON ; Configurar o registo INTCON com esse valor.1741 goto main1742 1743 ;************************************************************************************1744 ; Corpo principal do programa *1745 ;************************************************************************************1746 main1747 BANK01748 bsf LED_Vida1749 main_loop1750 BANK01751 clrwdt ; Limpar o Watchdog Timer1752 btfsc Rec_Stop ; Chegaram novos dados?1753 call ReceiveSerial1754 btfsc Status_flag,2 ; Chegaram novos dados (Parâmetros+Speed)?1755 call Test_value ; Sim, então chamar a função Test_value.1756 btfss Status_flag,4 ; O valor da velocidade real foi obtido?1757 goto main_loop ; Não, então...