UNIVERSIDADE FEDERAL FLUMINENSE CENTRO TECNOLÓGICO – ESCOLA DE ENGENHARIA ENGENHARIA MECÂNICA MARCELO TORRES DE QUEIROZ AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC NITERÓI 2007 MARCELO TORRES DE QUEIROZ AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC Dissertação apresentada ao Curso de Pós-Graduação em Engenharia Mecânica da Universidade Federal Fluminense, como requisito parcial para a obtenção do Grau de Mestre. Área de Concentração: Automação e Controle Orientador: Prof. DOMINGOS DE FARIAS BRITO DAVID, D. Sc. Niterói 2007 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 2 À minha família e à minha namorada Luciana que sempre me apoiaram em todos os momentos. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 3 AGRADECIMENTOS Ao professor Domingos David – meu orientador pelo desafio do trabalho. Ao Allan Delfino – amigo e aluno do curso de engenharia elétrica da Universidade Federal Fluminense, pelo apoio na construção dos circuitos elétricos e no desenvolvimento da programação. Aos professores Bruno Pedrosa, José Andres Santisteban e John Reed – pelo incentivo e experiência compartilhada. Aos amigos Elkin Velandia e Rodrigo Carneiro – pela paciência e conselhos. A todos os funcionários do Laboratório de Tecnologia Mecânica da Universidade Federal Fluminense - pela usinagem dos componentes da mesa xy. Aos professores da UFF – que colaboraram direta e indiretamente. Ao CNPq - pelo investimento ao desenvolvimento intelectual brasileiro. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 4 SUMÁRIO 1 2 Introdução........................................................................................................................... 8 1.1 Motivação ................................................................................................................. 10 1.2 Trabalhos relacionados ............................................................................................. 10 1.3 Proposta e objetivo do trabalho ................................................................................ 10 1.4 Estrutura do texto ..................................................................................................... 11 Cenário ............................................................................................................................. 12 2.1 Estruturas Gerais ...................................................................................................... 12 2.1.1 3 Mecânica........................................................................................................... 12 2.1.1.1 Componentes Fundidos ................................................................................ 14 2.1.1.2 Fusos............................................................................................................. 14 2.1.1.3 Guias lineares ............................................................................................... 14 2.1.1.4 Motores......................................................................................................... 15 2.1.1.5 Polias e correias ............................................................................................ 16 2.1.1.6 Encoder......................................................................................................... 17 2.1.2 Eletroeletrônica................................................................................................. 17 2.1.3 Interface ............................................................................................................ 19 2.1.4 Programas (Softwares)...................................................................................... 19 Estrutura de Controle........................................................................................................20 3.1 Controle em malha fechada ......................................................................................20 3.1.1 Planta ................................................................................................................ 21 3.1.1.1 Fuso .............................................................................................................. 22 3.1.1.2 Motor de corrente contínua .......................................................................... 25 3.1.1.3 Modelo da planta .......................................................................................... 29 3.1.2 Compensador em realimentação.......................................................................34 3.1.3 Compensador em série...................................................................................... 37 3.1.3.1 Controladores Industriais.............................................................................. 38 3.1.3.1.1 Controlador liga-desliga (ON-OFF) ....................................................... 38 3.1.3.1.2 Controlador proporcional ....................................................................... 39 3.1.3.1.3 Controlador integral................................................................................ 39 3.1.3.1.4 Controlador proporcional-integral..........................................................40 3.1.3.1.5 Controlador proporcional-derivativo......................................................40 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 3.1.3.1.6 3.1.4 Controlador proporcional-integral-derivativo ........................................ 41 Atuador ............................................................................................................. 42 3.1.4.1 PWM............................................................................................................. 42 3.1.4.2 Placa de acionamento do motor....................................................................44 3.2 4 5 Classificação de sistemas ......................................................................................... 46 Implementação da automação ..........................................................................................50 4.1 Projeto de controle via computador (DOS) .............................................................. 50 4.1.1 Estrutura de montagem..................................................................................... 51 4.1.2 Estrutura do programa ...................................................................................... 53 4.1.2.1 Temporizador da placa mãe (Timer) ............................................................ 55 4.1.2.2 Interrupções .................................................................................................. 55 4.1.2.3 Programa principal ....................................................................................... 56 4.1.3 Modelo.............................................................................................................. 57 4.1.3.1 Experimental................................................................................................. 57 4.1.3.2 Simulado....................................................................................................... 60 4.1.3.3 Testes experimentais .................................................................................... 62 4.2 Projeto de controle via microcontrolador ................................................................. 67 4.2.1 Estrutura de montagem..................................................................................... 67 4.2.2 Estrutura dos programas ................................................................................... 69 4.2.2.1 Programa de controle.................................................................................... 69 4.2.2.2 Programa de interface................................................................................... 71 4.2.3 Modelo.............................................................................................................. 74 4.2.3.1 Experimental................................................................................................. 74 4.2.3.2 Simulado....................................................................................................... 76 4.2.4 Resultados encontrados .................................................................................... 77 5 Conclusão e sugestões para trabalhos futuros .................................................................. 90 6 Referências Bibliográficas................................................................................................ 92 7 Apêndice........................................................................................................................... 94 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 6 RESUMO Aplicações em controle e automação vêm sendo objeto de estudos, tanto na universidade, como na indústria, tendo-se como metas a diminuição dos custos de produção, o aumento da precisão dos processos fabris e a monitoração de variáveis críticas, dentre outras. Este trabalho teve por objetivo estudar e implementar um dispositivo automatizado seguindo a tendência do chamado controle numérico computadorizado (CNC), destinado à área de fabricação mecânica, que demanda conhecimentos em mecânica de precisão, eletrônica, técnicas de informática e teoria de controle de sistemas dinâmicos. Palavras-chave: Automação Industrial, Mesa de Coordenadas XY, Microcontrolador, Fresadora, Encoder Incremental. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 7 ABSTRACT Applications on control and automation have been studied both in Academic and industrial areas, aiming the reduction of production costs, the increase of manufacturing process accuracy and the surveillance of critical variables. The main purpose of this work was the study and implementation of an automated device, following the concepts of CNC machines, applied to the branch of mechanic manufacturing areas, which demands fine mechanics, electronic, computer techniques and dynamic systems control theory. Keywords: Industry Automation, XY Table, Microcontroller, Milling Machine, Incremental Encoder, UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 1 8 Introdução Aplicações em controle e automação vêm sendo objeto de estudos tanto na área universitária quanto na industrial. Podem-se destacar como exemplos a otimização de custos de produção, monitoração de variáveis críticas e aumento da velocidade de produção. As pesquisas no setor de automação exigem elevado grau de interdisciplinaridade envolvendo as áreas de mecânica de precisão, elétrica, eletrônica e computação. O domínio das técnicas de controle digital é um facilitador, em especial para o engenheiro mecânico atuar na área de automação industrial. Existem variadas técnicas de automação de sistemas, dentre elas pode-se destacar a CNC (Computer Numeric Control ou Controle Numérico Computadorizado). Esta utiliza um tipo de controlador numérico empregado nos centros de usinagem permitindo controle de vários eixos através de uma lista pré-determinada de instruções formada por letras e números (código G). Tais procedimentos envolvem comandos de movimentação, posicionamento, velocidade, freqüências de rotação, entre outros. O advento das máquinas CNC transformou radicalmente o setor industrial, uma vez que facilitou todo processo de fabricação tornando-o mais rápido e com menos erros, aumentando a margem de lucro nas indústrias. Existem diversos tipos de processos de fabricação que podem ser automatizados, podem-se destacar: Eletro erosão, fresadora, furadeira, jato d’água, oxicorte e torno. A fresadora é uma máquina derivada do torno mecânico cujo desenvolvimento ocorreu a partir de certas dificuldades em se conseguir executar determinados tipos de usinagem, tais como desbaste de metal e cortes de peças [1]. Em resumo, a fresadora é a máquina cuja ferramenta, denominada fresa, apresenta um movimento de rotação que tem como objetivo arrancar material da peça de trabalho em forma de cavaco, a fim de obter uma peça final com dimensões, forma geométrica e acabamento superficial desejados. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 9 Existem diferentes configurações de fresadoras, as mais comuns são: vertical, horizontal, e horizontal de coluna móvel. Este projeto tem como base uma fresadora do tipo vertical que pode ser observada na Figura 1.1. Figura 1.1 :Representação de uma fresadora, com o eixo z parcialmente montado. A fresa é um sólido de revolução que possui vários dentes cortantes que trabalham de forma intermitente, o que facilita o resfriamento dos mesmos durante o tempo em que não arrancam o material. As fresas podem ser de diversos tipos, cada qual aplicada a uma determinada tarefa. Figura 1.2: Diferentes tipos de fresas UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 1.1 10 Motivação No ano de 2000, foi concebida a estrutura de uma fresadora, além disso, um sensor de posição angular foi construído com sucesso no ano de 2002. Na seqüência, este trabalho teve como principal motivação dar continuidade ao desenvolvimento de um equipamento de fácil manuseio e manutenção, que possa ser alvo de estudos relacionados à automação industrial, utilizando microcontroladores e técnicas de controle digital, tanto dentro do curso de graduação quanto no nível de pós-graduação em engenharia mecânica. 1.2 Trabalhos relacionados Como já mencionado e devido ao fato da Universidade Federal Fluminense não possuir uma máquina de controle numérico foi iniciado um estudo, no ano de 2000, visando o desenvolvimento de uma máquina fresadora CNC (Computer Numerical Control). O primeiro passo foi o estudo e a fabricação de parte da mesa de coordenadas com dois graus de liberdade [2]. Num segundo momento foi realizado um trabalho envolvendo o terceiro grau de liberdade da mesa [3]. Em seguida foi feito um estudo dos sensores necessários para a máquina, através do projeto de um encoder incremental [4]. Finalmente foi apresentado um servo-motor de corrente contínua, cujos movimentos de rotação foram monitorados pelo encoder incremental [5]. 1.3 Proposta e objetivo do trabalho O objetivo deste trabalho é apresentar duas diferentes abordagens de automação. A primeira é controlar um eixo da mesa de coordenadas com o auxílio exclusivo de um computador. A segunda é controlar dois eixos da mesa de coordenadas utilizando um microcontrolador modelo AVR do fabricante Atmel. Vale ressaltar que o terceiro grau de liberdade, eixo Z da mesa, não foi incluído neste projeto. Nas abordagens citadas, implementaram-se controladores de posicionamento na função de referência do tipo degrau e controladores de posicionamento na função de referência do tipo rampa até uma posição definida. Através de programas de simulações validaram-se modelos matemáticos que possibilitaram comparações com o sistema de UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 11 controle utilizado no processo real. 1.4 Estrutura do texto A dissertação está organizada de acordo com a estrutura que segue: O Capítulo 2 explica o cenário em que se insere o desenvolvimento do trabalho, mostrando de forma superficial os principais componentes utilizados na montagem, tanto da estrutura mecânica quanto da eletro-eletrônica. No Capítulo 3 foi dada uma nova visão da estrutura do trabalho com base na teoria clássica de sistemas lineares, tendo como relevância uma abordagem mais aprofundada de certos componentes. Os resultados experimentais do trabalho são mostrados no Capítulo 4, onde se podem comparar resultados. O Capítulo 5 propõe trabalhos futuros e apresenta as conclusões. No Apêndice são apresentados os códigos fontes referentes à automação via computador e via microcontrolador, além dos detalhes da placa de acionamento do motor de corrente contínua que foi fabricada exclusivamente para o trabalho. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 2 12 Cenário Este capítulo tem por objetivo ambientar o leitor no cenário para o desenvolvimento de máquinas CNC, mais especificamente dos componentes que formam a mesa de coordenadas xy e suas principais funções. Esta abordagem segue padrões visuais, para que se possam distinguir os diferentes elementos que compõem o projeto. 2.1 Estruturas Gerais Para um entendimento inicial das disposições dos elementos que compõem o projeto da mesa xy, foram organizadas quatro estruturas: • Mecânica • Eletroeletrônica • Interface • Programas 2.1.1 Mecânica A estrutura mecânica é composta por diversos elementos, os principais estão em destaque na Tabela 2.1. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 13 Tabela 2.1: Principais componentes da estrutura mecânica Peças Quantidade Componentes Fundidos Guias Lineares 04 Fusos de esferas 02 Motores CC 02 Polias 02 Correias 02 Encoders 02 Rolamentos 04 03 A Figura 2.1 mostra os componentes da mesa xy que apresenta as seguintes características: Tampo da mesa X Y Motor Sela Encoder Base Fuso de esferas Figura 2.1: Foto da mesa xy Guia linear UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 14 Na mesa foi adotado um sistema de coordenadas de referências, mostrado na Figura 2.1, onde o eixo x está disposto em paralelo ao maior comprimento da base, e o eixo y está disposto perpendicular ao mesmo. Vale ressaltar que o ponto de origem desse sistema de coordenadas é flutuante, pois é um dado que pode ser modificado no programa de implementação do controle da mesa xy. 2.1.1.1 Componentes Fundidos Os componentes fundidos citados na Tabela 2.1 referem-se a três diferentes peças: base, sela e o tampo da mesa que são mostrados na Figura 2.1 e foram fundidas e usinadas pela empresa THIESSEN Fundições. Os fundidos foram montados na Universidade Federal Fluminense em conjunto com diversos outros itens: fusos de esferas, patins, motores e encoders. 2.1.1.2 Fusos Transformam velocidade angular em linear. Os fusos utilizados foram fabricados e doados pela NSK para a Universidade Federal Fluminense. Na Figura 2.2 tem-se, em destaque, um fuso de esferas. Cada grau de liberdade utiliza um desses fusos. As esferas que circulam dentro dele servem para reduzir o atrito entre o eixo e a porca do fuso. Figura 2.2: Corte de um fuso de esferas recirculantes [6], ao lado o desenho da porca do fuso utilizado na mesa. 2.1.1.3 Guias lineares Trabalham em conjunto com o fuso de esferas impedindo que a parte linear do UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 15 deslocamento faça movimentos de rotação ao redor do fuso. Também possuem esferas que circulam entre o trilho e o patim. O peso de todo conjunto é distribuído entre os fusos e as guias lineares. Normalmente se utilizam dois pares de guias lineares para cada par de fusos de esferas. Figura 2.3: Desenho em corte de um patim de uma guia linera [6] 2.1.1.4 Motores Trata-se de servo motores de corrente contínua de 1.2 HP de potência nominal, e de 90 volts de tensão nominal; eles possuem um rotor com ímãs permanentes e são controlados pela corrente de armadura. Através dos motores geramos o torque necessário para a movimentação dos eixos sem fim e com ele todo o conjunto móvel. A Figura 2.4 mostra um dos motores utilizados. Figura 2.4: Foto de um dos motores UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 16 2.1.1.5 Polias e correias As polias e a correia trabalham em conjunto, transferindo potência de um eixo para outro. No caso da mesa xy, o conjunto transfere potência do motor para o eixo sem fim, como podemos observar na Figura 2.5. Figura 2.5: Foto da redução motor - fuso A equação (2.1) rege o princípio de transferência dessa potência. Como a velocidade tangencial na maior distância radial das polias é igual e os seus raios são diferentes, existe uma variação na velocidade angular entre as polias e, conseqüentemente, uma variação de torque entre elas. A polia menor possui grande velocidade angular, mas baixo torque. A polia maior possui grande torque, mas baixa velocidade angular. • Pot mec = τ × θ Onde: Potmec = Potência Mecânica τ • = Torque θ = Velocidade Angular (2.1) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 17 As correias utilizadas são trapezoidais do tipo fracionárias, que solucionam os problemas de sistemas de transmissão com espaço reduzido e necessidade de grandes raios de curvatura. Proporcionam pequeno arco de contato com a polia e a redução dos diâmetros, eliminando também a necessidade de pré-tensão. 2.1.1.6 Encoder O encoder é um dispositivo capaz de medir o deslocamento angular de um eixo ou fuso, funcionando como um transdutor que converte rotação em pulsos elétricos. Abaixo se tem a imagem do modelo tridimensional desenvolvido especialmente para a mesa xy [4]. Figura 2.6: Imagens do modelo tridimensional de um dos encoders. Foram projetados dois encoders para a mesa xy um para cada grau de liberdade. 2.1.2 Eletroeletrônica O conjunto eletroeletrônico é dado por diferentes componentes: • Placas de potência; • Placas de tratamento de sinais do encoder; • Placas de acionamento dos motores; UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC • Cabos, estabilizadores e conectores; • Computador PC; • Microcontrolador AVR. 18 Os componentes da Figura 2.7 e Figura 2.8, localizados próximos à estrutura mecânica, se comunicam por diversos cabos do tipo flat, blindado e conectores. Figura 2.7: Foto de parte do conjuntos eletro eletrônico Figura 2.8: Cabo de transição e uma placa para um encoder Na Figura 2.8, a foto da esquerda mostra um cabo que possui uma entrada para um encoder, uma conexão com a porta paralela e um conector por onde saem os sinais gerados por essa porta paralela, esse cabo é utilizado na montagem para o controle da mesa em um UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 19 grau de liberdade apenas pelo PC. Na foto da direita tem-se a placa utilizada por um encoder incremental. Vale ressaltar que as placas de circuito impresso foram fabricadas na própria universidade, através de elementos corrosivos, com exceção da placa onde se localiza o microcontrolador que foi uma doação do Laboratório de Controle e Automação do Departamento de Elétrica da Coordenadoria do Programa de Pós Graduação em Engenharia (COPPE), da Universidade Federal do Rio de Janeiro. 2.1.3 Interface Para realizarmos um controle do tipo digital, é muito importante utilizarmos uma interface adequada. Os principais elementos que compõem a interface homem máquina do projeto são: • Monitor de vídeo • Mouse • Teclado • Joystick do tipo manche 2.1.4 Programas (Softwares) • Turbo C++ Versão 3.0 • Borland C++ Builder 6.0 • Codevision V1.24.0 • DOS 6.22 • MatLab Versão 6.5 • Windows 2000 com acesso a porta serial. No caso do Borland C++ Builder 6.0, é necessária a instalação de um programa para habilitar a utilização das instruções de programação do joystick, e para o caso do Windows 2000, para se ter acesso direto à porta serial, é necessário instalar o programa UserPort, esse aplicativo pode ser facilmente encontrado na internet [7]. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 3 20 Estrutura de Controle Este capítulo tem por finalidade abordar o projeto da mesa xy segundo a teoria de controle clássico para sistemas lineares. 3.1 Controle em malha fechada A Figura 3.1 representa uma estrutura de controle em malha fechada [8]. Tem-se que r(t) corresponde à entrada de referência, u(t) é a entrada da planta, e y(t) é a saída a ser controlada. Planta é o sistema que se deseja controlar, considerado invariante. A maneira de controlar o sistema se dá configurando os parâmetros de um controlador. O controlador, em um sistema de malha fechada, recebe tanto a informação da saída da planta y(t) quanto da entrada de referência r(t). Em função dos valores de y(t), r(t) e dos parâmetros do controlador é determinado o valor da entrada u(t) da planta. Figura 3.1: Estrutura de controle em malha fechada UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 21 Para um melhor entendimento do controlador, pode-se reestruturar a malha de controle, incluindo detalhes que antes estavam ocultos no controlador. Figura 3.2: Estrutura com detalhes internos do controlador Pode-se dividir o controlador basicamente em três elementos: • Compensador em série • Atuador • Compensador em realimentação Cada qual possui características distintas e tem papel fundamental para a configuração de um controlador. Seguindo essa linha de raciocínio podem-se fazer comparações entre termos gerais da teoria com os elementos que compõem a mesa xy. Além disso, são abordados conceitos na área de controle. 3.1.1 Planta É o sistema a ser controlado, constituído por dispositivos mecânicos e elétricos podendo ser parte de um equipamento ou apenas um conjunto de componentes de um equipamento que funcione de maneira integrada, com o objetivo de realizar determinada operação [9]. A fim de um melhor entendimento da planta que será utilizada neste trabalho, UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 22 seguem as descrições dos seus principais componentes. 3.1.1.1 Fuso O início do conceito da planta está no estudo do eixo de esferas circulantes (sem fim). Basicamente transforma-se movimento de rotação de um servo motor elétrico em um movimento linear da mesa. Considerando um fuso convencional (de atrito), a relação entre o torque aplicado e a força axial depende do sentido de rotação [10]. TD = F ⋅ dm ⎛⎜ l + π ⋅ f ⋅ dm ⎞⎟ 2 ⎜⎝ π ⋅ dm − f ⋅ l ⎟⎠ (3.1) TE = F ⋅ dm ⎛⎜ π ⋅ f ⋅ dm − l ⎞⎟ 2 ⎜⎝ f ⋅ l − π ⋅ dm ⎟⎠ (3.2) Onde: TE = Torque no sentido oposto de F (regra da mão direita) TD = Torque no sentido de F (regra da mão direita) F = Carga suportada pelo eixo UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 23 dm = diâmetro médio f = coeficiente de atrito da rosca l = passo do fuso No caso do fuso de esferas, o coeficiente de atrito f é muito pequeno podendo assim reduzir as duas equações (3.1) e (3.2) a: T = F ⋅l 2 ⋅π (3.3) Figura 3.3: Eficiência mecânica de um fuso de atrito comparado com o de esferas recirculantes [11]. Sabe-se que: ∑F = m⋅a Onde m = massa deslocada pelo fuso a = aceleração linear da massa Desenvolvendo a equação (3.4) tem-se: (3.4) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC •• 24 (3.5) F = m⋅ x Onde x = deslocamento linear da massa Substituindo a equação (3.5) na equação (3.3) tem-se que: •• m ⋅ x⋅ l T = 2 ⋅π (3.6) Entretanto: x= θ ⋅l (3.7) 2π Onde θ = deslocamento angular do fuso Como l e π são constantes, pode-se derivar a equação (3.7): •• •• x= θl (3.8) 2π Aplicando-se a equação (3.8) na (3.6): •• m TL = θl 2π l (3.9) 2π Onde TL é o torque necessário para movimentar a massa. ⎛ l TL = m⎜⎜ ⎝ 2π 2 ⎞ •• ⎟ θ ⎟ ⎠ Devem-se ainda considerar as inércias do fuso e da polia. A equação (3.10) deve ser reescrita da seguinte forma: (3.10) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC ⎡ 2⎤ ⎛ l ⎞ ⎥ •• ⎢ TL = ⎢ J fuso + J polia + m⎜⎜ ⎟⎟ ⎥ θ ⎝ 2π ⎠ ⎥ ⎢ ⎣ ⎦ 25 (3.11) 3.1.1.2 Motor de corrente contínua Para entender o funcionamento de um motor de corrente contínua é necessário conhecimento dos conceitos de campo elétrico e força magnética. Uma carga elétrica cria um campo elétrico, quer esteja em repouso quer esteja em movimento [12]. Entretanto, somente estando em movimento a carga cria campo magnético. Um campo magnético pode ser gerado por: a) Um imã permanente - os elétrons giram sobre si mesmos e circulam nos átomos de ferro que constituem o imã. b) Um eletroímã - os elétrons se movimentam através das bobinas enroladas sobre um núcleo ferro magnético. Além disso, uma partícula com uma carga positiva +q, movendo-se com velocidade v, através de um campo magnético B, sofre uma força defletora magnética FB, segundo a equação (3.12). FB = qv × B Onde: FB = Força magnética q = carga do elétron v = velocidade da carga elétrica B = campo magnético (3.12) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 26 Figura 3.4: Representação de uma partícula sofrendo a ação de uma força magnético Sabe-se que a carga transferida (dq) pela corrente (i) durante um intervalo de tempo (dt) é dada pela equação (3.13). dq = idt (3.13) Considerando um fio de comprimento L, os elétrons nesta seção do fio, irão deslocarse por um plano perpendicular ao mesmo num intervalo de tempo igual a L / v , transportando uma carga dada pela equação: q = i( L / v) (3.14) Substituindo a equação (3.14), na equação (3.12) tem-se que: FB = iLB (3.15) Caso o campo magnético não seja perpendicular ao fio, a força magnética é dada por: FB = iL × B Onde L (3.16) é um vetor dirigido ao longo do segmento de fio no sentido da corrente. O princípio de funcionamento de um motor de corrente contínua é um campo magnético exercendo uma força sobre um emaranhado de fios que transportam corrente (enrolamento de armadura ou induzido) fazendo girar o eixo do motor. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 27 Figura 3.5: Bobina retangular transportando uma corrente i num campo magnético uniforme. Um torque age para alinhar o vetor normal n com a direção do campo. Considerando a bobina na posição em que o vetor unitário n, normal ao seu plano, faz um ângulo θ com a direção do campo. O sentido de n é determinado pela regra da mão direita. A força resultante é a soma vetorial das forças que atuam sobre cada um dos quatro lados da espira. No lado 2, o vetor L da equação (3.16) aponta no sentido da corrente e tem módulo igual a b. O ângulo entre L e B para este lado é igual a 90° - θ. Assim o modo da força que atua sobre o lado 2 vale: F 2 = ibBsen (90° − θ ) = ibB cos(θ ) (3.17) Pode-se mostrar que a força F4, que atua sobre o lado 4 tem o mesmo módulo que F2, mas aponta no sentido oposto. Assim sendo, as forças F2 e F4, tomadas em conjunto, não podem ocasionar qualquer movimento da espira, pois não só a resultante dela é igual a zero, como também é nula a resultante dos seus torques, visto terem elas a mesma linha de ação. Para os lados 1 e 3, as forças F1 e F3, têm módulos iguais a iaB e sentidos opostos, não podendo ocasionar o movimento do centro de massa da espira. Contudo, estas duas forças não possuem a mesma linha de ação e assim elas fazem a espira girar em torno do eixo, pois existe um torque resultante dado por: τ ´= iabBsen θ (3.18) Este torque atua sobre cada espira da bobina. Como existem N espiras, o torque total UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 28 é igual a: τ = NiabBsen θ = ( NiA )Bsenθ (3.19) Onde A é a área da bobina. As grandezas entre parênteses estão assim agrupadas, pois todas elas constituem propriedades da bobina: seu número de espiras, sua área e a corrente que a percorre. Figura 3.6: Representação simplificada do funcionamento de uma espira de um motor de corrente contínua A Figura 3.6 representa o funcionamento de uma espira de um motor de corrente contínua onde duas forças magnéticas se combinam para exercer um torque sobre uma bobina de corrente, tendendo a girá-la em torno do eixo central. O motor de corrente contínua é constituído basicamente por três partes: 1. Rotor 2. Estator 3. Escovas O rotor ou armadora é a parte girante, montada sobre o eixo da máquina, construído de um material ferromagnético envolto em um enrolamento chamado de enrolamento de armadura, este enrolamento suporta uma alta corrente no anel comutador. O estator ou campo é a parte estática da máquina, montada em volta do rotor, de forma que o mesmo possa girar internamente, também constituído de material ferromagnético UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 29 envolto em um enrolamento de baixa potência chamado de enrolamento de campo, que tem a função apenas de produzir um campo magnético fixo para interagir com o campo da armadura. As escovas servem para a condução de energia para o rotor. 3.1.1.3 Modelo da planta A Figura 3.7 mostra a planta do projeto mesa xy. O motor de corrente contínua controlado pela armadura aciona a polia menor, que através de uma correia aciona a polia maior. A polia maior está montada no fuso de esferas que, ao girar, converte o deslocamento angular do eixo em deslocamento linear. Pode-se utilizar como saída do sistema tanto a rotação θ quanto o deslocamento linear x . Figura 3.7: Esquema representativo da planta da mesa xy Nessa etapa do estudo foi utilizada a análise angular. Temos como dados do problema: ei = Tensão atuante na armadura do motor L = Indutância do motor R = Resistência elétrica do motor UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 30 θm = Deslocamento angular do eixo do motor Jm = Momento de inércia do eixo do motor T = Conjugado desenvolvido pelo motor TL = Conjugado desenvolvido sobre o eixo principal b = Coeficiente de viscosidade do sistema JL = Momento de inércia do conjunto: polia maior, eixo e carga x = Deslocamento linear da mesa θ = Deslocamento angular do fuso de esferas Definindo a corrente na armadura do motor tem-se: L dia dθ m + Ria + | K b dt = ei (3.20) dt Aplicando a transformada de Laplace na equação (3.20) tem-se: (Ls + R )I a (s ) + K b sΘ m (s ) = Ei (s ) (3.21) Onde Kb é a constante da força contra eletromotriz. Além disso, •• ∑Torques = J m θ m (3.22) O somatório dos torque atuantes é dado pela equação (3.23). ∑ Torques = T m −T (3.23) Aplicando a equação (3.23) na equação (3.22) tem-se que: •• J m θ m + T = Tm (3.24) Tm = Kia (3.25) Substituindo a equação (3.25) na equação (3.24) tem-se que: UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC •• J m θ m + T = Kia 31 (3.26) Sabe-se também que: T= θ T θm L (3.27) θ θm (3.28) n= • T •• = bθ + J L θ L (3.29) Substituindo as equações (3.28) e (3.29) na equação (3.27) tem-se: • •• T = n(bθ + J L θ ) (3.30) Substituindo a equação (3.30) na (3.26) tem-se: •• Jm θ m + nJ •• L • θ + nb θ = Ki a (3.31) Derivando e arrumando a equação (3.28): •• •• θm = θ (3.32) n Aplicando a equação (3.32) na (3.31): •• Jm Ou seja: θ n •• • + nJ L θ + nbθ = Kia (3.33) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC •• •• • J m θ + n 2 J L θ + n 2 b θ = nKi (J m (3.34) a + n J L )θ + n bθ = nKia 2 •• • 2 32 (3.35) Onde K é a constante de torque do motor e ia é a corrente na armadura. Aplicando a transformada de Laplace à equação (3.35) tem-se: (J ) ( ) + n 2 J L s 2 Θ( s)+ n 2b sΘ( s) = nKI a ( s) m (J ( s) = Ia m ) s 2 + n 2 J L s 2 + n 2bs Θ( s) (3.36) (3.37) nK Substituindo a equação (3.37) na equação (3.21): (Ls + R ) (J m ) s 2 + n 2 J L s 2 + n 2bs Θ( s ) nK + K b sΘ m ( s ) = Ei ( s) (3.38) Aplicando a transformada de Laplace na equação (3.32): Θ m ( s) = Θ( s ) (3.39) n Combinando as equações (3.39) e (3.38): (Ls + R ) (J m ) s 2 + n 2 J L s 2 + n 2bs Θ( s) nK [(Ls + R )(J m ) + Kb s ] Θ( s ) n = Ei ( s ) + n 2 J L s 2 + n 2b + KK b s Θ( s) = nKEi ( s) (3.40) (3.41) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC Θ(s) Ei ( s) = [ nK ( ) s (Ls + R ) J m + n J L s + n b + KKb Θ(s) Ei ( s) = 2 2 ] N 33 (3.42) (3.43) A´s + B´s + C´s 3 2 Ou seja, a equação (3.43) é uma equação de terceira ordem. ⎛ L⎞ Como, em geral, a constante de tempo elétrica ⎜⎜ ⎟⎟ é menor do que as constantes de ⎝ R⎠ tempo mecânicas, esta função pode ser aproximada para uma outra de segunda ordem. Isto será verificado experimentalmente. Logo, a equação (3.42) pode ser representada como: Θ(s) Ei (s) = (J nK m ) ( ) (3.44) R + n J L R s + n b + KKb s 2 2 2 Ou seja: Θ( s) Ei ( s) = C (3.45) As + Bs 2 Onde: A = ( J m R + n 2 J L R) B = n 2b + KK b C = nK K = Constante de torque Kb R = Constante de força contra-eletromotriz = Resistência elétrica do motor (3.46) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC Jm = Momento de inércia do rotor JL = Momento de inércia da carga acionada n 34 = relação entre diâmetros 3.1.2 Compensador em realimentação Para que aconteça a realimentação do sistema, é necessário o uso de um encoder incremental. Ele realimenta o sistema com pulsos de interrupção, que ao serem avaliados pelo processador permitem obter a distância percorrida pela mesa e a sua direção, ou seja, o encoder é um transdutor que converte um movimento angular ou linear em uma série de pulsos digitais elétricos. O encoder incremental do tipo angular consiste em um disco, que apresenta janelas transparentes e opacas, fixado em um eixo cuja extremidade está conectada ao eixo de estudo. Num dos lados do disco é colocado um fotoreceptor e do outro lado um diodo emissor de luz. Quando o disco gira, as janelas ora interrompem ora permitem a passagem de luz gerando pulsos. Figura 3.8: Representação de um encoder incremental do tipo angular [13]. A estrutura do encoder utilizado neste trabalho é simples. Trata-se de três pares de emissores e receptores infravermelhos, onde o feixe de luz gerado pelo diodo emissor pode ser bloqueado por uma máscara opaca, localizada entre o emissor e o receptor. As características da máscara usada definem a resolução do equipamento que, nesse caso, corresponde a um do tipo incremental com nove graus de resolução. Os três pares receptor/emissor geram em suas saídas, três canais distintos: dois canais (A e B) defasados UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 35 90º entre si, onde se obtém informações de direção e posição em relação ao ponto de partida. O encoder também fornece o 3º canal (C), de um pulso por volta, entretanto esse canal não está sendo utilizado neste trabalho. Figura 3.9: Seção do disco utilizado para a leitura do encoder incremental com nove graus de resolução. Para uma leitura digital dos sinais gerados pelo encoder é necessário uma forma de onda quadrada com amplitude de 5 volts, entretanto os sinais que saem do encoder não possuem tais características. Para a digitalização dos sinais utilizou-se a placa mostrada na Figura 3.10. Figura 3.10: Placa de tratamento de sinais do encoder e alguns dos sinais de saída da placa. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 36 Na Figura 3.11 pode-se observar o esquema da montagem da placa de tratamento dos sinais do encoder. Figura 3.11: Desenho esquemático da placa de tratamento de sinais do encoder. Onde: U1, U2 = LM358, amplificador operacional U3 = 4093, portas NAND Schmitt Trigger U4 = 4077, portas XNOR R1, R2, R3, R4, R5, R6, R14, R15, R16 = resistores de 10 kΩ R11, R12, R13 = resistores de 470 Ω R10 = 100 Ω R9, R7 = 1 kΩ R8 = 1 MΩ O amplificador operacional é usado como um comparador de tensão no circuito. Quando a saída do sensor de infravermelho ultrapassa 2,5V, marca determinada pelo divisor de tensão formado pelos resistores R2 e R3, a saída do LM358 vai ao nível baixo de tensão, UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 37 que é entregue a entrada do CI 4093 onde o sinal adquire a forma de onda quadrada, graças à função Schmitt Trigger de suas portas. Nesse momento se tem a leitura dos três sinais A, B e C por qualquer entrada digital. Porém, para garantir a correta leitura e interpretação dos sinais adicionando uma maior eficácia ao software, foi desenvolvido um quarto canal (D), onde temse em sua saída, um sinal baixo (0 volt) de duração dt, que indica que uma mudança de estado nos canais A e B ocorreu e que, em tal momento, deve ser realizada a leitura desses canais. Com isso pode-se, com apenas um pino de interrupção (canal D), gerenciar os três canais do encoder. Para gerar D, colocou-se A e B nas entradas de uma porta XNOR do CI 4077 gerando um sinal O. Tal sinal foi dividido em duas partes. Uma foi direcionada a uma entrada de outra porta XNOR do mesmo CI, enquanto a outra sofreu um pequeno retardo gerando um sinal O’. Na saída dessa porta lógica tem-se o canal D. Figura 3.12: Disposições dos canais utilizados 3.1.3 Compensador em série Existem diversos tipos de compensadores em série, sendo enfoque deste trabalho os controladores industriais proporcionais, derivativos e integrativos. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 38 3.1.3.1 Controladores Industriais Pode-se classificar os controladores industriais basicamente da seguinte forma [9]: • Controlador Liga-Desliga (ON-OFF); • Controlador Proporcional (P); • Controlador Integral (I); • Controlador Proporcional-Integral (PI); • Controlador Proporcional-Derivativo (PD); • Controlador Proporcional-Integrativo-Derivativo (PID); A maioria dos controladores utiliza eletricidade ou fluidos sobre pressão como fontes de potência. Assim, os controladores podem ter suas funções de transferência implementadas através de circuitos eletrônicos, circuitos hidráulicos e pneumáticos. Entretanto, é cada vez mais comum a utilização de controladores digitais em conjunto com conversores eletrohidráulicos ou eletro-pneumáticos caso sejam necessários [9]. 3.1.3.1.1 Controlador liga-desliga (ON-OFF) Nesse sistema de controle, o elemento de atuação possui apenas duas posições fixas, ou seja, o dispositivo fornece apenas dois valores na saída. A grande utilização deste tipo de controlador pode ser justificada pela simplicidade da sua construção e pelo seu baixo custo. O controlador Liga-Desliga pode ser equacionado da seguinte forma: seja u(t) o sinal de saída do controlador e e(t) o sinal de erro. O sinal de saída u(t) permanece no valor máximo ou mínimo, dependendo se o valor do erro é positivo ou negativo, de tal forma que: ⎧U para e(t ) > 0 u (t ) = ⎨ 1 ⎩U 2 para e(t ) < 0 (3.47) Onde U1 e U2 são constantes. O valor mínimo de U2 é em geral igual a zero ou -U1. Tais controladores são, em geral, implementados através de dispositivos elétricos, principalmente válvulas solenóides. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 39 3.1.3.1.2 Controlador proporcional O valor de saída do controlador é modificado a uma taxa de variação proporcional ao sinal de erro atuante, de forma que o controlador proporcional é regido pela equação (3.48). u (t ) = K p e(t ) (3.48) Onde Kp é o ganho proporcional. Ou, na forma da transformada de Laplace, U ( s) = Kp E ( s) (3.49) 3.1.3.1.3 Controlador integral A derivada temporal do valor de saída do controlador é modificada a uma taxa de variação proporcional ao sinal de erro atuante, ou seja: du (t ) = K i e(t ) dt (3.50) Integrando a equação (3.50) tem-se: u (t ) = t ∫ K e(t )dt 0 i (3.51) Sabendo que Ki é uma constante, pode-se simplificar a equação (3.51). t u (t ) = K i ∫ e(t )dt 0 Onde Ki é o ganho integral do sistema. Ou, na forma da transformada de Laplace, (3.52) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC K U (s) = i E ( s) s 40 (3.53) 3.1.3.1.4 Controlador proporcional-integral O controlador proporcional integral é uma combinação dos controladores proporcional e integral, sendo regido pela equação (3.54): u (t ) = K p e(t ) + Kp Ti t ∫ e(t )dt 0 ⎛ 1 ⎞ U (s) ⎟⎟ = K p ⎜⎜1 + E (s) T s i ⎠ ⎝ (3.54) (3.55) A função de transferência é dada pela equação (3.55), que pode ser simplificada da seguinte forma: t u (t ) = K p e(t ) + K i ∫ e(t )dt (3.56) K U (s) = Kp + i E (s) s (3.57) 0 Onde Ki = Kp / Ti 3.1.3.1.5 Controlador proporcional-derivativo O controlador proporcional derivativo é uma combinação dos controladores proporcional e derivativo, sendo regido pela equação (3.58): u (t ) = K p e(t ) + K p Td de(t ) dt (3.58) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 41 A função de transferência é dada pela equação (3.59): U (s) = K p (1 + Td s ) E (s) (3.59) U ( s) = K p + Kd s E (s) (3.60) Onde Kd = Kp x Td 3.1.3.1.6 Controlador proporcional-integral-derivativo Utiliza-se a ação combinada dos três controladores com o objetivo de obter o que há de melhor em cada um deles. A equação (3.61) que rege o controlador PID é apresentada abaixo: u (t ) = K p e(t ) + Kp Ti t ∫ e(t )dt + K pTd 0 de(t ) dt ⎞ ⎛ 1 U (s) = K p ⎜⎜1 + + Td s ⎟⎟ E (s) ⎠ ⎝ Ti s (3.61) (3.62) A função de transferência do controlador PID é representada pela equação (3.62) que pode ser transformada nas equações (3.63) e (3.64). t u (t ) = K p e(t ) + K i ∫ e(t )dt + K d 0 K U (s) = K p + i + Kd s E (s) s de(t ) dt (3.63) (3.64) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 42 3.1.4 Atuador O atuador, neste caso o acionamento eletrônico, fornece a tensão elétrica ao motor. O mesmo é constituído por um conjunto de quatro IGBT’s (Insulated Gate Bipolar Transistor), controlados com um padrão de chaveamento do tipo PWM (ver seção 3.1.4.1), numa configuração denominada de ponte H, a qual pode ser governada por um microcomtrolador ou um microcomputador via uma interface de disparo (driver). Os IGBT’s utilizados no projeto são capazes de fornecer até 600 volts e 23 amperes. 3.1.4.1 PWM PWM é a abreviação de Modulação de Largura de Pulso ou Pulse Width Modulation. Através do PWM pode-se variar o valor da transferência de potência entregue a uma carga sem as perdas ocorridas normalmente devido à queda de tensão por recursos resistivos. Esse método de disparo é utilizado para controle de velocidade de motores de corrente contínua. Um exemplo simples para o entendimento do funcionamento de um PWM está mostrado na Figura 3.13. Quando o interruptor está aberto, a potência aplicada é nula. No instante em que a chave é fechada, a potência transferida é máxima. Caso a chave seja fechada e aberta rapidamente, pode-se, dependendo do tempo que essa chave estiver aberta ou fechada, definir a potência transferida para a carga. Neste caso 0% de PWM corresponde a 0% de potência aplicada à carga, e 100% de PWM corresponde a 100% de potência aplicada à mesma. Figura 3.13: Funcionamento básico de um tipo de PWM UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 43 Figura 3.14: Gráfico tensão versus tempo do PWM mostrado na Figura 3.13 Onde T é o período do PWM e t é a variável que controla o sistema. O valor de T é fixo e o valor de t pode variar, dependendo da quantidade de energia que se deseja entregar ao sistema. No projeto mesa xy utiliza-se um PWM diferente do anterior. A tensão varia entre a máxima tensão negativa e a máxima positiva, em uma dada freqüência pré programada, Figura 3.15. Esse PWM é conhecido como anti-fase ou Locked anti-phase. Considerando t1 o tempo que as chaves estão abertas em uma disposição, e t2 o tempo que as chaves estão abertas na disposição contrária à primeira. Se t1 for menor que t2 o motor gira num sentido, caso esse tempo se inverta, ou seja, t1 for maior que t2, o motor gira no sentido contrário. A forma de deixar o motor parado é fazer t1 = t2, para uma dada freqüência. Vale ressaltar que o motor não entra em curto, pois t1 não é igual a t2 no mesmo intervalo de tempo, isso significa que eles intercalam o período de ligação. A vantagem de utilizar-se o PWM do tipo anti-fase, se comparado ao tipo clássico é que existe a possibilidade de inversão dos eixos do motor com grande facilidade e, assim a programação do mesmo se torna menos complexa. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 44 Figura 3.15: Diagrama de funcionamento do PWM anti-fase Figura 3.16: Gráfico tensão versus tempo do PWM mostrado na Figura 3.15 Pela Figura 3.16 pode-se constatar que existe um desequilíbrio no tempo de abertura entre t1 e t2. Isso significa que existe uma tensão média efetiva que estará no campo positivo de tensão. 3.1.4.2 Placa de acionamento do motor Para uma melhor compreensão será explicado o funcionamento de apenas um dos graus de liberdade, pois o outro é uma réplica do primeiro. Esta seção dará uma visão geral do funcionamento da placa de acionamento do motor, o desenho geral da placa encontra-se no UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 45 capítulo dos Anexos. Na placa de acionamento do motor, utilizam-se dois modelos diferentes de drivers, SKHI20OP e o SKHI20OPA da Semikron, estas placas servem de proteção para os IGBTs, que são os transistores de alta potência. O SKHI20OP saiu de circulação e atualmente só se comercializa o SKHI20OPA. Eles possuem características semelhantes, a única diferença, explicada pela assistência técnica da Semikron, é que o SKHI20OPA precisou de dois resistores de 27 ohms e dois jumpers soldados nele. Vcc M1 A B Driver 1 C D Driver2 Figura 3.17: : Esquema resumido da atuação das placas SKHI20OP/A (driver 1 e 2) Cada driver aciona meia ponte H, necessitando de três alimentações, sendo duas de 25 volts e outra de 15 volts. Figura 3.18: Esquema representativo das fontes de alimentação de 25 volts Calcularam-se os valores de R1 e R2 da Figura 3.18 utilizando a fórmula contida na Figura 3.19 disponibilizada no manual do fabricante do componente LM317. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 46 Figura 3.19: Calculando os valores paras as resistências Os quatro pulsos que chegam do PC passam através de quatro acopladores óticos do tipo 4N25, para depois atingirem a parte de potência da placa de acionamento do motor. Essa é uma forma de proteção do circuito de controle de um eventual acidente. 3.2 Classificação de sistemas Podem-se classificar os sistemas de acordo com o seu desempenho em regime estático. Esta associação visa estimar os erros comparando a saída com a entrada de um sistema no caso da entrada em função degrau e no caso da entrada em função rampa. Seja o seguinte valor em malha aberta [9]. G ( s) = K (Ta s + 1)(Tb s + 1) K (Tm s + 1) s N (T1 s + 1)(T2 s + 1) K (T p s + 1) (3.65) O valor de N da equação (3.65) determina a classificação do sistema da seguinte forma: Sistema Tipo 0 → N = 0 Sistema Tipo 1 → N = 1 Sistema Tipo 2 → N = 2 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 47 Figura 3.20: Sistema em malha fechada. A função de transferência do sistema pode ser escrita da seguinte forma: G ( s) = K (Ta s + 1) (3.66) s N (T1 s + 1) E a função do erro do sistema pode ser escrita assim: E ( s) R( s) = 1− C ( s) R( s) = 1 1 + G ( s) (3.67) O erro estático de sistema pode ser calculado segundo a equação (3.68). eSS = lim e(t ) = lim sE ( s) = lim s t →∞ t →∞ t →∞ 1 R( s ) 1 + G( s) (3.68) Constante de erro de posição estático Kp. Para uma entrada a degrau R(s) = 1/s, o erro estático ess pode ser calculado como: eSS = lim s t →∞ 1 1 1 = 1 + G( s) s 1 + G (0) (3.69) A constante de erro estático de posição é definida como: K P = lim G ( s ) = G (0) t →∞ eSS = 1 1 + KP A equação (3.71) define o erro estático. Para um sistema do tipo (N = 0): (3.70) (3.71) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC K P = lim K s→∞ (Ta s + 1)(Tb s + 1) K (Tm s + 1) =K s 0 (T1 s + 1)(T2 s + 1) K (T p s + 1) 48 (3.72) Para um sistema do tipo 1 ou maior (N ≥ 1): K P = lim K s→∞ (Ta s + 1)(Tb s + 1) K (Tm s + 1) =∞ s N (T1 s + 1)(T2 s + 1) K (T p s + 1) (3.73) A Tabela 3.1 indica um resumo referente as tipos de sistemas e os erros para uma entrada em degrau. Tabela 3.1: Erro estático para entrada em degrau eSS = Sistema do Tipo 0 Sistema Tipo 1 ou 1 1 + KP eSS = 0 maior No caso de entrada em rampa tem-se que a constante de erro de velocidade estática é denominado Kv, e a entrada é do tipo R ( s ) = 1 s2 , pode-se assim calcular o erro estático como: ess = lim s →0 1 1 1 + G(s) s 2 = lim s →0 1 sG ( s ) (3.74) A equação (3.75) define a constante de erro de velocidade estático Kv. K v = lim sG ( s ) s →0 Assim ess pode ser definido como: ess = 1 Kv (3.75) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 49 Nos sistemas do tipo 0: K P = lim sK s→0 (Ta s + 1)(Tb s + 1) K (Tm s + 1) =0 s 0 (T1 s + 1)(T2 s + 1) K (T p s + 1) Nos sistemas do tipo 1: K P = lim sK s →0 (Ta s + 1)(Tb s + 1)K(Tm s + 1) =K s1 (T1 s + 1)(T2 s + 1)K(T p s + 1) Nos sistemas do tipo 2 ou maiores: K P = lim sK s →0 (Ta s + 1)(Tb s + 1)K(Tm s + 1) =∞ s N (T1 s + 1)(T2 s + 1)K(T p s + 1) A Tabela 3.2 indica um resumo referente os diversos tipos de sistemas e os erros para uma entrada em degrau. Tabela 3.2: Erro estático para entrada em degrau Sistema do Tipo 0 eSS = ∞ Sistema do Tipo 1 eSS = Sistema Tipo 2 ou maior 1 K eSS = 0 O estudo dos erros comparados ao sistema serve como referência da grandeza do erro que se tem de um sistema de controle com realimentação. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 4 50 Implementação da automação A partir deste capítulo, será apresentada toda a parte experimental do projeto de automação da mesa xy. Essa montagem foi um trabalho gradual que envolveu um alto grau de aprendizagem e tempo de pesquisa. Foram feitas duas abordagens diferenciadas a respeito da implementação: • Projeto de controle via computador (DOS) • Projeto de controle via microcontrolador (AVR) Cada projeto possui características específicas que serão abordadas nas seções a seguir. 4.1 Projeto de controle via computador (DOS) O primeiro passo no aprendizado foi o estudo de programação em linguagem C utilizando o computador como núcleo de programação. Para tal, utilizaram-se conceitos relacionados à interrupção e mudança na programação da BIOS (Basic Input/Output System). A estrutura do processamento é feita exclusivamente utilizando um computador simples do tipo PC, mais especificamente um Pentium 3, 400 megahertz. Para se ter uma dedicação exclusiva dos recursos computacionais existentes, foi necessário utilizar como sistema operacional um ambiente do tipo DOS 6.22 e o compilador Turbo C++ versão 3.0. Nesse estudo foi realizado o controle de apenas um dos graus de liberdade da mesa xy. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 51 4.1.1 Estrutura de montagem A Figura 4.1 representa um diagrama de blocos da montagem do sistema geral de funcionamento da automação do grau x da mesa de coordenadas. Têm-se quatro fontes de alimentação de tensão alternada de 127 volts. A primeira é utilizada para a fonte de alimentação da placa do encoder, a segunda é responsável pela alimentação do computador PC, a terceira alimenta a fonte da placa de acionamento do motor e a última alimenta a fonte do motor. O PC recebe sinais digitais provenientes da placa eletrônica do encoder, esses sinais são utilizados como realimentação do sistema. Do PC são gerados os sinais de controle em PWM, são quatro ao todo, ou seja, um para cada IGBT da placa de acionamento do motor. Tanto a leitura do encoder quanto a saída de sinais são feitas utilizando a porta paralela. A placa de acionamento do motor trabalha com quatro tensões contínuas de 25 volts e uma de 15 volts recebidas através das fontes de alimentação da placa de controle. Essas tensões são utilizadas para o perfeito funcionamento das placas SKHI20opA. Pode-se observar também a entrada de uma tensão contínua de 86 volts que é utilizada para gerar a potência necessária para o acionamento do motor. A modulação PWM controla os IGBTs para fornecer a potência necessária que movimenta os motores. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC Figura 4.1: Estrutura de blocos do projeto DOS 52 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 53 4.1.2 Estrutura do programa A tela do programa sendo executado é ilustrada na Figura 4.2. O programa nos oferece as seguintes possibilidades: • Ligar - liga o PWM (50%). Tecla de atalho: L; • Teste - grava pontos de 10 em 10 ms. Tecla de atalho: T; • Velocidade - segue uma rampa como entrada. É necessário entrar com uma posição e uma velocidade desejada. Tecla de atalho: V; • Salvar Arq. - salva os pontos gravados em arquivo de extensão txt. Tecla de atalho: B; • Parar - retorna o PWM para 50% (parada). Tecla de atalho: P; • Posicionar - controle de posição. É necessário entrar com a posição desejada. Tecla de atalho: C; • Zerar - zera os valores mostrados na tela, também reposiciona a origem do eixo de coordenas. Tecla de atalho: Z; • Cima - incrementa 2% de PWM quando a tecla seta para cima for pressionada. • PageUp - incrementa 10% de PWM quando a tecla PageUp for pressionada. • Cima - decrementa 2% de PWM quando a tecla seta para baixo for pressionada. • PageDown - decrementa 10% de PWM quando a tecla PageDown for pressionada. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 54 Figura 4.2: Tela exibida na execução do programa em DOS Além das opções de controle do programa, o programa disponibiliza em tela: • Deslocamento em rotações do eixo do encoder; • Distância percorrida pela mesa; • Quantidade de pontos que foram gravados durante um teste; • Barra variável, referente ao PWM; • Hora do sistema; • Direito de criar um nome para o arquivo gravado. Para o desenvolvimento do programa, foram cumpridas certas exigências de projeto: • Estar sempre realizando um controle do tipo Pulse Width Modulation (PWM) na saída da porta paralela • O PWM deve ser gerado a uma freqüência fixa pré-determinada, no caso foi calculado o valor de 360 hertz. • Quando o canal D do encoder solicitar a leitura, esta deve ser realizada com prioridade, a fim de evitar um erro na contagem dos pulsos; • De o programa principal realizar o controle em malha fechada, modificando o valor do ciclo de trabalho do PWM, automaticamente. Para realizar tais tarefas, utilizaram-se interrupções e um temporizador da placa mãe. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 55 4.1.2.1 Temporizador da placa mãe (Timer) As funções de temporização e contagem, usadas freqüentemente em processos de automação e de interfaces, podem ser fornecidas pela placa mãe do PC. O CI (circuito integrado) que desempenha tal função é o 8253 da Intel (ou similar), através de três canais, usando um clock de aproximadamente 1,19318 MHz, ou seja, uma contagem a cada 838,1 ηs. Desses três canais disponíveis, usou-se o canal 0 que é responsável pela temporização do sistema. Porém, a BIOS inicializa o contador 0 para operar em modo 3, com a contagem de 65535, ou seja, está programado como gerador de onda quadrada, com um divisor da freqüência do clock de 65535, gerando uma interrupção a cada 54,936 ms. Deve-se então reprogramar o 8253 para trabalhar em modo 2, que gera um pulso baixo ao final da contagem, e carregar o contador com um valor de 10. Assim tem-se interrupção a cada 8,381 μs aproximadamente, que é a unidade de tempo (UNIT_TIMER). Essa programação do modo é realizada através da escrita da palavra 034h no Registrador de Controle do Modo (endereço 043h). Após isso, deve-se carregar o divisor de freqüência (igual a 10) no endereço 040h. outportb(0x43,0x34); /* palavra de controle para operação em modo 2 */ outportb(0x40,10); /* envio do byte menos significativo do divisor */ outportb(0x40,0); /* envio do byte mais significativo do divisor */ 4.1.2.2 Interrupções Após a reprogramação do CI 8253 [14] para gerar a unidade de tempo UNIT_TIMER, o valor da freqüência a ser usada no PWM é configurada. Divide-se o período da onda em 255 níveis (1 byte), com a finalidade de uma melhor resolução de controle, e também visando facilitar a migração para um processamento microcontrolado. Tais modificações podem ser feitas apenas mudando o conteúdo da constante PERIODO que corresponde ao período da onda. A rotina de interrupção temporizada 1Ch verifica o estado lógico atual (alto ou baixo) do PWM. Caso ela alcance o número de UNIT_TIMERs determinado pelo ciclo de trabalho, ela continua incrementando um contador. Caso contrário, ela muda o estado atual da onda, zera o contador e recomeça a contagem, a cada nova interrupção, do tempo decorrido da parte complementar do ciclo ativo. Ao término da contagem, o PWM vai para o nível alto, o UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 56 contador é zerado e um novo ciclo se repete. A mudança do estado ou nível lógico se refere aos pinos da porta paralela que, quando reinicializados, oferecem essa opção na ponte H de IGBTs. Para uma rotação em sentido horário os pinos 2 e 4 (bits 0 e 2 do endereço 378h) são ligados e para o sentido inverso, os pinos 3 e 5 (bits 1 e 3 do mesmo endereço) são ligados. O nível lógico 0 é quando são zerados todos os pinos. Além da interrupção temporizada 1Ch, outra interrupção alterada é a IRQ7, localizada no pino 10 da porta paralela e no bit 6 do endereço 379h. Essa interrupção de hardware tem uma maior prioridade sobre a 1Ch e é usada como entrada do canal D do encoder, que indica o momento de leitura dos outros canais que estão localizados nos pinos 12, 13 e 15 (bits 3, 4 e 5, respectivamente, do endereço 379h). As leituras são feitas através do comando inportb, e a saída através de outportb. O fato do canal D estar em uma interrupção de maior prioridade do que a do timer constitui uma situação favorável para que não ocorram perdas nas leituras dos canais do encoder. Todo conteúdo original dos registradores é armazenado para que possa ser restaurado ao término do programa, o mesmo acontece nos timers através de um comando chamado EOI (fim de interrupção). O trecho abaixo foi retirado do programa desenvolvido para o trabalho. outportb(0x20,0x20); /* envio do comando EOI */ A linha de código com o redirecionamento da IRQ7: disable(); /* desabilita interrupções de hardware */ rotina_velha = getvect(0x0F); /* guarda manipulador antigo da IRQ7 */ setvect(0x0F,Interrupção_IRQ7); /* instala a rotina do usuário para a IRQ7 */ outportb(0x21,inportb(0x21) & 07F); /* habilita IRQ7 */ enable(); /* habilita as interrupções de hardware */ 4.1.2.3 Programa principal O programa principal roda no que se denomina loop, ou seja um ciclo de programa que se repete, realizando o controle de malha fechada com os dados obtidos do encoder (posição) e atualizando o valor do ciclo de trabalho do PWM. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 57 4.1.3 Modelo Existem diferentes formas de obtenção do modelo do sistema que se deseja trabalhar. Neste trabalho foi utilizado um modelo experimental. Isto se justifica pela dificuldade em se modelar não linearidades tais como o atrito dos fusos. 4.1.3.1 Experimental Para sistemas de primeira ordem a resposta a um degrau unitário é mostrada na Figura 4.3 que representa uma curva exponencial. Pode-se observar que 3T é o tempo necessário para a curva alcançar 95% do seu valor final. Figura 4.3: Curva exponencial de resposta de uma entrada em degrau unitário Seguindo essa analogia foi calculado um modelo experimental para o sistema. Esses dados serão utilizados para a construção da função de transferência do modelo mostrado na Figura 4.4, além das seguintes informações: Vmáx = velocidade máxima do teste PWMv = PWM utilizado no teste Aplicou-se um degrau de 100% de PWM (tensão máxima de trabalho) sobre o sistema, foi traçado um gráfico com a curva de resposta. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 58 Figura 4.4: Função de transferência, entrada PWM e saída velocidade linear O gráfico da Figura 4.5 foi obtido com a captação de pontos do deslocamento da mesa na direção x, esses pontos foram gerados pelo programa de controle via DOS e gravados em um arquivo com extensão txt. Com esses pontos foi feita uma média ponto a ponto referente ao tempo decorrido entre eles. Imprimindo os pontos num gráfico e determinando uma curva que representa a média móvel de seis pontos consecutivos, gerou-se a curva aproximada da velocidade linear em relação ao tempo decorrido da mesa, pois o encoder disponibiliza apenas deslocamento linear. A Figura 4.5 ilustra a resposta em velocidade do eixo x. Figura 4.5: Gráfico da velocidade linear do “eixo x” em função do tempo 0,95 × 167,5 ≅ 159 (4.1) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 59 3T = 0,32 T = 0,32 / 3 T = 0,106 G (s) = k= k T .s + 1 (4.2) (4.3) 167,5 = 1,675 100 (4.4) 1,675 0,106.s + 1 (4.5) G(s) = 1,675 0,106 G (s) = 0,107.s + 1 0,106 G ( s) = 15,9 s + 9,5 (4.6) (4.7) Como: • G(s) = X ( s) PWM ( s ) (4.8) Desenvolvendo-se à equação (4.8) tem-se: G(s) = sX ( s ) PWM ( s ) Substituindo a equação (4.9) na equação (4.7) tem-se que: (4.9) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 60 sX ( s ) 15,9 = PWM ( s ) s + 9,5 (4.10) X ( s) 15,9 = PWM ( s ) s ( s + 9,5) (4.11) A equação (4.11) representa o modelo da planta do sistema. 4.1.3.2 Simulado Esta seção indica a forma de se montar um modelo utilizando o Matlab, pois em outras seções (4.2.4) são disponibilizadas comparações entre o modelo controlado (real) e o matemático controlado via Matlab. Utilizando o programa Matlab, mais precisamente o Simulink, simulou-se o controle da mesa em um grau de liberdade, para entrada em degrau, que é representada pelo bloco denominado referência. No bloco “PID” estão contidas informações do controle PID. O bloco “Volts para PWM”, representado por uma função descontínua, é apenas uma pequena correção de valores. A descontinuidade de PWM em função da tensão atende os seguintes pré-requisitos: 1. Tensão máxima da mesa (86 volts) é convertida em 100% PWM. 2. Tensões entre 0 e 10,3 Volts são convertidas em 12% de PWM. 3. Tensões entre 0 e -10,3 Volts são convertidas em -12% de PWM. 4. Tensão mínima da mesa (-86 volts) é convertida em -100% PWM. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 61 Figura 4.6: Modelo aproximado do sistema para entrada em degrau unitário. Figura 4.7: Informações contidas no bloco “PID” Apesar de incluído um bloco para um controlador PID discreto, Figura 4.7, obteve-se ótimos resultados apenas utilizando o controlador analógico, mas caso seja necessário, basta trocar a posição do interruptor manual que o PID discreto passa a fazer parte do sistema e o PID analógico deixa de ser utilizado. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 62 Figura 4.8: Informações contidas no bloco “Modelo”. Uma forma de representação em blocos no Simulink do modelo da planta da mesa é apresentada na Figura 4.8. Nela podem-se visualizar os parâmetros do modelo. 4.1.3.3 Testes experimentais Os testes realizados durante o trabalho via DOS utilizaram a freqüência de 360 hertz e são apresentados nesta seção. Inicialmente foi feito um teste de linearidade entre a saída de PWM do computador em comparação com a tensão aplicada na entrada do motor, utilizando um multímetro. Para facilitar a leitura de tensão foi utilizada uma montagem contendo uma lâmpada incandescente de 60 Watts (127 volts) ligada em paralelo ao atuador do sistema desconectando-se o motor do mesmo. Variou-se, através do programa, a percentagem de PWM aplicada sobre o atuador e a resposta desse atuador, em volts, foi registrada a cada 10% de PWM. O gráfico da Figura 4.9 indica esses resultados. Diferente do modelo simplificado do sistema mostrado na Figura 4.6, onde o PWM varia de -100% a 100%, a estrutura do programa (DOS) utiliza uma escala que varia de 0% a 100% de PWM. Quando a percentagem de PWM está na faixa de 0% significa que o ciclo de trabalho está todo em uma das direções, ou seja, indica máxima energia que o motor fornece para um dos lados. Quando o PWM está na faixa de 100% indica máxima energia na direção oposta. Com isso tem-se a comprovação da linearidade entre o valor dado de PWM e o valor de saída em volts. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 63 Figura 4.9: Comparação entre Tensão e PWM Após o teste de linearidade foram feitos mais três testes referentes ao torque máximo suportado pelos motores (x e y), utilizando também a configuração de controle via DOS. Os motores foram desacoplados do sistema e colocados sobre uma bancada para que pudessem ser feitas as medições dos torques. Os três testes realizados foram: 1 - Teste de tração utilizando a polia menor (motor retirado do eixo x) 2 - Teste de tração utilizando a polia maior (motor retirado do eixo x) 3 - Teste de tração utilizando a polia maior (motor retirado do eixo y) Para a realização dos testes 1, 2 e 3, utilizaram-se os seguintes equipamentos: • Recipiente de plástico com capacidade igual a 15 litros e massa total igual a 305 g. • Chapas de aço de massa 54g cada, num total de 150 placas. • Polia menor de raio efetivo igual a 27 mm. • Polia maior de raio efetivo igual a 70 mm. Na Figura 4.10 tem-se a representação do experimento onde a figura da esquerda mostra a polia de alumínio utilizada nos testes 2 e 3 e a figura da direita mostra a polia de aço carbono utilizada no teste 1, ambas as polias são acopladas diretamente no eixo do motor. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 64 Figura 4.10: Representação do teste feito nos motores Em ambos os testes foram verificados os valores mínimos de levantamento do recipiente para um determinado valor de PWM, até que o mesmo conseguisse obter um movimento vertical contínuo e lento. Tabela 4.1: Dados necessários para os testes Dados: Características Raio da polia menor 26 mm Raio da polia maior 70 mm Gravidade 9,81 m/s2 Massa do recipiente 350 g Massa da placa 54 g Na Tabela 4.2 pode-se observar que o recipiente, mesmo vazio, só conseguiu ser levantado com 52% de PWM. Vale ressaltar que como foi utilizado o PWM do tipo anti-fase o valor de 50% de PWM equivale a 0% de carga no sistema, e 100% corresponde à carga máxima no sistema. Para determinar o torque aplicado utilizou-se a equação (4.12). Torque = mtotal × g × rpolia (4.12) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 65 No teste 1 não foi possível verificar o torque máximo aplicado ao motor devido ao fato de não existirem mais placas disponíveis. Assim foi necessário dar prosseguimento segundo o teste 2, ou seja utilizando uma polia maior. Tabela 4.2: Teste 1 PWM (%) Número de placas Número de recipientes Massa total (g) Torque (N.m) 50 51 52 53 54 55 60 70 80 90 100 0 0 3 8 15 22 52 110 150 - 0 0 1 1 1 1 1 1 1 - 0 0 467 737 1115 1493 3113 6245 8405 - 0,00 0,00 0,12 0,19 0,28 0,38 0,79 1,59 2,14 - No teste 2 o motor começou a perder rendimento e sua temperatura aumentou consideravelmente. O teste foi refeito depois de transcorridos 30 minutos, e com o motor resfriado, verificou-se que o mesmo voltou a melhorar seu rendimento. Essa diferença no rendimento se deve ao fato de que, ao esquentar, o motor começa a variar suas propriedades, tais como indutância e resistência, mudando, com isso, suas características. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 66 3,0 Torque (N.m) 2,5 2,0 1,5 1,0 Motor normal 0,5 Motor superaquecido 0,0 50 60 70 80 90 100 PWM (%) Figura 4.11: Comparativo entre o motor trabalhando superaquecido e em temperatura normal Na Figura 4.12 estão apresentados os três testes. Como resultado pode-se concluir que os dois motores têm características semelhantes e que o torque máximo atingido pelo motor não passou de 2,8 N.m e que aparentemente o motor está saturando neste valor, não sendo conveniente trabalhar nesta faixa. Figura 4.12: Teste de torque máximo dos motores UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 4.2 67 Projeto de controle via microcontrolador A segunda parte da implementação diz respeito ao controle da mesa xy utilizando um microcontrolador modelo AVR ATMega 16. A escolha desse microcontrolador se deu por diversos fatores, dentre os quais pode-se destacar: 9 Possui quatro canais de PWM distintos – facilita a implantação de PWM sem a necessidade de configurar interrupções. 9 Facilidade de gravação 9 Possibilidade de trabalhar com freqüências mais elevadas, a escolhida para o projeto é de 1000 Hertz. 4.2.1 Estrutura de montagem A estrutura de montagem do controle através do microcontrolador é bastante semelhante à estrutura de montagem do controle através do computador. A diferença está na montagem do comando principal, o gerador de freqüências passa a ser o microcontrolador. O mesmo recebe os pulsos provenientes do encoder e realiza os cálculos necessários para o controle do sistema. A placa onde está conectado o microcontrolador é uma placa de desenvolvimento que disponibiliza os canais do AVR para entrada ou saída de dados, disponibiliza os sinais de PWM e também a porta para gravação. O computador tem papel secundário. Através do PC o microcontrolador pode ser gravado e é através dele que acontece a interface com o homem. A porta paralela nessa estrutura de montagem serve apenas para gravação do microcontrolador, que utiliza a porta serial para comunicação com o PC. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC Figura 4.13: Estrutura de blocos da montagem microcontrolada 68 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 69 4.2.2 Estrutura dos programas Foi necessário desenvolver dois programas que são compatíveis entre si. O primeiro denominado programa de controle ou principal é responsável pela ação do microcontrolador na realimentação do sistema de controle. O segundo programa é responsável pela interface do programa do microcontrolador. 4.2.2.1 Programa de controle O programa de controle ou principal é previamente gerado utilizando o programa Codevision, que é um gravador da própria AVR, utilizando um ambiente Windows. A maneira mais fácil de configurar o microcontrolador, dentro do Codevision, é utilizar um ícone denominado Codewizard. Com ele todas as configurações do microcontrolador são selecionadas apenas utilizando o mouse e qualquer porta, PWM ou timer, torna-se disponível para a programação ao término desta operação. Essas linhas são escritas e comentadas automaticamente. Abaixo temos a seqüência de figuras de uma configuração do Codewizard. Os temporizadores (timer) são utilizados para controle e para execução do PWM. As interrupções externas (External IRQ) são utilizadas para receber os pulsos de interrupção dos encoders. Ao final da operação os arquivos necessários para a programação são gerados e salvos. No apêndice está disponibilizado todo o código do programa necessário para o funcionamento do microcontrolador para o projeto de automação da mesa xy. Esse programa está configurado para o controle de dois graus de liberdade simultâneos, se necessário. Em anexo disponibiliza-se todo código utilizado no projeto de automação. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC Figura 4.14: Configurando o CHIP e as interrupções externas Figura 4.15: Configurações dos temporizadores e da porta serial 70 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 71 Figura 4.16: Momento de geração dos arquivos Figura 4.17: Pergunta de confirmação da utilização da OC1A e OC1B como PWM (saída) 4.2.2.2 Programa de interface O programa de interface é gerado utilizando o programa Borland C++ Builder 6.0, ele foi desenvolvido de maneira a interagir com o programa de controle, recebendo dados de leitura dos encoders e enviando bits de ações para execução do microcontrolador. A Figura 4.18 mostra como o C++ Builder apresenta a tela para arrumação do programa, na Figura 4.19 pode-se observar o programa em execução. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 72 Figura 4.18: Desenvolvimento do programa no C++ Builder O programa gerado no Borland só pode ser executado caso o programa feito no Codevision esteja instalado e funcionando dentro do microcontrolador, Figura 4.19: Tela de execução do programa de interface UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 73 Na Figura 4.20 foi separado o programa em nove subconjuntos: Subconjuntos: 1. Onde o programa deve ser iniciado. A porta escolhida deve ser a porta onde está configurada a porta serial, pois ela pode variar dependendo do computador. 2. Mostra o gráfico deslocamento em função do tempo no eixo x. 3. Mostra o gráfico deslocamento em função do tempo no eixo y. 4. Mostra o gráfico x em função do y, como se estivesse escrevendo sobre o tampo da mesa. 5. Define os valores de Kp, Kd e Ki dos dois graus de liberdade. 6. O subconjunto 6 trabalha em paralelo com as informações fornecidas pelo subconjunto 8. É uma tela onde se pode observar a seqüência de pontos escolhidos para controle seqüencial. Essa seqüência pode ser formatada utilizando os botões “Apagar Tudo” ou “Apagar Último”, e o controle funciona quando ativamos o botão “Iniciar”. 7. Mostra a atual contagem, em milímetros de leitura dos encoders. Além disso, torna o ponto atual como origem do sistema e limpa as telas gráficas (2, 3 e 4). 8. Configura os valores desejados para o controle, bem como a velocidade. A partir do botão “Gravar” um conjunto de pontos é enviado para o subconjunto 8. Caso o botão “Posição” seja acionado, ocorre controle de posição com entrada em degrau e caso o botão “Velocidade” seja acionado um controle de posição com entrada em rampa com uma posição final pré determinada passa a interagir com o sistema, e a massa se desloca para o ponto previamente digitado. 9. Habilita a captura de pontos. Muito útil para gerar gráficos mais sofisticados. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 74 Figura 4.20: Tela de execuções mapeada 4.2.3 Modelo Assim como no caso do controle via DOS, pode-se determinar um modelo experimental e um simulado ou virtual. Além da determinação do modelo referente ao eixo x foi determinado um modelo referente ao eixo y do projeto. 4.2.3.1 Experimental O gráfico da Figura 4.21 foi gerado com a captação de pontos do deslocamento da mesa na direção x. Foi feita uma média ponto a ponto referente ao tempo decorrido entre eles. Imprimindo os pontos num gráfico e determinando uma curva que representa a média móvel de seis pontos consecutivos, pode-se gerar uma curva aproximada da velocidade linear em relação ao tempo decorrido da mesa. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 75 Figura 4.21: Modelo utilizando microcontrolador no eixo x Seguindo o mesmo procedimento da seção 4.1.3.1 pode-se determinar o valor da função de transferência experimental do AVR na direção do eixo x. 18.7 X ( s) = 2 PWM ( s ) s + 10s (4.13) Comparado-se as equações (4.11) e (4.13), pode-se observar que existe uma diferença entre os valores encontrados, apesar de terem sido obtidos através do mesmo grau de liberdade. Essa diferença se deve ao enferrujamento do fuso, pois os experimentos que originaram tais equações foram realizados em datas diferentes, não havendo uma manutenção adequada do fuso durante esse intervalo de tempo. Um segundo teste foi realizado, mas com o eixo de coordenadas y, e teve como função de transferência a seguinte equação: UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC Y ( s) PWM ( s ) = 76 20 (4.14) s + 11s 2 Seguindo o mesmo procedimento da seção 4.1.3.1, pode-se constatar uma pequena variação nos valores obtidos, entre as equações (4.13) e (4.14). Essa variação se dá principalmente pela diferença de carregamento transportado nos eixos coordenados. No gráfico da Figura 4.22 pode-se verificar essa constatação. Para uma mesma entrada em PWM, os eixos apresentaram uma inclinação das curvas de deslocamento diferenciadas. 180 Deslocamento (mm) 160 140 120 100 80 60 40 Y 20 X 0 0 0,2 0,4 0,6 0,8 1 1,2 1,4 1,6 Tempo (s) Figura 4.22: Deslocamento x Tempo de uma entrada em degrau de máxima tensão, simultaneamente nos eixos x ey 4.2.3.2 Simulado Devido ao fato do programa desenvolvido para o microcontrolador executar dois diferentes tipos de controle, um deles com entrada em degrau unitário e o outro com entrada em rampa até um determinado ponto, foi necessário, além do modelo apresentado na seção 4.1.3.2, o modelo mostrado na Figura 4.23. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 77 Figura 4.23: Modelo aproximado do sistema para entrada em rampa com posição final pré-determinada. 4.2.4 Resultados encontrados Os testes apresentados a seguir foram realizados utilizando o controle através do microcontrolador. Foram feitos experimentos com controladores proporcionais, proporcionais derivativos, tanto em um grau de liberdade isolado quanto com os dois eixos de coordenadas simultaneamente. A Figura 4.24 apresenta um controle de posição do eixo x com entrada em degrau com os seguintes parâmetros: Kp = 10, Kd = 1 e Ki = 3. Devido aos parâmetros, a função apresentou um elevado sobre sinal e um elevado tempo de acomodação do sistema. As linhas contínuas representam a simulação (Simulink do Matlab) enquanto a linha tracejada representa os valores obtidos experimentalmente na mesa, com captura de pontos feita pelo microcontrolador. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 78 Figura 4.24: Controle de posição do eixo x com entrada em degrau com os seguintes parâmetros: Kp = 10, Kd = 1 Ki = 3. Figura 4.25: Detalhe ampliado da Figura 4.24. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 79 A Figura 4.26 apresenta um controle de posição do eixo x com entrada em degrau com os seguintes parâmetros: Kp = 30, Kd = 0 e Ki = 0. Devido aos parâmetros, a função apresentou características de um controle meramente proporcional. As linhas contínuas representam a simulação (Simulink do Matlab) enquanto a linha tracejada representa os valores obtidos experimentalmente na mesa, com captura de pontos feita pelo microcontrolador. Figura 4.26: Controle de posição do eixo x com entrada em degrau com os seguintes parâmetros: Kp=30, Kd=0 e Ki=0. Figura 4.27: Detalhe ampliado do gráfico da Figura 4.26 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 80 A Figura 4.28 apresenta um controle de posição do eixo x com entrada em degrau utilizando-se os seguintes parâmetros: Kp = 30, Kd = 2 e Ki = 0. Para o controle segundo uma referência em degrau, essa curva ofereceu os melhores resultados, pois apresentou baixo sobre sinal com uma resposta bem rápida. As linhas contínuas representam a simulação (Simulink do Matlab) enquanto a linha tracejada representa os valores obtidos experimentalmente na mesa, com captura de pontos feita pelo microcontrolador. Figura 4.28: Controle de posição do eixo x (entrada em degrau) com as seguintes características: Kp = 30, Kd = 2 Ki = 0 Figura 4.29: Detalhe ampliado da Figura 4.28 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 81 Um outro estudo foi feito utilizando um controle de posição com entrada em degrau para os dois graus de liberdade ao mesmo tempo utilizando-se os seguintes parâmetros: Kp = 30, Kd = 0 e Ki = 0. A Figura 4.30 apresenta o deslocamento de X em função de Y. Os pontos (0,0) e (80,80) são os pontos iniciais e finais do controle. Como já foi visto anteriormente, as equações (4.13) e (4.14) que representam os modelos dos graus de liberdade X e Y são diferentes. Assim, apenas utilizando o controle de posição com entrada em degrau não é suficiente para o sistema se deslocar dos pontos (0,0) e (80,80) de forma linear. Figura 4.30: Comportamento da mesa com controle de posição em um plano, para Kp=30 Kd=Ki=0 Figura 4.31: Curvas separadas por eixo, x e y para um mesmo deslocamento, para Kp=30 Kd=Ki=0 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 82 Para uma análise inicial do controle de posição com a entrada (referência) em rampa até um ponto definido foram realizados diversos testes representados na Figura 4.32. Todas as curvas possuem os parâmetros: Kp = 30, Kd = 0 e Ki = 0, entretanto variou-se a inclinação da curva de referência de entrada. As indicações das velocidades na legenda da figura nada mais são do que uma aproximação da inclinação da reta tangente da referência de entrada do controle. Todos os valores da Figura 4.32 foram obtidos de forma experimental. Deslocamento (mm/s) 120 100 80 60 10 mm/s 20 mm/s 40 mm/s 70 mm/s 100 mm/s 186 mm/s 40 20 0 0 1 2 3 4 5 6 7 8 9 10 11 Tempo (s) Figura 4.32: Controle de posição com entrada em rampa do eixo x com as seguintes características: Kp = 30, kd = 0, ki = 0 para diferentes inclinações da rampa de entrada. A seguir (Figura 4.33) tem-se uma análise de um controle de posição com entrada (referência) em rampa até um ponto definido de 100 mm com os seguintes parâmetros: Kp = 30, Kd = 0 e Ki = 0, e uma inclinação da curva de entrada em 100 mm/s. Apesar de a curva ter se comportado de forma a tentar seguir a inclinação pré estabelecida, a mesma apresentou uma oscilação elevada, com uma certa demora em estabilização do sinal. A linha preta indica o sinal de entrada (referência), a linha azul representa o teste simulado no Simulink (Matlab) e a curva em vermelho representa os valores obtidos experimentalmente na coordenada x da mesa xy. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 83 Figura 4.33: Controle de posição com entrada em rampa do eixo x com as seguintes características: inclinação da curva (referência)= 100 m/s, Kp = 30, Kd=Ki=0. Figura 4.34: Detalhe ampliado da região 1 da Figura 4.33 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 84 Figura 4.35: Detalhe ampliado da região 2 da Figura 4.33 No próximo teste (Figura 4.36) tem-se um controle de posição com entrada (referência) em rampa até um ponto definido de 100 mm com os seguintes parâmetros: Kp = 30, Kd = 2 e Ki = 0, e uma inclinação da curva de entrada em 100 mm/s. A linha vermelha indica o sinal de entrada (referência), a linha azul representa o teste simulado no Simulink (Matlab) e a curva tracejada (verde) representa os valores obtidos experimentalmente na coordenada x da mesa xy. A curva de resposta da Figura 4.36 foi a que apresentou melhores resultados dentre todos os testes experimentais realizados. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 85 Figura 4.36: Controle de posição com entrada em rampa do eixo x com as seguintes características: inclinação da curva (referência)= 100 m/s, Kp = 30, Kd=2 e Ki=0. Figura 4.37: Detalhe ampliado da região 1 da Figura 4.36. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC Figura 4.38: Detalhe ampliado da região 2 da Figura 4.36. Figura 4.39: Detalhe ampliado da região 3 da Figura 4.36. 86 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 87 No último teste realizou-se um controle de posição do tipo seqüencial. Os dados foram inseridos no computador (via teclado) pelo programa de interface (desenvolvido no C++ Builder) e retransmitidos automaticamente para o programa principal ou de controle (ver seção 4.2.2). Uma estrutura em forma de “L” foi projetada para simular o terceiro grau de liberdade da fresadora. Em uma de suas extremidades foi fixada uma caneta, simulando uma fresa, a outra extremidade dessa estrutura foi fixada na base da mesa (ver Figura 4.40). Os movimentos de rotação dos motores geram movimentos de translação, tanto do tampo da mesa, quanto da sela. A soma desses movimentos faz com que o tampo da mesa se movimente em dois graus de liberdade em relação à ponta da caneta. Tampo da mesa Caneta X Y Sela Base Figura 4.40: Configuração da mesa para o experimento de controle sequencial de pontos. A Figura 4.41 apresenta imagens capturadas do vídeo que foi filmado no teste de controle seqüencial. A Figura 4.42 é a imagem final do teste do controle seqüencial. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 1 2 3 4 5 6 7 8 9 10 Figura 4.41: Imagens capturadas do vídeo no teste de controle seqüencial. 88 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC Figura 4.42: Imagem final após o controle seqüencial 89 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 5 90 Conclusão e sugestões para trabalhos futuros Foi atingido, com sucesso, o objetivo do projeto, que foi a montagem e controle da mesa de coordenadas xy como parte integrante de uma fresadora CNC. Na área experimental, pôde-se controlar a posição seguindo uma referência em degrau, e um controle de posição seguindo uma referência do tipo rampa. O controle de um grau de liberdade foi realizado com auxílio de um computador PC, e para dois graus de liberdade foi utilizado um microcontrolador modelo AVR ATMega 16. Comparando-se o computador e o microcontrolador é correto destacar que para o aluno que está iniciando o estudo de automação é válido o aprofundamento no entendimento do controle via DOS antes do aprofundamento dos estudos de controle utilzando o microcontrolador. Entretanto para o aluno que já possui noções de controle e de programação, sugere-se um estudo mais aprofundado apenas dos controles via microcontrolador. Na parte de modelagem, viu-se que, mesmo utilizando modelos matemáticos simplificados, podem-se estimar com alto grau de acurácia as características de saída do sistema, ou seja, os dados experimentais estão de acordo com os dados teóricos e simulados, assim torna-se mais fácil estimar parâmetros de controle. O controlador do tipo proporcional derivativo foi o que apresentou melhores resultados. A parte integrativa, normalmente é mais utilizada quando se deseja zerar os erros relativos dos sistemas, mas ainda precisa de mais testes para sua determinação. Sugestão na área computacional: modificar o programa desenvolvido no Borland C++ tornando-o compatível com a linguagem NC, que utiliza código G. Com isso a mesa xy tornase controlável por qualquer pessoa que possua conhecimentos em programação de máquinas CNC. Outra sugestão é a implementação de uma entrada no tipo senóide e parabólica na programação do microcontrolador. A disponibilidade do código fonte do programa do UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 91 microcontrolador e do programa de interface tem o intuito de permitir futuras modificações e novos trabalhos na área. Para tornar a mesa uma fresadora de comando numérico serão necessárias algumas medidas, entre as quais: 9 Reestruturar a montagem da coluna Z, colocando as dimensões reais dos componentes. 9 Fazer uma verificação mais apurada dos mancais de rolamento. 9 Fazer um estudo mais apurado de especificação de motores, para que eles tenham potência suficiente para realizarem uma operação de usinagem. Nossos motores foram adaptados para o projeto, não possuem grandes valores de torques. 9 Aumentar a resolução do encoder (número de pulsos por volta). 9 Estudar a possibilidade de troca das polias por engrenagens, e das correias trapezoidas por correias dentadas, para uma melhor transmissão em baixas velocidades, evitando escorregamento e com isso perda de potência do motor. Vale ressaltar que o escorregamento não interfere na acurácia do sistema, já que o encoder encontra-se fixo no eixo de esferas recirculantes e não no eixo do motor. Essa solução diminui a resolução disponível ao sistema, entretanto evita falhas devido ao escorregamento. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 6 92 Referências Bibliográficas [1] Apostila de máquinas fresadoras Senai; Disponível: http://pt.wikipedia.org/wiki/Fresadora [capturado em 15 fev. 2007]. [2] Alves, Alan Nunes. “Mesa de Coordenadas com Guias Lineares e Fuso de Esferas para Fresadora CNC”, Projeto Final de Curso, Escola de Engenharia da UFF, 2002. [3] Gonçalves de Jesus, Alexandre Vasconcellos. “Projeto e Construção de Coluna com Eixo ‘Z’ para Fresadora CNC”, Projeto Final de Curso, Escola de Engenharia da UFF, 2003. [4] Queiroz, Marcelo Torres. “Projeto e Controle de um Encoder Incremental”, Projeto Final do Curso de Engenharia Mecânica, Escola de Engenharia da UFF, 2004. [5] Delfino, Allan. “Controle, em malha aberta, de um motor de corrente contínua utilizando circuito de potência”, Relatório final de Iniciaçõa Científica, Escola de Engenharia UFF, 2004. [6] Disponível: http://www.thk.com.br/technical/shinseihin_pt.html [capturado em 01 março 2007]. [7] Disponível: http://www.mecatronicafacil.com.br/downloads/Userport.zip, [capturado em 15 fev. 2007]. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 93 [8] Gomes, Afonso “Notas de aula”, UFRJ, 2º. Semestre, 2006. [9] Ogata, Katsuhiko “Engenharia de Controle Moderno”, 4a Edição, 2005. [10] Shigley, Joseph “Projeto de Engenharia Mecânica”, Editora Bookman, 7ª Edição, 2005. [11] Disponível: http://www.nsk.com.br, [capturado em 29 dez. 2006]. [12] Resnick, Robert; Halliday, David “Fundamentos de Física 3 Eletromagnetismo”, 3a Edição, 1994. [13] Disponível: http://www.euclidres.com/motionSensors/motionSensors.html, [capturado em 10 jun. 2007]. [14] Torres, Gabriel. “ Hardware e interfaceamento”, 4a Edição, 2001. UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 7 94 Apêndice O programa abaixo foi desenvolvido em C++ (programa Turbo C++), para ser executado no DOS 6,22 como sistema operacional exclusivo. // Universidade Federal Fluminense // Mestrado em Engenharia Mecânica // Aluno: Marcelo Torres de Queiroz // Ultima atualizacao = 26/12/2006 Versao 9 // Controle de posição com entrada em degrau // e controle de posição com entrada em rampa (controle de “velocidade)”. // OBS.: Esse programa foi pouco testado e apresenta algumas falhas que ainda não foram // resolvidas. # include <stdio.h> # include <conio.h> # include <dos.h> # include <math.h> // Definicoes para controlar a INT8 (IRQ0 - tempo) # define INT8 0X1C # define TRUE 1 # define FALSE 0 # define CTRL_8253 0x43 // Porta do registro controle da 8253 # define TIMER0 0x40 // Porta do TIMER0 # define T0_MODO2 0x34 // Coloca TIMER0 em modo 2 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC # define T0_MODO3 0x36 // Coloca TIMER0 em modo 3 # define TICK 0.838109651e-6 // 1/(1.193 180 Hz) = 0,838 096 51 us # define DIVISOR 32 // Divisor //# define PERIODO_ATU 10e-3 // Atualizaocao dos vetores, nao usado //# define TAXA_AMOSTRAGEM // nao usado # define UNIT_TIMER DIVISOR*TICK // Unid temporz adotada (26,819 088 us) // atualizacao pode ser: 373 186,5 (inteiro) # define ATUALIZACAO 373 // Taxa de atualizacao das variaveis em Unit_Timer // tempo de controle estava 20 alterei para 100 (24/04) # define TEMPO_CONTROLE 100 // Taxa de atualizacao das vars em Unit_Timer # define PONTOS 1000 // Quantidade de posicao dos vetores # define PERIODO 100.0 // Periodo do PWM em Unit_Timer # define DIED_ZONE 6. // Modulo da Zona Morta # define nciclo_ref 4 //Conta ciclos pwm para atualizar ref (V3) # define dt PERIODO*UNIT_TIMER*nciclo_ref //Intervalo de tempo (V3) // entre atualizacao de ref (V3) // Definicoes para controlar a interrupcao IRQ7 (Porta Paralela - Encoder) # define IRQ7 0xf // Posicao no vetor de interrupcoes # define HAB_8259_IRQ7 0x80 // Bit para habilitar IRQ7 (8259) # define HAB_8259_INTR 0x21 // Registrador para hab intr (8259) // Enderecos para a familia PS # define POS 0x102 // Prog. Option Select register # define POS_DADO 0x90 // 1001 0000 paralela normal e habilitada // Interrupcoes # define INT_TECLADO 0x60 # define SAIDA_P_PARALELA 0x378 # define ESTADO_P_PARALELA 0x379 # define POS_TECLADO_VECT 0x09 # define CRTL_PORTA_PARALELA 0x37A # define HABILITAR_IRQ7 0x14 // Interrupcao externa ?? # define ON_OFF_INT outportb(0x20,0x20) // ----------------------------------------// ---- ROTINAS DE INTERRUPCAO ANTIGAS ----// ----------------------------------------void interrupt (*old_int8)(void); // Guardar vet IRQ0 (INT8) void interrupt (*old_irq7)(void); // Guardar vet IRQ7 (p. paralela) 95 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC void interrupt (*old_tecla)(void); // Guardar vet IRQ1 (teclado) // ----------------------------------------// ---- DEFINICOES DE VARIAVEIS GLOBAIS----// ----------------------------------------int pos_velho; int hab_antiga; int tecla; int ang=0, ang_ant=0; int atual, antes, i=0, j=1, ii=1; int kref=0; // Conta total de ciclos de PWM para atualizar ref (V3) int pos_linear[PONTOS]; int controlando=0, testando=0, testt=0; int velocidando=0; // (V3) int sair=0, acao; int ciclo_ativo=0, aux; int tempo_pwm=0, pwm_high=1; double valor; // (V2) double veloc; // (V2) float tempo=0.; float dist; //(V6) struct dostime_t t; // Parametros do Controlador //float tau = UNIT_TIMER * 40.0; float tau = UNIT_TIMER * TEMPO_CONTROLE; // era 20 testamos 40 agora 56 float kp = 30.; float kd = 0.; float ki = 0.; // Variaveis do controlador unsigned char CONTROLE = 0; float e_old = 0.0; float int_erro = 0.0; float ref= 0.0; float dx=0.0; //(V3) 96 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC float pos_atual = 0.0; float pos_final = 0.0; // -------------------------------------------// ------------ FUNCOES DO TECLADO -----------// -------------------------------------------void zerando(void) { // printf("Zerando Variaveis... \n"); ang=0; ang_ant=0; // tempo=0; ciclo_ativo=50; controlando=0; velocidando=0; testando=0; pos_atual=0.; i=0; gotoxy(10,10); clreol(); gotoxy(10,11); clreol(); gotoxy(10,12); clreol(); gotoxy(40,13); clreol(); gotoxy(40,14); clreol(); } // -------------------------------------------// ------- Estados Proibido: 1+2; 4+8; -------// -------------------------------------------void parar(void) { outport (0x378,0); // utilizando deslizamento // outport (0x378,2+8); // utilizando frenagem } // -------------------------------------------void ligar(void) 97 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC { if (pwm_high) { outport ( 0x378,(2+4) ); }else { outport ( 0x378,(1+8) ); } } // -------------------------------------------void fim(void) { outport (0x378,0); sair=1; } // -------------------------------------------- // ---------------------------------------------------------// ----- ROTINA DE INTERRUPCAO 0x1C (INT8 - IRQ0) NOVA -----// ---------------------------------------------------------void interrupt intTimer(void) { float e,u,zona_morta,ciclo_ativo_float; float K_d = kd/tau; float K_i = ki*tau; tempo++; // simplesmente conta a unidade de tempo estipulada tempo_pwm++; //------------------------------------- CONTROLE PWM if (j==TEMPO_CONTROLE) { //=============inicio Controle ========== if (controlando) { pos_atual = ang/9.*0.25; e = ref - pos_atual; int_erro +=e; u =(( (kp + K_d)*e - K_d*e_old ) + K_i*int_erro ) ; e_old = e; if((e>-0.25)&&(e<0.25)) ciclo_ativo_float = 50.; 98 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC else { ciclo_ativo_float=u*50./(84.5)+50.; if ((ciclo_ativo_float>50.)&&(ciclo_ativo_float-50.)<DIED_ZONE) ciclo_ativo_float=50.+DIED_ZONE; else { if ((ciclo_ativo_float<50.)&&(-ciclo_ativo_float+50.)<DIED_ZONE) ciclo_ativo_float=50.DIED_ZONE; } } ciclo_ativo=ciclo_ativo_float; } if (ciclo_ativo > 100) ciclo_ativo = 100; if (ciclo_ativo < 0) ciclo_ativo = 0; // ========= fim controle ================= j = 1; } else j++; //------------------------------------ CAPTURA DE PONTOS if (testando || controlando || velocidando) { if (i<PONTOS) { if(ii==ATUALIZACAO) { pos_linear[i++]=ang; // guarda a posicao linear. ii = 1; } else ii++; } } //------------------------------------ COMUTA PWM if (tempo_pwm<PERIODO) { if (tempo_pwm*100.<=ciclo_ativo*PERIODO) pwm_high=1; else pwm_high=0; } else { // (V3) 99 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC tempo_pwm=0; kref++; // Conta o ciclo PWM (V3) // gotoxy(0,0); // printf("kref: %d",kref); } //------------------------------------- VELOCIDADE if (velocidando) //(V3) { if (kref>=nciclo_ref) { //(V5) //(V3) if (fabs(pos_final-ref)>fabs(dx)) //(V6) testa se o proximo ref { // nÆo passar de pos_final ref=ref+dx; //(V3) testt=1; } else //(V3) ref=pos_final; //(V3) kref=0; //(V3) } //(V3) } //(V3) //---------------------------------------BLOCO DE A€ÇO switch(acao) { case 0: parar(); break; // caso 'p' teclado case 1: ligar(); break; // caso 'l' teclado case 3: fim(); break; // caso 'q' teclado } // atualiza hora... :-| if ((tempo*UNIT_TIMER)>0.01) { t.hsecond++; tempo=0.; } if (t.hsecond==100) { t.second++; t.hsecond=0; } if (t.second==60) { 100 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC t.minute++; t.second=0; } if (t.minute==60) { t.hour++; t.minute=0; } /* if (tempo==65536/DIVISOR) { old_int8(); // chama o vetor antigo de int. tempo=0; } */ } // -------------------------------------------// ----- ROTINA DE INTERRUPCAO IRQ1 NOVA -----// -------------------------------------------void interrupt le_tecla (void) { tecla=inportb(INT_TECLADO); // outportb(0x20,0x20); old_tecla(); } // -------------------------------------------// ----- ROTINA DE INTERRUPCAO IRQ7 NOVA -----// -------------------------------------------// Ela acontece quando ha um pulso negativo pelo pino 10 // da porta paralela void interrupt le_contador(void) { atual=(inportb(ESTADO_P_PARALELA)&40); if ( ((atual==40) && (antes==8)) || ((atual==32) && (antes==40)) || ((atual==0) && (antes==32)) || ((atual==8) && (antes==0)) ) ang+=9; else { if ( ((atual==40) && (antes==32)) || ((atual==32) && (antes==0)) || ((atual==0) && (antes==8)) || ((atual==8) && (antes==40)) ) ang-=9; 101 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 102 } antes=atual; ON_OFF_INT; // habilitar outras ints } // --------------------------------------// ----------- CONFIGURA BIOS -----------// --------------------------------------void iniciar_bios(void) { // ------- Configura a BIOS para realizar a contagem de cerca de 1us -------- outportb(CTRL_8253,T0_MODO2); // programa o 8253 em modo 2 outportb( TIMER0, (unsigned char)(DIVISOR & 0x00FF) ); // byte menos sig do divisor... outportb( TIMER0, (unsigned char)((DIVISOR>>8) & 0x00FF) ); //...seguido do byte mais sig // Atencao !! O divisor corresponde a constante que multiplica TICK em UNIT_TIMER old_int8=getvect(INT8); // Guarda a ref. antiga do vetor de int. setvect(INT8, intTimer); // Seta a nova referencia do vetor de int. /* agora, a rotina de tratamento da interrupcao 0x08 sera chamada a cada n ticks de 0,8386 micro-segundos, que ao final da sua execucao, chama a rotina de tratamento da interrupcao de software 0x1C que conta este intervalo de tempo, incrementando um contador. O programa principal, que esta ocioso, em loop, periodicamente le este contador e o imprime, na forma de unidades de tempo e tambem convertido em segundos. */ old_tecla=getvect(POS_TECLADO_VECT); // Instala nossa interrupcao de teclado no vetor setvect(POS_TECLADO_VECT,le_tecla); // Programar os Registradores POS pos_velho=inportb(POS); outportb(POS,pos_velho||POS_DADO); // programar para os POS outportb(CRTL_PORTA_PARALELA,HABILITAR_IRQ7); // habilitar IRQ7 na Paralela old_irq7=getvect(IRQ7); // guardar vetor intr. antigo setvect(IRQ7,le_contador); // colocar novo vetor hab_antiga=inportb(HAB_8259_INTR); // guardar habilitacao antiga outportb(HAB_8259_INTR,hab_antiga&(~HAB_8259_IRQ7)); // hab IRQ7 na BIOS - Copiado do Livro ON_OFF_INT; // cancelar intr antigas UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC } // --------------------------------------// ------------ RESTAURA BIOS -----------// --------------------------------------- void restaura_bios(void) { //----------------- RESTAURA IRQ0 ---------------setvect(INT8, old_int8); // Restaura as configuracoes do vet. int. outportb(CTRL_8253,T0_MODO2); // programa o 8253 em modo 3 outportb(TIMER0,0x00); // byte menos sig do divisor... outportb(TIMER0,0x00); //...seguido do byte mais sig //----------------- RESTAURA IRQ7 ---------------setvect(IRQ7,old_irq7); // restaurar as habilitacoes outportb(HAB_8259_INTR,hab_antiga); outportb(POS,pos_velho); // restaurar vetor de interrupcao // restaurar os registradores POS //----------------- RESTAURA IRQ1 ---------------setvect(POS_TECLADO_VECT,old_tecla); //-----------------------------------------------} // -------------------------------------------// ------------ Programa Principal -----------// -------------------------------------------void main(void) { float temp, aux2, erro; char *valor_ss, *valor_s, *valor_v, *filename; // Variaveis referents a criacao e gravacao em arquivo FILE *stream; _dos_gettime(&t); // captura o tempo real atual antes=inportb(ESTADO_P_PARALELA)&40; // Le o estado inicial do encoder clrscr(); outport(SAIDA_P_PARALELA,0); zerando(); flushall(); iniciar_bios(); // Configura BIOS gotoxy(1,13); textcolor(GREEN); // Para o motor 103 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC cprintf( "ÉÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍ» \n\r" "º Ligar ºLº "º Teste ºTº º\n\r" º\n\r" "º Velocidade º V º "º Salvar Arq.º B º "º Parar Cima +1 º\n\r" º P º PageUp +5 º\n\r" "º Posicionar º C º "º Zerar º\n\r" Baixo -1 º\n\r" º Z º PageDown -5 º\n\r" "ÌÍÍÍÍÍÍÍÍÍÍÍÍÎÍÍÍÎÍÍÍÍÍÍÍÍÍÍÍÍͼ \n\r" "º Sair º Q º \n\r" "ÈÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍͼ "); while (!sair) { textcolor(WHITE); // gotoxy(20,2); // cprintf("ref: %f ",ref); gotoxy(20,4); temp = ang/9.*0.25; cprintf("Rotacao: %d voltas e %d graus ",(ang/360),ang-(ang/360)*360); gotoxy(20,6); cprintf("Percorreu : %.2f mm ",temp); gotoxy(20,8); cprintf("Pontos tst : %d ",i); gotoxy(40,8); cprintf("Atualizacao a cada %f s ",ATUALIZACAO*UNIT_TIMER); // imprimir tempo real textcolor(WHITE); textbackground(BLUE); // gotoxy(67,23); // cprintf(" Hora certa "); gotoxy(67,24); cprintf(" %02d:%02d:%02d ", t.hour, t.minute, t.second); textcolor(WHITE); textbackground(BLACK); gotoxy(1,24); cprintf("Velocidade (+/-): "); textcolor(RED); for(aux=1;aux<=ciclo_ativo/5;aux++) cprintf("Û"); textcolor(WHITE); 104 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC for(aux=(ciclo_ativo/5+1);aux<=100/5;aux++) cprintf("Û"); cprintf(" %d%% ",ciclo_ativo); gotoxy(10,12); switch(tecla) { case 72: // tecla 'para cima' if (ciclo_ativo<100) ciclo_ativo=ciclo_ativo+1; while(tecla==72); break; case 73: // tecla 'page up' if (ciclo_ativo<100) ciclo_ativo=ciclo_ativo+5; while(tecla==73); break; case 80: // tecla 'para baixo' if (ciclo_ativo>0) ciclo_ativo=ciclo_ativo-1; while(tecla==80); break; case 81: // tecla 'page down' if (ciclo_ativo>0) ciclo_ativo=ciclo_ativo-5; while(tecla==81); break; case 47: // tecla 'v' if (!velocidando) // (V3) { gotoxy(10,11); clreol(); gotoxy(10,10); clreol(); cprintf("Digite a posi‡Æo: "); gets(valor_ss); valor = atof(valor_ss); // ser a posi‡Æo final pos_final=valor; gotoxy(10,11); clreol(); cprintf("Digite a velocidade: "); gets(valor_v); 105 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC veloc = atof(valor_v); // ‚ sempre positivo if(veloc>160.) //(V6) Normaliza a velocidade veloc=160.; //(V6) if(veloc<1.) //(V6) veloc=1.; //(V6) dx=fabs(veloc)*dt; //(V5) toma valor absoluto dist=fabs(pos_final-pos_atual); //(V6) positivo if(dist<dx) //(V6) dx=dist; //(V6) if(pos_final<pos_atual) dx=-dx; // // dx ser negativo kref=0; //(V5) ref=pos_atual+dx; // gotoxy(10,3); //(V4) // printf("ref_i: %f %d dt: %d ",ref,testt,dt); //(V4) acao=1; // ligar gotoxy(10,12); printf("Ligado "); controlando=1; // Control vel tb usa controlando (V3) } else { controlando=0; //desliga o controle de posi‡Æo gotoxy(10,12); cprintf(" "); } velocidando=!velocidando; //(V3) controlando=velocidando; while (tecla==47); // 'v' break; case 44: // tecla 'z' zerando(); break; case 25: // tecla 'p' acao=0; printf("Parar "); break; case 38: // tecla 'l' acao=1; 106 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC printf("Ligado "); break; case 46: // tecla 'c' if (!controlando) { gotoxy(10,10); clreol(); gotoxy(10,12); clreol(); gotoxy(10,11); velocidando=0; //V7 clreol(); //V7 cprintf("Digite o valor: "); gets(valor_s); valor = atof(valor_s); //pos_final=temp+valor; ref = valor; acao=1; gotoxy(10,12); printf("Ligado "); } else { gotoxy(10,12); cprintf(" "); } while (tecla==46); // 'c' controlando=!controlando; break; case 20: // tecla 't' testando=!testando; if (testando) { gotoxy(10,12); printf("Testando... "); acao=1; } else { gotoxy(10,12); 107 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC printf(" "); } while (tecla==20); // ???? break; case 48: // ???? // tecla 'b' if (i) { gotoxy(40,13); clreol(); cprintf("Digite o nome do arquivo: "); flushall(); gets(filename); strcat(filename,".txt"); stream = fopen(filename, "w+"); gotoxy(40,14); clreol(); cprintf("%s",filename); for (aux=0;aux<=i;aux++) { fprintf(stream,"%.2f\n",(pos_linear[aux]*0.25)/9.); } fclose(stream); } gotoxy(40,13); clreol(); break; case 16: // tecla 'q' acao=3; printf("Fim "); break; } //switch } //while not sair clrscr(); restaura_bios(); _dos_settime(&t); // devolve o tempo atual } //main // FIM DO PROGRAMA !! 108 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 109 O programa abaixo foi desenvolvido em C++ (programa CodeVision), e foi testado utilizando o Windows 2000 como sistema operacional para a gravação de um microcontrolador. /********************************************* This program was produced by the CodeWizardAVR V1.24.0 Standard Automatic Program Generator © Copyright 1998-2003 HP InfoTech s.r.l. http://www.hpinfotech.ro e-mail:[email protected] Project : Automação de uma Mesa XY Version : 1.2 Date : 08/3/2007 Author : Marcelo Torres de Queiroz e Allan Delfino Company : Universidade Federal Fluminense Comments: Chip type : ATmega16 Program type : Application Clock frequency : 16,000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256 //*********************************************/ // BIBLIOTECAS //*********************************************/ #include <mega16.h> #include <delay.h> #include <stdio.h> #include <math.h> //********************************************* // CONSTANTES //*********************************************/ //********************************************* UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC // VARIAVEIS GLOBAIS //*********************************************/ unsigned char antes_x=0, antes_y=0; unsigned int ang_x=32768; unsigned char atual_x=0, atual_y=0; unsigned int ang_y=32768; unsigned char cmd; bit controlando = 0; bit controle_vx = 0; bit controle_vy = 0; unsigned char var_serial = 127; unsigned char temp_char; unsigned int ref_int_x = 32768; unsigned int ref_int_y = 32768; unsigned int rx_var; float ref_float_x; float pos_atual_x; float e_x=0., e_old_x=0., integ_erro_x=0.; float u_x; float kp_x=30.; float K_d_x, kd_x=0.; //= kd/tau; float K_i_x, ki_x=0.; //= ki*tau; int ciclo_ativo_x = 127; int ZONA_MORTA_x = 25; float ref_float_y; float pos_atual_y; float e_y=0., e_old_y=0., integ_erro_y=0.; float u_y; float kp_y=30.; float K_d_y, kd_y=0.; //= kd/tau; float K_i_y, ki_y=0.; //= ki*tau; int ciclo_ativo_y = 127; int ZONA_MORTA_y = 12; 110 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC unsigned long int cont_time = 0; float velocidade_abs = 0.; float velocidade_rel_x = 0.; float velocidade_rel_y = 0.; float pos_inicial_x; float pos_inicial_y; float pos_final_x = 0.; float pos_final_y = 0.; float teta = 0.; unsigned int ref_time = 0; //********************************************* // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { //#asm("sei")// Não !!! deu erro na contagem !!! atual_x = (PINC & 0b00000011); /* if (atual_x >=2) atual_x = 5-atual_x; //converte de gray para binario if (atual_x==(unsigned char)(fmod((float)(antes_x+1),4.))) ang_x = ang_x - 9; else ang_x = ang_x + 9; antes_x = atual_x; */ if ( ((atual_x==3) && (antes_x==1)) || ((atual_x==2) && (antes_x==3)) || ((atual_x==0) && (antes_x==2)) || ((atual_x==1) && (antes_x==0)) ) ang_x = ang_x + 9; else { if ( ((atual_x==3) && (antes_x==2)) || ((atual_x==2) && (antes_x==0)) || ((atual_x==0) && (antes_x==1)) || ((atual_x==1) && (antes_x==3)) ) ang_x = ang_x - 9; } antes_x = atual_x; } //********************************************* 111 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC // External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { //#asm("sei")// Não !!! deu erro na contagem!!! atual_y = (PINC & 0b00001100); //atual_y = atual_y >> 2; if ( ((atual_y==12) && (antes_y==4)) || ((atual_y==8) && (antes_y==12)) || ((atual_y==0) && (antes_y==8)) || ((atual_y==4) && (antes_y==0)) ) ang_y = ang_y - 9; else { if ( ((atual_y==12) && (antes_y==8)) || ((atual_y==8) && (antes_y==0)) || ((atual_y==0) && (antes_y==4)) || ((atual_y==4) && (antes_y==12)) ) ang_y = ang_y + 9; } antes_y = atual_y; /* if (atual_y >=2) atual_y = 5-atual_y; //converte de gray para binario if (atual_y==(unsigned char)(fmod((float)(antes_y+1),4.))) ang_y = ang_y + 9; else ang_y = ang_y - 9; antes_y = atual_y; */ } //********************************************* // Timer 0 output compare interrupt service routine interrupt [TIM0_COMP] void timer0_comp_isr(void) { // Place your code here if (controlando) { ref_time++; pos_atual_x = ang_x/36.; //36=9.*0.25; pos_atual_y = ang_y/36.; //36=9.*0.25; 112 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC if (controle_vx || controle_vy) cont_time++; /***********************************/ if (controle_vx) { ref_float_x = (0.00268*(float)cont_time*(float)velocidade_rel_x) + pos_inicial_x; if (((ref_float_x > pos_final_x)&&(velocidade_rel_x>0.)) || // se passou ((ref_float_x < pos_final_x)&&(velocidade_rel_x<0.))) { ref_float_x = pos_final_x; // controle puramente posicao controle_vx = 0; } } else { ref_float_x = ref_int_x/36.; } /***********************************/ e_x = ref_float_x - pos_atual_x; integ_erro_x = integ_erro_x + e_x; u_x =(((kp_x + K_d_x)*e_x - K_d_x*e_old_x ) + K_i_x*integ_erro_x ); e_old_x = e_x; if((e_x>-0.25)&&(e_x<0.25)) { ciclo_ativo_x = 127; } else { ciclo_ativo_x = u_x*127/(84.5)+127; if ((ciclo_ativo_x>127)&&((ciclo_ativo_x-127)<ZONA_MORTA_x)) ciclo_ativo_x=127+ZONA_MORTA_x; else { if ((ciclo_ativo_x<127)&&(-ciclo_ativo_x+127)<ZONA_MORTA_x) ciclo_ativo_x=127-ZONA_MORTA_x; } } if (ciclo_ativo_x > 255) ciclo_ativo_x = 255; if (ciclo_ativo_x < 0) ciclo_ativo_x = 0; 113 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC OCR1AL = 255-(unsigned char)ciclo_ativo_x; /***********************************/ if (controle_vy) { ref_float_y = (0.00268*(float)cont_time*(float)velocidade_rel_y) + pos_inicial_y; if (((ref_float_y > pos_final_y)&&(velocidade_rel_y>0.)) || // se passou ((ref_float_y < pos_final_y)&&(velocidade_rel_y<0.))) { ref_float_y = pos_final_y; // controle puramente posicao controle_vy = 0; } } else { ref_float_y = ref_int_y/36.; } /***********************************/ e_y = ref_float_y - pos_atual_y; integ_erro_y = integ_erro_y + e_y; u_y =(((kp_y + K_d_y)*e_y - K_d_y*e_old_y ) + K_i_y*integ_erro_y ); e_old_y = e_y; if((e_y>-0.25)&&(e_y<0.25)) { ciclo_ativo_y = 127; } else { ciclo_ativo_y = u_y*127/(84.5)+127; if ((ciclo_ativo_y>127)&&((ciclo_ativo_y-127)<ZONA_MORTA_y)) ciclo_ativo_y=127+ZONA_MORTA_y; else { if ((ciclo_ativo_y<127)&&(-ciclo_ativo_y+127)<ZONA_MORTA_y) ciclo_ativo_y=127-ZONA_MORTA_y; } } if (ciclo_ativo_y > 255) ciclo_ativo_y = 255; 114 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC if (ciclo_ativo_y < 0) ciclo_ativo_y = 0; OCR1BL = (unsigned char)ciclo_ativo_y; } } //********************************************* void main(void) { K_d_x = kd_x/0.00268; K_i_x = ki_x*0.00268; K_d_y = kd_y/0.00268; K_i_y = ki_y*0.00268; // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func0=In Func1=In Func2=In Func3=In Func4=Out Func5=Out Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=0 State5=0 State6=T State7=T PORTD=0x00; DDRD=0x30; 115 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 15,625 kHz // Mode: CTC top=OCR0 // OC0 output: Disconnected TCCR0=0x0D; TCNT0=0x00; OCR0=0x30; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 250,000 kHz // Mode: Fast PWM top=00FFh // OC1A output: Non-Inv. // OC1B output: Non-Inv. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0xA1; TCCR1B=0x0B; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x80; OCR1BH=0x00; OCR1BL=0x80; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: On // INT0 Mode: Falling Edge 116 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC // INT1: On // INT1 Mode: Falling Edge // INT2: Off GICR|=0xC0; MCUCR=0x0A; MCUCSR=0x00; GIFR=0xC0; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x02; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 38400 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80; SFIOR=0x00; // Global enable interrupts #asm("sei") while (1) { cmd = getchar(); switch(cmd) { 117 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC case 1: //controle automatico cmd = 0; ref_time = 0; var_serial = getchar(); ref_int_x = var_serial; var_serial = getchar(); ref_int_x = ref_int_x +((unsigned int)var_serial)*256; var_serial = getchar(); ref_int_y = var_serial; var_serial = getchar(); ref_int_y = ref_int_y +((unsigned int)var_serial)*256; controlando = 1; break; case 2: // controle manual controlando = 0; cmd = 0; var_serial = getchar(); OCR1BL = var_serial; //PWM x var_serial = getchar(); OCR1AL = var_serial; //PWM y break; case 3: // zerar controlando=0; cmd=0; OCR1AL = 0x80; OCR1BL = 0x80; ang_x = 32768; ang_y = 32768; break; case 4: //ler encoder cmd = 0; temp_char = (unsigned char)(ref_time & 0x00FF); putchar(temp_char); 118 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC temp_char = (unsigned char)((ref_time & 0xFF00)>>8); putchar(temp_char); temp_char = (unsigned char)(ang_x & 0x00FF); putchar(temp_char); temp_char = (unsigned char)((ang_x & 0xFF00)>>8); putchar(temp_char); temp_char = (unsigned char)(ang_y & 0x00FF); putchar(temp_char); temp_char = (unsigned char)((ang_y & 0xFF00)>>8); putchar(temp_char); break; case 5: // configuração cmd = 0; var_serial = getchar(); rx_var = var_serial; var_serial = getchar(); rx_var = rx_var +((unsigned int)var_serial)*256; kp_x = rx_var/100.; var_serial = getchar(); rx_var = var_serial; var_serial = getchar(); rx_var = rx_var +((unsigned int)var_serial)*256; kd_x = rx_var/100.; var_serial = getchar(); rx_var = var_serial; var_serial = getchar(); rx_var = rx_var +((unsigned int)var_serial)*256; ki_x = rx_var/100.; var_serial = getchar(); rx_var = var_serial; var_serial = getchar(); rx_var = rx_var +((unsigned int)var_serial)*256; kp_y = rx_var/100.; 119 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC var_serial = getchar(); rx_var = var_serial; var_serial = getchar(); rx_var = rx_var +((unsigned int)var_serial)*256; kd_y = rx_var/100.; var_serial = getchar(); rx_var = var_serial; var_serial = getchar(); rx_var = rx_var +((unsigned int)var_serial)*256; ki_y = rx_var/100.; K_d_x = kd_x/0.00268; K_i_x = ki_x*0.00268; K_d_y = kd_y/0.00268; K_i_y = ki_y*0.00268; break; case 6: // controle de velocidade cmd = 0; ref_time = 0; var_serial = getchar(); ref_int_x = var_serial; var_serial = getchar(); ref_int_x = ref_int_x +((unsigned int)var_serial)*256; var_serial = getchar(); ref_int_y = var_serial; var_serial = getchar(); ref_int_y = ref_int_y +((unsigned int)var_serial)*256; var_serial = getchar(); rx_var = var_serial; var_serial = getchar(); rx_var = rx_var +((unsigned int)var_serial)*256; velocidade_abs = rx_var/100.; pos_inicial_x = ang_x/36.; // pega a posiçao inicial pos_final_x = ref_int_x/36.; // pega a posiçao final 120 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC pos_inicial_y = ang_y/36.; // pega a posiçao inicial pos_final_y = ref_int_y/36.; // pega a posiçao final teta = atan2(fabs(pos_final_y-pos_inicial_y),fabs(pos_final_x-pos_inicial_x)); if (teta<0.) teta=-teta; velocidade_rel_x = cos(teta)*velocidade_abs; velocidade_rel_y = sin(teta)*velocidade_abs; if (pos_inicial_x > pos_final_x) velocidade_rel_x = -velocidade_rel_x; if (pos_inicial_y > pos_final_y) velocidade_rel_y = -velocidade_rel_y; controlando=1; if(velocidade_abs == 0){ controle_vx=0; controle_vy=0; }else{ controle_vx=1; controle_vy=1; } cont_time = 0; break; default: break; } }; } // Fim do Programa do microcontrolador //****************************************************************** 121 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 122 O programa abaixo foi desenvolvido em C++ (programa C++ Builder), e foi testado utilizando o Windows 2000 como sistema operacional. //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <stdio.h> #include <math.h> //--------------------------------------------------------------------------#pragma package(smart_init) #pragma link "Joystick" #pragma link "PERFGRAP" #pragma resource "*.dfm" TForm1 *Form1; HANDLE hCom; //hCom = a COM da porta serial int controlando = 0; int tempo=0; int grafx, grafx2, grafy2, grafy; int teste_encoder=0; int c=127, d=127; int conta_pontos; bool ativa_transm_pontos = false; unsigned char posicionado = 1; unsigned int ref_time=0; TStringList*XPontos; TStringList*YPontos; TStringList*VPontos; FILE *stream; char filename[30]; //--------------------------------------------------------------------------//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC { } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// Form1 = Nossa janela // FormCreate = executado no inicio, antes de tudo ! //--------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender) { // apenas cria vetores em memória XPontos = new TStringList; YPontos = new TStringList; VPontos = new TStringList; } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// Button1 = Botão de abrir comunicacao serial // Rotina de Click de Button1 //--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { // serial variaveis DCB dcb; DWORD dwError; // serial variaveis BOOL fSuccess; char *COMs[4] = {"COM1","COM2","COM3","COM4"}; if (Button1->Caption == "Abrir") { RadioGroup1->Enabled = false; // desativo "radio" // crio acesso a porta serial hCom = CreateFile(COMs[RadioGroup1->ItemIndex], GENERIC_READ | GENERIC_WRITE, 123 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC 0, /* comm devices must be opened w/exclusive-access */ NULL, /* no security attrs */ OPEN_EXISTING, /* comm devices must use OPEN_EXISTING */ 0, /* not overlapped I/O */ NULL /* hTemplate must be NULL for comm devices */ ); // caso der erro if (hCom == INVALID_HANDLE_VALUE) { dwError = GetLastError(); ShowMessage(dwError); // escrever rotina de tratamento de erro de configuracao // O que fazer caso ocorra um... } fSuccess = GetCommState(hCom, &dcb); // caso consiga pegar as configuracoes da porta... if (!fSuccess) { // escreva alguma mensagem se nao conseguir sucesso na captura das // configuracoes iniciais da COM, feita acima. //não foi preenchido ! } /* baud=38400, 8 data bits, no parity, 1 stop bit. */ dcb.BaudRate = 38400; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; fSuccess = SetCommState(hCom, &dcb); // Seta configuracoes do estado da porta... if (!fSuccess) { // escreva alguma mensagem se nao conseguir sucesso no setup das // configuracoes novas da COM, feita acima. // não foi preenchido ! 124 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC } Button1->Caption = "Fechar"; // novo texto do Button1 Timer1->Enabled = true; // Ativo Timer 1 /* características das caixas gráficas */ PaintBox1->Canvas->Pen->Width = 1; // espessura da linha PaintBox2->Canvas->Pen->Width = 1; // espessura da linha PaintBox3->Canvas->Pen->Width = 1; // espessura da linha // posicao inicial do ponto PaintBox3->Canvas->MoveTo(PaintBox3->Width/2,PaintBox3->Height/2); } else { // caso o botao NAO esteja escrito abrir CloseHandle(hCom); //fecho porta Button1->Caption = "Abrir"; // escreve abrir RadioGroup1->Enabled = true; // habilito "radio" //(caixas de escolha do nome da COM) Timer1->Enabled = false; //Desativo Timer1 } } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// Button2 = Botão "Posição" // Rotina de Click de Button2 //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { float a, b; unsigned char ref; unsigned short int tx_data; // Edit1 = Posicao final X a = StrToFloat(Edit1->Text); // captura o texto e transforma para real; a = a*36; // transforma para angulo // Edit2= Posicao final Y b = StrToFloat(Edit8->Text); // captura o texto e transforma para real; 125 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC b = b*36; // transforma para angulo // Verifica se o valor nao esta em uma faixa valida if (((a<-32768) || (a>32767)) && ((b<-32768) || (b>32767))) MessageDlg("Valor Inválido !",mtWarning,TMsgDlgButtons() << mbOK, 0); else { // se estiver... if (CheckBox1->Checked) // se "habilitar" (captura) estiver marcado { fcloseall(); // fecho arquivos, se abertos, por precaução sprintf(filename, "%s.txt", Edit10->Text); // pego o nome para o arquivo stream = fopen( filename, "w+"); // abro o arquivo Edit10->Enabled = false; // desabilito poder digitar outro nome } ativa_transm_pontos = false; // transmissao sequencial de pontos desativada controlando=1; // vai para o modo "controlando" // Comando = 1 (controle posição) TransmitCommChar(hCom,(unsigned char)1); // idem comentario da linha 247 tx_data = (unsigned short int)(a+32768); ref = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)ref); ref = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)ref); tx_data = (unsigned short int)(b+32768); ref = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)ref); ref = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)ref); } } //--------------------------------------------------------------------------//--------------------------------------------------------------------------- 126 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC // Button3 = Botão zerar // Rotina de Click de Button3 //--------------------------------------------------------------------------void __fastcall TForm1::Button3Click(TObject *Sender) { // Comando 3: Zera valores TransmitCommChar(hCom,(unsigned char)3); // Zera telas gráficas PaintBox1->Canvas->MoveTo(0,PaintBox1->Height/2); PaintBox1->Color = clNone; PaintBox1->Color = clWhite; PaintBox2->Canvas->MoveTo(0,PaintBox2->Height/2); PaintBox2->Color = clNone; PaintBox2->Color = clWhite; PaintBox3->Canvas->MoveTo(PaintBox3->Width/2,PaintBox3->Height/2); PaintBox3->Color = clNone; PaintBox3->Color = clWhite; tempo=0; } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// Button4 = Botão Configurar // Rotina de Click de Button4 //--------------------------------------------------------------------------void __fastcall TForm1::Button4Click(TObject *Sender) { float a; unsigned char aux; unsigned short int tx_data; controlando=0; ativa_transm_pontos = false; // transmissão sequencial de pontos desativada // Comando 5: Configurando valores TransmitCommChar(hCom,(unsigned char)5); 127 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC a = StrToFloat(Edit2->Text); // captura o texto e transforma para real; a = a*100; // mudo escala para transmissão // idem comentario linha 247 tx_data = (unsigned short int)a; aux = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)aux); aux = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)aux); a = StrToFloat(Edit3->Text); // captura o texto e transforma para real; a = a*100; // idem comentario linha 247 tx_data = (unsigned short int)a; aux = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)aux); aux = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)aux); a = StrToFloat(Edit4->Text); // captura o texto e transforma para real; a = a*100; // idem comentario linha 247 tx_data = (unsigned short int)a; aux = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)aux); aux = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)aux); a = StrToFloat(Edit5->Text); // captura o texto e transforma para real; a = a*100; // idem comentario linha 247 tx_data = (unsigned short int)a; aux = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)aux); aux = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)aux); a = StrToFloat(Edit6->Text); // captura o texto e transforma para real; a = a*100; // idem comentario linha 247 128 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC tx_data = (unsigned short int)a; aux = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)aux); aux = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)aux); a = StrToFloat(Edit7->Text); // captura o texto e transforma para real; a = a*100; // idem comentario linha 247 tx_data = (unsigned short int)a; aux = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)aux); aux = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)aux); } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// Button5 = Botão Limpar // Rotina de Click de Button5 //--------------------------------------------------------------------------void __fastcall TForm1::Button5Click(TObject *Sender) { PaintBox3->Color = clNone; PaintBox3->Color = clWhite; } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// Button6 = Botão Velocidade // Rotina de Click de Button6 //--------------------------------------------------------------------------void __fastcall TForm1::Button6Click(TObject *Sender) { float a, b, v; unsigned char ref; unsigned short int tx_data; a = StrToFloat(Edit1->Text); // captura o texto e transforma para real; 129 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC a = a*36; // transforma para angulo b = StrToFloat(Edit8->Text); // captura o texto e transforma para real; b = b*36; // transforma para angulo v = StrToFloat(Edit9->Text); // captura o texto e transforma para real; v = v*100; // muda escala para transmissão // A partir daqui mesmo comentario da linha 360 if (((a<-32768) || (a>32767)) && ((b<-32768) || (b>32767)) && (v<0.)) MessageDlg("Valor Inválido !",mtWarning,TMsgDlgButtons() << mbOK, 0); else { if (CheckBox1->Checked) { fcloseall(); sprintf(filename, "%s.txt", Edit10->Text); stream = fopen( filename, "w+"); Edit10->Enabled = false; } controlando=1; // vai para o modo "controlando" ativa_transm_pontos = false; TransmitCommChar(hCom,(unsigned char)6); // comando controle velocidade tx_data = (unsigned short int)(a+32768); ref = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)ref); ref = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)ref); tx_data = (unsigned short int)(b+32768); ref = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)ref); ref = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)ref); 130 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC tx_data = (unsigned short int)v; ref = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)ref); ref = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)ref); } } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// Button7 = Botão Gravar // Rotina de Click de Button7 //--------------------------------------------------------------------------void __fastcall TForm1::Button7Click(TObject *Sender) { ativa_transm_pontos = false; // Vetores com os valores XPontos->Add(Edit1->Text); YPontos->Add(Edit8->Text); VPontos->Add(Edit9->Text); // adiciona os valores na forma (X;Y;V) na lista na tela Memo1->Lines->Add("( "+XPontos->Strings[XPontos->Count-1]+" ; "+ YPontos->Strings[YPontos->Count-1]+" ; "+ VPontos->Strings[VPontos->Count-1]+" )"); } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// Button8 = Botão Iniciar // Rotina de Click de Button8 //--------------------------------------------------------------------------void __fastcall TForm1::Button8Click(TObject *Sender) { // Inicia o controle sequencial conta_pontos = 0; controlando = 1; 131 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC posicionado = 1; CheckBox1->Checked = false; ativa_transm_pontos = true; } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// Button9 = Botão Apagar Tudo // Rotina de Click de Button9 //--------------------------------------------------------------------------void __fastcall TForm1::Button9Click(TObject *Sender) { ativa_transm_pontos = false; // Limpa lista com os valores dos pontos Memo1->Clear(); // Limpa os vetores XPontos->Clear(); YPontos->Clear(); VPontos->Clear(); } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// Button10 = Botão Apagar Ultimo // Rotina de Click de Button10 //--------------------------------------------------------------------------void __fastcall TForm1::Button10Click(TObject *Sender) { // se tiver pelo menos 1 linha... if (Memo1->Lines->Count>=1) { ativa_transm_pontos = false; // Apaga Ultimo valor da lista de pontos (X;Y;V) Memo1->Lines->Delete(Memo1->Lines->Count-1); // ... e tambem dos vetores. XPontos->Delete(XPontos->Count-1); YPontos->Delete(YPontos->Count-1); VPontos->Delete(VPontos->Count-1); } } 132 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC //--------------------------------------------------------------------------//--------------------------------------------------------------------------// CheckBox1 = Caixa de seleção "habilitar" // Rotina de Click de Habilitar //--------------------------------------------------------------------------void __fastcall TForm1::CheckBox1Click(TObject *Sender) { // se clicado... if (CheckBox1->Checked) { fcloseall(); // fecho todos arquivos abertos sprintf(filename, "%s.txt", Edit10->Text); // pego o nome do arquivo stream = fopen( filename, "w+"); // abro um novo arquivo Edit10->Enabled = false; // desabilito edição de nome de arquivo Timer1->Interval = 1; // mudo valor de timer1 } // se não habilitado... else { fcloseall(); // fecho todos os arquivos abertos Edit10->Enabled = true; // ativo edição de nome de arquivo Timer1->Interval = 80; // mudo valor de timer1 } } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// Rotina de Timer1 // Realizada a cada valor de tempo, em ms, // configurado na variavel Timer1->Interval. //--------------------------------------------------------------------------void __fastcall TForm1::Timer1Timer(TObject *Sender) { int frente=127, M1=127; // var joystick int lado=127, M2=127; // var joystick DWORD BytesLidos = 0; // var de contagem dos bytes recebidos int LEN_BUFFER = 6; // tamanho do buffer de recepcao dos dados pela serial unsigned char BufferRecebe[6]; // Para armazenar os dados lidos pela serial AnsiString tempx, tempy; // var temporarias 133 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC int linha1, linha2; // var auxiliares para escrever nas caixas graficas float enc_x,enc_y; // var relativas aos encoders //-----------------------------// ajuste de escala do joystick frente = 255*(Joystick1->PositionX)/65535; lado = 255*(Joystick1->PositionY)/65535; // caso o botao 1 do joystick esteja pressionado... if (Joystick1->PressedButtons.Contains(joButton1) == true) { M1=frente; M2=lado; controlando=0; // desabilitar transmissao sequencial de pontos ativa_transm_pontos = false; // limites superiores e inferiores na nova escala do joystick if (M1 > 255) M1 = 255; if (M1 < 0) M1 = 0; if (M2 > 255) M2 = 255; if (M2< 0) M2= 0; } // se nao estiver controlando... if (controlando==0) { // ... transmitimos os valores de PWM. // Sequencia: // 1) Comando (nesse caso, valor 2 referente a controle manual) // 2) PWM motor 1 (eixo X) // 3) PWM motor 2 (eixo Y) TransmitCommChar(hCom,(unsigned char)2); TransmitCommChar(hCom,(unsigned char)M1); TransmitCommChar(hCom,(unsigned char)M2); } // fim joystick //------------------------------ 134 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC // captura os dados do encoder // Comando = 4 (responder com valores dos encoders e tempo) TransmitCommChar(hCom,(unsigned char)4); // Receber os valores do encoder e referencia de tempo ReadFile( hCom, BufferRecebe, LEN_BUFFER, &BytesLidos, NULL ); // 2 bytes iniciais = referencia de tempo ref_time = (unsigned int)((unsigned char)BufferRecebe[0]+256* (unsigned char)BufferRecebe[1]); // 2 bytes seguintes = enconder X // Transformando escala 0 a 65535 para // (-32768 a 32767)*0.25/9º -- resultado em mm. enc_x = ((float)((unsigned char)BufferRecebe[2]+256* (unsigned char)BufferRecebe[3])-32768)/36.; tempx.sprintf("%.2f",enc_x); Label1->Caption = "X: "+tempx+" mm"; // 2 bytes seguintes = enconder Y // Transformando escala 0 a 65535 para // (-32768 a 32767)*0.25/9º -- resultado em mm. enc_y = ((float)((unsigned char)BufferRecebe[4]+256* (unsigned char)BufferRecebe[5])-32768)/36.; tempy.sprintf("%.2f",enc_y); Label2->Caption = "Y: "+tempy+" mm"; // fim encoder //-----------------------------// TRANSMISSAO SEQUENCIAL DE PONTOS // Memo1 = lista de pontos // se flag ativa_transm_pontos é true (1) // e ainda tem algo para enviar na lista de pontos if (ativa_transm_pontos && (conta_pontos<Memo1->Lines->Count)) { // esta posicionado ? Se sim... if (posicionado == 1) // se posicionado, manda novo ponto { float a, b, v; // var auxiliares unsigned char ref; // var de referencia unsigned short int tx_data; // var relativa a informacao transmitida 135 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC // há alguma linha na lista de pontos ? Se sim... if (Memo1->Lines->Count>0) { // captura o texto e transforma para real (X) a = StrToFloat(XPontos->Strings[conta_pontos]); a = a*36; // transforma para angulo // captura o texto e transforma para real (Y) b = StrToFloat(YPontos->Strings[conta_pontos]); b = b*36; // transforma para angulo // captura o texto e transforma para real (V) v = StrToFloat(VPontos->Strings[conta_pontos]); v = v*100; // transforma para velocidade // verifica limites if (((a<-32768) || (a>32767)) && // para X, ((b<-32768) || (b>32767)) && // para Y, ((v<0.)) || (v>600.)) // e para V // mensagem de erro MessageDlg("Redigite !",mtWarning,TMsgDlgButtons() << mbOK, 0); else // se limites estao ok... { controlando=1; // vai para o modo "controlando" // Comando = 6 (controle velocidade) TransmitCommChar(hCom,(unsigned char)6); // transmitindo referencias... (X,Y,V) // modificando escala: (-32678 a 326767) para (0 a 65535) tx_data = (unsigned short int)(a+32768); // como ref é unsigned char, (0 a 255) // ref recebe a parte mais baixa de tx_data ref = (unsigned char)tx_data; // Transmito ref... TransmitCommChar(hCom,(unsigned char)ref); // agora, ref recebe a parte mais alta de tx_data deslocada ref = (unsigned char)(tx_data>>8); // Transmito ref... TransmitCommChar(hCom,(unsigned char)ref); 136 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC // transmito variavel a (Y)... idem a X tx_data = (unsigned short int)(b+32768); ref = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)ref); ref = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)ref); // transmito variavel a (V)... idem a X tx_data = (unsigned short int)v; ref = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)ref); ref = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)ref); // incremento a variavel de contagem de pontos transmitidos // essa sequencia de comandos acima é realizada enquanto a // var conta_pontos é menor que o numero de linhas (pontos) // da listagem. conta_pontos++; } } } // Verificacao de posicionado // veja se esta posicionado dentro dos valores de erro (resolucao) // somente mando o proximo ponto da listagem caso esteja posicionado. if ((fabs(enc_x-StrToFloat(XPontos->Strings[conta_pontos-1])))<0.25 && fabs((enc_y-StrToFloat(YPontos->Strings[conta_pontos-1])))<0.25) posicionado = 1; //se sim, posicionado else posicionado = 0; // caso contrario, não } else { ativa_transm_pontos = false; } //fim da transmissao seq de pontos //-----------------------------// telas gráficas // comandos de posicionamento e impressão de linhas 137 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC // referentes ao deslocamento dos eixos if (!CheckBox1->Checked) { grafx = PaintBox1->Height-(((int)(BufferRecebe[2]+256* BufferRecebe[3])-32768)/90+PaintBox1->Height/2); grafy = PaintBox2->Height-(((int)(BufferRecebe[4]+256* BufferRecebe[5])-32768)/90+PaintBox2->Height/2); PaintBox1->Canvas->LineTo(tempo,grafx); PaintBox2->Canvas->LineTo(tempo,grafy); tempo=tempo+2; if (tempo>PaintBox1->Width) { PaintBox1->Canvas->MoveTo(0,grafx); PaintBox2->Canvas->MoveTo(0,grafy); PaintBox1->Color = clNone; PaintBox1->Color = clWhite; PaintBox2->Color = clNone; PaintBox2->Color = clWhite; tempo=0; } grafx2 = PaintBox3->Height-(((int)(BufferRecebe[2]+256* BufferRecebe[3])-32768)/45+PaintBox3->Height/2); grafy2 = PaintBox3->Width-(((int)(BufferRecebe[4]+256* BufferRecebe[5])-32768)/45+PaintBox3->Width/2); PaintBox3->Canvas->LineTo(grafy2,PaintBox3->Height-grafx2); } // fim telas gráficas //-----------------------------// Verifica se habilitado a gravar em arquivo if (CheckBox1->Checked && controlando) { fprintf(stream,"%.3f\t%.2f\t%.2f\n",0.00268*ref_time,enc_x,enc_y); } } //--------------------------------------------------------------------------//--------------------------------------------------------------------------// Form1 = A nossa janela // FormClose = Rotina executada quando a fechamos //--------------------------------------------------------------------------void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { 138 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC if (Button1->Caption == "Fechar") CloseHandle(hCom); //fecho porta delete XPontos; // deleta algumas variaveis criadas delete YPontos; delete VPontos; fcloseall(); // fecha todos arquivos abertos } //--------------------------------------------------------------------------//Para testes... //--------------------------------------------------------------------------void __fastcall TForm1::PaintBox3MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { float a, b; unsigned char ref; unsigned short int tx_data; if (Shift.Contains(ssShift)) { a = (Y-(PaintBox3->Height/2))*30; b = -(X-(PaintBox3->Width/2))*30; controlando=1; // Comando 1: Controle posição TransmitCommChar(hCom,(unsigned char)1); // Como comentario na linha 247 tx_data = (unsigned short int)(a+32768); ref = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)ref); ref = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)ref); tx_data = (unsigned short int)(b+32768); ref = (unsigned char)tx_data; TransmitCommChar(hCom,(unsigned char)ref); ref = (unsigned char)(tx_data>>8); TransmitCommChar(hCom,(unsigned char)ref); } } //--------------------------------------------------------------------------- 139 UFF - AUTOMAÇÃO DE MESA COORDENADA DESTINADA À MÁQUINA FRESADORA CNC Figura 7.1: Configuração de montagem da placa de acionamento do motor 140