sistema de controle de velocidade digital embarcado de motor de

145
UNIVERSIDADE FEDERAL DO CEARÁ CENTRO DE TECNOLOGIA DEPARTAMENTO DE ENGENHARIA ELÉTRICA RENÉ DESCARTES OLÍMPIO PEREIRA SISTEMA DE CONTROLE DE VELOCIDADE DIGITAL EMBARCADO DE MOTOR DE CORRENTE CONTÍNUA DE ÍMÃ PERMANENTE FORTALEZA 2013

Upload: lamnhu

Post on 08-Jan-2017

222 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: sistema de controle de velocidade digital embarcado de motor de

UNIVERSIDADE FEDERAL DO CEARÁ

CENTRO DE TECNOLOGIA

DEPARTAMENTO DE ENGENHARIA ELÉTRICA

RENÉ DESCARTES OLÍMPIO PEREIRA

SISTEMA DE CONTROLE DE VELOCIDADE DIGITAL EMBARCADO DE

MOTOR DE CORRENTE CONTÍNUA DE ÍMÃ PERMANENTE

FORTALEZA

2013

Page 2: sistema de controle de velocidade digital embarcado de motor de

RENÉ DESCARTES OLÍMPIO PEREIRA

SISTEMA DE CONTROLE DE VELOCIDADE DIGITAL EMBARCADO DE

MOTOR DE CORRENTE CONTÍNUA DE ÍMÃ PERMANENTE

Monografia apresentada ao curso de

Engenharia Elétrica da Universidade Federal

do Ceará, como requisito parcial à obtenção do

título de Engenheiro Eletricista.

Orientadora: Profa. Dra. Laurinda Lúcia

Nogueira dos Reis.

FORTALEZA

2013

Page 3: sistema de controle de velocidade digital embarcado de motor de

Dados Internacionais de Catalogação na Publicação

Universidade Federal do Ceará

Biblioteca de Ciências e Tecnologia

P495s Pereira, René Descartes Olímpio.

Sistemas de controle de velocidade digital embarcado de motor de corrente continua de imã

permanente / René Descartes Olímpio Pereira. – 2013.

145f. : il. color., enc. ; 30 cm.

Monografia(graduação) – Universidade Federal do Ceará, Centro de Tecnologia,

Departamento de Engenharia Elétrica, Graduação em Engenharia Elétrica, Fortaleza, 2013.

Orientação: Profa. Dra. Laurinda Lúcia Nogueira dos Reis.

1. Sistema de controle digital. 2. Controle de velocidade. 3. Sistemas embarcados. I. Título.

CDD 621.3

Page 4: sistema de controle de velocidade digital embarcado de motor de
Page 5: sistema de controle de velocidade digital embarcado de motor de

Aos meus pais, Gabriel e Mércia.

Page 6: sistema de controle de velocidade digital embarcado de motor de

AGRADECIMENTO

À minha família, em especial aos meus pais, pelo cuidado, apoio, e extrema

paciência comigo nos meus momentos difíceis e pela motivação e reconhecimento nas minhas

pequenas conquistas.

À Profa. Dra. Laurinda Lúcia Nogueira dos Reis, pela excelente orientação e pelo

tempo dedicado para fazer o desenvolvimento deste trabalho possível.

Aos participantes da banca examinadora Prof. Dr. Bismark Claure Torrico e Msc.

Wellington Assunção da Silva, pelo tempo, pelas valiosas colaborações e sugestões.

Aos meus colegas de todas as turmas pelas quais passei do curso de Engenharia

Elétrica, pelo convívio, troca de experiências e bons momentos, que fizeram a minha longa

passagem pelo curso uma viagem de transformação única.

Page 7: sistema de controle de velocidade digital embarcado de motor de

“A criança é a inocência, e o esquecimento,

um novo começar, um brinquedo, uma roda

que gira sobre si, um movimento, uma santa

afirmação.”

Friedrich Nietzsche

Page 8: sistema de controle de velocidade digital embarcado de motor de

RESUMO

Este trabalho apresenta um método de controle de velocidade digital de motores, onde se

projeta um controlador PI, com realocação do ganho proporcional para o caminho de

realimentação, para se obter uma resposta estritamente aperiódica com tempo de

assentamento ótimo. Uma estratégia anti-wind-up é desenvolvida com o controlador na forma

incremental. O método é aplicado com a implementação de um sistema de controle de

velocidade digital de um motor de corrente contínua de ímã permanente. Ele é baseado na

ferramenta de desenvolvimento eZ430-RF2500 da Texas Instruments e conta com um

programa de interface gráfica para computador em Java. Simulações em Simulink/MATLAB

do modelo do sistema de controle digital e resultados experimentais também são apresentadas.

Palavras-chave: Controle PID. Controle de velocidade. Sistemas embarcados.

Page 9: sistema de controle de velocidade digital embarcado de motor de

ABSTRACT

This work presents a digital speed control method of motors, where a PI controller is

designed, with the relocation of the proportional gain to the feedback path, to obtain an

aperiodic response with optimal settling time. An anti-wind-up strategy is developed with the

controller in the incremental form. The method is applied with the implementation of a digital

speed control system of a permanent magnet direct current motor. The system is based on the

Texas Instrument’s eZ430-RF2500 development tool and count with a Java graphical user

interface. Simulink/MATLAB simulations of the digital control system model and

experimental results are presented too.

Keywords: PID control. Speed control. Embedded systems.

Page 10: sistema de controle de velocidade digital embarcado de motor de

LISTA DE ILUSTRAÇÕES

Figura 2.1 – Motor CC convencional (escovado) ................................................................ 16

Figura 2.2 – Circuito equivalente de um motor CC ............................................................. 18

Figura 2.3 – Reposta de um motor CC a uma elevação da tensão de armadura em

degrau ............................................................................................................

21

Figura 2.4 – Um sistema de engrenagens .......................................................................... 23

Figura 3.1 – Arquitetura da família MSP430F22x4 .......................................................... 25

Figura 3.2 – Gerador de frequência em USCI_A0 mostrando (a) modo de

sobreamostragem com dois divisores e clock intermediário BITCLK16, e

(b) modo de baixa frequência com apenas um divisor ..................................

37

Figura 4.1 – Diagrama de blocos de um sistema de controle de velocidade com

implementação digital do algoritmo de controle ...........................................

43

Figura 4.2 – A variação na velocidade real (n) no eixo do motor durante um período

de amostragem T ...........................................................................................

46

Figura 4.3 – Controlador de velocidade digital com atuador de torque ideal Ka = 1,

controlador de velocidade discreto e subsistema mecânico no domínio

contínuo .........................................................................................................

47

Figura 4.4 – O diagrama de blocos de um sistema de controle de velocidade digital

compreendendo sinais discretos ....................................................................

48

Figura 4.5 – Implementação discreta do controlador de velocidade com ação

proporcional e integral ...................................................................................

49

Figura 4.6 – Controlador de velocidade com ação proporcional e integral implementado

na forma incremental .....................................................................................

50

Figura 4.7 – Controlador de velocidade discreto com o ganho proporcional realocado

no caminho de realimentação ........................................................................

53

Figura 4.8 – Uma resposta ao degrau estritamente aperiódica .......................................... 55

Figura 4.9 – Um controlador de velocidade digital indicando os coeficientes de

escalonamento KFB e KA e estabelecendo a relação entre os sinais de

velocidade e torque reais e suas representações digitais de comprimento de

palavra finito T*DIG e *

DIG, localizadas na RAM ..........................................

60

Figura 4.10 – O sistema de controle de velocidade digital com capacidade de torque

limitada do atuador ..........................................................................................

61

Page 11: sistema de controle de velocidade digital embarcado de motor de

Figura 4.11 – Resposta a um elevado degrau de entrada, levando o sistema à saturação ...... 63

Figura 4.12 – Forma incremental do controlador de velocidade digital com ação

proporcional realocada no caminho de realimentação .....................................

63

Figura 4.13 – Resposta a um degrau elevado obtida com um controlador de velocidade PI

discreto na sua implementação incremental e com a estrutura AWU da

Figura 4.12 .......................................................................................................

64

Figura 5.1 – Imagem da interface gráfica do sistema de controle de velocidade digital ..... 67

Figura 5.2 – Apresentação do método de medição combinada de frequência e período ..... 76

Figura 5.3 – Modelo em Simulink do Controlador PI digital incremental com realocação

do ganho proporcional para estratégia anti-wind-up .......................................

80

Figura 5.4 – Modelo em Simulink do sistema de controle de velocidade digital com a

componente de torque do atrito viscoso incluída no torque de perturbação ....

80

Figura 5.5 – Resposta de velocidade e sinal de controle, incluindo a componente de

torque do atrito viscoso no torque de perturbação, para um degrau de 80 rpm

(8,378 rad/s) em t = 0 e para uma perturbação de 0,3 N.m em t = 1 s .............

81

Figura 5.6 – Resposta de velocidade em vazio e sinal de controle, incluindo a

componente de torque do atrito viscoso no torque de perturbação, para um

degrau de 80 rpm (8,378 rad/s) em t = 0 e um degrau de -80 rpm em t = 1 s,

com o torque máximo TMAX = 0,05 N.m ..........................................................

83

Figura 5.7 – Modelo em Simulink do sistema de controle de velocidade digital com a

componente de torque do atrito viscoso incluída no modelo do motor ...........

84

Figura 5.8 – Resposta de velocidade e sinal de controle, incluindo a componente de

torque do atrito viscoso no modelo do motor, para um degrau de 80 rpm

(8,378 rad/s) em t = 0 e para uma perturbação de 0,3 N.m em t = 1 s .............

85

Figura 5.9 – Resposta de velocidade em vazio e sinal de controle, incluindo a

componente de torque do atrito viscoso no modelo do motor, para um

degrau de 80 rpm (8,378 rad/s) em t = 0 e um degrau de -80 rpm em t = 1 s,

com o torque máximo TMAX = 0,3 N.m ............................................................

87

Figura 5.10 – Resposta ao degrau de velocidade de 80 rpm (8,378 rad/s) e sinal de

controle da simulação, com a tensão da bateria de 13,6 V ..............................

91

Figura 5.11 – Resposta ao degrau de velocidade de 80 rpm para -80 rpm e sinal de

controle da simulação, com a tensão da bateria de 13,6 V ..............................

93

Figura 5.12 – Resposta ao degrau de velocidade de 70 rpm (7,33 rad/s) e sinal de controle

Page 12: sistema de controle de velocidade digital embarcado de motor de

da simulação, com a tensão da bateria de 10,7 V ............................................ 95

Figura 5.13 – Resposta ao degrau de velocidade de 70 rpm para -70 rpm e sinal de

controle da simulação, com a tensão da bateria de 10,7 V ..............................

97

Page 13: sistema de controle de velocidade digital embarcado de motor de

LISTA DE TABELAS

Tabela 5.1 – Código Gray com a definição dos canais do encoder e dos padrões ........... 75

Page 14: sistema de controle de velocidade digital embarcado de motor de

LISTA DE ABREVIATURAS E SIGLAS

A/D Analógico/Digital

AWU Anti-Wind-Up

CA Corrente Alternada

CC Corrente Contínua

CMOS Complementary Metal-Oxide-Semiconductor

CPU Central Processing Unit

D/A Digital/Analógico

DSP Digital Signal Processing

fcem Força Contra-eletromotriz

fem Força Eletromotriz

FIR Finite Impulse Response

I2C Inter-Integrated Circuit

IrDA Infrared Data Association

LCD Liquid Crystal Display

LIN Local Interconnect Network

MAB Memory Adress Bus

MDB Memory Data Bus

PI Proporcional e Integral

PID Proporcional, Integral e Derivativo

PWM Pulse Width Modulation

RAM Random Access Memory

RISC Reduced Instruction Set Computer

SPI Serial Peripheral Interface

TTL Transistor-Transistor Logic

UART Universal Asynchronous Receiver/Transmitter

USB Universal Serial Bus

USCI Universal Serial Communication Interface

ZOH Zero-Order Hold

Page 15: sistema de controle de velocidade digital embarcado de motor de

LISTA DE SÍMBOLOS

Vs Tensão de armadura

Ia Corrente de armadura

Td Torque médio desenvolvido

tK Constante de torque

p Fluxo magnético por polo

Velocidade angular do rotor

aE Força contra-eletromotriz

eK Constante de força contra-eletromotriz

mK Constante do motor

Ra Resistência de armadura

La Indutância de armadura

TL Torque de carga

mk Constante do motor quando o fluxo por polo é constante

em Constante de tempo eletromecânica

a Constante de tempo elétrica

m Constante de tempo mecânica

Ângulo de deslocamento

r Raio da engrenagem

N Número de dentes da engrenagem

T Período de amostragem

* Velocidade de referência

Erro de velocidade

T* Torque de referência

Ka Ganho do atuador de torque

TMAX Torque máximo do limitador

J Momento de inércia no eixo

KP Ganho proporcional

KI Ganho integral

p Ganho proporcional normalizado

i Ganho integral normalizado

Page 16: sistema de controle de velocidade digital embarcado de motor de

KFB Coeficiente de escalonamento da velocidade

KA Coeficiente de escalonamento do torque

amax Aceleração quando o torque é igual ao valor máximo

CV Tensão no microcontrolador

encoderV Tensão no encoder

Np Resolução do encoder

Tsc Janela de observação básica

scT Janela de observação estendida

N Número de pulsos do encoder capturados dentro da janela de observação

Th Período de tempo entre o final da janela de observação e quando o ultimo pulso

foi capturado dentro dela

Thf Período de cada ciclo do temporizador

Csc Total de ciclos da janela observável básica

scC Soma total de ciclos para uma janela observável estendida

Ch Quantidade de ciclos quando ocorreu a captura do último pulso dentro da janela

observável

DPWM Ciclo de trabalho do PWM

CTB Total de ciclos do temporizador

CPWM Quantidade de ciclos que correspondem ao ciclo de trabalho do PWM

Vs* Tensão de referência que deve ser aplicada ao motor

Vn Tensão nominal do motor

Page 17: sistema de controle de velocidade digital embarcado de motor de

SUMÁRIO

1 INTRODUÇÃO ................................................................................................ 13

2 MOTORES DE CORRENTE CONTÍNUA .................................................. 15

2.1 Introdução ......................................................................................................... 15

2.2 Torque e força contra-eletromotriz (fcem) .................................................... 16

2.3 Circuito Equivalente ........................................................................................ 17

2.4 Velocidade de rotação a vazio ......................................................................... 18

2.5 Velocidade de rotação com carga ................................................................... 19

2.6 Motores de corrente contínua de ímã permanente ....................................... 19

2.7 Comportamento dinâmico e constantes de tempo ......................................... 20

2.8 Sistemas com engrenagens .............................................................................. 22

3 MICROCONTROLADORES MSP430 ......................................................... 24

3.1 Introdução ......................................................................................................... 24

3.2 Microcontrolador MSP430F2274 ................................................................... 25

3.3 Sistema de clock ................................................................................................ 27

3.4 Portas de entrada/saída digitais ...................................................................... 28

3.4.1 Registrador de entrada PxIN ............................................................................ 28

3.4.2 Registrador de saída PxOUT ............................................................................ 28

3.4.3 Registrador de direção PxDIR .......................................................................... 29

3.4.4 Registrador de habilitação dos resistores de pullup/pulldown PxREN .......... 29

3.4.5 Registradores de seleção de função PxSEL ..................................................... 29

3.4.6 Registradores de habilitação de interrupção P1EI e P2EI .............................. 29

3.4.7 Registradores de seleção de transição da interrupção P1IES e P2IES .......... 30

3.4.8 Registradores de flag de interrupções P1IFG e P2IFG .................................. 30

3.5 Temporizadores ................................................................................................ 30

3.5.1 Bloco temporizador ........................................................................................... 31

3.5.2 Canais de captura/comparação ........................................................................ 33

3.5.2.1 Modo de captura ................................................................................................ 33

3.5.2.2 Modo de comparação ......................................................................................... 34

3.6 Interface de Comunicação Serial Universal (USCI): modo assíncrono

(UART) ..............................................................................................................

35

3.6.1 Configurando a velocidade de comunicação com o módulo USCI_A0 .......... 36

3.6.1.1 Modo de baixa frequência do gerador de velocidade de comunicação ............. 37

Page 18: sistema de controle de velocidade digital embarcado de motor de

3.6.2 Operação do módulo USCI_A0 ........................................................................ 38

3.7 Modos de operação em baixa potência ........................................................... 38

4 CONTROLE DE VELOCIDADE DIGITAL DE MOTORES .................... 41

4.1 Introdução ......................................................................................................... 41

4.2 Sistema com atuador de torque ideal e carga inercial .................................. 42

4.3 Função de transferência do subsistema mecânico ......................................... 44

4.4 Função de transferência do subsistema de medição de velocidade ............. 45

4.5 Função de transferência do sistema em malha fechada ............................... 46

4.5.1 Polos de malha fechada e efeitos de zeros de malha fechada ......................... 51

4.5.2 Realocação do ganho proporcional .................................................................. 52

4.6 Determinação de parâmetros de controladores de velocidade digitais ....... 54

4.6.1 Resposta estritamente aperiódica ..................................................................... 54

4.6.2 Formulação da função critério ......................................................................... 55

4.6.3 Cálculo dos valores otimizados dos ganhos normalizados .............................. 57

4.7 Estratégia anti-wind-up .................................................................................... 61

5 SISTEMA DE CONTROLE DE VELOCIDADE DIGITAL BASEADO

NA FERRAMENTA EZ430-RF2500 .............................................................

65

5.1 Introdução ......................................................................................................... 65

5.2 Interface gráfica ............................................................................................... 66

5.3 Módulo local ..................................................................................................... 69

5.3.1 Eventos provenientes da interface gráfica ....................................................... 70

5.3.2 Eventos provenientes do módulo remoto .......................................................... 71

5.4 Módulo remoto ................................................................................................. 71

5.4.1 Comunicação com o módulo local ................................................................... 72

5.4.2 Medição de velocidade ...................................................................................... 73

5.4.2.1 Circuito de interface do encoder ........................................................................ 73

5.4.2.2 Escolha do período de amostragem ................................................................... 74

5.4.2.3 Determinação do sentido de rotação ................................................................. 74

5.4.2.4 Medição combinada de frequência e período .................................................... 76

5.4.3 Controlador PI .................................................................................................. 77

5.4.3.1 Estimação dos parâmetros do modelo do motor CC ......................................... 78

5.4.3.2 Determinação dos parâmetros do controlador .................................................. 79

5.4.3.3 Avaliação de desempenho do controlador por meio de simulação

Page 19: sistema de controle de velocidade digital embarcado de motor de

computacional .................................................................................................... 79

5.4.4 Acionamento do motor CC ................................................................................ 88

5.4.4.1 Circuito de acionamento do motor CC .............................................................. 88

5.4.4.2 Cálculo do número de ciclos do PWM ............................................................... 89

5.5 Resultados Experimentais ............................................................................... 89

6 CONCLUSÃO .................................................................................................. 99

REFERÊNCIAS ............................................................................................... 101

APÊNDICE A – CÓDIGOS FONTE ............................................................. 103

Page 20: sistema de controle de velocidade digital embarcado de motor de

13

1 INTRODUÇÃO

A modelagem de motores de Corrente Contínua (CC) no domínio contínuo é

amplamente abordada na literatura, como em Ogata (2010), Dorf e Bishop (2011) e

Golnaraghi e Kuo (2010). Nesses trabalhos são apresentados as equações diferencias do

modelo do motor CC, o modelo em diagrama de blocos, as funções de transferência e as

constantes de tempo. Uma análise do regime transitório do motor CC também pode ser

encontrada em Hughes (2006). Nela, argumenta-se que para grande parte das aplicações de

controle é possível desprezar-se o efeito da constante de tempo elétrica, pois esta é muito

menor do que a constante de tempo eletromecânica. Uma técnica de controle de velocidade no

domínio contínuo, por meio de um controlador Proporcional Integral (PI), pode ser

encontrada em Haishui et al. (2010).

Trabalhos sobre técnicas de controle de velocidade de motores CC no domínio

discreto datam desde a década de 70, como os trabalhos de Lin e Koepsel (1977) e Wang e

Chen (1979). Atualmente, pode-se encontrar vários trabalhos nessa área. Em especial, pode-se

citar o trabalho de Vukosavić (2007), que aborda técnicas de controle de velocidade tanto no

domínio contínuo como no discreto.

Este trabalho tem o objetivo de descrever uma técnica de controle de velocidade

digital de motores e sua aplicação no controle de velocidade de um motor CC de ímã

permanente. O sistema de controle digital implementado foi desenvolvido utilizando a

ferramenta de desenvolvimento eZ430-RF2500 da Texas Instruments, baseada no

microcontrolador de 16 bits MSP430F2274. Também foi desenvolvido um programa de

interface gráfica para computador implementado na linguagem Java.

No capítulo 2 são abordados os fundamentos da teoria de motores CC, e de forma

específica o motor CC de ímã permanente. São abordados os fundamentos para a operação

tanto no regime permanente como no regime transitório.

O capítulo 3 trata dos detalhes técnicos do microcontrolador MSP430, em especial

do modelo MSP430F2274. São descritos a configuração e operação dos componentes

utilizados no sistema de controle digital. São eles sistema de clock, portas de entrada/saída,

temporizadores, interface de comunicação serial e modos de operação em baixa potência.

O capítulo 4 descreve a teoria do controle de velocidade digital de motores. Uma

técnica utilizando um controlador PI é apresentada. É mostrado como é possível projetar um

controlador eliminando o sobressinal da resposta de velocidade e obtendo um tempo de

Page 21: sistema de controle de velocidade digital embarcado de motor de

14

resposta óptimo. Também é apresentada uma estratégia anti-wind-up para o sistema de

controle.

No capítulo 5 é apresentado a aplicação do controlador projetado no capítulo 4 no

controle de velocidade de um motor CC de ímã permanente. O sistema de controle

implementado é dividido em três componentes. Uma interface gráfica, um módulo local e um

módulo remoto. O desenvolvimento e operação de cada componente é mostrado em detalhes.

O capítulo 6 é formado pelas conclusões deste trabalho.

Page 22: sistema de controle de velocidade digital embarcado de motor de

15

2 MOTORES DE CORRENTE CONTÍNUA

2.1 Introdução

Desde o final do século dezenove os sistemas elétricos de Corrente Alternada

(CA) predominaram sobre os sistemas de Corrente Contínua (CC). No entanto, por várias

décadas, os motores CC continuaram sendo uma grande parcela do consumo de equipamentos

elétricos (Chapman, 2005).

Sistemas de corrente contínua ainda são comuns em muitas aplicações. Por isso,

nestes casos, faz sentido a utilização de motores CC. Porém, existem aplicações onde o custo

adicional de comutadores e conversores CA/CC é justificado pelo desempenho superior que

um motor CC pode apresentar, como elevado torque de partida e a operação em velocidades

que não são alcançadas por motores CA (Guru; Hiziroglu, 2001).

É nos sistemas de controle onde os motores CC encontram sua principal

aplicação. Suas características de velocidade e torque permitem que essas grandezas sejam

precisamente controladas dentro de uma ampla faixa de valores. Tal fato faz deles a escolha

preferida em sistemas de posicionamento e controle de velocidade. No entanto, não se pode

negar que da década de 1980 aos dias atuais, com a difusão dos inversores de frequência, os

motores CA passaram a ser a nova escolha em muitas aplicações de controle de velocidade

(Hughes, 2006).

De acordo com Hughes (2006, tradução nossa), a estrutura básica de um motor

CC pode ser vista na Figura 2.1 e é descrita da seguinte forma:

O motor tem dois circuitos separados. Os pares de terminais menores conectam-se

com os enrolamentos de campo, que envolvem cada polo e estão normalmente em

série: no regime permanente toda potência de entrada para os enrolamentos de

campo é dissipada como calor – nada é convertido em potência de saída mecânica.

Os terminais principais transportam a corrente de “potência” ou “trabalho” para as

escovas que fazem contato deslizante com o enrolamento de armadura no rotor. A

alimentação para o campo é separada daquela para a armadura, por isso a descrição

“excitação separada”.

Page 23: sistema de controle de velocidade digital embarcado de motor de

16

Figura 2.1 – Motor CC convencional (escovado).

Fonte: Adaptada de Hughes (2006).

Existem cinco tipos principais de motores CC de acordo com a forma de

excitação:

a) excitação independente ou separada;

b) excitação em paralelo;

c) ímã permanente;

d) excitação em série;

e) excitação composta.

Neste capítulo, trata-se apenas do motor CC com ímã permanente, pois é o tipo

utilizado no sistema de controle de velocidade que será apresentado.

2.2 Torque e força contra-eletromotriz (fcem)

Em um motor CC o campo magnético produzido pelos enrolamentos de campo é

uniforme e praticamente constante. Quando alimenta-se o circuito da armadura com uma

fonte de tensão constante Vs, os condutores da armadura, que conduzem uma corrente

constante, são submetidos, dentre outras forças, a forças (forças de Lorentz) que tendem a

movimentar o rotor da máquina CC. Enquanto o rotor está parado, a corrente de armadura Ia é

limitada apenas pela resistência do circuito de armadura Ra. Como geralmente essa resistência

Page 24: sistema de controle de velocidade digital embarcado de motor de

17

tem um valor muito baixo, a corrente de partida do motor é vinte a trinta vezes maior que a

corrente à plena carga. Essa condição produz um torque de partida muito elevado em motores

CC e consequentemente uma rápida aceleração do rotor.

O torque médio desenvolvido Td pelas forças a que estão submetidos os

condutores da armadura é diretamente proporcional ao produto do fluxo por polo p pela

corrente de armadura Ia.

d t p aT K I , (2.1)

onde Kt é a constante de torque do motor CC.

À medida que o rotor acelera, cada espira na armadura sofre o efeito da variação

de fluxo em seu plano. Assim, uma força eletromotriz (fem) é induzida no circuito da

armadura. Pela lei de Lenz, essa fem é produzida de tal modo a se opor à variação de fluxo,

tendo sentido contrário à tensão da fonte. Devido a esse fato, ela é chamada força contra-

eletromotriz (fcem).

A fcem é diretamente proporcional ao fluxo por polo p e à velocidade angular do

rotor . Assim, tem-se,

a e pE K , (2.2)

onde Ke é a constante de fcem do motor CC.

No Sistema Internacional (SI) de unidades, as constantes de torque Kt e de fcem

Ke são iguais. Desse modo, as Equações 2.1 e 2.2 podem ser simplificadas:

d m p aT K I , (2.3)

a m pE K , (2.4)

onde Km é a constante do motor CC.

2.3 Circuito Equivalente

O circuito equivalente de um motor CC é mostrado na Figura 2.2. Nela, o circuito

de armadura completo é representado por uma fonte de tensão Ea, um resistor Ra e uma

indutância La. A tensão Vs é a tensão aplicada aos terminais da armadura. Para que a máquina

CC opere como motor, Vs deve ser maior do que Ea. Desse modo, a corrente Ia tem o sentido

indicado na Figura 2.2 e a equação da tensão de armadura é dada por

as a a a a

dIV E R I L

dt . (2.5)

Page 25: sistema de controle de velocidade digital embarcado de motor de

18

Figura 2.2 – Circuito equivalente de um motor CC.

Fonte : Adaptada de Hughes (2006).

O último termo da Equação 2.5 representa a queda de tensão indutiva devida à

auto-indutância da armadura, que é proporcional à taxa de variação da corrente de armadura.

Em regime permanente (quando a corrente é constante), seu valor é igual a zero, podendo ser

ignorado (Hughes, 2006). Nessas condições, a Equação 2.5 se torna:

s a a aV E R I ou s aa

a

V EI

R

. (2.6)

Essas equações permitem se calcular a corrente de armadura tendo posse de

valores conhecidos previamente de tensão da fonte, resistência de armadura e velocidade (por

onde pode-se obter Ea). De posse da corrente de armadura, pode-se calcular o torque

desenvolvido pelo motor. De outro modo, tendo-se os valores de resistência de armadura,

velocidade de referência (especificada pelo operador) e torque desejado (calculado), pode-se

calcular a tensão da fonte necessária para atingir essas condições. A última abordagem é a

utilizada no controlador de velocidade proposto.

2.4 Velocidade de rotação à vazio

Considerando a Equação 2.6, quando o motor opera na condição à vazio, a queda

de tensão devida à resistência de armadura Ra é muito pequena. Assim, a fcem Ea é

aproximadamente igual à tensão nos terminais da armadura Vs (Wildi, 2002). Substituindo Ea

por Vs na Equação 2.4, tem-se

s

m p

V

K

. (2.7)

Page 26: sistema de controle de velocidade digital embarcado de motor de

19

Desse modo, pode-se observar que a velocidade do motor CC à vazio é

diretamente proporcional à tensão de armadura e inversamente proporcional à intensidade de

fluxo gerada pelo enrolamento de campo.

2.5 Velocidade de rotação com carga

Na condição com carga, pode-se obter a expressão para a velocidade em regime

permanente em função de duas variáveis que pode-se controlar, a tensão de armadura Vs e o

torque da carga TL. Em regime permanente, não há aceleração, portanto, o torque do motor Td

é igual a TL. Substituindo as Equações 2.3 e 2.4 na Equação 2.6 (Hughes, 2006), tem-se

as m p L

m p

RV K T

K

ou

2( )

s aL

m p m p

V RT

K K

. (2.8)

2.6 Motores de corrente contínua de ímã permanente

Motores CC de ímã permanente são largamente usados em aplicações de baixa

potência. As características construtivas desse tipo de motor são mais simples, onde no lugar

do enrolamento de campo tem-se um ímã permanente. Pode-se citar várias vantagens desse

motor. As principais delas são a ausência de excitação externa e suas baixas perdas no cobre

associadas para criar campos magnéticos na máquina (Fitzgerald; Kingsley; Umans, 2003).

A presença dos enrolamentos de campo também resulta em uma considerável

quantidade de calor e na necessidade de grande volume de espaço para acomodar os polos do

circuito de campo. Nos motores de ímã permanente essas características são superadas. Os

resultados são um motor menor, com alta eficiência e que corre riscos menores de falhas

relacionadas à produção de campo (Wildi, 2002).

Entretanto, os motores CC de ímã permanente também têm desvantagens. Nestes

motores o fluxo por polo é apenas o fluxo residual nos ímãs permanentes. Quando o

enrolamento de armadura é submetido a excessivos valores de corrente, existe o risco de que a

força magnetomotriz produzida pela mesma tenda a desmagnetizar os polos,

permanentemente reduzindo e reorientando o seu fluxo residual. A desmagnetização dos

polos também pode ocorrer por sobreaquecimento, ocasionado durante prolongados períodos

de sobrecarga (Chapman, 2005). Além do mais, apesar dos avanços feitos nas últimas

décadas, com o desenvolvimento de novos materiais com características desejáveis para a

Page 27: sistema de controle de velocidade digital embarcado de motor de

20

fabricação de ímãs permanentes, estes componentes ainda apresentam um alto custo (Wildi,

2002).

Um motor CC de ímã permanente é basicamente a mesma máquina que um motor

CC com excitação independente com a diferença de que o seu fluxo do campo é sempre

constante. Portanto, não é possível controlar a velocidade do motor variando o fluxo por polo

p, através da corrente de campo. Os únicos métodos disponíveis neste caso são através da

variação da resistência de armadura Ra ou da tensão de armadura Vs (Chapman, 2005). Assim,

em regime permanente, as Equações 2.8 se tornam

as m L

m

RV k T

k ou

2

s aL

m m

V RT

k k . (2.9)

onde km é a constante do motor CC com fluxo por polo p constante.

2.7 Comportamento dinâmico e constantes de tempo

De todos os tipos de motores, o motor CC é o que apresenta a teoria de dinâmica

transitória mais simples. Todas as suas mudanças transitórias são determinadas por apenas

duas constantes de tempo. A primeira é a constante de tempo eletromecânica, que governa o

modo como a velocidade se acomoda a um novo patamar seguindo uma perturbação como

uma mudança na tensão de armadura ou no torque da carga. A segunda é a constante de

tempo elétrica (ou de armadura), que é geralmente muito menor e governa a taxa de mudança

da corrente de armadura seguindo uma mudança na tensão de armadura (Hughes, 2006).

Os motores CC podem ser vistos como um sistema com duas entradas, a tensão de

armadura e o torque da carga. Quando desconsidera-se a indutância do motor CC, e varia-se

uma destas duas entradas, as respostas transitórias da corrente de armadura e da velocidade

são de primeira ordem (exponencial). Esta suposição é válida para a maioria dos motores CC,

exceto os de capacidade muito elevada.

Por exemplo, se subitamente aumenta-se a tensão de armadura de um motor sem

atrito e sem carga, sua corrente e velocidade variam como mostrado na Figura 2.3. Como a

indutância foi desprezada, há um instantâneo aumento de corrente, já que a diferença entre a

tensão de armadura e a fcem aumentam. Essa variação na corrente dá origem a uma elevação

do torque do motor, acelerando a máquina. A diferença entre a fcem e a tensão de armadura

diminui com o aumento de velocidade, assim como a corrente. Com o tempo, a corrente chega

Page 28: sistema de controle de velocidade digital embarcado de motor de

21

a zero e o torque também. A velocidade atinge seu novo valor de regime permanente neste

ponto.

Figura 2.3 – Reposta de um motor CC a uma elevação da

tensão de armadura em degrau.

Fonte: Adaptada de Hughes (2006).

A expressão que descreve a variação da corrente de armadura com o tempo é

/2 1 at

a

a

V VI e

R

. (2.10)

A constante de tempo elétrica do motor é definida como

aa

a

L

R . (2.11)

A expressão para a velocidade é similar à da corrente, também dependente de um

termo exponencial, / emte

(Hughes, 2006).

A constante de tempo eletromecânica é dada por

2

aem

m

R J

k , (2.12)

onde J é a inercia total do rotor mais a carga.

No caso de um motor com o rotor bloqueado, se é aplicada uma entrada tipo

degrau para a tensão de armadura, a corrente aumentaria exponencialmente até atingir o valor

final de Vs/Ra com uma constante de tempo a (Hughes, 2006).

O motor CC é na verdade um sistema de segunda ordem. Desse modo, as duas

constantes de tempo apresentadas influenciam a variação da corrente de armadura no período

transitório. No entanto, a constante de tempo elétrica é muito menor (mais rápida) que a

Page 29: sistema de controle de velocidade digital embarcado de motor de

22

constante eletromecânica. Assim, para a maioria dos motores CC e ampla gama de aplicações,

seu modelo pode ser aproximado por um sistema de primeira ordem com a constante de

tempo eletromecânica. No regime transitório, desprezando-se os efeitos da indutância de

armadura La, a relação das tensões descrita pela Equação 2.5 se torna

s a a aV E R I . (2.13)

Esta é a mesma equação para as tensões em regime permanente descrita anteriormente. Desse

modo, a Equação 2.9 pode ser aproveitada para descrever a relação da tensão de armadura

com a velocidade e o torque desenvolvido por um motor CC de ímã permanente, em regime

transitório, pela equação

as m d

m

RV k T

k . (2.14)

No controlador de velocidade que será apresentado, pode-se especificar a

velocidade angular como referência e o torque Td a ser desenvolvido pelo motor é calculado

pelo algoritmo do controlador. Assim, utilizando-se a Equação 2.14 juntamente com outras

equações, pode-se calcular o número de ciclos do temporizador do microcontrolador com

Modulação por Largura de Pulso (do inglês Pulse Width Modulation – PWM) correspondente

à tensão que deve ser aplicada ao motor, durante o atual período de amostragem, para se

alcançar a velocidade de referência do sistema.

2.8 Sistemas com engrenagens

Sistemas rotacionais raramente são vistos sem associação com caixa de

engrenagens para acionar a carga. Engrenagens fornecem vantagens mecânicas para sistemas

rotacionais. Como exemplo, tem-se uma bicicleta de 18 marchas. Quando sobe-se uma

ladeira, muda-se a marcha para obter mais torque e menos velocidade. Em uma reta, a

mudança é feita para se obter menos torque e mais velocidade. Desse modo, as engrenagens

permitem adequar o sistema de acionamento e a carga – um compromisso entre velocidade e

torque (Nise, 2011).

Na Figura 2.4, uma engrenagem de entrada com ângulo de deslocamento 1(t),

raio r1 e N1 dentes tem aplicado um torque T1(t). Na saída, tem-se uma engrenagem com

ângulo de deslocamento 2(t), raio r2 e N2 dentes, com um torque resultante T2(t). Quando as

engrenagens giram, o deslocamento ao longo das suas circunferências é igual. Desse modo,

tem-se

Page 30: sistema de controle de velocidade digital embarcado de motor de

23

1 1 2 2r r . (2.15)

Figura 2.4 – Um sistema de engrenagens.

Fonte: Adaptada de Nise (2011).

Pode-se observar que o número de dentes de cada engrenagem é diretamente

proporcional ao seu raio. Obtém-se, então

2 1 1

1 2 2

r N

r N

. (2.16)

Dividindo cada termo do centro pela variação de tempo t pode-se obter a relação

para as velocidades angulares dada abaixo:

2 2 1

1 1 2

N

N

. (2.17)

Considerando que as engrenagens são ideais e não absorvem nem armazenam

energia, pode-se dizer que a energia na entrada é a mesma da saída. Assim,

1 1 2 2T T . (2.18)

Substituindo a Equação 2.18 na Equação 2.17, finalmente tem-se

1 2 1

2 1 2

T N

T N

. (2.19)

Pode-se perceber então que o torque é diretamente proporcional à relação do

número de dentes e inversamente proporcional à relação das velocidades angulares.

Page 31: sistema de controle de velocidade digital embarcado de motor de

24

3 MICROCONTROLADORES MSP430

3.1 Introdução

O controlador digital de velocidade que foi desenvolvido é baseado em um

sistema de hardware embarcado microcontrolado. Nesse caso, o microcontrolador escolhido

foi o MSP430.

A família de microcontroladores MSP430 é um produto da Texas Instruments

(TI). Eles são microcontroladores de 16 bits, de arquitetura Computador com um Conjunto

Reduzido de Instruções (do inglês Reduced Instruction Set Computer - RISC), que,

dependendo do modelo, podem trabalhar com frequências de até 25 MHz e endereçar até 512

KB de memória. Os periféricos que se podem encontrar disponíveis nestes

microcontroladores vão desde os mais básicos até os com relativa sofisticação, sempre

focando na simplicidade. De acordo com o modelo, pode-se encontrar unidades de memórias

flash, temporizadores, Interface de Comunicação Serial Universal (do inglês Universal Serial

Communication Interface - USCI), interface de Barramento Serial Universal (do inglês

Universal Serial Bus - USB), controladores de Tela de Cristal Líquido (do inglês Liquid

Crystal Display - LCD), conversores Analógico/Digital (A/D) e Digital/Analógico (D/A),

amplificadores operacionais, hardware multiplicador, relógio de tempo-real, controladores de

supervisão de tensão de alimentação, sensor de temperatura e outros. Além disso, alguns

modelos de MSP430 são suportados por sistemas operacionais de tempo-real.

A principal vantagem dos microcontroladores MSP430 com relação a outros

microcontroladores com características semelhantes é o seu baixo consumo de energia. Isso

faz dele uma boa escolha para aplicações de sistemas embarcados com relativo desempenho e

baixa potência (à bateria) ou sistemas de coleta de energia (sistemas autônomos reduzidos e

sem fio). No entanto, microcontroladores MSP430 tem a desvantagem de serem mais caros do

que outros microcontroladores de 16 bits. Então, dependendo da aplicação, deve-se avaliar a

relação custo-benefício.

A TI disponibiliza várias ferramentas de desenvolvimento para o MSP430. Para a

implementação do controlador de velocidade que será apresentado, utilizou-se a ferramenta

eZ430-RF2500. Ela é baseada no microcontrolador MSP430F2274. Desse modo, será descrita

a operação dos periféricos utilizados no sistema de controle de velocidade.

Page 32: sistema de controle de velocidade digital embarcado de motor de

25

3.2 Microcontrolador MSP430F2274

O MSP430 incorpora uma Unidade Central de Processamento (do inglês Central

Processing Unit - CPU) tipo RISC, periféricos e um flexível sistema de clock que se

interconectam usando um Barramento de Endereços de Memória (do inglês Memory Adress

Bus - MAB) comum tipo von-Neumann e um Barramento de Dados de Memória (do inglês

Memory Data Bus - MDB) (Figura 3.1). Compartilhando uma moderna CPU com periféricos

analógicos e digitais modulares com mapeamento de memória, o MSP430 oferece soluções

para aplicações de sinais mistos exigentes (Texas Instruments, 2013a).

Figura 3.1 – Arquitetura da família MSP430F22x4.

Fonte: Texas Instruments (2013b).

As principais características do MSP430F2274 são dadas abaixo (Texas

Instruments, 2013b):

f) Faixa de tensão de alimentação: 1,8 a 3,6 V;

g) Consumo de energia:

modo ativo: 270 µA a 1 MHz e 2,2 V;

Page 33: sistema de controle de velocidade digital embarcado de motor de

26

modo standby: 0,7 µA;

modo desligado (retenção de Memória de Acesso Aleatório (do inglês

Random Access Memory - RAM)): 0,1 µA;

h) ativação do modo standby em menos de 1 µs;

i) arquitetura RISC de 16 bits e tempo de ciclo de instrução de 62,5 ns;

j) configurações do módulo de clock básico:

frequências internas de até 16 MHz com quatro frequências calibradas com

1 % de erro;

oscilador interno de baixa frequência e baixo consumo de energia;

cristal de 32 kHz;

cristal de alta frequência de até 16 MHz;

ressonador;

fonte de clock digital externo;

resistor externo;

k) Timer_A de 16 bits com três registradores de captura/comparação;

l) Timer_B de 16 bits com três registradores de captura/comparação;

m) Interface de Comunicação Serial Universal (USCI):

Receptor/Transmissor Assíncrono Universal (do inglês Universal

Asynchronous Receiver/Transmitter - UART) avançado com suporte a

detecção automática de velocidade;

codificador e decodificador infravermelho (do inglês Infrared Data

Association - IrDA);

Interface Periférica Serial (do inglês Serial Peripheral Interface - SPI)

síncrona;

interface Circuito Inter-integrado (do inglês Inter-Integrated Circuit - I²C);

n) conversor A/D de 10 bits e 200 ksps, com referência interna, circuito Amostra e

Segura, varredura automática e controlador de transferência de dados;

o) dois amplificadores operacionais configuráveis;

p) detector de queda de energia;

q) programação onboard serial, sem necessidade de tensão de programação

externa e proteção com código programável por meio de fusível de segurança;

r) módulo de emulação on-chip;

Page 34: sistema de controle de velocidade digital embarcado de motor de

27

s) memória:

32 KB + 256 B de memória flash;

1 KB de RAM.

3.3 Sistema de clock

O Basic Clock Module+ suporta sistemas de baixo custo e baixo consumo de

energia. Usando três sinais internos de clock, o usuário pode selecionar o melhor equilíbrio

entre desempenho e baixo consumo de energia. No caso do MSP430F2274, o Basic Clock

Module+ pode ser configurado para operar sem nenhum componente externo, com um

resistor externo, com um cristal externo, ou com ressonadores, sob controle de software

completo. Ele inclui três fontes de clock (Texas Instruments, 2013a):

a) LFXT1: oscilador de baixa frequência/alta frequência que pode ser usado com

cristais de relógio de baixa frequência ou fontes de clock externas de 32768 Hz

ou com cristais padrão, ressonadores, ou fontes de clock externas na faixa de

400 kHz a 16 MHz;

b) DCO: Oscilador Digitalmente Controlado interno. Disponível em todos os

dispositivos e um dos componentes de mais destaque do MSP430.

Basicamente, é um oscilador RC altamente controlável que inicia em menos de

1 µs;

c) VLO: oscilador de baixa frequência, baixa potência, interno, de 12 kHz. Pode

ser usado como alternativa a LFXT1 quando a precisão de um cristal não é

necessária.

Como saída, o Basic Clock Module+ fornece três clocks:

a) Master clock, MCLK: sua fonte é selecionável por software como LFXT1,

VLO ou DCO. Pode ser dividido por 2, 4 ou 8. O MCLK é usado pela CPU e

alguns periféricos;

b) Sub-main clock, SMCLK: assim como o MCLK, sua fonte é selecionável por

software como LFXT1, VLO ou DCO e pode ser dividido por 2, 4 ou 8. É

distribuído aos periféricos;

c) Auxiliary clock, ACLK: sua fonte é selecionável por software como LFXT1 ou

VLO. Pode ser dividido por 2, 4 ou 8. Também é distribuído aos periféricos.

Page 35: sistema de controle de velocidade digital embarcado de motor de

28

3.4 Portas de entrada/saída digitais

O MSP430 pode apresentar até oito portas de entrada/saída digitais, com oito

pinos cada. Cada pino pode ser configurado individualmente como uma entrada ou uma saída

por meio de software.

O MSP430F2274 possui quatro portas de entrada/saída. As portas P1 e P2

possuem recurso de interrupção em todos os seus pinos. As interrupções podem ser ativadas

tanto por uma mudança de bit ascendente como descendente. Na porta P1, tem-se um vetor de

interrupção para atender todos os pinos. Já na porta P2, tem-se um vetor de interrupção

diferente para cada pino.

As portas de entrada/saída digitais apresentam as seguintes características (Texas

Instruments, 2013a):

a) entrada/saídas independentes controladas individualmente;

b) qualquer combinação de entrada ou saída;

c) interrupções de P1 e P2 configuráveis individualmente;

d) registradores de dados de entrada e saída independentes;

e) resistores de pullup e pulldown configuráveis individualmente;

f) função de oscilador de pino configurável individualmente.

No MSP430F2274 as portas P3 e P4 possuem cinco registradores de 8 bits cada,

enquanto que as portas P1 e P2 têm oito registradores de 8 bits cada. As portas P1 e P2

possuem os seis registradores semelhantes aos das portas P3 e P4, mais três registradores

associados às funções de interrupção. A seguir são descritas as funções de cada registrador.

3.4.1 Registrador de entrada PxIN

Cada bit do registrador representa o nível lógico do respectivo pino quando este

está configurado como entrada/saída digital. É um registrador somente de leitura e não precisa

ser inicializado, já que seu conteúdo depende de sinais externos.

3.4.2 Registrador de saída PxOUT

O nível lógico de cada pino da porta é conduzido para o valor armazenado no

respectivo bit do registrador quando o pino está configurado como saída e o resistor de

Page 36: sistema de controle de velocidade digital embarcado de motor de

29

pullup/pulldown está desabilitado. Quando o pino está configurado como entrada, o valor do

respectivo bit é armazenado em um buffer e, quando posteriormente o pino é configurado

como saída, sua saída é conduzida para este valor.

Esse registrador não precisa de inicialização. No início de uma operação é

necessário gravar o valor desejado no registrador antes de configurar a direção do pino.

Além da sua função básica, quando o resistor de pullup/pulldown está ativado

para um determinado pino (configurado como entrada), o valor do respectivo bit de PxOUT

seleciona o tipo de conexão do resistor, se pulldown (bit = 0) ou pullup (bit = 1).

3.4.3 Registrador de direção PxDIR

Cada bit configura um pino como entrada (bit = 0) ou saída (bit = 1). Esse

registrador é utilizado quando o pino está configurado tanto como entrada/saída digital,

quanto como uma função pertencente a outro periférico. No segundo caso, a direção do pino

deve ser configurada de acordo com a função.

3.4.4 Registrador de habilitação dos resistores de pullup/pulldown PxREN

Cada bit habilita (bit = 1) ou desabilita (bit = 0) o resistor de pullup/pulldown do

pino correspondente, quando este está configurado como entrada. Por padrão, os resistores

estão desativados. Quando habilitado, o respectivo bit de PxOUT seleciona o tipo de conexão.

3.4.5 Registradores de seleção de função PxSEL

Pinos de portas geralmente compartilham conexões com funções de outros

periféricos. Cada bit de PxSEL seleciona o pino como entrada/saída digital (bit = 0) ou uma

função de outro periférico (bit = 1). No entanto, quando o pino está configurado para uma

outra função, ainda é necessário selecionar a direção do pino por meio de PxDIR.

3.4.6 Registradores de habilitação de interrupção P1EI e P2EI

Habilita (bit = 1) a capacidade de gerar interrupções quando ocorre uma transição

de bit em um pino de entrada. Por padrão interrupções ficam desabilitadas na inicialização.

Page 37: sistema de controle de velocidade digital embarcado de motor de

30

3.4.7 Registradores de seleção de transição da interrupção P1IES e P2IES

Cada bit seleciona a transição que ativa a interrupção. Quando o bit é igual a zero,

a interrupção é acionada por uma transição de nível lógico baixo para alto. O inverso ocorre

para o bit igual a um. Esse registrador não é inicializado e, portanto, deve ser configurado

antes das interrupções serem habilitadas.

3.4.8 Registradores de flag de interrupções P1IFG e P2IFG

Indica (bit = 1) que ocorreu uma transição (de acordo com PxIES) no

correspondente pino configurado como entrada quando PxIE está ativo. Quando a rotina de

serviço de interrupção é chamada, o reset de PxIFG precisa ser realizado via software. Esse

registrador é de leitura e gravação. Assim, pode-se gerar uma interrupção via software

gravando o valor um no respectivo bit em que se deseja ativar a interrupção.

3.5 Temporizadores

O MSP430F2274 possui dois módulos temporizadores: Timer_A e Timer_B. As

características do Timer_A são descritas abaixo (Texas Instruments, 2013a):

a) temporizador/contador de 16 bits assíncrono com quatro modos de operação;

b) fonte de clock selecionável e configurável;

c) três registradores de captura/comparação configuráveis;

d) saídas configuráveis com recurso de Modulação por Largura de Pulso (do

inglês Pulse Width Modulation - PWM);

e) latchs de entrada e saída assíncronos;

f) registrador de vetor de interrupção para decodificação rápida de todas

interrupções do Timer_A.

O Timer_B é idêntico ao Timer_A com as seguintes exceções:

a) o período de duração do Timer_B pode ser programado como 8, 10, 12 e 16

bits;

b) os registradores TBCCRx do Timer_B possuem buffer duplo e podem ser

agrupados;

c) todas as saídas do Timer_B podem ser postas em estado de alta impedância;

Page 38: sistema de controle de velocidade digital embarcado de motor de

31

d) a função do bit SCCI (entrada de captura sincronizada) não é implementada no

Timer_B.

Como a configuração e operação dos dois temporizadores é muito semelhante,

serão descritos os detalhes relacionados ao Timer_A. O hardware do Timer_A é dividido em

duas partes principais (Davies, 2008):

a) bloco temporizador: O núcleo, baseado no registrador de 16 bits TAR. A fonte

do clock pode ser escolhida entre várias opções. Também possui divisores de

frequência, permitindo escalonamento. Não possui nenhuma saída, mas uma

flag TAIFG é ativada quando o contador retorna para zero;

b) canais de captura/comparação: É onde a maioria dos eventos ocorre. Cada

canal é baseado em um registrador TACCRx. Trabalham de forma semelhante

com exceção de TACCR0. Cada canal pode:

capturar uma entrada, que significa gravar o “tempo” (o valor de TAR) em

TACCRx no qual a entrada sofre uma transição. A entrada pode ser externa

(pino) ou interna (outro periférico ou via software);

comparar o valor atual de TAR com o valor armazenado em TACCRx e,

quando esses valores são iguais, atualizar uma saída. A saída também pode

ser externa ou interna;

solicitar uma interrupção, ocorrendo um dos dois eventos acima, ativando a

flag de interrupção CCIFG de TACCRx; isso pode ser realizado mesmo sem

nenhum sinal de saída sendo ativado;

amostrar uma entrada em um evento de comparação; este recurso especial é

particularmente útil se o Timer_A é usado para comunicação serial em um

dispositivo onde falta uma interface dedicada.

3.5.1 Bloco temporizador

Esse bloco contém o registrador do temporizador de 16 bits TAR e é crucial para

a operação do Timer_A. Ele é controlado pelo registrador TACTL.

Um temporizador nada mais é que um contador e não tem nenhum conceito direto

de tempo (o relógio de tempo real é uma exceção). É trabalho do programador estabelecer

uma relação entre o valor no contador e o tempo real. Isso depende essencialmente da

Page 39: sistema de controle de velocidade digital embarcado de motor de

32

frequência do clock para o temporizador. Ela pode ser escolhida de quatro fontes através do

campo de bits TASSELx em TACTL (Davies, 2008):

a) SMCLK: é interno e geralmente muito rápido (da ordem de megahertz);

b) ACLK: é interno e geralmente lento. Pode ser proveniente de um cristal

(tipicamente 32 kHz) ou do VLO (12 kHz);

c) TACLK: é externo;

d) INCLK: é também externo.

O clock selecionado pode ser aplicado diretamente ou ter sua frequência dividida

por 2, 4 ou 8 através dos bits IDx. Quando se divide a frequência da fonte, diminui-se a

resolução com que os eventos são registrados. Por outro lado, isso resulta em um período do

temporizador maior. O divisor do temporizador é reiniciado quando TACLR é ativado.

O temporizador possui quatro modos de operação selecionados pelos bits MCx:

a) parada, MCx = 00: se o temporizador já foi iniciado, a contagem é

interrompida e o valor de TAR é preservado até que o contador seja reiniciado;

b) crescente, MCx = 01: a contagem vai de zero até o valor de TACCR0,

repetidamente. O período é igual a TACCR0 + 1. A flag de interrupção CCIFG

de TACCR0 é ativada quando o contador conta do valor de TACCR0 para

zero. Se o temporizador for configurado para o modo crescente quando TAR

for maior que o valor de TACCR0, o temporizador imediatamente reinicia a

contagem a partir de zero;

c) Contínuo, MCx = 10: a contagem vai de zero até FFFFh, repetidamente. A flag

de interrupção do Timer_A TAIFG é ativada quando o contador conta de

FFFFh para zero;

d) Crescente/decrescente, MCx = 11: a contagem vai de zero até o valor de

TACCR0 e depois de forma decrescente até zero, repetidamente. O período é

igual a duas vezes o valor de TACCR0. A flag CCIFG de TACCR0 é ativada

na contagem de TACCR0 – 1 para TACCR0 e a flag TAIFG é acionada na

contagem de 0001h para 0000h.

Quando é necessário um controle mais preciso do período de tempo, os modos

crescente e crescente/decrescente são indicados. No entanto, com a utilização do registrador

TACCR0, o canal zero do Timer_A fica indisponível. Alguns temporizadores mais modernos

Page 40: sistema de controle de velocidade digital embarcado de motor de

33

utilizados em microcontroladores já incluem um registrador de módulo incluído no bloco

temporizador.

3.5.2 Canais de captura/comparação

O Timer_A do MSP430F2274 tem três canais de captura/comparação. Cada um

deles é controlado por um registrador TACCTLx.

O registrador principal de cada canal de captura/comparação é o TACCRx. No

modo de captura, ele armazena o valor do contador TAR no momento que uma transição

ocorre na sua entrada correspondente. No modo de comparação, ele armazena o valor da

contagem em que sua respectiva saída deve mudar de valor e uma interrupção é solicitada.

3.5.2.1 Modo de captura

O modo de captura é selecionado com o bit CAP = 1. Ele pode ser utilizado para

medições de velocidade ou período de tempo.

As entradas de captura CCIxA e CCIxB podem ser conectadas a pinos externos e

sinais internos. No caso do MSP430F2274, somente CCI2B é conectado a um sinal interno,

que é o clock ACLK. Todas as outras entradas estão conectadas a pinos externos.

As entradas são selecionadas pelos bits CCISx. Os bits CMx selecionam o tipo de

transição de captura do sinal de entrada, se de nível lógico baixo para alto, alto para baixo ou

ambos. Quando uma captura ocorre, o valor de TAR é copiado para TACCRx e a flag de

interrupção CCIFG é acionada. O nível lógico da entrada pode ser lida a qualquer momento

pelo bit CCI.

Quando a captura é realizada de forma assíncrona com relação ao clock do

temporizador, uma condição de corrida (quando dois processos concorrentes perdem a

sincronia) pode ser criada, ocorrendo a perda de captura de alguns pulsos. Desse modo, a

opção de sincronizar a captura com o próximo pulso de clock é sempre recomendada. Isso é

feito por meio do bit CSC = 1.

Page 41: sistema de controle de velocidade digital embarcado de motor de

34

3.5.2.2 Modo de comparação

O modo de comparação é selecionado quando CAP = 1 e é usado para gerar sinais

de saída PWM ou interrupção em intervalos de tempo específicos. Quando TAR conta até o

valor de TACCRx (Texas Instruments, 2013a):

a) a flag de interrupção CCIFG é ativada;

b) o sinal interno EQUx é ativado;

c) EQUx afeta a saída de acordo com o modo de saída;

d) o sinal de entrada CCI é carregado no bit SCCI.

Cada canal de captura/comparação tem oito modos de saída que geram sinais

baseados nos sinais EQU0 e EQUx. Os modos de saída são definidos pelos bits OUTMODx e

são descritos abaixo:

a) output, OUTMODx = 000: o sinal de sáida OUTx é definido pelo bit OUTx e é

atualizado imediatamente após uma mudança neste bit;

b) toggle, OUTMODx = 100: a saída é comutada quando o valor do temporizador

é igual a TACCRx. Pode ser utilizado tanto no modo crescente como no

crescente/decrescente. O período do sinal de saída é o dobro do período do

temporizador;

c) set, OUTMODx = 001 e reset, OUTMODx = 101: a saída é ativada (set) ou

desativada (reset) quando o contador atinge o valor de TACCRx e permanecem

imutáveis até que o temporizador seja reiniciado ou um novo modo seja

configurado e afete a saída. São geralmente usados para realizar uma única

mudança na saída;

d) reset/set, OUTMODx = 111 e set/reset, OUTMODx = 011: geralmente usados

para PWMs alinhados à borda no modo crescente e consistem de duas

mudanças na saída durante o período do temporizador. A primeira ação ocorre

quando o contador atinge o valor de TACCR0 e a segunda quando o contador

retorna para zero;

e) toggle/reset, OUTMODx = 010 e toggle/set, OUTMODx = 110: geralmente

utilizados para sinais de PWM alinhados ao centro no modo

crescente/decrescente. A primeira ação ocorre na contagem até o valor de

TACCRx e a segunda na contagem até o valor de TACCR0.

Page 42: sistema de controle de velocidade digital embarcado de motor de

35

Os modos 2, 3, 6 e 7 não são aplicáveis para o canal 0, poque EQUx = EQU0.

3.6 Interface de Comunicação Serial Universal (USCI): modo assíncrono (UART)

Como foi visto no item (h) da seção 3.2, a USCI do MSP430F2274 possibilita

vários tipos de comunicação serial. Assim, tratar de cada uma delas seria um trabalho muito

amplo. Por isso, como o foco deste trabalho são apenas os tópicos relacionados com o

controlador de velocidade que será apresentado, será tratada aqui apenas a comunicação serial

assíncrona no modo UART. Mesmo este modo ainda é um tema muito abrangente, dadas as

suas possibilidades de configuração. Sendo assim, serão abordadas apenas as funcionalidades

deste modo de comunicação que estão relacionadas com o controlador de velocidade digital.

O MSP430F2274 possui dois módulos USCI, o USCI_A0 e o USCI_B0. O

USCI_B0 possibilita dois tipos de comunicação serial, SPI e I²C. Será utilizado o módulo

USCI_A0, que possibilita comunicação serial dos tipos UART, IrDA, SPI e detecção

automática de velocidade para protocolo Rede de Interconexão Local (do inglês Local

Interconnect Network - LIN).

O tipo de comunicação serial, se síncrona ou assíncrona, é selecionada pelo bit

UCSYNC no registrador UCA0CTL0. Quando este bit é igual à zero, o módulo é configurado

para comunicação assíncrona, possuindo quatro modos de comunicação selecionados pelos

bits UCMODExx de UCA0CTL0 (Davies, 2008):

a) modo UART padrão, UCMODExx = 00;

b) modos de multiprocessador, UCMODExx = 01 ou 10. Esses modos são

utilizados quando mais de dois processadores estão presente no mesmo

barramento de comunicação;

c) detecção automática de velocidade para LIN, UCMODExx = 11.

Adicionalmente, fazendo o bit UCIREN do registrador UCA0IRTCTL igual a 1, o

modo de comunicação infravermelho (IrDA) é selecionado.

O modo de comunicação aplicado no projeto é o modo UART padrão. A seguir, é

descrito como configurar a velocidade de comunicação e a operação neste modo.

Page 43: sistema de controle de velocidade digital embarcado de motor de

36

3.6.1 Configurando a velocidade de comunicação com o módulo USCI_A0

A exata frequência do clock é critica para comunicações assíncronas. Por isso, o

USCI_A0 possui opções sofisticadas para a seleção da velocidade de comunicação (baud

rate) e é o aspecto mais complicado da sua configuração. Existem três clocks no USCI_A0

(Davies, 2008):

a) BRCLK: é a entrada para o módulo (SMCLK, ACLK e UCA0CLK);

b) BITCLK: controla a velocidade em que os bits são recebidos e transmitidos.

Idealmente, sua frequência deveria ser igual a velocidade de comunicação,

fBITCLK = fbaud;

c) BITCLK16: é a frequência de amostragem no modo de sobreamostragem, com

uma frequência fBITCLK16 = 16 fBITCLK.

Os períodos desses clocks são TBITCLK = 1/fBITCLK e assim sucessivamente. Existem

dois modos para configurar a velocidade de comunicação, ilustrados na Figura 3.2. Eles são

selecionados pelo bit UCOS16 no registrador de controle de modulação UCA0MCTL:

a) modo de sobreamostragem, UCOS16 = 1: primeiro, BRCLK é dividido para

gerar BITCLK16, que depois é dividido por um fator de 16 para gerar

BITCLK;

b) modo de baixa frquencia, UCOS16 = 0: BRCLK é usado diretamente como a

frequência de amostragem e é dividido para gerar BITCLK. Geralmente, fBRCLK

≠ 16 fBITCLK.

Dividindo BRCLK por um inteiro não resulta em uma velocidade muito precisa

na maioria dos casos. Desse modo, cada divisor do módulo USCI_A0 tem um modulador que

permite a geração de uma frequência mais precisa para BITCLK. Alguns bits e registradores

são utilizados para isso:

a) UCA0BR0 e UCA0BR1: são registradores de 8 bits que juntos formam

UCBR0, que é o principal divisor de BRCLK;

b) UCBRF0: controla a modulação de primeiro estágio que gera BITCLK16 no

modo de sobreamostragem. É um campo de quatro bits no registrador de

controle de modulação UCA0MCTL;

c) UCBRS0: controla a modulação de segundo estágio que gera BITCLK. É um

campo de três bits no registrador UCA0MCTL.

Page 44: sistema de controle de velocidade digital embarcado de motor de

37

Figura 3.2 – Gerador de frequência em USCI_A0 mostrando (a) modo de

sobreamostragem com dois divisores e clock intermediário BITCLK16, e (b) modo de

baixa frequência com apenas um divisor.

Fonte: Adaptada de Davies (2008).

Toda essa complicação é necessária porque a velocidade de comunicação é

raramente próxima de ser um fator perfeito de fBRCLK, a frequência da fonte de clock para o

módulo (Davies, 2008). Nesse ponto, continua-se a discussão apenas para o modo de baixa

frequência.

3.6.1.1 Modo de baixa frequência do gerador de velocidade de comunicação

O modo de baixa frequência geralmente é escolhido quando se tem fBRCLK <

16fbaud. No caso do sistema de controle de velocidade, a velocidade de comunicação fbaud é de

9600 bauds com BRCLK alimentado pelo clock ACLK de 12 kHz. Então, tem-se fBRCLK/fbaud

= 1,25, o que justifica a escolha do modo de baixa frequência.

Somente um divisor e um modulador são usados no modo de baixa frequência,

como mostrado na Figura 3.2. Neste modo não é possível fazer o comprimento de cada ciclo

de BITCLK correto. Para o projeto, deveriam ser 1,25 ciclos de BRCLK. No entanto, para

esse caso, não se pode ter altas expectativas e o USCI_A0 procura alcançar o melhor valor

médio da frequência durante oito ciclos de BITCLK (Davies, 2008). O divisor UCBR0 e o

índice de modulação UCBRS0 são dados por

8int (8 UCBRS0)UCBR0 UCBRS0(UCBR0 1)

8UCBR0 UCBRS0

BRCLK

baud

f

f

(3.1)

Page 45: sistema de controle de velocidade digital embarcado de motor de

38

Para o controlador de velocidade desenvolvido, a expressão da esquerda é igual a

10, o que resulta em UCBR0 = 1 e UCBRS0 = 2. Desse modo, cada conjunto de 8 ciclos de

BITCLK contém seis de duração TBRCLK e dois ciclos de duração 2TBRCLK.

3.6.2 Operação do módulo USCI_A0

Depois de configurado o modo UART padrão e a velocidade de comunicação, a

operação do módulo USCI_A0 é muito simples.

Para transmissão, deve-se primeiro ativar o bit de habilitação de interrupção de

transmissão UCA0TXIE do registrador de habilitação de interrupção UC0IE. Feito isso, a

rotina de serviço da interrupção de transmissão é chamada e nela atribui-se a variável (um

vetor) que contém o byte a ser enviado ao buffer de transmissão UCA0TXBUF. O byte é

então enviado automaticamente. Caso haja mais um byte a ser enviado, o índice do vetor deve

ser incrementado. Enquanto o bit UCA0TXIE permanece ativado, após o envio do primeiro

byte, a rotina de serviço de interrupção é chamada novamente e o próximo byte do vetor é

enviado. Quando não existem mais dados a serem enviados, no final da última chamada o bit

UCA0TXIE deve ser desabilitado.

O processo de recepção se inicia com a chegada de um quadro completo no buffer

de recepção UCA0RXBUF e com a automática ativação da flag UCA0RXIFG. A rotina de

serviço de interrupção é então chamada e a flag UCA0RXIFG é desabilitada automaticamente

com a leitura de UCA0RXBUF. Como a comunicação é assíncrona, um outro quadro pode

chegar em qualquer momento. Por isso a leitura de UCA0RXBUF deve ser realizada

prontamente após a rotina de serviço de interrupção ser chamada. Caso um quadro seja

sobrescrito, a flag de perda de dados UCOE no registrador de status UCA0STAT é ativada.

3.7 Modos de operação em baixa potência

O projeto do MSP430 foi baseado desde o princípio no baixo consumo de energia.

Ele possui cinco diferentes modos de operação que trabalham de acordo com um determinado

perfil de economia de energia. No entanto, no caso do MSP430F2274, apenas quatro modos

são geralmente utilizados. Estes modos são sumarizados a seguir (Texas Instruments, 2013b)

para a operação com tensão de alimentação VCC = 3 V, DCO trabalhando com 1 MHz e

LFXT1 em 32 kHz, de um cristal.

Page 46: sistema de controle de velocidade digital embarcado de motor de

39

a) modo ativo: a CPU, todos os clocks habilitados e todos módulos habilitados

estão ativos. O valor típico de corrente de consumo I é 390 µA, podendo

chegar a um máximo de 550 µA. Considerando VCC = 3.6 V e DCO

trabalhando a uma frequência de 16 MHz, tem-se uma corrente de consumo de

aproximadamente 6,7 mA. Para VCC = 3 V e DCO = 12 MHz, tem-se I ≈ 4 mA.

b) LPM0: CPU e MCLK estão desligados e SMCLK e ACLK estão ativos. Esse

modo geralmente é utilizado quando a CPU não é necessária, mas algum

módulo necessita de um clock rápido de SMCLK e do DCO. A corrente de

consumo típica é I ≈ 90 µA e a máxima é I ≈ 120 µA.

c) LPM2: CPU, MCLK, SMCLK e DCO estão desligados. O gerador de DCO e

ACLK permanecem ativos. É um modo pouco usado e parecido com LPM3. A

corrente de consumo típica é I ≈ 25 µA e a máxima é I ≈ 32 µA.

d) LPM3: CPU, MCLK, SMCLK, DCO e o gerador de DCO estão desligados e

ACLK está ativo. É o modo de operação utilizado quando se trabalha com um

módulo de baixa frequência e se utiliza a CPU apenas por alguns instantes.

Para modelos de MSP430 que possuem relógio de tempo real, esse é o modo

necessário para mantê-lo funcionando. Sua corrente de consumo típica é I ≈ 0.9

µA e a máxima de I ≈ 1.5 µA. Caso utilize-se o VLO de 12 kHz ao invés de

um cristal de 32 kHz, esses valores caem para I ≈ 0,6 µA e I ≈ 1,2 µA,

respectivamente.

e) LPM4: CPU e todos os clocks desligados. O dispositivo pode ser ativado

apenas por um sinal externo. É também chamado de modo de retenção de

RAM. A corrente de consumo típica é de I ≈ 0,1 µA e a máxima de I ≈ 0,5 µA.

Os modos de baixa potência são configurados com os bits CPUOFF, OSCOFF,

SCG0 e SCG1 no registrador de status SR. A vantagem de se por os bits de controle no

registrador de status é que o modo de operação presente é salvo na pilha durante uma rotina

de serviço de interrupção. O fluxo de programa retorna para o modo de operação anterior se o

valor salvo de SR não é alterado durante a rotina de serviço de interrupção (Texas

Instruments, 2013a).

Quando são ativados qualquer um dos bits de controle, o modo de operação

selecionado começa imediatamente. O MPS430 pode ser “acordado” somente por uma

interrupção. Desse modo, as interrupções devem estar habilitadas pelo bit GIE no SR. Na

linguagem C, a habilitação de interrupções e a entrada no modo de operação desejado é feito

Page 47: sistema de controle de velocidade digital embarcado de motor de

40

por uma única função, presente no arquivo cabeçalho “intrinsics.h”: __low_power_mode_3();.

Nesse caso, a função entra no modo LPM3, sendo uma função correspondente para cada

modo. Para retornar-se de um modo de operação em baixa potência para o modo ativo, deve-

se incluir o seguinte comando no final da rotina de serviço de interrupção:

__low_power_mode_off_on_exit();.

Page 48: sistema de controle de velocidade digital embarcado de motor de

41

4 CONTROLE DE VELOCIDADE DIGITAL DE MOTORES

4.1 Introdução

Antes do advento dos microcontroladores, tarefas de controle de velocidade eram

implementadas no domínio contínuo por meio de circuitos eletrônicos analógicos

compreendendo amplificadores operacionais, resistores e capacitores. Um sinal proporcional a

velocidade girante, era obtido de um tacogerador acoplado ao eixo do motor. De um

amplificador operacional, a referência para o torque fornecido era obtida na forma de um sinal

analógico padrão de +/- 10 V, aplicado ao circuito do atuador de torque (driver do motor)

(Vukosavić, 2007). A implementação analógica coloca os seguintes limites na resposta em

malha fechada (Vukosavić, 2007):

a) a operação em baixa velocidade é prejudicada pelo offset intrínseco de amplificadores

operacionais;

b) os ganhos de realimentação, definidos por resistores e capacitores, variam com a

temperatura e com o envelhecimento;

c) os sensores do eixo, tal como o tacogerador CC, introduzem o ruído originado do

comutador mecânico, com a frequência do ruído relacionada a velocidade de rotação.

O ruído na linha de realimentação reduz o intervalo do ganho aplicável e, desse modo,

a largura de banda de malha fechada;

d) enquanto fornecendo um meio direto de implementação de ações de controle

convencionais (controle Proporcional, Integral e Derivativo (PID)), esse tipo de

implementação encontra grandes dificuldades implementando leis de controle não-

lineares, compensadores de folga, filtros antiressonantes ou filtros de Resposta ao

Impulso Finita (do inglês Finite Impulse Response – FIR);

e) uma tarefa de controle de velocidade, onde parâmetros de realimentação ajustáveis

tem que ser adaptados on-line para condições de operação específicas, dificilmente

pode ser implementada por técnicas no domínio contínuo. Para esse caso, uma

mudança nos parâmetros ou estrutura do controlador de velocidade requer substituição

de resistores e capacitores. A implementação de tais substituições em tempo real é

dificilmente praticável com ferramentas analógicas. Portanto, controladores de

estrutura variável e adaptação de parâmetros requerem implementação em uma

plataforma digital.

Page 49: sistema de controle de velocidade digital embarcado de motor de

42

Comparada com a implementação analógica o controlador de velocidade digital

experimenta deterioração de sinal devido à discretização de tempo e amplitude. Ao mesmo

tempo, os cálculos numéricos envolvidos contribuem para atraso de transportes adicionais.

Apesar disso, controladores de velocidade digital superam o desempenho das suas

contrapartes analógicas (Vukosavić, 2007). Os efeitos de quantização e os atrasos de cálculo

são suprimidos pelo uso de plataformas de Processamento Digital de Sinais (do inglês Digital

Signal Processing – DSP) de controle de movimento especializadas e de alto processamento.

Com sensores de eixo digitais, tais como encoders digitais, os sinais de realimentação são

livres de offset e de ruído e mantêm sua relação sinal/ruído mesmo em velocidades girantes

muito baixas. Um controlador de velocidade digital pode incluir compensadores não lineares,

uma adaptação de parâmetros on-line e mecanismos de mudança estrutural; pode empregar

filtros FIR e um número de outras características que não estão disponíveis na implementação

analógica (Vukosavić, 2007).

4.2 Sistema com atuador de torque ideal e carga inercial

Um diagrama de blocos de um sistema de controle de velocidade com um

controlador digital é mostrado na Figura 4.1. A velocidade de referência no domínio do tempo

*(t) é amostrada com período T. O sinal resultante é um trem de pulsos *DIG. Em um

sistema microprocessado, *DIG é um valor armazenado na memória, que pode ser alterado a

qualquer momento e atualizado no sistema de controle a cada período de amostragem T. O

sinal de erro de velocidade é obtido pela diferença entre os sinais de velocidade de

referência discreta *DIG e a velocidade medida discreta FB

DIG. O valor de FBDIG é obtido

através do sensor de realimentação no eixo do motor. O circuito de interface do sensor que faz

a conversão do movimento rotativo do eixo do motor em um sinal elétrico é representado por

WM(s). Na maioria dos casos, o sensor pode ser um tacogerador ou um encoder óptico ou

eletromagnético.

No caso de um tacogerador, o sinal FB é uma tensão com valor proporcional à

velocidade. Esta tensão é amostrada por um conversor A/D com período T, resultando no trem

de pulsos FBDIG. A conversão deste trem de pulsos de tensão para velocidade é representada

por WSE(s).

Quando utiliza-se um encoder, o sinal FB representa variações de posição.

Geralmente, associado ao microprocessador tem-se um temporizador que captura de forma

Page 50: sistema de controle de velocidade digital embarcado de motor de

43

assíncrona o tempo de cada novo pulso (ou conjunto de pulsos) digital que representa uma

variação de posição. Desse modo, WSE(s) representa o cálculo da velocidade média FBDIG

durante um período de amostragem T.

Figura 4.1 – Diagrama de blocos de um sistema de controle de velocidade com

implementação digital do algoritmo de controle.

Fonte: Adaptada de Vukosavić (2007).

O sinal de erro de velocidade é utilizado pelo controlador de velocidade

digital WSC para se obter as amostras do torque de referência T*DIG necessárias para fazer o

erro convergir para zero. Em um sistema discreto, o controlador WSC é caracterizado por uma

equação de diferenças. A estrutura e os parâmetros de WSC determinam a característica e a

largura de banda da resposta ao degrau em malha fechada (Vukosavić, 2007). O objetivo

deste capítulo é fornecer um procedimento de projeto e a determinação dos parâmetros do

controlador WSC.

O circuito atuador de torque é representado pelo ganho Ka e por um limitador. Ele

necessita como entrada de um torque de referência T*(t) contínuo. Desse modo, para realizar-

se a conversão do sinal discreto T*DIG para o sinal contínuo T*(t), utiliza-se um segurador de

ordem zero (do inglês Zero-Order Hold – ZOH). Sua função de transferência é dada por

(Fadali, 2009):

1 Ts

ZOH

eW

s

. (4.1)

Page 51: sistema de controle de velocidade digital embarcado de motor de

44

O limitador do atuador restringe o torque de referência a ser desenvolvido Td em

± TMAX. Esse limite é determinado pela corrente máxima do circuito de acionamento do motor,

assim como pela corrente máxima que o motor pode suportar.

Após ter seu valor limitado, o torque que deve ser desenvolvido Td é aplicado ao

subsistema mecânico WP, afetando a velocidade no eixo do motor (t). Como a constante de

tempo eletromecânica geralmente é muito maior do que a constante de tempo elétrica do

motor, considera-se que as amostras do torque a ser desenvolvido Td tem imediato efeito sobre

a dinâmica eletromecânica do motor.

4.3 Função de transferência do subsistema mecânico

A dinâmica do subsistema mecânico é representada pela Equação 4.2. O

parâmetro J representa o momento de inércia no eixo do motor, Td representa o torque

desenvolvido e TL é o torque da carga.

(t) (t)d L

dJ T T

dt

(4.2)

O torque TL pode ser considerado uma perturbação. Ele compreende além do

torque da carga propriamente dito, a componente de atrito viscoso, a reação da transmissão

(se presente), e outras componentes de torque parasitas. O que se assume na Equação 4.2 é

que estas componentes parasitas estão desacopladas da dinâmica do subsistema mecânico

(Vukosavić, 2007).

No momento, considera-se o atuador de torque ideal, com Ka = 1 e sem o

limitador. Desse modo, Td(t) = T*(t). Segundo Vukosavić (2007), uma das equações de

diferenças que pode corresponder à Equação 4.2 é

*(n 1) (n) (n) (n)L

T TT T

J J , (4.3)

onde T*(n) corresponde ao valor na saída do ZOH entre os instantes t = nT e t = (n + 1)T e

TL(n) é o valor médio do sinal TL(t) entre os instantes t = nT e t = (n + 1)T.

Considerando TL(t) = 0 e aplicando a transformada z na Equação 4.3, a função de

transferência do subsistema mecânico com relação à entrada T*(t) é dada por

(z) 0*

(z) 1(z)

(z) 1LP T

TW

T J z

. (4.4)

Page 52: sistema de controle de velocidade digital embarcado de motor de

45

De forma similar, pode-se calcular a função de transferência WPL(z) do subsistema

mecânico com relação à entrada TL(t). Uma rápida observação na Equação 4.3 nos revela que

WPL(z) = - WP(z).

Quando as duas entradas estão presentes, a transformada z da saída se torna

* *1(z) (z)( (z) (z)) ( (z) (z))

1P L L

TW T T T T

J z

. (4.5)

4.4 Função de transferência do subsistema de medição de velocidade

Em sistemas de controle de velocidade digitais, na maioria dos casos, a medição

da velocidade necessária à realimentação é realizada por meio de encoders ópticos ou

eletromagnéticos. Como mencionado anteriormente, o encoder fornece informações de

posição por meio de pulsos digitais. Pode-se supor, ainda, que não existem atrasos associados

à geração destes pulsos. Assim, pode-se assumir que WM(s) = 1.

Considerando a Figura 4.1, a posição do eixo do motor (t) (FB) é amostrada com

período T, gerando o trem de pulsos DIG(n) (FBDIG). Em termos de sistemas

microprocessados, isso se dá contando as variações de posição que cada pulso digital do

encoder representa, dentro do período de amostragem.

Quando se utiliza encoders como sensores de velocidade, a amostra de velocidade

medida é a velocidade média dentro de um período de amostragem T. Para se obter a amostra

da velocidade FB(n), utiliza-se a equação da derivada discreta da posição, que também

corresponde à equação da velocidade média:

(n) (n 1)(n)FB

T

. (4.6)

Para se obter a função de transferência WSE(z), precisa-se determinar a relação

entre a velocidade real do eixo do motor (n) e a velocidade média FB(n). Para esse fim,

considera-se que o torque a ser desenvolvido Td e a o torque de perturbação da carga TL

permanecem constantes durante o período de amostragem T. No caso da referência do torque

a ser desenvolvido Td, ela é proveniente do ZOH, sendo assim constante durante o período T.

E no caso da perturbação de carga TL, na maioria dos sistemas de controle de velocidade,

pode-se considerar que ela permanece constante durante o período de amostragem T

(Vukosavić, 2007). Os efeitos de uma perturbação de carga com variação muito rápida dentro

do período de amostragem é abordado em uma seção posterior.

Page 53: sistema de controle de velocidade digital embarcado de motor de

46

Nas condições supostas anteriormente, o gráfico da velocidade real (n) varia

com uma inclinação constante (Vukosavić, 2007), como mostrado na Figura 4.2. Desse modo,

a velocidade média FB(n) é proporcional à área S e é igual à média entre as velocidades reais

(n) e (n - 1) espaçadas entre o período T.

Figura 4.2 – A variação na velocidade real (n) no eixo do motor

durante um período de amostragem T.

Fonte: Adaptada de Vukosavić (2007).

( 1) ( 1)

1(n) (n 1) (n)

nT nT

FB

n T n T

d dt dt dtT

(4.7)

(n) (n 1)(n)

2

FB

(4.8)

Aplicando a transformada z na Equação 4.8, finalmente obtém-se a função de

transferência WSE(z).

1(z) (z)(z)

2

FB z

(4.9)

(z) 1(z)

(z) 2

FB

SE

zW

z

(4.10)

4.5 Função de transferência do sistema em malha fechada

A função de transferência do sistema em malha fechada WSS(z) representa a

relação entre a velocidade no eixo do motor (z) (saída) e a velocidade de referência *(z)

Page 54: sistema de controle de velocidade digital embarcado de motor de

47

(entrada). Os polos e zeros de WSS(z) definem a característica da resposta do sistema e a sua

largura de banda em malha fechada.

O sistema da Figura 4.1 pode ser considerado de pequenos sinais. Desse modo, na

presente análise, pode-se desconsiderar o bloco limitador de torque. Sem perda de

generalidade, também pode-se incluir o bloco Ka em WSC, assumindo que o atuador de torque

tem ganho unitário (Vukosavić, 2007). Um diagrama de blocos simplificado é dado na Figura

4.3.

Figura 4.3 – Controlador de velocidade digital com atuador de torque ideal Ka = 1,

controlador de velocidade discreto e subsistema mecânico no domínio contínuo.

Fonte: Adaptada de Vukosavić (2007).

Se introduz-se as funções de transferência WP(z) e WSE(z), obtidas nas seções

anteriores, o diagrama de blocos compreendendo apenas sinais discretos resulta como na

Figura 4.4.

O controlador de velocidade digital WSC calcula as amostras do torque de

referência T*DIG a partir do erro DIG. Segundo Vukosavić (2007), o controlador

Proporcional e Integral (PI) garante rejeição de entrada e perturbações de carga na forma de

degraus. Desse modo, assume-se que a função de transferência WSC(z) é uma versão discreta

da função de transferência contínua do controlador PI.

A equação no domínio do tempo que representa um controlador PI discreto é dada

pela Equação 4.11, onde os ganhos proporcional e integral correspondem respectivamente a

KP e KI. Os valores destes ganhos afetam a função de transferência WSC(z) e o desempenho do

Page 55: sistema de controle de velocidade digital embarcado de motor de

48

sistema em malha fechada. O ajuste dos ganhos do controlador deve resultar em uma ação de

controle que leve o erro de velocidade a zero através de consecutivos períodos de

amostragem.

*

0

(n) (n) K (j)j n

P I

j

T K

(4.11)

Figura 4.4 – O diagrama de blocos de um sistema de controle de

velocidade digital compreendendo sinais discretos.

Fonte: Adaptada de Vukosavić (2007).

Na prática, deve-se ter uma posição de memória que armazena a soma dos erros

de velocidade (o acumulador de erro INT(n) na Figura 4.5). Multiplicando o acumulador de

erro por KI, obtém-se a ação integral do controlador de velocidade. Na Figura 4.5, o torque de

referência T*(n) é calculado por KP(n) + INT(n).

Utilizando a função de transferência discreta para o integrador (1 – z-1)-1 na

Equação 4.11, obtém-se a função de transferência WSC(z).

*

1

(z) 1(z)

(z) 1SC P I

TW K K

z

(4.12)

Uma outra implementação possível para o controlador de velocidade discreto é a

forma incremental, como mostrada na Figura 4.6. A ação proporcional é calculada por

KP((n) - (n - 1)) e a ação integral por KI(n). A soma da ação proporcional e da ação

integral resulta no incremento do torque de referência T*(n). Amostra do torque de

Page 56: sistema de controle de velocidade digital embarcado de motor de

49

referência T*(n) é então calculado por meio de um acumulador que armazena o valor da

amostra anterior T*(n - 1).

A equação de diferenças que representa o controlador PI na forma incremental é

dada na Equação 4.13. Aplicando a transformada z obtém-se a Equação 4.14. Como pode-se

observar, a função de transferência resultante da equação do controlador PI na forma

incremental é a mesma obtida anteriormente para WSC(z) na forma direta.

* * *(n) (n) (n 1) ( (n) (n 1)) (n)P IT T T K K (4.13)

* 1 1(z)(1 ) (z)(1 ) (z).P IT z K z K (4.14)

Figura 4.5 – Implementação discreta do controlador de velocidade com

ação proporcional e integral.

Fonte: Adaptada de Vukosavić (2007).

A forma incremental do controlador de velocidade tem algumas vantagens, que

serão apresentadas mais adiante, quando se trabalha com condições de operação onde o torque

a ser desenvolvido atinge os valores limite do atuador (Vukosavić, 2007). Portanto, esta é a

implementação escolhida para o controlador PI.

Para se obter a função de transferência do sistema em malha fechada WSS(z) com

relação à velocidade de referência *, considera-se o torque de perturbação TLDIG igual a zero.

Substituindo a Equação 4.4 para WP(z), a Equação 4.10 para WSE(z) e a Equação 4.12 para

WSC(z) no sistema com realimentação simplificado da Figura 4.4, obtém-se a Equação 4.15

para WSS(z) (Vukosavić, 2007).

Page 57: sistema de controle de velocidade digital embarcado de motor de

50

Figura 4.6 – Controlador de velocidade com ação proporcional e integral implementado na

forma incremental.

Fonte: Adaptada de Vukosavić (2007).

0*

2

2

3 2

(z) (z)(z) 1(z)

(z) 1 (z) (z) (z) 2

( ( 1) )

( 1) ( ( 1) )( 1)2

( )

2 12 2 2 2

L

SC PSS T

SC P SE

P I

P I

P I P

P I I P

W WW

W W W

Tz K z K z

JT

z z K z K z zJ

T TK K z K z

J JT T T T

z K K z K z KJ J J J

(4.15)

Do mesmo modo, considerando agora a velocidade de referência * igual a zero,

pode-se obter a função de transferência de perturbação WLS(z), que representa a

suscetibilidade da saída do sistema às perturbações de carga. Ela é apresentada na Equação

4.16 (Vukosavić, 2007).

* 0

2

3 2

(z)(z)(z)

T (z) 1 (z) (z) (z)

2 12 2 2 2

PLS L

SC P SE

P I I P

WW

W W W

T Tz z

J JT T T T

z K K z K z KJ J J J

(4.16)

O denominador de WSS(z) e de WLS(z) é o polinômio característico f(z) do sistema.

As raízes de f(z) são os polos de malha fechada do sistema. Observa-se também nas Equações

4.15 e 4.16 que os ganhos KP e KI são multiplicados pelo termo T/2J. Portanto, pode-se

introduzir nestas equações os ganhos normalizados p e i, de acordo com as Equações 4.17 e

Page 58: sistema de controle de velocidade digital embarcado de motor de

51

4.18 (Vukosavić, 2007). O resultado pode ser visto nas Equações 4.19 e 4.20 (Vukosavić,

2007).

2P

Tp K

J (4.17)

2I

Ti K

J (4.18)

2

3 2

2( ) 2(z)

2 1SS

p i z pzW

z p i z i z p

(4.19)

2

3 2(z)

2 1LS

T z zW

J z p i z i z p

(4.20)

4.5.1 Polos de malha fechada e efeitos de zeros de malha fechada

O polinômio característico do sistema em malha fechada f(z) possui três raízes.

Portanto, têm-se três polos de malha fechada 1, 2 e 3, que determinam a característica e a

velocidade da resposta do sistema. Na Equação 4.21 (Vukosavić, 2007), o polinômio

característico f(z) é expresso em termos de seus zeros.

3 2

1 2 3

(z) (2 ) ( 1)

( )( )( )

f z p i z i z p

z z z

(4.21)

Os polos de malha fechada dependem dos ganhos normalizados p e i. Portanto,

não pode-se escolher os valores dos polos arbitrariamente. Tem-se dois parâmetros ajustáveis

que determinarão os valores dos polos.

Igualando os coeficientes de zn em ambos os lados da Equação 4.21, obtém-se três

equações relacionando os polos de malha fechada com os ganhos normalizados p e i, como

mostrado nas Equações 4.22, 4.23 e 4.24 (Vukosavić, 2007).

1 2 3 2 p i (4.22)

1 2 2 3 3 1 1i (4.23)

1 2 3 p (4.24)

O polinômio do numerador de WSS(z) é dado na Equação 4.25 (Vukosavić, 2007).

As raízes deste polinômio são os zeros do sistema. O zero z2 está localizado na origem e,

portanto, adianta a resposta do sistema em um período de amostragem T. Esse efeito sobre a

resposta do sistema é benéfico, pois reduz atrasos introduzidos pelo polinômio de terceira

Page 59: sistema de controle de velocidade digital embarcado de motor de

52

ordem do denominador. O zero z1 é real e positivo e se localiza dentro do círculo unitário,

sendo, portanto, mapeado no lado negativo do eixo real do plano s.

2(z) 2( 1)z 2num p pz (4.25)

1

pz

p i

(4.26)

2 0z (4.27)

Com todos os polos de malha fechada sendo reais, é esperado que a resposta ao

degrau do sistema seja aperiódica. No entanto, a presença do zero z1 contribui para a ação

derivativa da função de transferência. Esta natureza diferencial de WSS(z) enfatiza a curva de

subida da entrada e das perturbações de carga, causando o surgimento de sobressinal

(Vukosavić, 2007). Em inúmeras aplicações de servomecanismos, ultrapassar a referência não

é aceitável. O sobressinal pode levar a carga mecânica e suas partes vitais, como ferramentas,

a uma posição onde eles podem colidir com outros objetos e eventualmente se danificar.

Considerando uma resposta de velocidade com sobressinal, no final do período transitório é

necessário que ocorra uma fase de desaceleração requerida para dissipar o excesso de

velocidade. Nesta fase, o torque desenvolvido torna-se negativo. Frequentes mudanças de

sinal do torque desenvolvido agravam a folga nos elementos de transmissão, resultando em

desgaste e redução de controlabilidade da velocidade e da posição da carga mecânica

(Vukosavić, 2007).

Portanto, com o intuito de evitar respostas oscilatórias, o projeto do controlador

deve produzir uma função de transferência em malha fechada com zeros apenas na origem.

Isso pode ser alcançado com o artifício de realocação do ganho proporcional.

4.5.2 Realocação do ganho proporcional

No controlador representado na Figura 4.5, o ganho proporcional está localizado

no caminho direto e multiplica o erro de velocidade . Outra forma de se implementar o

controlador PI é apresentada na Figura 4.7, onde o ganho KP está no caminho de

realimentação e multiplica a amostra de velocidade .

Page 60: sistema de controle de velocidade digital embarcado de motor de

53

Figura 4.7 – Controlador de velocidade discreto com o ganho proporcional

realocado no caminho de realimentação.

Fonte: Adaptada de Vukosavić (2007).

Para a estrutura da Figura 4.7, considera-se agora que o torque de perturbação TL

seja igual à zero. A relação no domínio da frequência entre a velocidade de saída (z) e a

velocidade de referência *(z) é dada pela Equação 4.28 (Vukosavić, 2007). Desse modo, a

função de transferência em malha fechada para o sistema com realocação do ganho

proporcional pode ser derivada da Equação 4.28 e é dada pela Equação 4.29 (Vukosavić,

2007).

*(z) 1 (z) (z) (z) (z) (z) (z)1 1

I IP SE P SE P P

K z K zK W W W W W

z z

(4.28)

0*

2

3 2

(z) (z)(z)(z)

(z) 1 (z) (z) (z)

2 12 2 2 2

L

SC PSS T

SC P SE

I

P I I P

W WW

W W W

TK z

JT T T T

z K K z K z KJ J J J

(4.29)

Introduzindo os ganhos normalizados p e i na Equação 4.29 atinge-se a Equação

4.30 (Vukosavić, 2007) para a função de transferência do sistema em malha fechada. Pode-se

observar que a realocação do ganho proporcional não altera o polinômio característico do

sistema. O numerador, no entanto, passa a possuir dois zeros na origem. A resposta do

sistema resultante é aperiódica e não ultrapassa a referência (Vukosavić, 2007).

Page 61: sistema de controle de velocidade digital embarcado de motor de

54

2

3 2

2(z)

(2 ) (1 )SS

izW

z p i z i z p

(4.30)

Com o ganho proporcional no caminho de realimentação, as variações do sinal de

erro de velocidade afetam o torque de referência TL através da ação integral. Portanto,

grandes variações no sinal de erro resultarão em flutuações mais suaves no torque de

referência e o esforço submetido ao subsistema mecânico será reduzido (Vukosavić, 2007). A

implementação prática do controlador com realocação do ganho proporcional na forma

incremental pode ser vista através das Equações 4.31 e 4.32 (Vukosavić, 2007).

* * *(n) (n) (n 1) ( (n 1) (n)) (n)P IT T T K K (4.31)

* * *(n) (n 1) (n)T T T (4.32)

4.6 Determinação de parâmetros de controladores de velocidade digitais

O procedimento de determinação de parâmetros do controlador de velocidade

digital tem como objetivo encontrar valores para os ganhos normalizados p e i, tal que, seja

alcançada uma resposta aperiódica mais rápida possível. Primeiro, o objetivo é expresso em

uma função critério em termos dos parâmetros p e i. A partir daí, o processo de otimização

encontra os valores de p e i que resultam no valor extremo da função critério.

4.6.1 Resposta estritamente aperiódica

Para se obter uma resposta estritamente aperiódica é necessário obedecer certas

condições no que diz respeito a natureza da função de transferência de malha fechada do

sistema de controle de velocidade. Essas condições são a ausência de zeros de malha fechada

reais e a presença de polos de malha fechada reais localizados no interior do círculo unitário

(intervalo [0, 1]) do plano z.

A ausência de zeros reais já foi obtida por meio da realocação do ganho

proporcional do controlador. A obtenção dos polos de malha fechada 1, 2 e 3 nas

condições desejadas é alcançada por meio do ajuste dos parâmetros p e i. Os polos de malha

fechada estão relacionados com os ganhos normalizados pelas Equações 4.22, 4.23 e 4.24.

Uma resposta estritamente aperiódica impõe as seguintes restrições aos polos de malha

fechada (Vukosavić, 2007):

Page 62: sistema de controle de velocidade digital embarcado de motor de

55

1 2 3Im( ) 0, Im( ) 0 e Im( ) 0 (4.33)

1 2 30 Re( ) 1, 0 Re( ) 1 e 0 Re( ) 1 (4.34)

Sob as restrições das Equações 4.33 e 4.34 e as relações dadas pelas Equações

4.22, 4.23 e 4.24, os ganhos normalizados p e i serão escolhidos para fornecer a resposta mais

rápida possível e a máxima largura de banda de malha fechada. Uma ampla largura de banda

permite a supressão com sucesso de flutuações causadas pelas perturbações de torque de

carga.

4.6.2 Formulação da função critério

A Figura 4.8 mostra uma resposta ao degrau da velocidade (t) estritamente

aperiódica, para uma referência *. Como não há sobressinal, as amostras do erro de

velocidade (n) = * - (nT) = (nT) são sempre positivas. Pode-se observar que quanto

Figura 4.8 – Uma resposta ao degrau estritamente aperiódica.

Fonte: Adaptada de Vukosavić (2007).

mais rápida é a resposta do sistema, menor é a área sombreada da Figura 4.8. Portanto, essa

superfície pode ser um indicador da velocidade da resposta de velocidade. O valor da área

sombreada S pode ser calculada pela integral definida na Equação 4.35. Trabalhando com

sistemas discretos, pode-se calcular a área sombreada através de uma somatória Q e em

termos das amostras do erro de velocidade (n), como mostrado na Equação 4.36. O valor

Page 63: sistema de controle de velocidade digital embarcado de motor de

56

de Q será utilizado como a função critério. Assim, busca-se os valores de p e i que

correspondem ao menor valor possível de Q para as dadas restrições.

0

(t)dtS

(4.35)

0

(kT)k

Q

(4.36)

É necessário expressar a função critério Q em termos dos parâmetros p e i. Com

esse intuito, considera-se o trem de amostras Q(n), mostrado na Equação 4.37. Cada amostra

de Q(n) corresponde à soma dos erros de velocidade do instante 0 até o instante nT.

Quando n tende ao infinito, Q(n) converge para a função critério Q. A transformada z de Q(n)

em função de (z) pode ser obtida como mostra a Equação 4.38.

0

(kT)n

k

Q

(4.37)

10

1(z) (n) z (z)

1

n

k

Q Qz

(4.38)

A função critério Q pode ser obtida então através do teorema do valor final

aplicado a Q(z), como visto na Equação 4.39.

1 1

1( ) lim (z) lim (z)

z z

zQ Q Q

z

(4.39)

Pode-se expressar (z) em função da referência de velocidade *(z) e da função

de transferência de malha fechada WSS(z) (Equação 4.40). Para uma resposta ao degrau, *(z)

é dada como mostra a Equação 4.41.

* *(z) (z) (z) (z)(1 (z))SSW (4.40)

**

1(z)

1 z

(4.41)

Substituindo as Equações 4.30 e 4.41 na Equação 4.33, a expressão para (z)

fica como mostrado na Equação 4.42. Assim, a função critério Q é dada na Equação 4.43

(Vukosavić, 2007).

Page 64: sistema de controle de velocidade digital embarcado de motor de

57

* 2

1 3 2

* 3 2

3 2

* 2

3 2

* 2

3 2

2(z) 1

1 (2 ) ( 1)

( 2) (1 )

1 (2 ) ( 1)

( 1)( ( 1) )

1 (2 ) ( 1)

( ( 1) )

(2 ) ( 1)

iz

z z p i z i z p

z z z p i z i p

z z p i z i z p

z z z z p i p

z z p i z i z p

z z z p i p

z p i z i z p

(4.42)

*

1

1lim (z)

2z

pQ

i

(4.43)

Fazendo a relação p/i ser a menor possível, a função critério pode então ser

minimizada. Para se obter a resposta estritamente aperiódica mais rápida possível, o valor

mínimo da relação p/i deve ser obtido respeitando-se as relações das Equações 4.22, 4.23 e

4.24 e as restrições das Equações 4.33 e 4.34. Na próxima seção, os valores otimizados de p e

i são encontrados por um procedimento buscando o valor máximo de Q1 = i/p = 1/Q.

4.6.3 Cálculo dos valores otimizados dos ganhos normalizados

As Equações 4.22, 4.23 e 4.24 dão a relação entre os polos de malha fechada 1,

2 e 3 e os ganhos normalizados p e i. Somando as três expressões, obtém-se a Equação 4.44,

que restringe a escolha dos polos. Dois dos três polos podem ser ajustados à vontade,

enquanto que o terceiro é calculado da Equação 4.44.

1 2 3 1 2 2 3 3 1 1 2 3( ) ( ) ( ) 3 (4.44)

Utilizando as Equações 4.23 e 4.24, pode-se relacionar a função critério Q1 = i/p

com os polos de malha fechada (Equação 4.45).

1 2 2 3 3 11

1 2 3

1iQ

p

(4.45)

Pode-se expressar os polos de malha fechada pelos seus valores inversos x = 1/1,

y = 1/2 e v = 1/3. Pelas restrições nas Equações 4.33 e 4.34, tem-se que x, y e v são números

reais positivos maiores do que um (x > 1, y > 1 e v > 1). A Equação 4.44 assume a forma dada

na Equação 4.46.

1 3xy yv vx x y v xyv (4.46)

A variável v pode ser expressa em termos de x e y como na Equação 4.47 abaixo.

Page 65: sistema de controle de velocidade digital embarcado de motor de

58

1( , )

3 1

xy x yv x y

xy x y

(4.47)

A função critério é reformulada e dada em função de x e y na Equação 4.48.

1 ( , ) ( , )

1(1 )

3 1

iQ x y v x y xyv x y

p

xy x yx y xy

xy x y

(4.48)

Deve-se então encontrar os valores de x e y que resultam no máximo valor da

função critério. x e y possuem valores dentro do intervalo [1, +∞]. É necessário provar que o

valor máximo de Q1(x,y) não ocorre nos limites deste intervalo. Através da Equação 4.44

pode-se concluir (Vukosavić, 2007):

a) quando x = y = +∞, os polos de malha fechada 1 = 1/x e 2 = 1/y estão na origem,

enquanto que o terceiro polo permanece fora do círculo unitário (3 = 3), causando

instabilidade;

b) quando x = y = 1, os polos de malha fechada 1 = 1/x e 2 = 1/y estão no círculo

unitário no plano z. Eles estão mapeados no plano s em s1/2 = 0, introduzindo um

integrador duplo na função de transferência de malha fechada e uma resposta ao

degrau que não converge para a referência;

c) quando x = 1 e y = +∞ ou y = 1 e x = +∞, o terceiro polo 3 = 1/v está no círculo

unitário (3 = 1), resultando no plano s s3 = 0 e na não convergência da resposta da

velocidade para a referência.

Visto que o valor máximo da função critério não ocorre nos limites do intervalo

[1, +∞], os valores otimizados xOPT e yOPT podem ser calculados fazendo as primeiras

derivadas parciais de Q1(x,y) (Equações 4.49 e 4.50) iguais a zero. Desprezando a solução x =

1 e y = 1, é necessário encontrar as soluções que satisfazem as Equações 4.44 e 4.45.

2 2 2

2 2

( 1) (2 3 2 1)( , )

(3 1)

x yx xy x y yf x y

xy x y

(4.49)

2 2 2

1 2

( 1) (2 3 2 1)( , )

(3 1)

y xy yx y x xf x y

xy x y

(4.50)

2 22 3 2 1 0xy yx y x x (4.51)

2 22 3 2 1 0yx xy x y y (4.52)

Pela Equação 4.51, pode-se expressar y em termos de x:

Page 66: sistema de controle de velocidade digital embarcado de motor de

59

2

2

2 1y( )

3 2 1

x xx

x x

. (4.53)

Substituindo a Equação 4.53 na Equação 4.52, obtém-se:

4 2

2 2

3 6 4 14 0

(3 2 1)

x x xx

x x

. (4.54)

A solução x = 0 corresponde a polos fora do círculo unitário, portanto, é

desprezada. Através da Equação 4.55 obtém-se as quatro soluções restantes.

4 2( ) 3 6 4 1 0H x x x x (4.55)

x1 = 1,7024, (4.56)

x2/3 = -0,3512 ± j0,2692 e (4.57)

x4 = -1. (4.58)

Tomando-se as restrições das Equações 4.33 e 4.34, e sabendo que 1 = 1/x,

despreza-se as soluções x2, x3 e x4. Substituindo x1 = 1,7024 nas Equações 4.53 e 4.47, obtém-

se:

xOPT = yOPT = vOPT = 1,7024. (4.59)

Os valores de 1, 2 e 3 agora podem ser calculados (Equação 4.60) e

substituídos nas Equações 4.23 e 4.24 para se obter os valores otimizados dos ganhos

normalizados (Equações 4.61 e 4.62).

1 2 3 0,587 (4.60)

3 0,2027OPTp (4.61)

23 1 0,03512OPTi (4.62)

Os ganhos absolutos do controlador KP e KI são obtidos substituindo-se os valores

de pOPT e iOPT nas Equações 4.17 e 4.18. Portanto, tem-se

20,2027P OPT

JK

T , (4.63)

20,03512I OPT

JK

T . (4.64)

Em aplicações práticas de controladores de velocidade digitais, sinais como a

velocidade de referência, a velocidade medida do eixo do motor, o sinal de erro e a referência

de torque são armazenados na RAM do microcontrolador. Na maioria dos casos, estes sinais

são representados por inteiros com sinal de 16 bits. A relação entre a velocidade real expressa

em [rad/s] e a palavra digital representando a velocidade é decidida pelo programador. Esta

decisão é governada pelo requerimento para maximizar a resolução na representação da

Page 67: sistema de controle de velocidade digital embarcado de motor de

60

velocidade e para minimizar o ruído de quantização produzido pelo comprimento de palavra

finito (Vukosavić, 2007). O coeficiente de proporcionalidade entre a representação digital e a

velocidade real pode ser representado por KFB. Do mesmo modo, a relação entre a referência

de torque real e sua imagem digital podem ser representada por KA.

A Figura 4.9 representa o diagrama de blocos do controlador de velocidade digital

introduzindo-se os coeficientes de escalonamento KFB e KA. Estes coeficientes multiplicam a

função de transferência de malha aberta e afetam a relação entre os valores otimizados dos

ganhos do controlador KP e KI e suas contrapartes normalizadas p e i. As Equações 4.65 e

4.66 incluem a influência dos coeficientes de escalonamento nas expressões dos ganhos

otimizados do controlador (Vukosavić, 2007). Portanto, para se realizar o ajuste do

controlador PI digital, são necessários os valores do período de amostragem T, do momento

de inércia no eixo do motor J e dos coeficientes de escalonamento KFB e KA.

2 10,2027P OPT

A FB

JK

T K K (4.65)

2 10,03512I OPT

A FB

JK

T K K (4.66)

Figura 4.9 – Um controlador de velocidade digital indicando os coeficientes de escalonamento

KFB e KA e estabelecendo a relação entre os sinais de velocidade e torque reais e suas

representações digitais de comprimento de palavra finito T*DIG e *

DIG, localizadas na RAM.

Fonte: Adaptada de Vukosavić (2007).

Page 68: sistema de controle de velocidade digital embarcado de motor de

61

4.7 Estratégia anti-wind-up

Uma alta capacidade de tolerância a sobrecargas é um requisito de muitas

aplicações de controle de movimento. Isso acontece em casos onde se necessita alta

aceleração, o que significa que os motores devem trabalhar com torques muito elevados

durante um curto período de tempo. No entanto, o torque máximo ± TMAX que pode ser

desenvolvido pelo motor é limitado pelas características dos semicondutores que compõem os

conversores de potência (atuadores) associados ao motor, assim como por características do

próprio motor.

Um sistema de controle de velocidade digital com capacidade de torque limitada é

mostrado na Figura 4.10. Enquanto a referência de torque T* está dentro dos limites impostos

pelo torque máximo ± TMAX, o sistema opera na região linear. Variações na velocidade de

referência ou no torque de perturbação irão resultar em transientes de torque proporcionais a

estas variações. No entanto, variações muito elevadas nas entradas do sistema farão com que

o torque de referência atinja o seu limite máximo, levando o sistema para um modo de

operação não linear.

Figura 4.10 – O sistema de controle de velocidade digital com capacidade de torque limitada

do atuador.

Fonte: Adaptada de Vukosavić (2007).

A Figura 4.11 mostra a resposta de um sistema de controle de velocidade digital

com um elevado degrau de entrada. Como o torque atinge seu limite positivo e permanece

constante, tem-se uma aceleração constante. Assim, a velocidade do eixo aumenta com uma

Page 69: sistema de controle de velocidade digital embarcado de motor de

62

inclinação constante. O torque oscila atingindo os limites máximos várias vezes, resultando

em uma resposta de forma triangular, com decaimento de amplitude e aumento de frequência

gradual. Esse tipo de resposta é característica de sistemas não-lineares e esse fenômeno é

chamado de wind-up. Ele se dá pelo crescimento elevado do termo integral do controlador,

que se diz estar carregado. O descarregamento do termo integral ocorre gradativamente

somente quando, devido ao sobressinal, o erro se torna negativo.

Os efeitos causados pelo wind-up não são aceitáveis. Portanto, o projeto do

controlador de velocidade deve incluir estratégias para suprimir o carregamento do termo

integral, que são conhecidas como anti-wind-up (AWU).

As estratégias AWU aplicadas a controladores na forma posicional (Figura 4.5,

Figura 4.7 e Equação 4.11) são complexas e apresentam várias desvantagens. No entanto,

pode-se obter uma implementação simples e efetiva na forma incremental do controlador PI

(Figura 4.6 e Equações 4.13, 4.31 e 4.32).

As expressões para o controlador PI na forma incremental com realocação do

ganho proporcional (Equações 4.31 e 4.32) podem ser reescritas na forma a seguir. A

estrutura para esse controlador é mostrada na Figura 4.12.

* * *(n 1) (n 1) (n) ( (n) (n 1)) (n 1)P IT T T K K (4.67)

1* *

0

(n 1) (k)n

k

T T

(4.68)

O integrador discreto abrangendo o limitador de torque, o bloco de atraso D2 e o

somador S1 é responsável pela ação integral sobre o erro. A localização do limitador previne o

carregamento da ação integral e suprime suas consequências negativas.

Na Figura 4.13 tem-se um exemplo de simulação para um sistema com o

controlador mostrado na Figura 4.2. Durante o período em que o torque atinge o valor

máximo, a velocidade do eixo varia com aceleração amax = TMAX/J. A velocidade atinge a

referência sem sobressinal. Do mesmo modo, quando a referência muda para zero, a

velocidade diminui com aceleração constante até a parada, sem mudança de sinal.

Segundo Vukosavić (2007), a estrutura da Figura 4.12 elimina o wind-up no

integrador do erro e fornece um resposta estritamente aperiódica, mesmo em casos com

elevadas perturbações de entrada. Com relação ao problema de controle de velocidade,

estratégias AWU adicionais não são necessárias.

Page 70: sistema de controle de velocidade digital embarcado de motor de

63

Figura 4.11 – Resposta a um elevado degrau de entrada,

levando o sistema à saturação.

Fonte: Adaptada de Vukosavić (2007).

Figura 4.12 – Forma incremental do controlador de velocidade digital com ação proporcional

realocada no caminho de realimentação.

Fonte: Adaptada de Vukosavić (2007).

Page 71: sistema de controle de velocidade digital embarcado de motor de

64

Figura 4.13 – Resposta a um degrau elevado obtida com um

controlador de velocidade PI discreto na sua implementação

incremental e com a estrutura AWU da Figura 4.12.

Fonte: Adaptada de Vukosavić (2007).

Page 72: sistema de controle de velocidade digital embarcado de motor de

65

5 SISTEMA DE CONTROLE DE VELOCIDADE DIGITAL BASEADO NA

FERRAMENTA EZ430-RF2500

5.1 Introdução

Baseado nos fundamentos expostos nos capítulos 2, 3 e 4, foi desenvolvido um

sistema de controle de velocidade digital utilizando a ferramenta eZ430-RF2500 e um

programa de interface gráfica. O material utilizado para a sua implementação é descrito a

seguir:

a) 01 ferramenta de desenvolvimento eZ430-RF2500 da Texas Instruments:

02 placas alvo eZ430-RF2500T;

01 interface de depuração USB eZ430-RF;

01 kit de baterias AAA com placa de extensão.

b) 01 motor CC escovado de ímã permanente da Pololu Corporation:

velocidade nominal a vazio do eixo de saída v0 = 80 rpm;

caixa de transmissão 131,25:1;

torque desenvolvido de rotor travado Tstall = 250 oz.in;

tensão nominal Vn = 12V;

corrente em vazio I0 = 300 mA;

corrente de rotor travado Istall = 5 A;

encoder em quadratura de efeito Hall de 64 pulsos por revolução

(equivalente a 8400 pulsos por revolução com relação ao eixo de saída), 2

canais e tensão de alimentação entre 3,5 – 20 V;

dimensão: 37 mm de diâmetro x 69 mm de comprimento.

c) 01 driver de motor CC MC33926 Motor Driver Carrier da Pololu Corporation:

tensão de chaveamento entre 5 – 28 V;

máxima corrente em regime permanente de 3 A;

máxima corrente de pico de 5 A;

entradas com lógica compatível com padrões Lógica Transistor-Transistor

(do inglês Transistor-Transistor Logic – TTL) 5 V e Semicondutor de Óxido

de Metal Complementar (do inglês Complementary Metal-Oxide-

Semiconductor – CMOS) 3 V;

suporta até 20 kHz de frequência PWM.

Page 73: sistema de controle de velocidade digital embarcado de motor de

66

d) 01 bateria selada de 12 V e 7 Ah;

e) resistores:

02 resistores de 100 kΩ;

02 resistores de 33 kΩ.

f) 01 placa de circuito impresso padrão tipo trilha;

g) barras de pinos diversas;

h) terminais e alojamentos para conectores tipo Modu diversos;

i) cabos diversos.

É importante mencionar o motivo da escolha de se usar uma bateria como fonte de

alimentação para o motor CC. Em casos de grande redução de velocidade ou reversão, a fcem

do motor CC pode se tornar maior do que a tensão de alimentação. Em fontes baseadas em

circuitos eletrônicos comuns é possível que ocorra até mesmo a danificação da fonte. Quando

se utiliza uma bateria, esse problema não ocorre, pois ela absorve a energia proveniente da

fcem do motor CC.

O sistema de controle de velocidade digital pode ser dividido em 3 componentes

principais. A interface gráfica, o módulo local e o módulo remoto. A interface gráfica é um

programa de computador que roda no sistema operacional Windows de 64 bits. O módulo

local é composto por uma placa alvo eZ430-RF2500T conectada a interface de depuração

USB eZ430-RF. O módulo remoto é composto por uma placa alvo eZ430-RF2500T conectada

ao kit de baterias.

A interface gráfica e o módulo local residem em um computador distante do

módulo remoto. A comunicação entre a interface gráfica e o módulo local se dá por

comunicação serial. A comunicação entre o módulo local e o remoto é sem fio.

A comunicação sem fio é realizada através do protocolo de comunicação sem fio

SimpliciTI. Ele é um protocolo proprietário da Texas Instruments. Para a implementação dos

programas dos módulos local e remoto adaptou-se um exemplo de comunicação peer-to-peer

que pode ser encontrado em Texas Instruments (2013c).

5.2 Interface gráfica

A interface gráfica desenvolvida foi adaptada daquela encontrada em Henry

Poon's Blog (2013). Ela foi desenvolvida utilizando a linguagem de programação Java e

Page 74: sistema de controle de velocidade digital embarcado de motor de

67

realiza a comunicação serial através da versão de 64 bits da biblioteca RXTX. Uma imagem

sua pode ser vista na Figura 5.1.

Figura 5.1 – Imagem da interface gráfica do sistema de controle de

velocidade digital.

Fonte: Próprio autor.

A interface gráfica é formada por três objetos:

a) BlueSkyGUI: implementa a parte gráfica do programa;

b) KeyBinding: implementa as funções que controlam o bloqueio e desbloqueio

dos elementos da interface gráfica;

c) SerialCommunication: implementa todas as funções que realizam o processo

de comunicação serial.

A interface gráfica é responsável pela transmissão de novas velocidades de

referência e de comandos de resposta ao degrau e de desligamento para o módulo local e pela

Page 75: sistema de controle de velocidade digital embarcado de motor de

68

recepção do status da comunicação sem fio, da velocidade atual medida e de confirmações de

fim de resposta ao degrau e de desligamento.

O programa inicia apenas com a caixa de combinação de seleção de porta serial, o

botão “Conectar” e a caixa de texto ativos. Os outros itens ficam bloqueados até que a

conexão serial com o módulo local e a comunicação sem fio entre o módulo local e o remoto

sejam estabelecidas com sucesso. Mensagens de sucesso desses dois passos são mostradas na

caixa de texto, assim como mensagens de erro.

A partir daí o uso da interface gráfica é simples. Pode-se então colocar o motor

em funcionamento com uma nova velocidade de referência ou executar um comando de

resposta ao degrau e salvar as amostras de velocidade em um arquivo de texto.

Para uma nova velocidade de referência, através do spinner da velocidade de

referência, pode-se selecionar valores entre 80 e -80 rpm com um passo de 1 rpm. Enviada

uma nova velocidade de referência para o módulo local, aguarda-se o início de rotação do

motor e então a velocidade atual medida é mostrada a cada 0,5 segundo. Com o motor em

movimento, pode-se enviar novas velocidades de referência, efetuar comandos de

desligamento e desconexão ou realizar-se um comando de resposta ao degrau.

Comandos de resposta ao degrau podem ser realizados com o motor inicialmente

desligado ou com o motor já em movimento. Para realizar-se um comando de resposta ao

degrau deve-se fornecer a velocidade inicial, a velocidade final, o tempo em segundos (entre

0,1 e 3 segundos) do degrau, selecionar se a as amostras devem ser salvas em rpm ou rad/s e

clicar-se no botão “Iniciar”. O processo começa sendo enviada a velocidade inicial do motor.

O motor permanece girando nessa velocidade por aproximadamente 2,5 segundos. Logo após,

são enviados o comando de resposta ao degrau e a velocidade final. Após o período da

resposta ao degrau, o motor é desligado, uma mensagem de final da resposta ao degrau é

mostrada na caixa de texto e as amostras de velocidade são salvas em um arquivos de texto.

Para salvar em arquivo, o programa cria automaticamente uma pasta no caminho

“C:\BlueSky” e salva o arquivo com o título no formato "StepResponse_dd.MM.yyyy_HH-

mm-ss.txt”. O código após a primeira sublinha se refere à data atual e o código após a

segunda sublinha se refere à hora local em que ocorreu o ensaio.

Comandos de desligamento são seguidos por confirmação do desligamento, pois o

motor é parado de forma controlada, não apenas desenergizado. Ao final do desligamento,

uma mensagem é mostrada na caixa de texto. Comandos de desconexão são apenas comandos

de desligamento seguidos pela interrupção da comunicação serial e do fechamento da porta

Page 76: sistema de controle de velocidade digital embarcado de motor de

69

serial. Após a desconexão o fluxo do programa retorna ao estado inicial podendo ser fechado

com segurança. Nesse ponto, caso seja desejado uma nova utilização do programa, é

necessário reiniciar os módulos local e remoto e recomeçar o processo descrito anteriormente.

5.3 Módulo local

O módulo local é responsável por realizar a comunicação entre a interface gráfica

e o módulo remoto. No sentido interface gráfica – módulo remoto, ele transmite novas

velocidades de referência e comandos de resposta ao degrau e de desligamento. No sentido

módulo remoto – interface gráfica, são transmitidos o status da comunicação sem fio, a

velocidade atual medida e confirmações de fim de resposta ao degrau e de desligamento.

No início do programa é realizada a configuração de hardware pelo protocolo

SimpliciTI através da função BSP_Init(). Esta função configura componentes como a

frequência de clock, o watchdog timer e a temporização do protocolo pelo Timer_A ou via

software.

O próximo passo é a configuração da comunicação serial com o computador.

Antes da configuração dos registradores de controle da USCI_A, é necessário configurar o

registrador de seleção de função P3SEL da porta P3 para que os pinos P3.4 e P3.5 sejam

usados pela USCI_A para transmissão e recepção, respectivamente, no modo UART. A

comunicação da USCI_A é então configurada para sem paridade, bit menos significante

primeiro, 8 bits de dados, 1 bit de parada, modo UART e modo assíncrono. A lógica da

USCI_A é parada em reset, a fonte do clock é SMCLK = 12 MHz e a velocidade é

configurada no modo de baixa frequência em 9600 baud. Ao final da configuração, a USCI_A

é liberada do reset e interrupções na unidade de recepção são habilitadas.

Depois das configurações iniciais o programa aguarda que o botão seja

pressionado para que se inicie a comunicação sem fio. Após o botão ser pressionado, é gerado

um endereço para o módulo local e são inicializados o rádio e a pilha de protocolos

SimpliciTI. Os LEDs (do inglês Light Emissor Diode) ficam piscando até que o link de

comunicação com o módulo remoto seja estabelecido. Estabelecido o link, o programa envia

pela porta serial uma confirmação para a interface gráfica de que a comunicação sem fio foi

estabelecida.

O laço principal do programa é formado apenas por seis verificações condicionais

de variáveis booleanas que indicam a ocorrência de algum evento iniciado por uma

Page 77: sistema de controle de velocidade digital embarcado de motor de

70

interrupção. Esses eventos podem ser provenientes da interface gráfica ou do módulo remoto

e para cada um deles uma ação é tomada. A lógica das ações é bem simples e é descrita a

seguir.

5.3.1 Eventos provenientes da interface gráfica

Como mencionado anteriormente, os eventos provenientes da interface gráfica

têm como ação a transmissão para o módulo remoto de novas velocidades de referência e

comandos de desligamento. Esses eventos são recebidos por comunicação serial e sua

ocorrência é sinalizada pela rotina de serviço de interrupção que trata da recepção de dados na

USCI_A.

Quando um conjunto de bytes é recebido, é identificado a que classe de evento

eles pertencem e uma variável booleana correspondente torna-se verdadeira. Tratada a

interrupção, retorna-se ao laço principal do programa e a verificação condicional

correspondente é satisfeita. A ação correspondente é então tomada, no caso, enviar algo para o

módulo remoto.

Todas as ações relacionadas com eventos provenientes da interface gráfica

utilizam a função “smplStatus_t SMPL_Send(linkID_t lid, uint8_t *msg, uint8_t len)” para

enviar dados para o módulo remoto. Ela retorna variáveis de status do protocolo SimpliciTI e

os seus argumentos são a identificação do link “lid” para o qual os dados serão enviados, o

ponteiro “msg” para os dados a serem enviados e o comprimento “len” desse ponteiro

(número de bytes a ser enviado).

Para o caso em que uma nova velocidade de referência ou um comando de

resposta ao degrau devem ser enviados, três bytes são enviados para o módulo remoto. O

primeiro byte é a identificação do evento. Os dois outros bytes, para uma nova velocidade de

referência, correspondem ao valor da velocidade de referência e, para um comando de

resposta ao degrau, correspondem a quantidade de amostras de duração da resposta. Para o

evento de desligamento, é enviado apenas a correspondente identificação do evento.

Page 78: sistema de controle de velocidade digital embarcado de motor de

71

5.3.2 Eventos provenientes do módulo remoto

Os eventos provenientes do módulo remoto são o envio do status da comunicação

sem fio, o envio da velocidade atual medida e o envio de confirmações de fim de resposta ao

degrau e de que o motor está desligado.

Esses eventos são recebidos pelo protocolo de comunicação sem fio SimpliciTI e

têm caráter de interrupção. Eles são processados pela função “static uint8_t

sRxCallback(linkID_t port)” que é especificada no início do programa como a função

responsável por tratar as interrupções geradas pela recepção de novos pacotes pelo protocolo

SimpliciTI. Ela retorna valores 0 ou 1, caso seja mal-sucedida ou não, respectivamente. Seu

argumento é a identificação do link “port” de onde foi recebido o pacote. Como no caso

anterior, após classificar que tipo de evento o conjunto de bytes recebidos representam, uma

variável booleana torna-se verdadeira e o fluxo de programa retorna ao laço principal. Lá,

uma verificação condicional é satisfeita e uma ação é tomada. Para este caso, o envio de algo

para a interface gráfica.

Todas estas ações utilizam a função “void writeData(uint8_t wCommand, uint8_t

currentOmega0, uint8_t currentOmega1)”, onde ela é uma função de retorno vazio, que tem

como argumentos o tipo de comando “wCommand” e os bytes “currentOmega0” e

“currentOmega1”, que formam a velocidade atual medida (têm valor zero para os demais

comandos).

Após armazenar os dados a serem enviados em um vetor apropriado, o envio dos

dados pela porta serial se dá pela habilitação da interrupção de transmissão. Na rotina de

serviço de interrupção os bytes armazenados no vetor são atribuídos um de cada vez ao buffer

de transmissão e automaticamente enviados.

5.4 Módulo remoto

No módulo remoto é onde acontece o controle do motor propriamente dito. Além

das tarefas de controle, ele se comunica por meio do protocolo SimpliciTI com o módulo

local.

O programa começa com a configuração do hardware do modulo remoto pelo

protocolo SimpliciTI e com uma rotina de espera até que o botão do módulo seja pressionado.

Feito isso, a comunicação sem fio é iniciada e entra-se em um novo laço onde se aguarda o

Page 79: sistema de controle de velocidade digital embarcado de motor de

72

envio da primeira velocidade de referência. Recebida a velocidade, definem-se certas

condições por meio de variáveis booleanas e abandona-se o laço.

O passo seguinte é fazer algumas configurações iniciais para o Timer_A e o

Timer_B. O Timer_A é responsável pela medição da velocidade do motor enquanto que o

Timer_B gera o sinal PWM para o driver do motor.

Em seguida, entra-se no laço principal do programa. Dentro deste laço existem

outros dois laços colocados de forma sequencial. O primeiro, caso o motor esteja ligado e o

segundo para o caso de o motor já houver sido ligado e foi desligado. O segundo caso nada

mais é do que um laço vazio realizado enquanto uma nova velocidade de referência não for

enviada. Sendo enviada uma nova velocidade o laço termina, algumas condições iniciais são

definidas e entra-se no laço para o caso do motor ligado. É neste laço onde ocorrem todas as

ações de controle.

Nas seções seguintes são descritas as rotinas necessárias para se realizar o

controle de velocidade e a comunicação com o módulo local.

5.4.1 Comunicação com o módulo local

A comunicação com o módulo local se dá pela recepção de novas velocidades de

referência e de comandos de resposta ao degrau e de desligamento e pela transmissão da

velocidade atual e de confirmações de fim de resposta ao degrau e de desligamento.

A recepção ocorre do mesmo modo como no módulo local e se dá pela função

“sRxCallback”. Nela são armazenados os bytes recebidos em outras variáveis e atribuídos

valores verdadeiros para variáveis booleanas correspondentes a cada evento. Retornando ao

laço principal uma verificação condicional é realizada e uma ação é tomada.

Para o caso de uma nova velocidade de referência, os bytes recebidos são unidos

em uma variável de 16 bits para formar a velocidade angular multiplicada por mil. Esse valor

será utilizado na próxima iteração do sistema de controle.

Quando é recebido um comando de resposta ao degrau, une-se os bytes recebidos

em uma variável de 16 bits para formar-se a quantidade de amostras que corresponde à

duração do degrau. Todo comando de resposta ao degrau é sucedido por um comando de nova

velocidade de referência (velocidade final). Quando a nova velocidade de referência é

recebida, na próxima iteração do sistema de controle, em vez de ser enviada a cada 0,5

segundo, a velocidade atual passa a ser enviada a cada período de amostragem durante o

Page 80: sistema de controle de velocidade digital embarcado de motor de

73

número de amostras recebido. Ao final desse período, a velocidade de referência é atribuída

igual a zero e é enviada a confirmação de fim de resposta ao degrau ao módulo local.

Para o caso de comandos de desligamento faz-se a nova velocidade de referência

igual a zero e espera-se o motor parar. Quando a velocidade for igual a zero, o Timer_A e o

Timer_B são parados, o driver do motor é desabilitado, é enviada uma confirmação de

desligamento para o módulo local e abandona-se o laço para o estado do motor ligado.

A velocidade atual é transmitida para o módulo local aproximadamente a cada 0,5

segundo. Essa escolha de frequência foi tomada para evitar o congestionamento do canal de

comunicação com a interface gráfica. Dentro do fluxo de programa, a transmissão ocorre

depois que o sinal de controle é aplicado ao motor. Como no caso do módulo local, ela é

realizada pela função “SMPL_Send”.

5.4.2 Medição de velocidade

Para a medição de velocidade utilizou-se o encoder de efeito Hall em quadratura

de dois canais acoplado ao eixo no motor CC utilizado. Os canais do encoder passam por um

circuito divisor de tensão antes de serem conectados às unidades de captura e comparação do

MSP430F2274. A vantagem de se trabalhar com esse tipo de encoder é a possibilidade de,

além de se medir a velocidade, detectar-se a variação do sentido de rotação. O método de

medição de velocidade escolhido foi o método de medição combinada de frequência e

período.

5.4.2.1 Circuito de interface do encoder

O circuito de interface dos canais do encoder para os pinos das unidades de

captura/comparação do MSP430F2274 é apenas um divisor de tensão. O encoder é

alimentado com 12 V provenientes da mesma bateria que alimenta o motor CC. As saídas dos

canais possuem a mesma tensão da alimentação. Portanto, para reduzir a tensão para a faixa

de 2,4 – 3,3 V com que o microcontrolador (alimentado por 3 V) pode reconhecer um nível

lógico alto, usa-se esse circuito. Assim, tem-se a relação

2

1 2

0,25C

encoder

VR

R R V

. (5.1)

Page 81: sistema de controle de velocidade digital embarcado de motor de

74

No entanto, a corrente consumida por cada canal do encoder deve ser mínima,

para que não ocorra um afundamento de tensão. Assim, foram escolhidos os valores R1 = 100

kΩ e R2 = 33 kΩ.

5.4.2.2 Escolha do período de amostragem

Para a escolha do período de amostragem levou-se em consideração valores

usualmente utilizados no controle de motores CC. Foi necessário também lidar com as

limitações da ferramenta eZ430-RF2500. Apesar de o MSP430F2274 possuir três canais de

captura por temporizador, a eZ430-RF2500 tem pinos disponíveis apenas para dois canais de

captura por temporizador. Além do mais, quando estes dois canais estão em uso não é

possível utilizar o temporizador no modo crescente (conta até o valor de TACCR0), apenas no

modo contínuo (conta até FFFFh), pois um destes canais é a unidade 0 de

captura/comparação. Por isso, configurou-se o Timer_A no modo contínuo, com clock

alimentado por SMCLK = 12 MHz e dividido por 2. Assim, um período completo do

temporizador corresponde a 10,923 ms, que é o período de amostragem T.

5.4.2.3 Determinação do sentido de rotação

Os encoders em quadratura possuem como saída nos seus canais ondas quadradas

que variam de frequência de acordo com a velocidade do motor. A variação destas ondas,

defasadas de 90° elétricos, apresentam sempre a mesma sequência de padrões entre seus

pulsos para cada sentido de rotação. E estas sequências podem ser representadas pelo código

Gray de dois bits.

Assim, para a tabela verdade apresentada abaixo, pode-se estabelecer que no

sentido horário o motor segue a sequência ...0, 1, 3, 2, 0, ... e para o sentido anti-horário segue

a sequência ...0, 2, 3, 1, 0, ... Para que essas suposições estejam corretas, deve-se verificar no

osciloscópio qual a sequência de canais do encoder é a correspondente ao sentido de rotação,

mudando os canais nas entradas de captura quando necessário.

Page 82: sistema de controle de velocidade digital embarcado de motor de

75

Tabela 5.1 – Código Gray com a definição dos canais do

encoder e dos padrões.

Canal B Canal A Padrão

0 0 0

0 1 1

1 1 3

1 0 2

Fonte: Próprio autor.

Para determinar-se o sentido de rotação do motor de acordo com a sequência de

padrões é necessário saber qual o padrão atual e qual o padrão anterior. Para esse fim, seria

necessário uma tabela onde cada sequência de dois padrões correspondesse a uma direção.

Uma forma mais simples de resolver esse problema é a implementação de um

vetor onde cada elemento corresponde a um sentido de rotação para uma determinada

sequência de dois padrões, podendo possuir alguns valores para sequências de padrões não

permitidas e para casos em que a o padrão não mudou. Assim, o índice do elemento deste

vetor correspondente a uma determinada sequência pode ser calculada por uma expressão

matemática. O vetor de encoder em quadratura usado foi adaptado do vetor encontrado em

Let’s Make Robots (2013), e é dado abaixo com sua expressão matemática para cálculo do

índice.

Vetor de Encoder em Quadratura[i] = {-1, 0, 1, -1, 1, -1, -1, 0, 0, -1, -1, 1, -1, 1, 0, -1},

i = 4x(padrão anterior) + padrão atual, (5.2)

onde 0 corresponde ao sentido horário, 1 ao sentido anti-horário e -1 corresponde a estados

não permitidos ou casos em que o padrão não mudou.

No entanto, ainda é necessário determinar qual o padrão anterior quando o motor

está parado e começa a se movimentar. É definido que de acordo com a velocidade de

referência (positiva ou negativa) sabe-se se o motor inicia o movimento no sentido horário ou

anti-horário. A unidade de captura deve ser configurada para ser ativada por transições de

nível lógico, tanto de subida como de descida. Assim, de acordo com a leitura do nível lógico

do pulso inicial em qualquer canal, observando a Tabela 5.1 pode-se obter o padrão atual e o

anterior ao mesmo tempo.

Page 83: sistema de controle de velocidade digital embarcado de motor de

76

5.4.2.4 Medição combinada de frequência e período

O método escolhido para a medição de velocidade foi proposto por Faccio et al.

(2004). Ele se baseia na medição tanto da frequência dos pulsos como no número de períodos

entre dois pulsos (medição em baixas velocidades). A equação da velocidade angular é dada

por

1

2

sc h h p

N

T T T N

(5.3)

onde, Np é a resolução do encoder, Tsc é uma janela de observação básica, scT é uma janela

de observação estendida, N é o número de pulsos do encoder capturados dentro da janela de

observação, Th é o período de tempo entre o final da janela de observação e quando o último

pulso foi capturado dentro dela e Th-1 é seu equivalente para a janela de observação anterior.

Assim, tem-se como variáveis para calcular a velocidade N, scT , Th e Th-1. Na Figura

5.2 é possível observar melhor cada elemento da Equação 5.3.

Figura 5.2 – Apresentação do método de medição combinada de frequência e período.

Fonte: Adaptada de Faccio et al. (2004).

O MSP430F2274 só realiza por hardware operações de soma e subtração de

números inteiros. Desse modo, todos os cálculos envolvendo multiplicações e divisões são

realizados por bibliotecas matemáticas via software. Além do mais, para uma melhor

precisão, é necessária a utilização de variáveis de ponto flutuante. Tudo isso resulta em um

custo computacional elevado. Assim, procura-se agrupar o máximo número possível de

constantes dentro de cada expressão a ser calculada.

Page 84: sistema de controle de velocidade digital embarcado de motor de

77

Outra questão que aparece é o fato de que a unidade de captura do Timer_A

apenas conta o número de ciclos em que ocorreu a captura. A conversão em unidades de

tempo deve ser realizada pela multiplicação com o período do temporizador.

Além disso, como a velocidade nominal do motor CC é de 80 rpm ou 8,378 rad/s,

para facilitar a transmissão ou recepção de valores desta ordem em bytes, multiplica-se a

velocidade angular por 1000.

Baseado nos fatos citados anteriormente, reescrevendo a Equação 5.3 tem-se

1

2 1000

1000p hf

sc h h

NN T

C C C

, (5.4)

onde Thf é o período de cada ciclo do Timer_A, Csc é o total de ciclos da janela observável

básica, scC é a soma total de ciclos para uma janela observável estendida, Ch é a quantidade

de ciclos quando ocorreu a captura do último pulso dentro da janela observável e Ch-1 é seu

equivalente para a janela de observação anterior.

O controle da velocidade do motor é realizado tanto com velocidades positivas

(sentido horário) como negativas (sentido anti-horário). Assim para incluir o sinal na

velocidade calculada estabelece-se que, para movimento no sentido horário, a quantidade de

pulsos capturados é positiva e, no sentido anti-horário, ela é negativa. É necessário ainda

contemplar o caso da reversão de velocidade. Neste caso, quando a velocidade está próxima

de zero e o motor está prestes a mudar de sentido de rotação, dentro de uma janela observável

ocorrem tanto pulsos positivos como negativos. Assim, pode-se obter a velocidade média

dentro desta janela fazendo N ser calculado pela diferença entre a quantidade de pulsos

positivos e negativos.

5.4.3 Controlador PI

No capítulo 4 foi apresentado o controlador PI na forma incremental com

realocação do ganho proporcional, suas expressões sendo dadas pelas Equações 4.67 e 4.68.

Nesta seção, trata-se então da estimação dos parâmetros do modelo do motor e do cálculo dos

parâmetros do controlador.

É importante observar que o motor CC utilizado possui uma caixa de transmissão

e que a velocidade com que se deve lidar é a do eixo da engrenagem de saída. Portanto, para

Page 85: sistema de controle de velocidade digital embarcado de motor de

78

que todas as equações do controlador sejam válidas, é preciso calcular os parâmetros do motor

com relação ao eixo de saída do motor.

5.4.3.1 Estimação dos parâmetros do modelo do motor CC

Parâmetros como a constante do motor km, o momento de inércia J e atrito viscoso

B não são fornecidos pelo fabricante do motor CC utilizado, portanto, precisam ser estimados.

No modelo do subsistema mecânico considerado no capítulo 4 o único parâmetro a se

determinar era o momento de inércia J, pois a componente do atrito viscoso B era incluída no

torque de perturbação TL. No entanto, pelo método apresentado por Daher (2012), a estimação

de J é dependente da estimação de B e de km. Os ensaios e cálculos realizados para se obter

esses valores são descritos a seguir.

Para a estimação da constante do motor km, primeiro mediu-se a resistência de

armadura Ra = 2,2 Ω. com o motor a vazio e alimentado diretamente pela bateria, conectou-se

um amperímetro em série com a alimentação, e mediu-se a corrente e a tensão da bateria. A

corrente medida foi Ia = 310 mA e a tensão Vs = 13,04 V.

Utilizando uma outra versão do programa apresentado aqui, em malha aberta

alimentou-se o motor com um ciclo de trabalho de 100% e mediu-se sua velocidade angular

em regime permanente. Obteve-se = 9,571 rad/s.

Considerando que a tensão da bateria era a mesma no momento dos dois ensaios,

calculou a constante do motor km pela Equação 5.5 (Daher, 2012).

s a am

V R Ik

. (5.5)

O valor estimado foi km = 1,2901 V.s/rad.

Para se obter o atrito viscoso B, seguiu-se a Equação 5.6 e utilizou-se os valores

obtidos nos ensaios anteriores (Daher, 2012).

m ak IB

. (5.6)

Obteve-se B = 0,04179 N.m.s/rad.

Para se estimar o momento de inércia J realizou-se o ensaio conhecido como

rundown test. Para isso, alimenta-se o motor a vazio, em regime permanente interrompe-se a

alimentação e mede-se o tempo que a velocidade levou para atingir 36,8% da velocidade de

Page 86: sistema de controle de velocidade digital embarcado de motor de

79

regime permanente 0. Esse valor é a constante de tempo mecânica τm do motor e é dada pela

Equação 5.7 (Daher, 2012).

m

J

B (5.7)

Utilizando o mesmo programa mencionado anteriormente realizou-se o rundown

test, coletou-se as velocidades para cada período de amostragem até que o motor parasse e

com o auxílio do MATLAB plotou-se o gráfico da velocidade. Obteve-se 0 = 9.567 rad/s,

τm = 0,067 s. Portanto, J = 0,0028 kg.m2.

5.4.3.2 Determinação dos parâmetros do controlador

De posse do momento de inércia J e do período de amostragem T = 10,923 ms, os

parâmetros do controlador PI são calculados de acordo com as Equações 4.63 e 4.64 e são

dados por

KP = 0,10391 e (5.8)

KI = 0,018004. (5.9)

5.4.3.3 Avaliação de desempenho do controlador por meio de simulação computacional

Em Vukosavić (2007) pode ser encontrado um modelo em Simulink para o

sistema de controle digital apresentado no capítulo 4. Adaptado dele, foi implementado um

modelo em Simulink para o sistema de controle com os parâmetros encontrados.

Na Figura 5.3 é mostrado o subsistema do controlador. Foram realizadas

simulações para dois casos. Com o modelo do motor incluindo a componente de torque do

atrito viscoso no torque de perturbação (Figura 5.4) e com a componente de torque do atrito

viscoso incluída no modelo do motor (Figura 5.7). Isso foi feito com o intuito de mostrar as

diferenças nos resultados das duas abordagens, visto que no projeto do controlador é levado

em consideração apenas a primeira hipótese.

Page 87: sistema de controle de velocidade digital embarcado de motor de

80

Figura 5.3 – Modelo em Simulink do Controlador PI digital incremental

com realocação do ganho proporcional e estratégia anti-wind-up.

Fonte: Próprio Autor.

Figura 5.4 – Modelo em Simulink do sistema de controle de velocidade digital

com a componente de torque do atrito viscoso incluída no torque de perturbação.

Fonte: Próprio autor.

Na primeira simulação aplicou-se ao sistema um degrau de 80 rpm ou 8,378 rad/s

em t = 0 e, em t = 1 s, aplicou-se uma perturbação de 0,3 N.m. Os resultados para a resposta

de velocidade e para o sinal de controle são apresentados na Figura 5.5.

Page 88: sistema de controle de velocidade digital embarcado de motor de

81

Figura 5.5 – Resposta de velocidade e sinal de controle, incluindo a componente de torque do

atrito viscoso no torque de perturbação, para um degrau de 80 rpm (8,378 rad/s) em t = 0 e

para uma perturbação de 0,3 N.m em t = 1 s.

Fonte: Próprio autor.

Page 89: sistema de controle de velocidade digital embarcado de motor de

82

Correspondendo ao projeto do controlador, não houve sobressinal na resposta de

velocidade. O tempo de assentamento com critério de 5% para a resposta ao degrau foi de

Ts = 120,1 ms. O tempo de assentamento para a rejeição da perturbação foi de Ts = 125 ms.

O sinal de controle é o torque eletromagnético de referência que deve ser

desenvolvido pelo motor Td. Esse sinal é a saída do limitador de torque. O sinal de controle

mostra que na resposta ao degrau de velocidade o torque a ser desenvolvido cresce até atingir

o valor de Td = 0,3136 N.m e diminui até ficar em torno de zero em regime permanente. Para

a rejeição de perturbação o torque a ser desenvolvido cresce até Td = 0,403 N.m e diminui

para um valor em torno de 0,3 N.m em regime permanente.

A segunda simulação tem o intuito de comprovar a eficácia da estratégia anti-

wind-up. Com o motor sem carga, o torque máximo TMAX foi ajustado para 0,05 N.m, em t = 0

foi aplicado um degrau de 80 rpm e em t = 1 s, realizou-se a reversão da velocidade para -80

rpm. A resposta da velocidade e o sinal de controle podem ser vistos na Figura 5.6.

Page 90: sistema de controle de velocidade digital embarcado de motor de

83

Figura 5.6 – Resposta de velocidade em vazio e sinal de controle, incluindo a componente de

torque do atrito viscoso no torque de perturbação, para um degrau de 80 rpm (8,378 rad/s) em

t = 0 e um degrau de -80 rpm em t = 1 s, com o torque máximo TMAX = 0,05 N.m.

Fonte: Próprio autor.

Page 91: sistema de controle de velocidade digital embarcado de motor de

84

A resposta de velocidade mostra que não houve sobressinal mesmo com a

saturação do sinal de controle. No entanto, devido ao valor constante que o torque a ser

desenvolvido Td assume durante determinados momentos, a resposta tem uma inclinação

constante durante esses períodos de tempo. Sempre após atingir a velocidade de referência, o

torque de referência fica em torno de zero, pois não há torque de perturbação.

O modelo em Simulink para o caso em que a componente de torque do atrito

viscoso é incluída no modelo do motor é mostrado na Figura 5.7. Para este caso, foram

realizadas simulações semelhantes às do caso anterior.

Figura 5.7 – Modelo em Simulink do sistema de controle de velocidade digital com a

componente de torque do atrito viscoso incluída no modelo do motor.

Fonte: Próprio autor.

Como no caso anterior, foi aplicado um degrau de 80 rpm em t = 0, e aplicado

uma perturbação de 0,3 N.m em t = 1 s. A resposta de velocidade e o sinal de controle podem

ser vistos na Figura 5.8.

Page 92: sistema de controle de velocidade digital embarcado de motor de

85

Figura 5.8 – Resposta de velocidade e sinal de controle, incluindo a componente de torque do

atrito viscoso no modelo do motor, para um degrau de 80 rpm (8,378 rad/s) em t = 0 e para

uma perturbação de 0,3 N.m em t = 1 s.

Fonte: Próprio autor.

Page 93: sistema de controle de velocidade digital embarcado de motor de

86

Para a resposta de velocidade não ocorreu sobressinal e o tempo de assentamento

da resposta ao degrau foi de Ts = 229,4 ms. Para a rejeição de perturbação Ts = 146,9 ms.

Devido à inclusão do termo do atrito viscoso no modelo do motor, tanto na

resposta ao degrau como na rejeição de perturbação, o sinal de controle cresce até um

determinado valor e permanece em torno dele em regime permanente. Para a resposta ao

degrau este valor é de Td = 0,3501 N.m e para a rejeição de perturbação é de Td = 0,6501 N.m.

Na segunda simulação, com o motor a vazio, aplicou-se um degrau de 80 rpm em

t = 0 e um degrau de -80 rpm em t = 1 s, com o torque máximo TMAX = 0,3 N.m. Os resultados

para a resposta de velocidade e para o sinal de controle podem ser vistos na Figura 5.9.

Page 94: sistema de controle de velocidade digital embarcado de motor de

87

Figura 5.9 – Resposta de velocidade em vazio e sinal de controle, incluindo a componente de

torque do atrito viscoso no modelo do motor, para um degrau de 80 rpm (8,378 rad/s) em t = 0

e um degrau de -80 rpm em t = 1 s, com o torque máximo TMAX = 0,3 N.m.

Fonte: Próprio autor.

Page 95: sistema de controle de velocidade digital embarcado de motor de

88

Observando os resultados, nota-se que o torque a ser desenvolvido Td satura no

seu valor máximo e permanece nele. O controlador não consegue fazer com que a velocidade

atinja o seu valor de referência. Isso ocorre pois o valor máximo do torque TMAX = 0,3 N.m é

menor do que o valor da componente de torque do atrito viscoso para a velocidade de

referência TB = 0,3501 N.m.

5.4.4 Acionamento do motor CC

Após o cálculo do sinal de controle é necessário ainda transformar esse sinal em

um meio de acionamento do motor CC. Para realizar o acionamento escolheu-se o método

PWM, utilizando um circuito de ponte H. A frequência do sinal PWM escolhida foi 10 kHz.

5.4.4.1 Circuito de acionamento do motor CC

O circuito de acionamento do motor CC é o MC33926 Motor Driver Carrier

desenvolvido pela Pololu Corporation. Ele utiliza uma ponte H e é baseado no circuito

integrado MC33926 da Freescale Semiconductor. A corrente máxima que pode ser entregue

continuamente é de aproximadamente 3 A, suportando picos de até 5 A. A conexão dele com

a ferramenta eZ430-RF2500 é direta, pois o MC33926 trabalha com níveis lógicos entre

3 – 5 V.

São necessárias três conexões entre o microcontrolador e a ponte H. O Pino de

habilitação (EN) do MC33926 conecta-se à porta P4.6 do MSP430F2274. A habilitação da

ponte H ocorre com nível lógico alto. O Pino de inversão (INV) do MC33926 conecta-se à

porta P4.5 do MSP430F2274. A inversão do PWM é acionada com nível lógico alto. O Pino

de entrada 1 (IN1) do MC33926 conecta-se ao pino da saída OUT1 da unidade de

captura/comparação 1 do Timer_B do MSP430F2274. Para essa configuração a entrada (IN2)

da ponte H deve permanecer sempre aterrada.

Além dessas conexões são necessárias mais algumas configurações para o

MC33926. É necessário conectar a alimentação do microcontrolador ao pino VDD do

MC33926 Motor Driver Carrier. Depois, conecta-se jumpers entre os pinos D1 e GND e

entre D2 e VDD. Para conectar os jumpers os pinos estão lado a lado.

Page 96: sistema de controle de velocidade digital embarcado de motor de

89

5.4.4.2 Cálculo do número de ciclos do PWM

O controlador apresentado calcula o torque de referência T* para um motor

qualquer, desde que seja conhecido seu momento de inércia J e o período de amostragem T do

sistema de controle. É necessário então tomar esse valor e calcular para um motor CC a

referência do sinal que será aplicado ao circuito de acionamento. Para o sistema de controle

proposto, esta referência é o número de ciclos do temporizador que correspondem ao ciclo de

trabalho do sinal PWM, podendo ser obtida por

PWM PWM TBC D C , (5.10)

onde DPWM é o ciclo de trabalho do PWM, CTB é total de ciclos do temporizador e CPWM é

quantidade de ciclos que correspondem ao ciclo de trabalho do PWM.

CTB é um valor conhecido. Então o ciclo de trabalho do PWM é obtido por

*

sPWM

n

VD

V , (5.11)

onde Vs* é a tensão de referência que deve ser aplicada ao motor CC e Vn é a tensão nominal

do motor e é um valor conhecido.

A tensão de referência Vs* pode ser obtida através da Equação 2.14, sendo

reescrita da forma

* * *as m

m

RV k T

k , (5.12)

onde * é a velocidade de referência.

Baseado nas Equações 5.11 e 5.12 pode-se reformular a Equação 5.10 da seguinte

forma:

* *1000 10001000 1000

m TB a TBPWM

n m n

k C R CC T

V k V

. (5.13)

Deve-se lembrar que os valores de velocidade e torque são multiplicados por 1000.

5.5 Resultados Experimentais

Aqui são mostrados resultados de respostas ao degrau para duas situações. A

primeira, com a bateria totalmente carregada e a segunda com a bateria descarregada. A

resposta obtida com o controlador implementado é comparada com a resposta de simulação

para o modelo em Simulink da Figura 5.7, onde a componente de torque do atrito viscoso é

Page 97: sistema de controle de velocidade digital embarcado de motor de

90

incluída no modelo do motor. Este modelo para a simulação foi escolhido pois não se pode

quantificar com certeza a soma das componentes parasitas do torque de perturbação para o

modelo da Figura 5.4, onde a componente de torque do atrito viscoso é incluída na

perturbação.

Com a bateria carregada, a sua tensão medida no momento dos experimentos foi

13,6 V. A Figura 5.10 mostra os resultados para uma resposta ao degrau de 80 rpm ou 8,378

rad/s.

Page 98: sistema de controle de velocidade digital embarcado de motor de

91

Figura 5.10 – Resposta ao degrau de velocidade de 80 rpm (8,378 rad/s) e sinal de controle da

simulação, com a tensão da bateria de 13,6 V.

Fonte: Próprio autor.

Page 99: sistema de controle de velocidade digital embarcado de motor de

92

Para a simulação não houve sobressinal e o tempo de assentamento com critério

de 5 % foi de Ts = 229,32 ms. Na resposta experimental, o tempo de assentamento foi de

Ts = 163,8 ms e ocorreu sobressinal de OS% = 1,66 %.

Ainda com a bateria carregada, a Figura 5.11 mostra os resultados para uma

reversão de velocidade de 80 rpm para -80 rpm.

Page 100: sistema de controle de velocidade digital embarcado de motor de

93

Figura 5.11 – Resposta ao degrau de velocidade de 80 rpm para -80 rpm e sinal de controle da

simulação, com a tensão da bateria de 13,6 V.

Fonte: Próprio autor.

Page 101: sistema de controle de velocidade digital embarcado de motor de

94

Na simulação não ocorreu sobressinal e o tempo de assentamento foi de

Ts = 283,92 ms. Para o experimento, obteve-se um tempo de assentamento de Ts = 185,64 ms

e ocorreu sobressinal de OS% = 3,14 %.

O que se pode perceber dos resultados experimentais é que a sua resposta é

sempre mais rápida do que a da simulação e que sempre ocorreu sobressinal. Este sobressinal

se deve, provavelmente, ao valor da tensão de alimentação do sistema de controle maior do

que a tensão nominal, que é considerada no cálculo do sinal de controle (ciclos do PWM).

Com a bateria descarregada, a sua tensão medida foi de 10,7 V. A Figura 5.12

mostra os resultados para uma resposta ao degrau de 70 rpm ou 7,33 rad/s.

Page 102: sistema de controle de velocidade digital embarcado de motor de

95

Figura 5.12 – Resposta ao degrau de velocidade de 70 rpm (7,33 rad/s) e sinal de controle da

simulação, com a tensão da bateria de 10,7 V.

Fonte: Próprio autor.

Page 103: sistema de controle de velocidade digital embarcado de motor de

96

Não houve sobressinal em nenhuma das respostas. Para a simulação, o tempo de

assentamento foi de Ts = 218,4 ms. Para o experimento, obteve-se Ts = 524,16 ms.

Na segunda resposta ao degrau, fez-se uma reversão de velocidade de 70 rpm para

-70 rpm. Os resultados são mostrados na Figura 5.13.

Page 104: sistema de controle de velocidade digital embarcado de motor de

97

Figura 5.13 – Resposta ao degrau de velocidade de 70 rpm para -70 rpm e sinal de controle da

simulação, com tensão da bateria de 10,7 V.

Fonte: Próprio autor.

Page 105: sistema de controle de velocidade digital embarcado de motor de

98

Não ocorreu sobressinal para nenhuma das respostas. Para a simulação o tempo de

assentamento foi de Ts = 283,92 ms. Para o experimento, o tempo de assentamento foi de

Ts = 764,4 ms.

Com a bateria descarregada, pode-se perceber que, não ocorre sobressinal e que a

resposta do experimento é sempre mais lenta do que a resposta simulada. No entanto, a

presença da ação integral do controlador faz com que a referência ainda seja atingida.

Page 106: sistema de controle de velocidade digital embarcado de motor de

99

6 CONCLUSÃO

Como é comum em todas as baterias, ocorreu a variação dos valores de tensão de

acordo com o seu carregamento (13,6 V carregada e 10,7 V descarregada). No entanto,

mesmo com essas variações o sistema de controle digital conseguiu manter a velocidade de

referência. A exceção ocorreu apenas com a bateria descarregada, quando a velocidade

máxima alcançada foi de aproximadamente 76 rpm.

O circuito completo que realiza as conexões entre microcontrolador e driver do

motor e entre microcontrolador e encoder se mostrou muito simples para esse caso. O driver

foi facilmente configurado através de jumpers e conexões com a tensão de alimentação do

módulo remoto e com o terra do circuito. Adicionalmente, as conexões com o

microcontrolador foram diretas.

O MSP430F2274 apresentou fácil configuração e operação tanto para o módulo

local como para o remoto. Trabalhando com um clock de 12 MHz apenas, ele apresentou

desempenho satisfatório com comunicação serial, gerenciamento de comunicação sem fio,

operações de captura e comparação através dos temporizadores e operações matemáticas de

ponto flutuante via software. O único problema apresentado se deu com algumas poucas

amostras do número de ciclos representando o momento da captura. Esse problema foi

contornado limitando-se o número de ciclos do último pulso dentro de uma janela observável

em 64000. Valores menores que esses eram considerados errôneos e era atribuído ao número

de ciclos um valor de 65536, a borda de uma janela observável básica.

O protocolo SimpliciTI, para a comunicação peer-to-peer, se apresentou simples

de configurar e de se operar. Não houve problemas relacionados com seu uso e, em testes

realizados, sempre todos os dados enviados entre os módulos local e remoto não se perderam.

A utilização de um motor CC com caixa de engrenagens aparentemente afetaria

muito as equações do sistema de controle e da medição da velocidade. Mas foi observado que

a condição necessária para que as equações permaneçam válidas é que todas as estimações de

parâmetros e cálculos sejam efetuados com relação a valores relacionados com o eixo de saída

da caixa de engrenagens.

As simulações realizadas em Simulink/MATLAB mostraram o comportamento do

modelo do sistema de controle para condições a vazio, com carga e com saturação do torque

de referência. Foram contempladas situações tanto com a inclusão da componente de torque

de atrito viscoso no torque de perturbação como com o atrito viscoso incluído no modelo do

Page 107: sistema de controle de velocidade digital embarcado de motor de

100

motor. A suposição feita no primeiro caso é que que a componente do atrito viscoso é

descasada da dinâmica interna do sistema mecânico do motor.

Os resultados experimentais comparados com os resultados de simulação

mostraram o desempenho do controlador para respostas ao degrau quando a bateria está

completamente carregada e quando está descarregada. Foi possível observar certas diferenças

entre os resultados experimentais e simulados para cada caso. Com a bateria carregada a

resposta experimental sempre é mais rápida, mas ocorre a presença de um pequeno

sobressinal. Com a bateria descarregada não ocorre sobressinal e o sistema atinge a

velocidade de referência, no entanto, a resposta experimental é bem mais lenta.

Como trabalhos futuros, considera-se a implementação de uma interface gráfica

em MATLAB. Isso possibilitaria o desenvolvimento mais simples de métodos de estimação

dos parâmetros do motor baseados em respostas ao degrau e de métodos de auto-ajuste do

controlador para diferentes tipos de carga.

Page 108: sistema de controle de velocidade digital embarcado de motor de

101

REFERÊNCIAS

CHAPMAN, Stephen J. Electric Machinery Fundamentals. 4. ed. New York: McGraw-

Hill, 2005.

DAHER, Sérgio. Disciplina de Máquinas Elétricas. Roteiro de Laboratório 6. Fortaleza,

2012.

DAVIES, John H. MSP430 Microcontroller Basics. Burlington: Newnes, 2008.

DORF, Richard C.; BISHOP, Robert H. Modern Control Systems. 12. ed. Upper Saddle

River: Prentice Hall, 2011.

FACCIO, Marco; GRANDE, Paolo; PARASILITI, Francesco; PETRELLA, Roberto;

TURSINI, Marco. An Embedded System for Position and Speed Measurement Adopting

Incremental Encoders. In: INDUSTRY APPLICATIONS CONFERENCE, 2004. 39TH IAS

ANNUAL MEETING, 2004. Conference Record of the 2004 IEEE (Volume: 2). p. 1192 –

1199.

FADALI, M. Sam. Digital Control Engineering. Burlington: Academic Press, 2009.

FITZGERALD, A. E.; KINGSLEY, Charles; UMANS, Stephen D. Electric Machinery. 6.

ed. New York: McGraw-Hill, 2003.

GURU, Bhag S.; HIZIROGLU, Hüseyin R. Electric Machinery and Transformers. 3. ed.

New York: Oxford University Press, 2001.

GOLNARAGHI, Farid; KUO, Benjamin C. Automatic Control Systems. 9. ed. Hoboken:

John Wiley & Sons, Inc., 2010.

HAISHUI, Zhu; DAHU, Wang; TONG, Zhang; KEMING, Huang. Design on a DC Motor

Speed Control. In: 2010 International Conference on Intelligent Computation Technology and

Automation (ICICTA), 2010, Changsha. Record (Volume: 2). p. 59 – 63.

HENRY POON'S BLOG. Serial Communication in Java with Example Program.

Disponível em: <henrypoon.wordpress.com/2011/01/01/serial-communication-in-java-with-

example-program/>. Acesso em: 4 out. 2013.

HUGHES, Austin. Electric Motors and Drives: Fundamentals, Types and Applications. 3.

ed. Oxford: Newnes, 2006.

LET’S MAKE ROBOTS. How to use a quadrature encoder. Disponível em:

<letsmakerobots.com/node/24031>. Acesso em: 7 nov. 2013.

LIN, A. K.; KOEPSEL, W.W. A Microprocessor Speed Control System. IEEE Transactions

on Industrial Electronics and Control Instrumentation, v. IECI-24, n. 3, ago. 1977.

NISE, Norman S. Control Systems Engineering. 6. ed. Hoboken: John Wiley & Sons, Inc.,

2011.

Page 109: sistema de controle de velocidade digital embarcado de motor de

102

OGATA, Katsuhiko. Modern Control Engineering. 5. ed. Upper Saddle River: Prentice

Hall, 2010.

TEXAS INSTRUMENTS. MSP430x2xx Family User's Guide (Rev. J). Disponível em:

<http://www.ti.com/lit/ug/slau144j/slau144j.pdf>. Acesso em: 11 jul. 2013a.

TEXAS INSTRUMENTS. MSP430F22x2, MSP430F22x4 Mixed Signal Microcontroller

(Rev. G). Disponível em: <http://www.ti.com/lit/ds/slas504g/slas504g.pdf>. Acesso em: 12

jul. 2013b.

TEXAS INSTRUMENTS. TI E2E Community. Exemplo de Programa. Disponível em:

<http://e2e.ti.com/cfs-file.ashx/__key/communityserver-discussions-components-

files/156/8080.SMPL_5F00_PeerToPeer_5F00_Ori.zip>. Acesso em: 13 jul. 2013c.

VUKOSAVIĆ, Slobodan N. Digital Control of Electrical Drives. New York: Springer,

2007.

WANG, H. C.; CHEN, J. N. A microcomputer-based digital system for DC motor speed

control. In: 1979 Symposium on Automatic Control, 1979. Proceedings.

WILDI, Theodore. Electrical Machines, Drives, and Power Systems. 5. ed. Upper Saddle

River: Prentice Hall, 2002.

Page 110: sistema de controle de velocidade digital embarcado de motor de

103

APÊNDICE A – CÓDIGOS FONTE

CÓDIGOS FONTE DA INTERFACE GRÁFICA EM JAVA

BlueSkyGUI.java

package my.bluesky;

import java.awt.Color;

/**

*

* @author Rene Descartes Olimpio Pereira

*/

public class BlueSkyGUI extends javax.swing.JFrame {

SerialCommunication serialCommunication = null;

KeyBinding keyBinding = null;

double pi = 3.14159, SamplePeriod = 0.01092267, SecondsStepTime = 0;

long omega, LongInitialOmegax1000, LongFinalOmegax1000;

int RpmSpeed, refOmega, InitialRpmSpeed, FinalRpmSpeed, InitialOmegax1000,

FinalOmegax1000, StepResponseSamples, MilisecondsStepTime;

private final static int TURN_OFF = 1, SEND_REF_OMEGA = 2,

STEP_RESPONSE = 5;

private String statusText = "";

public BlueSkyGUI() {

initComponents();

createObjects();

serialCommunication.searchForPorts();

keyBinding.toggleControls();

}

private void createObjects()

{

serialCommunication = new SerialCommunication(this);

keyBinding = new KeyBinding(this);

}

/**

* This method is called from within the constructor to initialize the form.

* WARNING: Do NOT modify this code. The content of this method is always

* regenerated by the Form Editor.

*/

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

jPanel1 = new javax.swing.JPanel();

Page 111: sistema de controle de velocidade digital embarcado de motor de

104

Portas = new javax.swing.JComboBox();

jLabel1 = new javax.swing.JLabel();

Conectar = new javax.swing.JButton();

Desconectar = new javax.swing.JButton();

VelocidadeRef = new javax.swing.JSpinner();

jLabel2 = new javax.swing.JLabel();

jLabel3 = new javax.swing.JLabel();

jLabel4 = new javax.swing.JLabel();

jLabel5 = new javax.swing.JLabel();

VelocidadeAtual = new javax.swing.JTextField();

Enviar = new javax.swing.JButton();

jScrollPane1 = new javax.swing.JScrollPane();

Status = new javax.swing.JTextArea();

Desligar = new javax.swing.JButton();

Fechar = new javax.swing.JButton();

jLabel6 = new javax.swing.JLabel();

InitialStepSpeed = new javax.swing.JSpinner();

jLabel8 = new javax.swing.JLabel();

jLabel9 = new javax.swing.JLabel();

FinalStepSpeed = new javax.swing.JSpinner();

jLabel10 = new javax.swing.JLabel();

jLabel11 = new javax.swing.JLabel();

StepResponseStart = new javax.swing.JButton();

OmegaOption = new javax.swing.JRadioButton();

jSeparator1 = new javax.swing.JSeparator();

jLabel13 = new javax.swing.JLabel();

StepTime = new javax.swing.JSpinner();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jPanel1.setBorder(new

javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));

jLabel1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jLabel1.setText("Porta Serial:");

Conectar.setText("Conectar");

Conectar.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

ConectarActionPerformed(evt);

}

});

Desconectar.setText("Desconectar");

Desconectar.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

DesconectarActionPerformed(evt);

}

});

Page 112: sistema de controle de velocidade digital embarcado de motor de

105

VelocidadeRef.setModel(new javax.swing.SpinnerNumberModel(0, -80, 80, 1));

VelocidadeRef.setEditor(new javax.swing.JSpinner.NumberEditor(VelocidadeRef, ""));

jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jLabel2.setText("Velocidade de");

jLabel3.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jLabel3.setText("Referência (rpm):");

jLabel4.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jLabel4.setText("Velocidade");

jLabel5.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jLabel5.setText("Atual (rpm):");

VelocidadeAtual.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

VelocidadeAtual.setHorizontalAlignment(javax.swing.JTextField.CENTER);

Enviar.setText("Enviar");

Enviar.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

EnviarActionPerformed(evt);

}

});

Status.setColumns(20);

Status.setRows(5);

jScrollPane1.setViewportView(Status);

Desligar.setText("Desligar");

Desligar.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

DesligarActionPerformed(evt);

}

});

Fechar.setText("Fechar");

Fechar.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

FecharActionPerformed(evt);

}

});

jLabel6.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jLabel6.setText("Resposta ao Degrau");

InitialStepSpeed.setModel(new javax.swing.SpinnerNumberModel(0, -80, 80, 1));

InitialStepSpeed.setEditor(new javax.swing.JSpinner.NumberEditor(InitialStepSpeed,

""));

Page 113: sistema de controle de velocidade digital embarcado de motor de

106

jLabel8.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jLabel8.setText("Velocidade");

jLabel9.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jLabel9.setText("Inicial (rpm):");

FinalStepSpeed.setModel(new javax.swing.SpinnerNumberModel(0, -80, 80, 1));

FinalStepSpeed.setEditor(new javax.swing.JSpinner.NumberEditor(FinalStepSpeed,

""));

jLabel10.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jLabel10.setText("Velocidade");

jLabel11.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jLabel11.setText("Final (rpm):");

StepResponseStart.setText("Iniciar");

StepResponseStart.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

StepResponseStartActionPerformed(evt);

}

});

OmegaOption.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

OmegaOption.setText("Salvar velocidade em rad/s");

jLabel13.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jLabel13.setText("Duração (seg):");

StepTime.setModel(new javax.swing.SpinnerNumberModel(0.1d, 0.1d, 10.0d, 0.1d));

StepTime.setEditor(new javax.swing.JSpinner.NumberEditor(StepTime, "0.0"));

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);

jPanel1.setLayout(jPanel1Layout);

jPanel1Layout.setHorizontalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI

NG)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI

NG)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(91, 91, 91)

.addComponent(Desligar)

.addGap(109, 109, 109)

.addComponent(Fechar, javax.swing.GroupLayout.PREFERRED_SIZE,

74, javax.swing.GroupLayout.PREFERRED_SIZE))

Page 114: sistema de controle de velocidade digital embarcado de motor de

107

.addGroup(jPanel1Layout.createSequentialGroup()

.addContainerGap()

.addComponent(jSeparator1,

javax.swing.GroupLayout.PREFERRED_SIZE, 405,

javax.swing.GroupLayout.PREFERRED_SIZE)))

.addGap(0, 0, Short.MAX_VALUE))

.addGroup(jPanel1Layout.createSequentialGroup()

.addContainerGap()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI

NG)

.addComponent(jScrollPane1,

javax.swing.GroupLayout.Alignment.TRAILING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addComponent(jLabel2)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,

javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI

NG)

.addComponent(jLabel4,

javax.swing.GroupLayout.PREFERRED_SIZE, 69,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGroup(jPanel1Layout.createSequentialGroup()

.addComponent(jLabel5)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(VelocidadeAtual,

javax.swing.GroupLayout.PREFERRED_SIZE, 75,

javax.swing.GroupLayout.PREFERRED_SIZE))))

.addGroup(jPanel1Layout.createSequentialGroup()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILI

NG, false)

.addComponent(Portas, 0,

javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,

javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(Conectar,

javax.swing.GroupLayout.PREFERRED_SIZE, 100,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(86, 86, 86)

.addComponent(Desconectar))

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(1, 1, 1)

.addComponent(jLabel11)

Page 115: sistema de controle de velocidade digital embarcado de motor de

108

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(FinalStepSpeed,

javax.swing.GroupLayout.PREFERRED_SIZE, 75,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addComponent(OmegaOption)

.addGap(0, 0, Short.MAX_VALUE))

.addGroup(jPanel1Layout.createSequentialGroup()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILI

NG)

.addComponent(jLabel6)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI

NG)

.addGroup(jPanel1Layout.createSequentialGroup()

.addComponent(jLabel3)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(VelocidadeRef,

javax.swing.GroupLayout.PREFERRED_SIZE, 75,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(6, 6, 6)

.addComponent(Enviar,

javax.swing.GroupLayout.PREFERRED_SIZE, 63,

javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(jPanel1Layout.createSequentialGroup()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADI

NG, false)

.addComponent(jLabel9,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,

Short.MAX_VALUE)

.addComponent(jLabel8,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,

Short.MAX_VALUE))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(InitialStepSpeed,

javax.swing.GroupLayout.PREFERRED_SIZE, 75,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(16, 16, 16)

.addComponent(jLabel13,

javax.swing.GroupLayout.PREFERRED_SIZE, 84,

javax.swing.GroupLayout.PREFERRED_SIZE))

.addComponent(jLabel10)))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

Page 116: sistema de controle de velocidade digital embarcado de motor de

109

.addComponent(StepTime,

javax.swing.GroupLayout.PREFERRED_SIZE, 75,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,

javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(StepResponseStart,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,

Short.MAX_VALUE)))))

.addContainerGap())

);

jPanel1Layout.setVerticalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(10, 10, 10)

.addComponent(jLabel1)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELI

NE)

.addComponent(Portas, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(Conectar)

.addComponent(Desconectar))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELI

NE)

.addComponent(jLabel2)

.addComponent(jLabel4))

.addGap(1, 1, 1)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELI

NE)

.addComponent(jLabel3)

.addComponent(VelocidadeRef, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jLabel5)

.addComponent(VelocidadeAtual,

javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(Enviar))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 14,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jLabel8)

Page 117: sistema de controle de velocidade digital embarcado de motor de

110

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELI

NE)

.addComponent(jLabel9)

.addComponent(InitialStepSpeed,

javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(StepResponseStart)

.addComponent(jLabel13)

.addComponent(StepTime, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.PREFERRED_SIZE))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jLabel10)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELI

NE)

.addComponent(jLabel11)

.addComponent(FinalStepSpeed, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(OmegaOption))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 132,

Short.MAX_VALUE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELI

NE)

.addComponent(Desligar)

.addComponent(Fechar))

.addContainerGap())

);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addContainerGap())

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

Page 118: sistema de controle de velocidade digital embarcado de motor de

111

.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addContainerGap())

);

pack();

}// </editor-fold>

private void ConectarActionPerformed(java.awt.event.ActionEvent evt) {

serialCommunication.connect();

if (serialCommunication.getConnected() == true)

{

if (serialCommunication.initIOStream() == true)

{

serialCommunication.initListener();

}

}

}

private void EnviarActionPerformed(java.awt.event.ActionEvent evt) {

RpmSpeed = (int)VelocidadeRef.getValue();

omega = Math.round(2*pi*RpmSpeed*1000/60);

refOmega = (int)omega;

serialCommunication.writeData(SEND_REF_OMEGA, refOmega);

}

private void DesconectarActionPerformed(java.awt.event.ActionEvent evt) {

serialCommunication.disconnect();

}

private void DesligarActionPerformed(java.awt.event.ActionEvent evt) {

serialCommunication.writeData(TURN_OFF, 0);

}

private void FecharActionPerformed(java.awt.event.ActionEvent evt) {

serialCommunication.disconnect();

System.exit(0);

}

private void StepResponseStartActionPerformed(java.awt.event.ActionEvent evt) {

InitialRpmSpeed = (int)InitialStepSpeed.getValue();

LongInitialOmegax1000 = Math.round(2*pi*InitialRpmSpeed*1000/60);

InitialOmegax1000 = (int)LongInitialOmegax1000;

FinalRpmSpeed = (int)FinalStepSpeed.getValue();

LongFinalOmegax1000 = Math.round(2*pi*FinalRpmSpeed*1000/60);

FinalOmegax1000 = (int)LongFinalOmegax1000;

SecondsStepTime = (double)StepTime.getValue();

StepResponseSamples = (int)Math.ceil(SecondsStepTime/SamplePeriod);

Page 119: sistema de controle de velocidade digital embarcado de motor de

112

if ((!serialCommunication.TurnedOff) || (InitialOmegax1000 != 0))

{

serialCommunication.writeData(SEND_REF_OMEGA, InitialOmegax1000);

try

{

Thread.sleep(2500);

} catch(InterruptedException e)

{

statusText = "Falha em sleep. (" + e.toString() + ")";

Status.setForeground(Color.red);

Status.append(statusText + "\n");

}

}

serialCommunication.writeData(STEP_RESPONSE, StepResponseSamples);

try

{

Thread.sleep(500);

} catch(InterruptedException e)

{

statusText = "Falha em sleep. (" + e.toString() + ")";

Status.setForeground(Color.red);

Status.append(statusText + "\n");

}

serialCommunication.writeData(SEND_REF_OMEGA, FinalOmegax1000);

if (OmegaOption.isSelected()) serialCommunication.OmegaOption = true;

serialCommunication.StepResponse = true;

}

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

/* Set the Nimbus look and feel */

//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">

/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and

feel.

* For details see

http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

*/

try {

for (javax.swing.UIManager.LookAndFeelInfo info :

javax.swing.UIManager.getInstalledLookAndFeels()) {

if ("Nimbus".equals(info.getName())) {

javax.swing.UIManager.setLookAndFeel(info.getClassName());

break;

}

}

} catch (ClassNotFoundException ex) {

Page 120: sistema de controle de velocidade digital embarcado de motor de

113

java.util.logging.Logger.getLogger(BlueSkyGUI.class.getName()).log(java.util.logging.Level

.SEVERE, null, ex);

} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(BlueSkyGUI.class.getName()).log(java.util.logging.Level

.SEVERE, null, ex);

} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(BlueSkyGUI.class.getName()).log(java.util.logging.Level

.SEVERE, null, ex);

} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(BlueSkyGUI.class.getName()).log(java.util.logging.Level

.SEVERE, null, ex);

}

//</editor-fold>

/* Create and display the form */

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new BlueSkyGUI().setVisible(true);

}

});

}

// Variables declaration - do not modify

public javax.swing.JButton Conectar;

public javax.swing.JButton Desconectar;

public javax.swing.JButton Desligar;

public javax.swing.JButton Enviar;

private javax.swing.JButton Fechar;

public javax.swing.JSpinner FinalStepSpeed;

public javax.swing.JSpinner InitialStepSpeed;

public javax.swing.JRadioButton OmegaOption;

public javax.swing.JComboBox Portas;

public javax.swing.JTextArea Status;

public javax.swing.JButton StepResponseStart;

public javax.swing.JSpinner StepTime;

public javax.swing.JTextField VelocidadeAtual;

public javax.swing.JSpinner VelocidadeRef;

private javax.swing.JLabel jLabel1;

private javax.swing.JLabel jLabel10;

private javax.swing.JLabel jLabel11;

private javax.swing.JLabel jLabel13;

private javax.swing.JLabel jLabel2;

private javax.swing.JLabel jLabel3;

private javax.swing.JLabel jLabel4;

private javax.swing.JLabel jLabel5;

private javax.swing.JLabel jLabel6;

private javax.swing.JLabel jLabel8;

Page 121: sistema de controle de velocidade digital embarcado de motor de

114

private javax.swing.JLabel jLabel9;

private javax.swing.JPanel jPanel1;

private javax.swing.JScrollPane jScrollPane1;

private javax.swing.JSeparator jSeparator1;

// End of variables declaration

}

SerialCommunication.java

package my.bluesky;

import gnu.io.*;

import java.io.*;

import java.awt.Color;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.Enumeration;

import java.util.HashMap;

import java.util.Locale;

import java.util.TooManyListenersException;

import java.util.Date;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

/**

*

* @author Rene Descartes Olimpio Pereira

*/

public class SerialCommunication implements SerialPortEventListener{

//passed from main GUI

BlueSkyGUI window = null;

private Enumeration ports = null;

private final HashMap portMap = new HashMap();

private CommPortIdentifier selectedPortIdentifier = null;

private SerialPort serialPort = null;

private InputStream input = null;

private OutputStream output = null;

public static final int TIME_OUT = 2000;

public static final int DATA_RATE = 9600;

private boolean bConnected = false, bLinked = false;

public boolean TurnedOff = true, StepResponse = false, OmegaOption = false;

Page 122: sistema de controle de velocidade digital embarcado de motor de

115

volatile int i = 0, CurrentSpeedCount = 0, RpmSpeedTextCount = 0;

short CurrentOmegax1000 = 0;

double pi = 3.14159, CurrentRpmSpeed = 0, FloatCurrentOmegax1000 = 0,

FloatCurrentOmega = 0;

final static char TURN_OFF = 1, SEND_REF_OMEGA = 2,

RECEIVE_CURRENT_OMEGA = 3, LINKED = 4, STEP_RESPONSE = 5,

STEP_RESPONSE_END = 6, END_OF_MESSAGE = 170;

byte[] SendMsg = new byte[2];

char[] ReceptionMsg = new char[4];

String StatusText = "";

String RpmSpeedText = "";

String OmegaText = "";

String FilePath = "";

String FileName = "";

StringBuffer FileData = new StringBuffer("");

public SerialCommunication(BlueSkyGUI window)

{

this.window = window;

}

public void searchForPorts()

{

ports = CommPortIdentifier.getPortIdentifiers();

while (ports.hasMoreElements())

{

CommPortIdentifier currPort = (CommPortIdentifier)ports.nextElement();

if (currPort.getPortType() == CommPortIdentifier.PORT_SERIAL)

{

window.Portas.addItem(currPort.getName());

portMap.put(currPort.getName(), currPort);

}

}

}

public void connect()

{

String selectedPort = (String)window.Portas.getSelectedItem();

selectedPortIdentifier = (CommPortIdentifier)portMap.get(selectedPort);

try

{

serialPort = (SerialPort)selectedPortIdentifier.open(this.getClass().getName(),

TIME_OUT);

serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8,

Page 123: sistema de controle de velocidade digital embarcado de motor de

116

SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

setConnected(true);

StatusText = selectedPort + " aberta com sucesso.";

window.Status.setForeground(Color.black);

window.Status.append(StatusText + "\n");

window.keyBinding.toggleControls();

}

catch (PortInUseException e)

{

StatusText = selectedPort + " está em uso. (" + e.toString() + ")";

window.Status.setForeground(Color.RED);

window.Status.append(StatusText + "\n");

}

catch (Exception e)

{

StatusText = "Falha ao abrir " + selectedPort + "(" + e.toString() + ")";

window.Status.append(StatusText + "\n");

window.Status.setForeground(Color.RED);

}

}

public boolean initIOStream()

{

boolean successful = false;

try {

input = serialPort.getInputStream();

output = serialPort.getOutputStream();

successful = true;

return successful;

}

catch (IOException e) {

StatusText = "I/O Streams falhou ao abrir. (" + e.toString() + ")";

window.Status.setForeground(Color.red);

window.Status.append(StatusText + "\n");

return successful;

}

}

public void initListener()

{

try

{

serialPort.addEventListener(this);

serialPort.notifyOnDataAvailable(true);

Page 124: sistema de controle de velocidade digital embarcado de motor de

117

}

catch (TooManyListenersException e)

{

StatusText = "Muitos listeners. (" + e.toString() + ")";

window.Status.setForeground(Color.red);

window.Status.append(StatusText + "\n");

}

}

public void disconnect()

{

try

{

writeData(TURN_OFF, 0);

try

{

Thread.sleep(3000);

} catch(InterruptedException e)

{

StatusText = "Falha em sleep. (" + e.toString() + ")";

window.Status.setForeground(Color.red);

window.Status.append(StatusText + "\n");

}

serialPort.removeEventListener();

serialPort.close();

input.close();

output.close();

setConnected(false);

window.keyBinding.toggleControls();

StatusText = "Desconectado.";

window.Status.append(StatusText + "\n");

}

catch (IOException e)

{

StatusText = "Falha ao fechar " + serialPort.getName() + "(" + e.toString() + ")";

window.Status.setForeground(Color.red);

window.Status.append(StatusText + "\n");

}

}

final public boolean getConnected()

{

return bConnected;

}

public void setConnected(boolean bConnected)

{

this.bConnected = bConnected;

Page 125: sistema de controle de velocidade digital embarcado de motor de

118

}

final public boolean getLinked()

{

return bLinked;

}

public void setLinked(boolean bLinked)

{

this.bLinked = bLinked;

}

public void serialEvent(SerialPortEvent evt) {

if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE)

{

try

{

ReceptionMsg[i] = (char)input.read();

if ((ReceptionMsg[0] == LINKED) && (ReceptionMsg[1] ==

(char)END_OF_MESSAGE))

{

setLinked(true);

StatusText = "Comunicação sem fio estabelecida.";

window.Status.append(StatusText + "\n");

window.keyBinding.toggleControls2();

ReceptionMsg[1] = 0;

i = -1;

}

if ((ReceptionMsg[0] == TURN_OFF) && (ReceptionMsg[1] ==

(char)END_OF_MESSAGE))

{

TurnedOff = true;

StatusText = "Motor desligado.";

window.Status.append(StatusText + "\n");

ReceptionMsg[1] = 0;

i = -1;

}

if ((ReceptionMsg[0] == RECEIVE_CURRENT_OMEGA) && (ReceptionMsg[3]

== (char)END_OF_MESSAGE))

{

if (StepResponse)

{

window.VelocidadeAtual.setText("");

CurrentOmegax1000 = (short)((ReceptionMsg[1] << 8) | ReceptionMsg[2]);

if (OmegaOption)

{

FloatCurrentOmegax1000 = (double)CurrentOmegax1000;

Page 126: sistema de controle de velocidade digital embarcado de motor de

119

FloatCurrentOmega = FloatCurrentOmegax1000/1000;

OmegaText = String.format(Locale.US, "%.4f%n", FloatCurrentOmega);

FileData.append(OmegaText);

}

else

{

CurrentRpmSpeed = (double)(CurrentOmegax1000*60/(2*pi*1000));

RpmSpeedText = String.format(Locale.US, "%.4f%n", CurrentRpmSpeed);

FileData.append(RpmSpeedText);

}

}

else

{

CurrentOmegax1000 = (short)((ReceptionMsg[1] << 8) | ReceptionMsg[2]);

CurrentRpmSpeed = (double)(CurrentOmegax1000*60/(2*pi*1000));

RpmSpeedText = String.format("%.2f", CurrentRpmSpeed);

window.VelocidadeAtual.setText(RpmSpeedText);

}

ReceptionMsg[3] = 0;

i = -1;

}

if ((ReceptionMsg[0] == STEP_RESPONSE_END) && (ReceptionMsg[1] ==

(char)END_OF_MESSAGE))

{

StepResponse = false;

OmegaOption = false;

createFile();

writeToFile();

StatusText = "Final de resposta ao degrau.";

window.Status.append(StatusText + "\n");

ReceptionMsg[1] = 0;

i = -1;

}

i++;

}

catch (IOException e)

{

StatusText = "Falha ao ler dados. (" + e.toString() + ")";

window.Status.setForeground(Color.red);

window.Status.append(StatusText + "\n");

}

}

}

public synchronized void writeData(int comando, int Data)

{

try

{

Page 127: sistema de controle de velocidade digital embarcado de motor de

120

if ((comando == TURN_OFF) || (comando == SEND_REF_OMEGA && Data == 0))

{

output.write((byte)1);

output.flush();

output.write((byte)END_OF_MESSAGE);

output.flush();

TurnedOff = true;

}

if (comando == SEND_REF_OMEGA && Data != 0)

{

SendMsg[0] = (byte)(Data >> 8);

SendMsg[1] = (byte)Data;

output.write((byte)2);

output.flush();

output.write(SendMsg[0]);

output.flush();

output.write(SendMsg[1]);

output.flush();

//this is a delimiter for the data

output.write((byte)END_OF_MESSAGE);

output.flush();

TurnedOff = false;

}

if (comando == STEP_RESPONSE)

{

SendMsg[0] = (byte)(Data >> 8);

SendMsg[1] = (byte)Data;

output.write((byte)5);

output.flush();

output.write(SendMsg[0]);

output.flush();

output.write(SendMsg[1]);

output.flush();

//this is a delimiter for the data

output.write((byte)END_OF_MESSAGE);

output.flush();

}

}

catch (Exception e)

{

StatusText = "Falha ao gravar dados. (" + e.toString() + ")";

window.Status.setForeground(Color.red);

window.Status.append(StatusText + "\n");

}

}

public void createFile()

Page 128: sistema de controle de velocidade digital embarcado de motor de

121

{

DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy_HH-mm-ss");

Date date = new Date();

String FileTime = dateFormat.format(date);

FilePath = "C:"+File.separator+"BlueSky";

//(use relative path for Unix systems)

FileName = FilePath+File.separator+"StepResponse_"+FileTime+".txt";

File p = new File(FilePath);

File f = new File(FileName);

//(works for both Windows and Linux)

p.mkdirs();

try

{

f.createNewFile();

} catch (IOException e) {

StatusText = "Falha ao criar arquivo. (" + e.toString() + ")";

window.Status.setForeground(Color.red);

window.Status.append(StatusText + "\n");

}

}

public void writeToFile()

{

try {

FileWriter objFileWriter = new FileWriter(FileName);

BufferedWriter objBufferedWriter = new BufferedWriter(objFileWriter);

try {

objBufferedWriter.write(FileData.toString());

try {

objBufferedWriter.flush();

try {

objBufferedWriter.close();

} catch (IOException e) {

StatusText = "Falha ao fechar arquivo. (" + e.toString() + ")";

window.Status.setForeground(Color.red);

window.Status.append(StatusText + "\n");

}

} catch (IOException e) {

StatusText = "Falha ao realizar flush. (" + e.toString() + ")";

window.Status.setForeground(Color.red);

window.Status.append(StatusText + "\n");

}

} catch (IOException e) {

StatusText = "Falha ao escrever dados no arquivo. (" + e.toString() + ")";

window.Status.setForeground(Color.red);

Page 129: sistema de controle de velocidade digital embarcado de motor de

122

window.Status.append(StatusText + "\n");

}

} catch (IOException e) {

StatusText = "Falha ao abrir arquivo. (" + e.toString() + ")";

window.Status.setForeground(Color.red);

window.Status.append(StatusText + "\n");

}

FileData.setLength(0);

}

}

KeyBinding.java

package my.bluesky;

/**

*

* @author Rene Descartes Olimpio Pereira

*/

public class KeyBinding {

BlueSkyGUI window = null;

public KeyBinding(BlueSkyGUI window)

{

this.window = window;

}

public void toggleControls()

{

if (window.serialCommunication.getConnected() == true)

{

window.Desconectar.setEnabled(true);

window.Conectar.setEnabled(false);

window.Portas.setEnabled(false);

}

else

{

window.Enviar.setEnabled(false);

window.Desligar.setEnabled(false);

window.VelocidadeRef.setEnabled(false);

window.VelocidadeAtual.setEnabled(false);

window.Desconectar.setEnabled(false);

window.InitialStepSpeed.setEnabled(false);

window.FinalStepSpeed.setEnabled(false);

window.StepTime.setEnabled(false);

window.OmegaOption.setEnabled(false);

window.StepResponseStart.setEnabled(false);

Page 130: sistema de controle de velocidade digital embarcado de motor de

123

window.Conectar.setEnabled(true);

window.Portas.setEnabled(true);

}

}

public void toggleControls2()

{

if (window.serialCommunication.getLinked() == true)

{

window.Enviar.setEnabled(true);

window.Desligar.setEnabled(true);

window.VelocidadeRef.setEnabled(true);

window.VelocidadeAtual.setEnabled(true);

window.InitialStepSpeed.setEnabled(true);

window.FinalStepSpeed.setEnabled(true);

window.StepTime.setEnabled(true);

window.OmegaOption.setEnabled(true);

window.StepResponseStart.setEnabled(true);

}

}

}

PRINCIPAIS CÓDIGOS FONTE DOS MÓLULOS LOCAL E REMOTO

main_LinkTo.c

/*----------------------------------------------------------------------------

* Local Module Program

*

* Rene Descartes Olimpio Pereira

*---------------------------------------------------------------------------- */

#include "bsp.h"

#include "mrfi.h"

#include "nwk_types.h"

#include "nwk_api.h"

#include "bsp_leds.h"

#include "bsp_buttons.h"

#include "app_remap_led.h"

#include "stdbool.h"

#define SPIN_ABOUT_A_SECOND NWK_DELAY(1000)

static _Bool TurnOffCommand = false, TurnOffCommandOK = false, NewRefOmega =

false, NewCurrentOmega = false,

StepResponse = false, StepResponseEnd = false;

Page 131: sistema de controle de velocidade digital embarcado de motor de

124

static volatile uint8_t TXcount = 0, RXcount = 0;

static uint8_t TX_MESSAGE_LENGTH = 0, TXdata[4], RXdata[4], CurrentOmega[2],

SendData[3];

static linkID_t sLinkID1 = 0;

const uint8_t TURN_OFF = 1, RECEIVE_REF_OMEGA = 2, SEND_REF_OMEGA = 2,

SEND_CURRENT_OMEGA = 3,

LINKED = 4, STEP_RESPONSE = 5,

STEP_RESPONSE_END = 6, END_OF_MESSAGE = 170;

const addr_t linkToAddr = {'L', 'I', 'T', 'O'};

void toggleLED(uint8_t);

void writeData(uint8_t, uint8_t, uint8_t);

/* application Rx frame handler. */

static uint8_t sRxCallback(linkID_t);

void main (void)

{

BSP_Init();

P3SEL |= BIT4 | BIT5; // P3.4 - P3.5 used by USCI_A.

// Defaults: no parity , lsb first , 8-bit data , 1 stop bit , UART , async.

UCA0CTL1 |= UCSSEL_2 | UCSWRST; // Clock: SMCLK; hold in reset.

// 9600 baud from 12Mhz.

UCA0BR0 = 0xE2;

UCA0BR1 = 0x4;

UCA0MCTL = 0;

UCA0CTL1 &= ~UCSWRST; // Release from reset

UC0IE |= UCA0RXIE; // Enable interrupts on RX all time

_enable_interrupts();

// turn on LEDs

if (!BSP_LED2_IS_ON())

{

toggleLED(2);

}

if (!BSP_LED1_IS_ON())

{

toggleLED(1);

}

// wait for a button press

do {

Page 132: sistema de controle de velocidade digital embarcado de motor de

125

if (BSP_BUTTON1() || BSP_BUTTON2())

{

break;

}

} while (1);

SMPL_Ioctl(IOCTL_OBJ_ADDR, IOCTL_ACT_SET, (addr_t*) &linkToAddr);

SMPL_Init(sRxCallback);

while (SMPL_SUCCESS != SMPL_Link(&sLinkID1))

{

// blink LEDs until link successfully

toggleLED(1);

toggleLED(2);

SPIN_ABOUT_A_SECOND;

}

// turn off red LED

if (BSP_LED2_IS_ON())

{

toggleLED(2);

}

// turn on RX

if (SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_RXON, 0) ==

SMPL_SUCCESS)

{

toggleLED(1);

}

// send confirmation to the GUI that the link is established

writeData(LINKED, 0, 0);

while (1)

{

if (TurnOffCommand)

{

*SendData = TURN_OFF;

SMPL_Send(sLinkID1, SendData, 1);

RXdata[0] = 0;

RXdata[1] = 0;

TurnOffCommand = false;

}

if (NewRefOmega)

{

*SendData = SEND_REF_OMEGA;

*(SendData + 1) = RXdata[1];

*(SendData + 2) = RXdata[2];

Page 133: sistema de controle de velocidade digital embarcado de motor de

126

SMPL_Send(sLinkID1, SendData, 3);

RXdata[0] = 0;

RXdata[1] = 0;

RXdata[2] = 0;

RXdata[3] = 0;

NewRefOmega = false;

}

if (NewCurrentOmega)

{

//send omega to the GUI

writeData(SEND_CURRENT_OMEGA, CurrentOmega[0],

CurrentOmega[1]);

NewCurrentOmega = false;

}

if (TurnOffCommandOK)

{

//send confirmation to the GUI

writeData(TURN_OFF, 0, 0);

TurnOffCommandOK = false;

}

if (StepResponse)

{

*SendData = STEP_RESPONSE;

*(SendData + 1) = RXdata[1];

*(SendData + 2) = RXdata[2];

SMPL_Send(sLinkID1, SendData, 3);

RXdata[0] = 0;

RXdata[1] = 0;

RXdata[2] = 0;

RXdata[3] = 0;

StepResponse = false;

}

if (StepResponseEnd)

{

writeData(STEP_RESPONSE_END, 0, 0);

StepResponseEnd = false;

}

}

}

void toggleLED(uint8_t which)

{

if (1 == which)

{

BSP_TOGGLE_LED1();

}

else if (2 == which)

Page 134: sistema de controle de velocidade digital embarcado de motor de

127

{

BSP_TOGGLE_LED2();

}

return;

}

void writeData(uint8_t wCommand, uint8_t currentOmega0, uint8_t currentOmega1)

{

if (wCommand == LINKED)

{

TXdata[0] = LINKED;

TXdata[1] = END_OF_MESSAGE;

TXcount = 0;

TX_MESSAGE_LENGTH = 2;

UC0IE |= UCA0TXIE;

}

if (wCommand == TURN_OFF)

{

TXdata[0] = TURN_OFF;

TXdata[1] = END_OF_MESSAGE;

TXcount = 0;

TX_MESSAGE_LENGTH = 2;

UC0IE |= UCA0TXIE;

}

if (wCommand == SEND_CURRENT_OMEGA)

{

TXdata[0] = SEND_CURRENT_OMEGA;

TXdata[1] = currentOmega0;

TXdata[2] = currentOmega1;

TXdata[3] = END_OF_MESSAGE;

TXcount = 0;

TX_MESSAGE_LENGTH = 4;

UC0IE |= UCA0TXIE;

}

if (wCommand == STEP_RESPONSE_END)

{

TXdata[0] = STEP_RESPONSE_END;

TXdata[1] = END_OF_MESSAGE;

TXcount = 0;

TX_MESSAGE_LENGTH = 2;

UC0IE |= UCA0TXIE;

}

}

// handle received frames

static uint8_t sRxCallback(linkID_t port)

{

uint8_t ReceivedData[3], length, LinkCommand;

if (port == sLinkID1)

Page 135: sistema de controle de velocidade digital embarcado de motor de

128

{

if ((SMPL_SUCCESS == SMPL_Receive(sLinkID1, ReceivedData, &length)) && (length

> 0))

{

LinkCommand = *ReceivedData;

if (LinkCommand == TURN_OFF)

{

TurnOffCommandOK = true;

}

if (LinkCommand == SEND_CURRENT_OMEGA)

{

CurrentOmega[0] = *(ReceivedData + 1);

CurrentOmega[1] = *(ReceivedData + 2);

NewCurrentOmega = true;

}

if (LinkCommand == STEP_RESPONSE_END)

{

StepResponseEnd = true;

}

return 1;

}

}

return 0;

}

// ISR for USCI_A ,B0 TX

#pragma vector = USCIAB0TX_VECTOR

__interrupt void USCIAB0TX_ISR (void) // Acknowledge by write to TXBUF

{

while (!(UC0IFG & UCA0TXIFG));

UCA0TXBUF = TXdata[TXcount]; // Send next byte

TXcount++;

if (TXcount >= TX_MESSAGE_LENGTH) UC0IE &= ~UCA0TXIE; // Disable

further interrupts.

}

// ISR for USCI_A ,B0 RX

#pragma vector = USCIAB0RX_VECTOR

__interrupt void USCIAB0RX_ISR (void) // Acknowledge by read of RXBUF

{

RXdata[RXcount] = UCA0RXBUF; // Store received data

RXcount++;

if ((RXdata[0] == TURN_OFF) && (RXdata[1] == END_OF_MESSAGE))

{

TurnOffCommand = true;

RXcount = 0;

Page 136: sistema de controle de velocidade digital embarcado de motor de

129

}

if ((RXdata[0] == RECEIVE_REF_OMEGA) && (RXdata[3] ==

END_OF_MESSAGE))

{

NewRefOmega = true;

RXcount = 0;

}

if ((RXdata[0] == STEP_RESPONSE) && (RXdata[3] == END_OF_MESSAGE))

{

StepResponse = true;

RXcount = 0;

}

}

main_LinkListen.c

/*----------------------------------------------------------------------------

* Remote Module Program

*

* Rene Descartes Olimpio Pereira

*---------------------------------------------------------------------------- */

#include "bsp.h"

#include "mrfi.h"

#include "nwk_types.h"

#include "nwk_api.h"

#include "bsp_leds.h"

#include "bsp_buttons.h"

#include "app_remap_led.h"

#include "stdbool.h"

#include "intrinsics.h"

static _Bool TurnOnCommand = false, TurnedOff = false, TurnOffCommand = false,

NewRefOmega = false,

NewSample = false, ClockwiseStart = false, NewFirstPulse =

false,

Inversion = false, StepResponse = false, SendStepResponse =

false, StepResponseEnd = false;

static volatile uint8_t SendCurrentOmegaCount = 0, nBasicWindows = 0, PositiveDeltaN = 0,

NegativeDeltaN = 0,

SendStepResponseCount = 0;

static uint8_t refOmegax1000[2] = {0}, SendData[3] = {0}, stepResponseSamples[2] = {0},

Sequence = 0,

Page 137: sistema de controle de velocidade digital embarcado de motor de

130

PreviousSequence = 0, CCI0BCurrentPulse = 0,

CCI1BCurrentPulse = 0;

static int8_t Direction = 0;

static volatile uint16_t TotalBasicWindows = 0;

static uint16_t PWMCycles = 0, CaptureInput0 = 0, CaptureInput1 = 0,

StepResponseSamples = 0;

static int16_t RefOmegax1000 = 0, IntCurrentOmegax1000 = 0, DeltaN = 0;

static uint32_t TotalCyclesTimerASum = 65536, LastPulseCycles = 65536,

PreviousLastPulseCycles = 65536;

static float CurrentOmegax1000 = 0, PreviousOmegax1000 = 0, OmegaErrorx1000 = 0,

DeltaTorquex1000 = 0,

RefTorquex1000 = 0, PreviousRefTorquex1000 = 0,

FloatPWMCycles = 0;

static linkID_t sLinkID2 = 0;

const uint8_t TURN_OFF = 1, RECEIVE_REF_OMEGA = 2, SEND_CURRENT_OMEGA

= 3, STEP_RESPONSE = 5, STEP_RESPONSE_END = 6;

const int8_t QuadEncMatrix[16] = {-1, 0, 1, -1, 1, -1, -1, 0, 0, -1, -1, 1, -1, 1, 0, -1};

const uint16_t TotalCyclesTimerB = 1200;

const uint32_t TotalCyclesTimerA = 65536;

const float Pix2x1000_NpxTtimerA = 4487989, Kp = 0.10391, Ki = 0.018004,

MaxTorquex1000 = 1290.147,

KmxTotalCyclesTimerB_1000xRatedVoltage = 0.12901,

RaxTotalCyclesTimerB_1000xKmxRatedVoltage = 0.17052;

const addr_t linkListenAddr = {'L', 'I', 'L', 'I'};

// Rx callback handler

static uint8_t sRxCallback(linkID_t);

void toggleLED(uint8_t);

void main (void)

{

BSP_Init();

// turn on LEDs

if (!BSP_LED2_IS_ON())

{

toggleLED(2);

}

if (!BSP_LED1_IS_ON())

{

Page 138: sistema de controle de velocidade digital embarcado de motor de

131

toggleLED(1);

}

// wait for a button press

do {

if (BSP_BUTTON1() || BSP_BUTTON2())

{

break;

}

} while (1);

SMPL_Ioctl(IOCTL_OBJ_ADDR, IOCTL_ACT_SET, (addr_t*) &linkListenAddr);

SMPL_Init(sRxCallback);

// listen for link

while (1)

{

if (SMPL_SUCCESS == SMPL_LinkListen(&sLinkID2))

{

break;

}

}

// Turn off one LED

toggleLED(1);

// turn on RX

SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_RXON, 0);

while (1)

{

if (NewRefOmega)

{

RefOmegax1000 = (refOmegax1000[0] << 8) | refOmegax1000[1];

if (RefOmegax1000 > 0) ClockwiseStart = true;

else ClockwiseStart = false;

NewFirstPulse = true;

TurnOnCommand = true;

NewRefOmega = false;

break;

}

}

P2DIR &= ~(BIT2 | BIT3); // P2.2 - P2.3 input (capture)

P2SEL = BIT2 | BIT3; // P2.2 - P2.3 TAx options

P4DIR = BIT4 | BIT5 | BIT6; // P4.4 - P4.6 output

P4SEL = BIT4; // P4.4 TBx options

_enable_interrupts();

Page 139: sistema de controle de velocidade digital embarcado de motor de

132

// Capture on both rising and falling edges, input: CCI0B, synchronize capture source,

// capture mode and capture/compare interrupt enable.

TACCTL0 = CM_3 | CCIS_1 | SCS | CAP | CCIE;

TACCTL1 = CM_3 | CCIS_1 | SCS | CAP | CCIE;

TBCCR0 = TotalCyclesTimerB;

// Output mode: Reset/Set.

TBCCTL1 = CCIS_1 | OUTMOD_7;

while (1)

{

while (!TurnedOff)

{

if (TurnOnCommand)

{

// Clock = SMCLK, input divider = 2, continuous mode (until

0xFFFF), reset

//and TAIFG interrupts enabled.

TACTL = TASSEL_2 | ID_1 | MC_2 | TAIE;

}

OmegaErrorx1000 = (float)(RefOmegax1000 - CurrentOmegax1000);

// Incremental PI speed controller with relocation of the proportional gain

DeltaTorquex1000 = (float)(Kp*(PreviousOmegax1000 -

CurrentOmegax1000) + Ki*OmegaErrorx1000);

RefTorquex1000 = (float)(PreviousRefTorquex1000 + DeltaTorquex1000);

if (RefTorquex1000 > MaxTorquex1000) RefTorquex1000 =

MaxTorquex1000;

if (RefTorquex1000 < -MaxTorquex1000) RefTorquex1000 = -

MaxTorquex1000;

// PWM Cycles computation

FloatPWMCycles =

(float)(RefOmegax1000*KmxTotalCyclesTimerB_1000xRatedVoltage +

RefTorquex1000*RaxTotalCyclesTimerB_1000xKmxRatedVoltage);

if (FloatPWMCycles < 0)

{

FloatPWMCycles = -FloatPWMCycles;

Inversion = true;

}

PWMCycles = (uint16_t)FloatPWMCycles;

if (PWMCycles > TotalCyclesTimerB) PWMCycles = TotalCyclesTimerB;

Page 140: sistema de controle de velocidade digital embarcado de motor de

133

TBCCR1 = PWMCycles;

if (Inversion)

{

P4OUT |= BIT5; // Enable H-bridge inversion (INV = 1).

Inversion = false;

}

else P4OUT &= ~BIT5; // Disable H-bridge inversion (INV = 0).

if (TurnOnCommand)

{

// Clock: SMCLK, up mode (until TBCCR0).

TBCTL = TBSSEL_2 | MC_1;

P4OUT |= BIT6; // Enable H-bridge (EN = 1).

TurnOnCommand = false;

}

PreviousRefTorquex1000 = RefTorquex1000;

PreviousOmegax1000 = CurrentOmegax1000;

if (SendStepResponse)

{

IntCurrentOmegax1000 = (int16_t)CurrentOmegax1000;

*SendData = SEND_CURRENT_OMEGA;

*(SendData + 1) = (uint8_t)(IntCurrentOmegax1000 >> 8);

*(SendData + 2) = (uint8_t)IntCurrentOmegax1000;

SMPL_Send(sLinkID2, SendData, 3);

SendStepResponseCount++;

if (SendStepResponseCount >= StepResponseSamples)

{

SendStepResponse = false;

StepResponse = false;

StepResponseSamples = 0;

SendStepResponseCount = 0;

RefOmegax1000 = 0;

StepResponseEnd = true;

}

}

else

{

SendCurrentOmegaCount++;

if (SendCurrentOmegaCount >= 45)

{

IntCurrentOmegax1000 = (int16_t)CurrentOmegax1000;

*SendData = SEND_CURRENT_OMEGA;

*(SendData + 1) = (uint8_t)(IntCurrentOmegax1000 >> 8);

*(SendData + 2) = (uint8_t)IntCurrentOmegax1000;

SMPL_Send(sLinkID2, SendData, 3);

SendCurrentOmegaCount = 0;

}

}

Page 141: sistema de controle de velocidade digital embarcado de motor de

134

if (NewRefOmega)

{

RefOmegax1000 = (refOmegax1000[0] << 8) | refOmegax1000[1];

NewRefOmega = false;

}

if (TurnOffCommand) RefOmegax1000 = 0;

while (!NewSample);

NewSample = false;

if (StepResponseEnd)

{

*SendData = STEP_RESPONSE_END;

SMPL_Send(sLinkID2, SendData, 1);

StepResponseEnd = false;

}

if ((TurnOffCommand) && CurrentOmegax1000 == 0)

{

TACTL &= ~MC_3; // Stop Timer_A.

P4OUT &= ~BIT6; // Disable H-bridge (EN = 0).

TBCTL &= ~MC_3; // Stop Timer_B.

*SendData = TURN_OFF;

SMPL_Send(sLinkID2, SendData, 1);

PreviousOmegax1000 = 0;

PreviousRefTorquex1000 = 0;

TurnedOff = true;

TurnOffCommand = false;

}

}

while (!NewRefOmega);

NewRefOmega = false;

RefOmegax1000 = (refOmegax1000[0] << 8) | refOmegax1000[1];

if (RefOmegax1000 > 0) ClockwiseStart = true;

else ClockwiseStart = false;

NewFirstPulse = true;

TurnOnCommand = true;

TurnedOff = false;

}

}

void toggleLED(uint8_t which)

{

if (1 == which)

{

Page 142: sistema de controle de velocidade digital embarcado de motor de

135

BSP_TOGGLE_LED1();

}

else if (2 == which)

{

BSP_TOGGLE_LED2();

}

return;

}

// handle received

static uint8_t sRxCallback(linkID_t port)

{

uint8_t ReceivedData[3], length = 0, LinkCommand = 0;

if (port == sLinkID2)

{

if (SMPL_SUCCESS == SMPL_Receive(sLinkID2, ReceivedData, &length) && length >

0)

{

LinkCommand = *ReceivedData;

if (LinkCommand == TURN_OFF)

{

TurnOffCommand = true;

}

if (LinkCommand == RECEIVE_REF_OMEGA)

{

if (StepResponse) SendStepResponse = true;

refOmegax1000[0] = *(ReceivedData + 1);

refOmegax1000[1] = *(ReceivedData + 2);

NewRefOmega = true;

}

if (LinkCommand == STEP_RESPONSE)

{

stepResponseSamples[0] = *(ReceivedData + 1); //MSB

stepResponseSamples[1] = *(ReceivedData + 2);

StepResponseSamples = (stepResponseSamples[0] << 8) | stepResponseSamples[1];

StepResponse = true;

}

return 1;

}

}

return 0;

}

// ISR for Timer_A, CCR0

#pragma vector = TIMERA0_VECTOR

Page 143: sistema de controle de velocidade digital embarcado de motor de

136

__interrupt void TIMERA0_ISR (void) // Flag cleared automatically

{

LastPulseCycles = (uint32_t)(TACCR0 + 1);

CaptureInput0 = TACCTL0 & CCI;

if (CaptureInput0) // CCI = 1.

{

if (NewFirstPulse)

{

if (ClockwiseStart)

{

Sequence = 1;

PreviousSequence = 0;

}

else

{

Sequence = 3;

PreviousSequence = 2;

}

}

else CCI0BCurrentPulse = 0x01;

}

if (!CaptureInput0) // CCI = 0.

{

if (NewFirstPulse)

{

if (ClockwiseStart)

{

Sequence = 2;

PreviousSequence = 3;

}

else

{

Sequence = 0;

PreviousSequence = 1;

}

}

else CCI0BCurrentPulse = 0x00;

}

if (!NewFirstPulse) Sequence = CCI1BCurrentPulse | CCI0BCurrentPulse;

else NewFirstPulse = false;

Direction = QuadEncMatrix[(PreviousSequence << 2) + Sequence];

if (Direction == 0) PositiveDeltaN++;

if (Direction == 1) NegativeDeltaN++;

PreviousSequence = Sequence;

}

// ISR for Timer_A, CCR1

Page 144: sistema de controle de velocidade digital embarcado de motor de

137

#pragma vector = TIMERA1_VECTOR

__interrupt void TIMERA1_ISR (void) // Flag cleared automatically

{

switch (TAIV)

{

case TAIV_TACCR1: // Vector 2: TACCR1_CCIFG

LastPulseCycles = (uint32_t)(TACCR1 + 1);

CaptureInput1 = TACCTL1 & CCI;

if (CaptureInput1) // CCI = 1.

{

if (NewFirstPulse)

{

if (ClockwiseStart)

{

Sequence = 3;

PreviousSequence = 1;

}

else

{

Sequence = 2;

PreviousSequence = 0;

}

}

CCI1BCurrentPulse = 0x02;

}

if (!CaptureInput1) // CCI = 0.

{

if (NewFirstPulse)

{

if (ClockwiseStart)

{

Sequence = 0;

PreviousSequence = 2;

}

else

{

Sequence = 1;

PreviousSequence = 3;

}

}

CCI1BCurrentPulse = 0x00;

}

if (!NewFirstPulse) Sequence = CCI1BCurrentPulse | CCI0BCurrentPulse;

else NewFirstPulse = false;

Direction = QuadEncMatrix[(PreviousSequence << 2) + Sequence];

if (Direction == 0) PositiveDeltaN++;

if (Direction == 1) NegativeDeltaN++;

Page 145: sistema de controle de velocidade digital embarcado de motor de

138

PreviousSequence = Sequence;

break;

case TAIV_TAIFG: // Vector 10: TAIFG

DeltaN = PositiveDeltaN - NegativeDeltaN;

if (PositiveDeltaN == 0 && NegativeDeltaN == 0)

{

nBasicWindows++;

if (nBasicWindows <= 2) TotalCyclesTimerASum +=

TotalCyclesTimerA;

else

{

CurrentOmegax1000 = 0;

PreviousLastPulseCycles = 65536;

TotalCyclesTimerASum = TotalCyclesTimerA;

nBasicWindows = 0;

NewSample = true;

}

}

else

{

if (LastPulseCycles < 64000) LastPulseCycles = 65536;

CurrentOmegax1000 =

(float)(DeltaN*Pix2x1000_NpxTtimerA/(TotalCyclesTimerASum - PreviousLastPulseCycles

+ LastPulseCycles));

DeltaN = 0;

PositiveDeltaN = 0;

NegativeDeltaN = 0;

PreviousLastPulseCycles = LastPulseCycles;

TotalCyclesTimerASum = TotalCyclesTimerA;

NewSample = true;

}

break;

}

}