Escolar Documentos
Profissional Documentos
Cultura Documentos
2007 KitDidáticoMotorDePasso TG ThiagoCamargo
2007 KitDidáticoMotorDePasso TG ThiagoCamargo
Campinas, 2007
S.P. Brasil
i
F884
Ttulo
Freitas Campinas, SP: [s.n.], 2004.
/ Jos da Silva
Orientador:
Dissertao/Tese - Universidade Estadual de
Campinas, Faculdade de Engenharia Mecnica.
1.
2.
3. 4.
I. , . II. Universidade
Estadual de Campinas. Faculdade de Engenharia
Mecnica. III. Ttulo.
Titulo em Ingls:
Palavras-chave em Ingls:
rea de concentrao:
Titulao:
Banca examinadora:
Data da defesa:
ii
TRABALHO DE GRADUAO
iv
Dedicatria:
Dedico este trabalho aos meus queridos filho e esposa. Alm de todos aqueles alunos que
possam crescer e melhorar o seu aprendizado.
Agradecimentos
Agradeo a sdfsdgddfasdfadfasdfasdfa
Sdfasdfasdfasdfasdfa
Sdfasdfasdfasdfasdf
sdfasdfasdfasdfasdfdssdfasdfasdf
vi
vii
Resumo
CAMARGO, Thiago Augusto Bento da Silva, Desenvolvimento de Kit Didtico para Ensino de
Teoria de Motor de Passo, Campinas, Faculdade de Engenharia Mecnica, Universidade
Estadual de Campinas, 2007. XXXp. Trabalho de Graduao.
Esse trabalho tem o objetivo de tornar mais simples e fcil o aprendizado e ensino da teoria
de motores de passo. Para isso, foi desenvolvido um kit composto por um prottipo de motor de
passo, por um driver de acionamento e softwares de interface para comunicao entre o micro
controlador, computador e driver. Toda a arquitetura do kit foi voltada e documentada ao
aprendizado simples e intuitivo. Com esse kit, o aluno poder compreender de maneira bastante
visual o funcionamento de um motor de passo alm de tambm ter a possibilidade de desenvolver
um modelamento matemtico para tanto.
Palavras Chave
- Motor de Passo, Kit Didtico, ????
viii
Abstract
CAMARGO, Thiago Augusto Bento da Silva, Didactic kit development for Steppers Motors
Lectures , Campinas, Faculdade de Engenharia Mecnica, Universidade Estadual de Campinas,
2007. XXXp. Trabalho de Graduao.
kjhlkjhlkjhlkj
Key Words
Xxxxxxxxxxxxxxxxxxxxxx
ix
ndice
Dedicatria:......................................................................................................................................v
Agradecimentos...............................................................................................................................vi
Resumo..........................................................................................................................................viii
Abstract............................................................................................................................................ix
ndice................................................................................................................................................x
Lista de Figuras...............................................................................................................................xi
1. Introduo.....................................................................................................................................1
2. Reviso Bibliogrfica...................................................................................................................4
2.1 Introduo................................................................................................................4
2.2 Modos de Acionamento...........................................................................................7
2.3 Tipos de Motores...................................................................................................11
2.4 Curva Torque Vs. Velocidade de um Motore de Passo.........................................15
2.5 Modelamento Matemtico.....................................................................................16
3. Material e Mtodos.....................................................................................................................21
3.1 Kit Didtico...........................................................................................................21
3.2 Simulao computacional......................................................................................40
Anexos............................................................................................................................................46
Anexo 1. Programa para PIC na linguagem C.........................................................46
Lista de Figuras
- Motores de Passo.........................................................................................................2
- Rotor............................................................................................................................5
- Estator..........................................................................................................................5
- Bobinas em Pares (2 ou 3)...........................................................................................6
- Fluxo Magntico por Corrente....................................................................................6
- Configurao Unipolar................................................................................................7
- Configurao Bipolar..................................................................................................7
- Acionamento Unipolar com Passo Inteiro...................................................................7
- Acionamento Bipolar com Passo Inteiro.....................................................................8
- Acionamento Unipolar de Meio Passo........................................................................8
- Acionamento Bipolar de Meio Passo..........................................................................9
- Acionamento Bipolar..................................................................................................9
- Acionamento Binvel1...............................................................................................10
- Acionamento Binvel 2..............................................................................................10
- Acionamento com Choppers.....................................................................................10
- Motor de Relutncia Varivel...................................................................................11
- Passo de um VR........................................................................................................12
- Motor PM..................................................................................................................13
- Uma Revoluo do Motor PM..................................................................................13
xi
- Motor Hbrido............................................................................................................14
- Curva Torque vs. Velocidade....................................................................................15
- Curva Torque vs. Velocidade (com carga)................................................................16
Modelo Eltrico de uma Fase...................................................................................18
- Esquema de Fluxo de Informaes...........................................................................21
- Esquema do Prottipo...............................................................................................22
- Prottipo na Posio A..............................................................................................23
- Prottipo na Posio B..............................................................................................23
- Prottipo na Posio C..............................................................................................23
- Componentes.............................................................................................................26
- Ponte-H......................................................................................................................26
- Sentido A...................................................................................................................27
- Sentido B...................................................................................................................28
- Byte de Comunicao................................................................................................30
- Seqenciamento (Byte).............................................................................................31
- Funo Passo Completo............................................................................................33
- Funo Meio Passo....................................................................................................36
- Funo Mquina de Estados......................................................................................38
- Programa de Interface VB.........................................................................................39
- Detalhe de Interface...................................................................................................40
- SDL - Simulao Computacional..............................................................................43
- Iteraes da Simulao (Perfil de Velocidades)........................................................43
- Dados da Curva.........................................................................................................44
- Curva Exemplo..........................................................................................................44
- Simulao Exemplo...................................................................................................45
xii
xiii
1. Introduo
Quando Hans Christian Oersted, em 1820, observou uma interessante relao entre a
eletricidade e magnetismo, as portas para o desenvolvimento de motores eltricos foram abertas.
Desde ento, inmeros tipos de motores foram patenteados e desenvolvidos; cada um com seu
modo de acionamento, peculiaridade, vantagens e desvantagens.
Os primeiros motores eltricos eram acionados por corrente contnua e, geralmente, tinham
um im permanente em sua constituio. Posteriormente, os motores comearam a utilizar
eletroms e possibilitar diversas formas de acionamento: por corrente contnua ou alternada.
Os motores eltricos convencionais so, hoje, largamente utilizados em todas as reas,
desde em aplicaes industriais at em eletrodomsticos, como o exemplo de trens eltricos e
liquidificadores domsticos.
Contudo, com o avano da tecnologia, necessidades especiais, como: preciso de
posicionamento e controle de velocidade, comearam a surgir, foi quando o motor de passo
surgiu para auxiliar nesses casos. Apesar dos motores eltricos de corrente alternada ou contnua
tambm possibilitarem certo controle de posio, a eficincia, nesse aspecto, do motor de passo
superior.
O motor de passo nada mais do que um motor eltrico especial (vide exemplos na figura
1). Isso quer dizer que, devido a sua arquitetura, ele possibilita inmeros tipos de controle mais
precisos que os motores convencionais. Ou seja, esse motor foi desenvolvido e projetado para
atender necessidades de controle, mais especificamente de posicionamento. Posteriormente, neste
trabalho, as caractersticas que conferem aos motores de passo esses controles sero mais
detalhadamente elucidadas.
2. Reviso Bibliogrfica
2.1 Introduo
Os motores de passo, antes de tudo, so motores eltricos que tambm utilizam o princpio
do eletromagnetismo como fora motriz. Este um princpio bastante simples, mas que requer
certo nvel de abstrao.
O eletromagnetismo o nome da teoria unificada desenvolvida por James Maxwell, que
relaciona a eletricidade com o magnetismo. Para o caso aqui estudado, interessante salientar um
aspecto dessa teoria: sempre que h uma corrente eltrica gerada tambm uma variao de fluxo
de campo magntico. Isso quer dizer que quando h a movimentao ordenada de eltrons
(corrente eltrica) formado um campo magntico. Como pode ser visto pela lei de AmpreMaxwell com a equao abaixo (Eq.: 1.1):
Figura 2 - Rotor
Figura 3 - Estator
Os motores de passo podem ser de 3 tipos, que sero logo elucidados, mas de um modo
geral, podem ter seu funcionamento explicado pelo alinhamento entre um im-permanente ou
eletrom e um campo gerado por pares de bobinas transpassadas por corrente eltrica.
As bobinas do estator esto posicionadas sempre em pares, podendo ser comumente
encontradas em 2 ou 3 pares, como no esquema abaixo:
Com isso, basta que o campo eletromagntico formado fique variando de posio para que
o rotor se alinhe e d movimento ao motor de passo.
Essa troca de acionamento de bobinas outra peculiaridade do motor de passo. O
ligamento ou desligamento de um par de bobinas feito atravs de um driver de potncia que
pode ter inmeras configuraes e ser abordado posteriormente. De qualquer forma o
acionamento das bobinas pode ser de um ou meio passo e unipolar ou bipolar.
6
Basicamente, como dito acima, os motores podem ter seu acionamento com configuraes
entre unipolares ou bipolares e de passo inteiro ou meio passo. A configurao unipolar significa
que para cada bobina, s haver um sentido de corrente e portanto de campo eletromagntico. J
para a bipolar, a corrente e o campo podero assumir as duas direes. Outro tipo de acionamento
o com passo inteiro ou meio passo. Para o acionamento de passo inteiro as bobinas devero ser
acionadas ou unicamente ou em pares. J o acionamento com meio passo requer um acionamento
de uma nica bobina e de um par, intercaladamente. A escolha do tipo de acionamento depender
da exigncias da aplicao e do tipo de motor de passo com que se esteja trabalhando.
As possibilidades de acionamento foram exemplificadas conforme as figuras abaixo:
10
No motor de relutncia varivel, sempre que h a energizao das bobinas, o rotor tenta se
alinhar e se manter em uma posio de maior estabilidade. Essa posio de maior estabilidade
sempre aquela aonde h a menor relutncia entre estator e rotor. Isso quer dizer que quando as
bobinas conduzem corrente, um campo eletromagntico formado e o rotor tenta se alinhar com
o mesmo.
Nesse tipo de motor, temos o estator trabalhando com bobinas em pares e todas voltadas
para o centro. J o rotor uma pea com um formato de uma engrenagem, que, dependendo do
modelo de motor, pode ter mais ou menos dentes que pares de bobinas, constitudo de material
ferro magntico, mas no im permanente. Abaixo, a ilustrao mostra claramente esses
componentes:
11
Para a movimentao desse motor, um par de bobinas acionado aps o outro. Sempre que
o campo magntico muda, o rotor tenta se alinhar com esse campo. Assim, o rotor estar sempre
buscando a posio de menor relutncia (que a resistncia passagem do campo magntico),
que quando h a menor distncia entre os dentes do rotor e o par de bobinas acionado.
O torque esttico de um motor de passo pode ser medido quando o mesmo no est em
funcionamento, ou no tem nenhuma bobina sendo acionada. E, justamente pelo fato de ser um
motor sem im permanente, o seu torque inicial nulo.
Comercialmente esse motor encontrado com passos que podem variar de 5 a 15 por
passo.
A figura abaixo salienta o funcionamento desse tipo de motor de passo, assim que o par de
bobinas acionadas muda, o rotor tende a se alinhar e gira at encontrar o ponto de menor
relutncia, como mostra a figura:
Figura 17 - Passo de um VR
12
Figura 18 - Motor PM
Esse modelo se movimenta tendo suas bobinas sendo acionadas seqencialmente, a seguir a
uma seqncia de movimentao desse motor mostrada:
Motor Hbrido
Como o prprio nome sugere esse um motor que combina a estrutura dos dois motores,
ou seja, possui rotor dentado e magnetizado. Essa configurao confere a esse tipo de motor uma
grande versatilidade de aplicaes alm de ter um custo barato em relao aos motores eltricos
tradicionais.
Motor Hbrido
14
Essa curva fornece quase todos os dados importantes para se aplicar um motor de passo,
pois ela sempre representar o mximo de torque disponvel quela velocidade. Alm de ajudar
a estipular a sua rampa de acelerao, velocidade de cruzeiro e torque. Aps a carga ser aplicada,
ela provavelmente agregar uma inrcia ao sistema, que dever ser calculada ou estipulada. Com
esses novos dados, pode-se traar outra curva que agora trar o torque relativo quela velocidade
com carga. Abaixo segue uma figura com o grfico de curva torque vs. velocidade para duas
cargas diferentes sendo comparadas com a curva de um motor em vazio.
15
Para um estudo mais detalhado do motor de passo interessante que seja feito um
modelamento matemtico de quanto e como seriam suas correntes, torques, deslocamentos,
velocidades e aceleraes.
interessante tambm que sejam feitos vrios tipos de modelamento, alguns mais
abrangentes e outros mais aprofundados. Todos esses modelos devero receber dados obtidos
experimentalmente como inputs. Basicamente podem ser feitos 3 tipos de modelamento.
Primeiramente, um modelo mais genrico pode ajudar no clculo da melhor velocidade a
ser utilizada para um carregamento e um nmero de passos dado. Sendo que nesse modelo a
entrada de dados a curva de velocidade vs. toque e as velocidades de teste. Um outro modelo
onde a inrcia da carga, durante o movimento, varivel. E um terceiro, onde podemos calcular
as correntes e tenses que passam pelo motor, sendo que nesse tipo de modelamento, dependendo
do circuito de acionamento (ou de controle), temos uma aproximao boa ou no da realidade.
No primeiro modelo, basta calcular alguns parmetros como: a velocidade, distncias e
tempos de acelerao, desacelerao e andamento. Para isso interessante levar em conta
algumas equaes:
16
Lembrando torque de acelerao (Tac) sempre igual ao torque da curva levantada (Tcurva)
vezes a porcentagem de utilizao (Tu) de torque menos a frio de Coulomb (Tc).
Tac = Tcurva * Tu - Tc
Assim, o torque gerado (Tg) pode ser determinado pela multiplicao da inrcia da carga,
somado com o atrito viscoso e com a frio Coulomb e torque gravitacional (se houve):
Tg = J * dw/dt + Fv * w + Tc + Tgr
No segundo moldelo, a inrcia da carga varia de acordo com a posio do motor, e ela ser
levada em conta com:
Tg = Tm * - sen (e)
17
Sendo que Tm no igual ao torque de pullout (Tpo), mas pode ser derivado dele.
Tpo = -Tm/ se * int (sen e de, - pi + se/2, - pi - se/2)
No terceiro modelo, para o motor de im permanente, aonde entram as correntes das fases,
deve-se interpretar as fases como um circuito como o abaixo:
Para facilitar, aqui, sero apresentadas as equaes para um motor de duas fases.
Va = ia* R + L *dia/dt - NB * sen N * d/dt
Vb = ib* R + L *dib/dt - NB * sen N * d/dt
Tg = Ta + Tb + Td
Para o motor hibrido as equaes das fases so:
Va = ia* R + L *dia/dt + Kea * d/dt
La = L C * Z * cos N (Z = sinal da corrente)
Onde:
Kea = - N* (B C * ia) * sen N
Vb = ib* R + L *dib/dt + Keb * d/dt
Lb = L C * Z * sen N (Z = sinal da corrente)
Onde:
Keb = - N* (B C * ib) * cos N
Onde:
Kta = N * ( B C/2 * |ia|) * - sen N
Tb = Ktb * ib
Onde:
19
E o torque total:
Tg = Ta + Tb + Td
20
3. Material e Mtodos
21
O Prottipo
22
O Driver de Potncia
Para o kit didtico, um driver de potncia se torna necessrio, pois, os sinais de controle
enviados pelo micro controlador no teriam potncia ou corrente suficiente para alimentar as
24
bobinas e conseguir um campo magntico eficiente. E esse driver de potncia que far a
interface entre o micro controlador e o prottipo. Ou seja, ele o estgio que amplifica os sinais
enviados e alimenta com correntes adequadas as bobinas.
Cada bobina ser acionada de maneira bipolar, isso quer dizer, conforme dito acima, que a
corrente dever fluir nos dois sentidos. Para tanto, usou-se o conceito de acionamento por ponteH que, nada mais , do que um circuito que permite a ligao nos dois sentidos atravs do envio
de sinais de controle para transistores e ser mais bem explicado mais a frente.
Lista de Materiais:
- 1 protoboard com 550 pontos
- 6 transistores NPN (BC548)
- 6 transistores PNP (BC558)
- 12 diodos (1N914)
- 12 resistores de 1Kohm
- 1 resistor de 4r
- 6 resistores de 10ohm
- 1 cabo flatcable de 14 vias (com conectores macho e fmea)
Nos esquemas eltricos a seguir os componentes usados sero representados como na
figura:
25
Figura 29 - Componentes
Para montar o circuito foi usado o seguinte esquema de ligao para a ponte-H:
Figura 30 - Ponte-H
26
A seguir sero dadas explicaes detalhadas dos motivos e de cada componente, bem como
os seus dimensionamentos.
O funcionamento da ponte-H bastante simples. Os transistores devero ser acionados
sempre em pares para que haja a passagem de corrente e gerao do campo. Para exemplificar o
acionamento da ponte-H, algumas ilustraes foram montadas.
Nos dois casos a seguir sero mostrados os acionamento dos transistores para que a haja a
possibilidade de passagem de corrente nos dois sentidos das bobinas. Para que a ponte-H
funcione corretamente, os transistores devero ser acionados em pares e em x como mostrado a
seguir:
Figura 31 - Sentido A
E no sentido oposto:
27
Figura 32 - Sentido B
Para simbolizar o acionamento dos transistores, foram usadas as chaves S1 e S2, aonde
seus estados representam sinal alto ou baixo, representados por um ou zero respectivamente. Vale
lembrar que o acionamento de transistores PNP dado em nvel baixo (0) e os NPN em nvel
alto(1). Tambm interessante salientar que as bases dos transistores foram curto-circuitadas
convenientemente, e essa juno ser posteriormente explicada.
Para esse circuito, os resistores de 1k so apenas limitadores de corrente de acionamento.
Pois como esses componentes tm ganhos muito grandes, uma corrente de base da ordem de
5mA ser o suficiente. Alm desses componentes, h a presena de quatro diodos que permitem
que a correntes parasitas e decorrentes do regime transiente do indutor sejam dissipadas, uma vez
que o circuito ser chaveado e as correntes reversas devido variao de tenso no indutor
podero representar campos magnticos contrrios ao desejado.
Nesse circuito, algumas precaues devero ser tomadas. Os transistores nunca podero ser
acionados em linha, pois isso representa um curto circuito entre a fonte e o terra. Mesmo
tomando esse cuidado, devido ao tempo de chaveamento de cada transistor pode ser que um
28
transistor demore mais ou menos para mudar o seu estado de conduo, o que caracterizaria um
curto instantneo e de curta durao. Nesse sentido, foi colocado um resistor de 4 ohms para que
a corrente de curto seja limitada minimamente para minimizar danos. Ainda no intuito de evitar o
acionamento em linha as bases dos transistores foram curto-circuitadas, garantindo que na mesma
linha, os transistores nunca recebam sinal para conduzirem.
Para o dimensionamento da linha principal desse circuito, foram feitos alguns experimentos
prticos para se definir uma corrente que fosse suficiente para movimentar a bssola mas que
tambm no fosse demasiadamente intensa para danificar o sistema. Sendo assim, chegou-se a
concluso que a melhor corrente seria de 200mA. Por tanto, considerando o circuito total,
precisar-se-ia de mais 10 ohms para o circuito, que foi acrescentado pelo resistor.
Esse foi o circuito de acionamento de uma bobina e, por tanto, ele se repetir trs vezes,
sendo uma ponte para cada bobina. Combinado com 3 circuitos, o driver de potncia ficou assim:
Para que possa haver uma seqncia de acionamento foi montado uma espcie de protocolo
de comunicao entre o driver e os sinais de comando. Essa comunicao chegar sempre atravs
de um cabo do tipo flatcable de quatorze vias das quais s sero usadas seis (dois bits para cada
par de bobinas). Os 6 bits estaro separados por um bit inativo por motivos construtivos do
experimento. Esse byte estar representando cada chave de comando para cada bit. Novamente,
os sinais de zero e cinco volts sero aqui representados na forma de bits (zeros e ums). A figura a
baixo ilustra a relao entre os bits e as chaves. Sendo elas representadas da forma ABC para as
bobinas e um e dois para as respectivas chaves.
29
30
A seguir ser apresentado o programa que far o controle seqencial do motor. A idia
bsica do programa ser interpretar os comandos enviados via seria do computador e transformlos em sada atravs do byte de comando para o driver de potncia. Assim, basicamente haver
dois modos de operao do motor. Um deles ser o acionamento manual que a cada comando o
motor se mover um passo. E outro modo aonde ser passada uma quantidade de passos e uma
velocidade mxima (de cruzeiro) a ser executada, e assim o micro controlador se encarregar de
passar os sinais corretamente para o driver.
O PIC, micro controlador, usado ser o modelo: 16F877. Esse um modelo bastante
completo e com muitos recursos, apesar de utilizar poucos deles nesse experimento, esse foi o
controlador usado, pois no laboratrio da faculdade de engenharia mecnica j o disponibiliza
com alguns recursos estruturais como os pinos de expanso, adequados para os conectores de
31
flatcable. Nesse projeto, sero usadas 6 sadas digitais no port D do controlador. Sendo as sadas
D00 a D07 as escolhidas para o experimento.
32
Nesse caso, foram usadas as variveis Motor_Pas e Motor, sendo a primeira que diz em
que posio o motor se encontra e a segunda imprime o byte de comando nos pinos de sada do
PIC. Como nesse modo, o motor anda com passo completo, a varivel Motor_Pas s assume seis
valores diferentes (0-5). J a varivel Motor, pode assumir, dentro dessa funo tambm apenas
33
seis valores. Obs.: os valores de Motor so expressos em hexadecimais para uma simples
adequao linguagem de programao usada.
Para a funo de meio passo ser usada a mesma varivel de sada de comandos (Motor),
porm ser usada uma varivel Motor_MPass, que tambm guardar a posio em que o motor se
encontra. Tambm interessante ressaltar que ao termino da funo, dever ser feita uma
converso entre as variveis Motor_MPass e Motor_Pass, para que no haja perda de
posicionamento. Sendo assim, nas duas funes, uma etapa de correo de valores feita.
A figura a seguir mostra o SDL para a funo de meio passo.
A partir das duas funes de deslocamento, pode-se construir uma mquina interpretadora
de comandos que alm de processar os comandos recebidos, executa uma rotina para realizar os
pedidos.
Para que os comandos fossem recebidos e tivessem o mnimo tratamento para erros o
programa principal funciona como uma mquina de estado. Ou seja, a cada comando, ele recebe
o dado, verifica se realmente uma comunicao e muda de estado esperando o comando
seguinte.
Para o primeiro modo, basta que seja enviado pela serial o comando N, o motor j
responde e anda um passo apenas e fica aguardando novas instrues.
No segundo modo, o primeiro comando dever ser o P e logo aps cinco algarismos
sendo os trs primeiros representando o nmero de passos a serem dados e os dois ltimos a
velocidade mxima a ser desenvolvida.
34
35
36
37
Para criar uma interface agradvel e de fcil entendimento, foi criado no Visual Basic uma
interface amigvel que envia os comandos para o micro controlador e mostra a posio do motor.
nesse programa que o aluno pode selecionar o modo a ser trabalhado. Se ser acionado
passo a passo ou ser atravs de objetivos.
A interface bsica do programa est ilustrada abaixo. Nela, pode-se observar que h um
boto de opo aonde poder ser selecionado o modo de trabalho. Sendo que quando um modo
foi escolhido o outro permanecer inativo e vice-versa.
Esse programa segue o mesmo padro de comandos que o PIC, uma vez que entre eles ser
estabelecida a comunicao de comandos. Com isso, essa interface se encarregar de enviar, via
38
39
Introduo
Alm do kit didtico, foi desenvolvido um programa simples para simulao de um motor
de passo.
Durante o estudo de motores de passo, preciso que o seu funcionamento seja bem
entendido, para que tambm possa se dimensionado de forma correta, sem que haja super ou subdimensionamento.
40
/ Obtido experimentalmente
/ Aproximaes *
/ Aproximaes
Esses torques foram aproximados para no variarem devido a sua posio em relao a
gravidade.
Para a simulao computacional desse modelo, sero usadas como dados a serem entrados
de acordo com os objetivos pretendidos:
- Distncia total percorrida, ou distncia final.
41
42
Durante toda a simulao gerado um arquivo (*.txt) com todos os dados de velocidade e
distncia percorrida por tempo, que, posteriormente ser usado para a gerao de grficos no
Excel ou MatLab.
O programa para a simulao foi feito em linguagem C e est integralmente exposto no
anexo 3.
Como exemplo foi feita uma simulao com curva de motor:
44
Aps a gerao dos arquivos em TXT, os dados podem ser plotados pelo Excel, como
mostrado logo abaixo:
Ex:
Velocidade mxima: 5000
Distncia requerida : 2000
Anexos
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Trabalho de Grauao - 2o Semestre 2007
* Universidade Estadual de Campinas - UNICAMP
* Faculdade de Egenharia Mecnica - FEM
* Curso de Engenharia de Controle e Automao
* Aluno: Thiago Augusto Bento da Silva Camargo
* Orientador: Luiz Otvio Saraiva Ferreira
*
**************************************
* Programa: Motor de Passo.c
* VERSO : 1.0
* DATA : 04/11/2007
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
Descrio geral
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
Este programa, a partir de caracteres enviados, via serial,
controla um prottipo de motor de passo.
Os caracteres so enviados e interpretados por uma mquina de estados.
Basicamente o acionamento se d de duas formas:
1 - Passo a Passo. (Um passo)
2 - Ou com objetivos de velocidade e nmero de passos. Assim, o motor ser
acionado at atingir o nmero de passos com velocidade mxima de cruzeiro
setada pelo usurio.
*/
/*
**===================================================================
46
** 1
Informaes Gerais
** 1.1 Revises
**
**===================================================================
*/
/*
**===================================================================
** 1.2 Referncias
**
** No Identificao
Nome ou Descrio
** =======================================================
** 1 Datasheet do microcontrolador
**
PIC16F877, da Microchip
**
**===================================================================
*/
/*
**===================================================================
** 2.
Bibliotecas a incluir
**===================================================================
*/
#include <io16f877.h>
/* Definies dos registradores do processador
*/
#include <inpic.h>
/* Definio das funes intrnsecas do compilador */
#include <stdlib.h> /* Definio das funes padro do ANSI C */
#include <ctype.h>
/* Definio da converso aSCII para HEXADECIMAL */
/*
**===================================================================
** 3.
DECLARAES
** 3.1 Definies de tipos internas
**===================================================================
*/
#define RXFLAG RCIF /* Flag de chegada de byte pela serial */
#define TXFLAG TXIF /* Flag de esvaziamento de TXREG */
#define MOTOR PORTD //Sada de dados para o LCD.
#define ENABLE RE1 //Sinal de enable para o LCD. Ativo na borda de subida.
#define RS RE0
//Sinal de envio de dados (RS=1) ou comando (RS=0) para o LCD.
#define INIT 0
#define P1
#define P2
1
2
47
#define P3
#define V1
#define V2
3
4
5
char MOTOR_PAS;
// Posio do Motor (Passo)
char MOTOR_MPAS;
// Posio do Motor (Meio - Passo)
char PASSOS[3], VELOCIDADE[2]; // Velocidade de cruzeiro e quantidade de passos objetivo.
/*
**===================================================================
** 3.2 Prottipos de funes internas (definidas na Seo 5)
**===================================================================
*/
void Beep(char PITCH[3]);
void Delay_1ms(char TEMPO);
char Recebe(void);
void Transmite(char DADO_TX);
void Comando(void);
char Le_Tecla(void);
void Aciona_Led (char LUZ[2] );
void Inicializa_LCD (char vias, char modo, char cursor);
void Escreve_LCD (const char *str, char tamanho, char linha, char coluna);
void Escreve_Char_LCD (char caractere);
void Um_Passo (void);
void Meio_Passo (void);
void Anda(void);
/*
**===================================================================
** 3.3 Variveis Internas
**===================================================================
*/
char CHAR_RX;
// Caractere recebido pela serial
char NUM_TECLA, COD_TECLA;
// Variveis utilizadas para ler as teclas
char STT_INTERPRETADOR;
// Estado do interpretador de comandos
/*
**===================================================================
** 4.
FUNES GLOBAIS
**
(declaradas como 'extern' em algum arquivo de cabealho)
**===================================================================
*/
48
/* FUNO PRINCIPAL */
void main( void )
/*
**--------------------------------------------------------------------------**
**
** Parmetros:
**
Nenhum
**
** Retorna:
**
Nada
**
**--------------------------------------------------------------------------*/
{
/*
**-----------------------------------------------------------------** Inicia o sistema
**-----------------------------------------------------------------*/
/*
**--------------------------------------------------------------------------** IMPORTANTE: programar os Configuration bits da seguinte forma:
**
Oscillator:
XT
**
Watchdog Timer
Off
** Debug
On
**
Power Up Timer
On
**
Brown Out Detect
Off
**
Low Voltage Program Disabled
**
Flash Program Write Disabled
**
Data EE Read Protect Off
**
Code Protect
Off
**--------------------------------------------------------------------------*/
__set_configuration_word(CP_OFF&CPD_OFF&DEBUG_ON&LVP_OFF&BODEN_OFF&P
WRTE_ON&WDT_OFF&XT_OSC);
/*
** NOTA: dispositivos que tm conversor A/D podem precisar
** configurar os pinos assinalados a 'in' e 'out' como E/ digital
*/
ADCON1 = 0x07;
49
INTCON = 0x00;
/*
**
**
**
*/
*/
//*****************************************************************************
//
Funo Delay_1ms( tempo )
//
tempo = quantidade de milissegundos
//----------------------------------------------------------------------------void Delay_1ms(char TEMPO)
{
char i,j;
if (TEMPO==0) return;
do {
TEMPO--;
for (i=255; i>0; i--);
for (j=90; j>0; j--);
} while(TEMPO!=0);
}
//*****************************************************************************
/* Funo que recebe caractere pela serial */
/* No tem argumento de entrada, e o argumento de saida caractere ASCII */
/* recebido ou o nmero 0 em caso de nenhum caractere recebido */
//----------------------------------------------------------------------------char Recebe(void)
{
if (RXFLAG == 0)
{
return 0;
}
51
else
{
return RCREG;
}
}
//*****************************************************************************
/* Funo que transmite caractere pela serial */
//----------------------------------------------------------------------------void Transmite(char DADO_TX)
{
while (TXFLAG == 0) {};
TXREG = DADO_TX;
}
//****************************************************************************
/* Funo que interpreta os comandos vindos do teclado */
//---------------------------------------------------------------------------void Comando(void)
{
CHAR_RX = Recebe();
// L caractere na porta serial
// Incio da mquina de estados interpretadora de comandos.
switch (STT_INTERPRETADOR) {
case(INIT):
if (CHAR_RX == 0) break;
if (CHAR_RX == 'N') { Um_Passo(); Delay_1ms(100); MOTOR_MPAS =
2*MOTOR_PAS; break;}
if (CHAR_RX == 'P') { STT_INTERPRETADOR = P1; break;}
break;
case(P1):
if (CHAR_RX == 0) break;
if (isdigit (CHAR_RX)) { PASSOS[0] = CHAR_RX; STT_INTERPRETADOR =
P2; break;}
break;
case(P2):
if (CHAR_RX == 0) break;
if (isdigit (CHAR_RX)) { PASSOS[1] = CHAR_RX; STT_INTERPRETADOR =
P3; break; }
break;
52
case(P3):
if (CHAR_RX == 0) break;
if (isdigit (CHAR_RX))
{
STT_INTERPRETADOR = V1; break; }
break;
PASSOS[2]
CHAR_RX;
case(V1):
if (CHAR_RX == 0) break;
if
(isdigit
(CHAR_RX))
STT_INTERPRETADOR = V2; break; }
break;
VELOCIDADE[0]
CHAR_RX;
VELOCIDADE[1]
CHAR_RX;
case(V2):
if (CHAR_RX == 0) break;
if
(isdigit
(CHAR_RX))
{
STT_INTERPRETADOR = INIT; Anda(); break; }
break;
}
}
/* Funo Escreve_Char_LCD (caractere) */
//-----------------------------------------------------------------------------------------------------------void Escreve_Char_LCD (char caractere)
{
MOTOR = caractere;
ENABLE = 1;
ENABLE = 0;
Delay_1ms(1);
}
/* Funo Escreve_LCD (string, linha, coluna) */
//----------------------------------------------------------------------------------------------------------void Escreve_LCD (const char *str, char tamanho, char linha, char coluna)
{
char i;
coluna=coluna & 0x0F;
if (linha == 0) coluna = coluna + 0x80;
//Linha 0
else coluna = coluna + 0xC0;
//Linha 1
RS = 0;
53
MOTOR = coluna;
ENABLE = 1;
ENABLE = 0;
Delay_1ms(1);
RS = 1;
for (i=0; i < tamanho; i++)
{
Escreve_Char_LCD (str[i]);
}
}
/* Funo Inicializa o LCD */
//----------------------------------------------------------------------------------------------------------void Inicializa_LCD (char vias, char modo, char cursor)
{
RS = 0;
Escreve_Char_LCD (vias);
Delay_1ms (3);
Escreve_Char_LCD (modo);
Escreve_Char_LCD (cursor);
Escreve_Char_LCD (0x01);
Delay_1ms (1);
}
/* Funo Um_Passo () */
//-----------------------------------------------------------------------------------------------------------void Um_Passo ()
{
if (MOTOR_PAS > 4) MOTOR_PAS = 0;
else MOTOR_PAS++;
switch (MOTOR_PAS) {
case (0):
MOTOR = 0x37;
break;
case (1):
MOTOR = 0x57;
break;
case (2):
MOTOR = 0x67;
break;
case (3):
MOTOR = 0x73;
break;
case (4):
MOTOR = 0x75;
break;
case (5):
MOTOR = 0x76;
break;
default:
MOTOR = 0x77;
break;
/* Posiciona em B'-B */
/* Posiciona em C'-C */
/* Erro: Mantem em A-A' */
}
}
/* Funo Meio_Passo () */
//-----------------------------------------------------------------------------------------------------------void Meio_Passo ()
{
if (MOTOR_MPAS > 10) MOTOR_MPAS = 0;
else MOTOR_MPAS++;
switch (MOTOR_MPAS) {
case (0):
MOTOR = 0x37;
break;
case (1):
MOTOR = 0x17;
break;
case (2):
MOTOR = 0x57;
break;
case (3):
MOTOR = 0x47;
break;
case (4):
MOTOR = 0x67;
break;
case (5):
MOTOR = 0x63;
break;
case (6):
MOTOR = 0x73;
break;
case (7):
55
MOTOR = 0x71;
break;
case (8):
MOTOR = 0x75;
break;
case (9):
MOTOR = 0x74;
break;
case (10):
MOTOR = 0x76;
break;
case (11):
MOTOR = 0x36;
break;
default:
MOTOR = 0x77;
break;
/* Posiciona em A'B' */
/* Posiciona em B'-B */
/* Posiciona em B'C' */
/* Posiciona em C'-C */
/* Posiciona em AC' */
/* Erro: Mantem em A-A' */
}
}
/* Funo Anda () */
//-----------------------------------------------------------------------------------------------------------void Anda ()
{
char i;
char Steps;
char Vel;
for (i=0; i < 3; i++)
{
if (PASSOS[i] >= 'A')
PASSOS[i] = PASSOS[i] - 0x37;
else PASSOS[i] = PASSOS[i] - 0x30;
}
if (VELOCIDADE[0] >= 'A')
VELOCIDADE[0] = VELOCIDADE[0] - 0x37;
else VELOCIDADE[0] = VELOCIDADE[0] - 0x30;
if (VELOCIDADE[1] >= 'A')
VELOCIDADE[1] = VELOCIDADE[1] - 0x37;
else VELOCIDADE[1] = VELOCIDADE[1] - 0x30;
Steps = 100*PASSOS[0]+10*PASSOS[1]+PASSOS[2];
56
Vel = 100*VELOCIDADE[0]+10*VELOCIDADE[1];
if (Steps>2*Vel)
{
for (i=0; i < Vel; i++) { Meio_Passo(); Delay_1ms(1000-i); }
for (i=Vel; i < (Steps-Vel); i++) { Meio_Passo(); Delay_1ms(1000-Vel);}
for (i=Vel; i > 0; i--) { Meio_Passo(); Delay_1ms(1000-i);}
}
else
{
for (i=0; i < Steps/2; i++) { Meio_Passo(); Delay_1ms(1000-i); }
for (i=Steps/2; i > 0; i--) { Meio_Passo(); Delay_1ms(1000-i); }
}
if (MOTOR_MPAS%2) MOTOR_PAS = (MOTOR_MPAS-1)/2;
else MOTOR_PAS = MOTOR_MPAS/2;
}
/*
**===================================================================
** FIM DO ARQUIVO
**===================================================================
*/
Variaveis usadas
Dim Vel As Double define o valor da velocidade
Dim Pas As Double define a quantidade de passos
Dim P1 As Integer primeiro algarismo do nmero de passos
Dim P2 As Integer segundo algarismo do nmero de passos
Dim P3 As Integer terceiro algarismo do nmero de passos
Dim V1 As Integer primeiro algarismo do valor de velocidade
Dim V2 As Integer segundo algarismo do valor de velocidade
Dim T1 As Integer variveis para espero de um segundo
Dim T2 As Integer
57
Funo de espera de 1 segundo, esse um lao que se repete at transcorrer 1segundo, porm
durante a sua execuo os eventos podero acontecer normalmente pela funo DoEvent.
Apesar de esse tipo de lao ser uma perda de processamento, ele garante que os comandos sejam
repassados de maneira segura e com o intervalo de tempo adequado.
Sub Espera_1s()
T1 = Second(Time)
T2 = Second(Time)
DoEvents
Do Until (T2 = T1 + 1)
T2 = Second(Time)
Loop
End Sub
Funo de carregamento e configurao inicial
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.CommPort = 1
MSComm1.PortOpen = True
Load frmSobre
frmSobre.Visible = False
End Sub
Funo de finalizao
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False
End Sub
Funo de visualizao de objetos
Private Sub optObjetivos_Click()
If optObjetivos = True Then
frmPassoapasso.Enabled = False
cmdProx.Enabled = False
Label9.Enabled = True
Label10.Enabled = True
frmObjetivos.Enabled = True
59
txtPos.Enabled = True
txtVel.Enabled = True
Label11.Enabled = True
Label14.Enabled = True
Else
frmPassoapasso.Enabled = True
optLigado.Enabled = True
optDesligado.Enabled = True
cmdProx.Enabled = True
Label9.Enabled = False
Label10.Enabled = False
frmObjetivos.Enabled = False
txtPos.Enabled = False
txtVel.Enabled = False
Label11.Enabled = False
Label14.Enabled = False
End If
optPaP.Value = False
End Sub
Private Sub optPaP_Click()
If optPaP = True Then
frmPassoapasso.Enabled = True
cmdProx.Enabled = True
Label9.Enabled = False
Label10.Enabled = False
frmObjetivos.Enabled = False
txtPos.Enabled = False
txtVel.Enabled = False
Label11.Enabled = False
Label14.Enabled = False
Else
frmPassoapasso.Enabled = False
optLigado.Enabled = False
optDesligado.Enabled = False
cmdProx.Enabled = False
60
Label9.Enabled = True
Label10.Enabled = True
frmObjetivos.Enabled = True
txtPos.Enabled = True
txtVel.Enabled = True
Label11.Enabled = True
Label14.Enabled = True
End If
optObjetivos.Value = False
End Sub
Funo do boto de sada
Private Sub Sair_Click()
resp = MsgBox("Tem certeza que deseja sair?", vbYesNo, "Confirmao")
If resp = vbYes Then
Unload frmMotor
End If
End Sub
Funo que mostra dados sobre o programa
Private Sub Sobre_Click()
frmSobre.Enabled = True
frmMotor.Enabled = False
frmSobre.Visible = True
End Sub
Funo que testa os dados entrados pelo usurio e retira apesar trs nmeros para a quantidade
de passo e dois nmeros para a velocidade.
Private Sub txtVel_Change()
Vel = Left(Val(txtVel.Text), 2)
Pos = Left(Val(txtPos.Text), 3)
If (Pos <> 0) Then
If (Vel <> 0) Then
cmdEnviar.Enabled = True
Else
cmdEnviar.Enabled = False
End If
61
End If
End Sub
Private Sub txtPos_Change()
Vel = Left(Val(txtVel.Text), 2)
Pos = Left(Val(txtPos.Text), 3)
P3 = Pos Mod 10
P2 = ((Pos - P3) / 10) Mod 10
P1 = Left((Pos - P3) / 10, 1)
Nesse momento, foi feita uma seqncia de cdigos que separa os algarismos do valor de
nmero de passos a serem dados.
If (Pos <> 0) Then
If (Vel <> 0) Then
cmdEnviar.Enabled = True
Else
cmdEnviar.Enabled = False
End If
End If
End Sub
Funo que separa os comandos a serem repassados
Private Sub txtVel_LostFocus()
V2 = Vel Mod 10
V1 = (Vel - V2) / 10
End Sub
#include <stdio.h>
#include <stdlib.h>
/////////////////////////////////
//Declarao de variveis globais
/////////////////////////////////
float Deltat=0.001;
}
///////////////////////////////////
///////////////////////////////////
//Funo que calcula os parmetros de desacelerao a cada iterao
void DecelRate()
{
float PoTorque=CalcTorque(DecelVel);
float DecelTorque = PoTorque*Torqueut-Friction;
float SpeedChange = DecelTorque/(Rotorj+Loadj)*Deltat*100/pi;
DecelDist = DecelDist + (DecelVel + SpeedChange/2)*Deltat;
DecelVel = DecelVel+SpeedChange;
DecelTime = DecelTime+Deltat;
}
//////////////////////////////////
////////////////////////
// Loop de Calculo
////////////////////////
//Parmetros : arquivos como referncia
//Funo: chamar as funes de clculo e escrever no arquivo
////////////////////////
void Calculo(FILE *arquivo,FILE *arquivo2)
{
float i;
if ((AccelDist+DecelDist) > Distance)
{
DecelDist=Distance-AccelDist;
TotalTime = AccelTime + DecelTime + SlewTime;
return;
}
else {
if (AccelVel>DecelVel)
{
DecelRate();
fprintf(arquivo2,"%7.3f
%7.3f
Calculo(arquivo,arquivo2);
}
%7.3f\n",DecelTime,DecelVel,DecelDist);
else {
64
if (AccelVel>SlewSpeed)
{
SlewDist = Distance-AccelDist-DecelDist;
SlewTime = SlewDist/SlewSpeed;
TotalTime = AccelTime + DecelTime + SlewTime;
for (i=Deltat;i<(SlewTime);i=i+Deltat)
{
fprintf(arquivo,"%7.3f
%7.3f
%7.3f\n",i+AccelTime,SlewSpeed,(AccelDist
+i*SlewSpeed));
}
return;
}
else
{
AccelRate();
fprintf(arquivo,"%7.3f
%7.3f
%7.3f\n",AccelTime,AccelVel,AccelDist);
Calculo(arquivo,arquivo2);
}
}
}
return ;
}
/////////////////////
// Programa Principal
/////////////////////
int main ()
{
//////////////////////////////////////////
//Entrada de Valores-Objetivo
printf(" Entre com os objetivos pretendidos:\n\n\n");
printf(" Entre com a distancia que o motor percorrera: ");
scanf("%f",&Distance);
printf("\n Entre com velocidade mxima do motor:");
scanf("%f",&SlewSpeed);
//////////////////////////////////////////
///////////////////////////////////////////
// Abertura de arquivos (gravados no disco)
///////////////////////////////////////////
///////////////////////////////////////////
//Arquivo: conter os dados de tempo, distncia e velocidade
65
//
durante a acelerao e em velocidade de "cruzeiro" (objetivo)
FILE *arquivo;
arquivo = fopen("grafico.txt","w");
fprintf(arquivo," Tempo
Velocidade Distncia\n");
fprintf(arquivo,"000.000
000.000
000.000\n");
///////////////////////////////////////////
//Arquivo2: conter os dados de tempo, distncia e velocidade
//
de desacelerao (porm em ordem invertida, que ser trabalhada
//
no programa de plot dos dados (MatLab).
FILE *arquivo2;
arquivo2 = fopen("decel.txt","w");
////////////////////////////////////////////
/////////////////////////////////////
//Chamada para incio dos clculos (iterativamente)
Calculo(arquivo,arquivo2);
/////////////////////////////////////
////////////////////////////
// Fechamento dos arquivos
fclose(arquivo);
fclose(arquivo2);
////////////////////////////
system("PAUSE");
return 0;
}
66