Portal - FPGA para Todos

Controle de Motor de Passo

Controle de Motor de Passo

[Vídeo]

O objetivo do projeto a seguir é controlar a velocidade e o sentido de rotação de um motor de passo, por meio da lógica digital programável. A ideia deste projeto surgiu na proposta do Professor Nazareno de Oliveira Pacheco na disciplina de Motores e Acionamentos do Curso Técnico Integrado em Eletrônica do IF-SC.

Este artigo descreve três modos diferentes de acionamento de um motor de passo: passo completo wave, passo completo normal e meio passo. O projeto será um exemplo de circuito sequencial em VHDL no Quartus II, implementando o passo inteiro. Faremos a simulação no ModelSim®-Altera, por meio de um testbench feito no Quartus II, implementando em seguida no kit de CPLD com um driver de corrente. O motor de passo é empregado em máquinas que precisam ser controladas de forma precisa como: impressoras, plotters, equipamentos de coordenadas, entre outros.

Neste projeto será utilizado:

Lógica de Funcionamento

O motor de passo é um dispositivo eletromecânico, composto por bobinas (indutores), e um rotor magnético (imã permanente ou imantado). As bobinas convertem energia elétrica em campo magnético, de forma que o rotor se alinhe a esse campo. A correta excitação das bobina faz com que o rotor (algo que gira em torno de seu próprio eixo) se mova no sentido desejado, convertendo energia magnética em movimento (energia mecanica). O rotor  de um motor de passo é rotacionado em pequenos incrementos angulares, denominados “passos”. 

O funcionamento básico do motor de passo é dado pelo uso de bobinas alinhadas dois a dois, e quando energizadas atraem o rotor, fazendo este alinhar-se com o campo magnético gerado pelas bobinas, o que causa uma variação do ângulo (geralmente pequena), a qual denominamos de passo. A velocidade e o sentido de movimento são determinados pela forma como cada bobina é ativada: ordem e a velocidade entre cada processo de ativação das bobinas.

As vantagens de utilizar um motor de passo é que ele segue uma lógica digital, possui precisão em seu posicionamento e torque aplicado, além de ter excelente resposta na aceleração e  desaceleração. No entanto, pode apresentar baixo desempenho em alta velocidade, requer certo grau de complexidade para operação, e pode ocorrer ressonância por controle inadequado. ----> Explicar melhor sobre ressonância ----

As animações abaixo mostram princípios de funcionamento de um motor de passo muito simples, com um passo de 90°. De fato, motores de passo reais têm, em geral, uma construção com estator e rotor "denteados", que resultam em passos bem menores a cada etapa de um ciclo de acionamento. O site Wikipedia apresenta, em uma página sobre "Stepper Motor" [1], uma animação bastante esclarecedora. Apresentamos a seguir três modos diferentes de acionamento de um motor de passo: Passo completo wave, passo completo normal e meio passo.

  • Passo Completo Wave:

Animação 1: Passo inteiro

Animação 1: Passo Completo Wave

A Animação 1 apresenta o acionamento do tipo passo completo wave, no qual uma bobina é acionada por vez. Seguindo uma determinada sequência, diferente para cada motor, e acionando apenas uma bobina, o rotor irá se alinhar com a bobina energizada, e na próxima etapa, fará o mesmo, dando um passo inteiro.

  • Passo Completo Normal:

Animação 2: Passo Completo Normal

Na Animação 2, é ilustrado o motor controlado de forma a fornecer mais torque. Seu funcionamento é parecido com o de passo completo wave; no entanto, a cada etapa, duas bobinas são ativadas por vez. Em outras palavras, temos as bobinas 1, 2, 3 e 4; primeiramente ativa-se 1 e 2, e em seguida 2 e 3, e assim por diante. O motor gera mais torque devido a soma vetorial dos campos magnéticos gerados por cada bobina ser maior do que apenas o campo magnético de uma bobina.

  • Meio Passo:

Animação 3: Meio Passo

Já na Animação 3, temos a ilustração do acionamento de meio passo, que funciona como a união dos acionamentos apresentados acima, de forma que dobrará o número de passos para completar uma volta. O controle é feito ativando uma bobina na primeira etapa, e em seguida, ativa-se junto dela a bobina posterior à mesma, durante a etapa dois. Isso faz com que o rotor alinhe-se entre as duas bobinas, como ocorre com acionamento de passo completo. Na próxima etapa, a bobina inicial é desativada, alinhando o rotor à única bobina ativada, dando mais meio passo. Assim, este processo de ativar uma bobina e em seguida duas bobinas acaba se repetindo, gerando meio passo.

Além da sequência de terminais, um motor de passo funciona de acordo com as especificações de seu datasheet ou na etiqueta no mesmo. O motor a ser utilizado é de 12 V e 48 Ω, retirado de uma impressora. A partir de um cálculo simples pela lei de Ohm, pode-se definir a corrente necessária para o motor funcionar ( I = V / R = 12 V / 48 Ω = 250 mA).

Nosso kit gerará sinais para o acionamento de transistores, que funcionarão como chaves para o acionamento das bobinas do motor, como foi ilustrado acima.

O diodo de roda livre foi acrescentado, pois quando o transistor é desativa/desligado a bobina correspondente(indutor) se opõe a variação da corrente, causando uma sobretensão no transistor, podendo ocasionar a queima do componente. A Animação 4 mostra esse efeito de sobretensão.

Animação 4: Sobretensão na chave

O diodo é colocado em paralelo de forma que o catodo fique conectado ao Vcc. Dessa forma, a energia armazenada no indutor é descarregada pelo diodo. A Animação 5 mostra uma animação da corrente cessando com o diodo.

Animação 5: Corrente cessando com diodo de roda livre

Observe na Figura 1 um diagrama de blocos esquematizando as etapas de todo o processo para controlar o motor.

Figura 1: Diagrama de Blocos do Projeto

Figura 1: Diagrama de Blocos do Projeto

 

Projeto em VHDL

Primeiro foi selecionada a biblioteca "ieee", junto com os pacotes desejados para a implementação do projeto.

-- Declaração das Bibliotecas e pacotes utilizados
 library ieee;
 use ieee.numeric_std.all;

O projeto possui seis entradas, sendo elas o clock do kit, habilitação do motor, reset do circuito, sentido de rotação, e dois pinos para controle de velocidade. Além disso, ele também possuí um barramento de saída de 4 bits, implementando a sequência para as bobinas do motor. Declara-se da seguinte forma:

-- Entidades e Mapeamento de Portas
 entity CTRL_MOTOR is
   port (
     CLOCK       :   in  bit;   -- Clock do kit de CPLD
     RESETn      :   in  bit;   -- Botão de reset do kit de CPLD
     ENABLEn     :   in  bit;   -- Pino que habilitação do motor
     SENTIDO     :   in  bit;   -- Sentido de rotação horária ou anti-horária
     MAIS, MENOS :   in  bit;   -- Controle de velocidade
     T       :   out bit_vector (3 downto 0)  -- Vetor de saída que vai para o motor
          );
 end entity CTRL_MOTOR;

Na arquitetura, foi criado o sinal PRESCALER, com variação de 0 à 15, e começando em 10.

-- Sinal interno do projeto, onde divide-se o
 -- ciclo de clocks, atuando como uma escala.
 architecture LOGICA of CTRL_MOTOR is
    signal PRESCALER: integer range 0 to 15 := 10;

PRESCALER, como diz no código, atuará como uma escala que dividirá os pulsos de clock. Então faz-se "PRESCALER pulsos" para controlar o motor, por exemplo, quando PRESCALER for igual a 4, só depois de 4 pulsos de clock, o controle avançará para o próximo passo.  A Figura 2 ilustra o relatado.

Figura 2: PRESCALER igual a 4

Figura 2: PRESCALER igual a 4

Ainda na arquitetura, declara-se as variáveis do processo "controle":

   begin
      controle:
      process (CLOCK, RESETn, SENTIDO, ENABLEn, MAIS, MENOS)
        -- Declaração de variáveis
       -- Conta servirá para vereficar os botões de controle de velocidade, iniciando "0".
        variable conta:   integer range 0 to 63 := 0;
       -- Posição do Motor começando em 0001
        variable POS_MOTOR:   bit_vector (3 downto 0):= "0001";
       -- Contagem conta o número de pulsos, começando em "10" (mesmo de PRESCALER)
        variable contagem:   integer range 0 to 15 := 10;

Tome cuidado, a variável "conta" é diferente da outra variável "contagem". No decorrer da programação ficará mais claro a diferença entre essas variáveis.

Inicia-se o processo pelo RESETn:

     begin
        if RESETn = '0' then            -- Se RESETn está ativado, então
          conta:= 0;                    -- as variáveis ficam no estado inicial,
          PRESCALER <= 10;              -- ou seja, conta em 0, PRESCALER em 10,
          contagem := PRESCALER;        -- contagem recebe o valor de PRESCALER,
          POS_MOTOR := "0001";          -- e POS_MOTOR em 0001.
                
        -- Se RESETn for 1, e um evento de subida de clock e ENABLE em 0, então
        elsif (CLOCK'event and CLOCK = '1' and ENABLEn = '0') then
 

Detalhe: O pressionamento dos botões apresentam nível lógico baixo.

Então, se RESETn não estiver ativo, e uma subida de clock com ENABLE em 0, ocorrerão dois controles simultâneos:

  • Velocidade
  • Posição

O primeiro controla a velocidade do motor, aumentando ou diminuindo o PRESCALER. Nessa ação, "conta" serve para testar os botões de MAIS e MENOS após um tempo determinado.

Perceba, descrito no código abaixo, que se MAIS estiver ativo e PRESCALER for maior que um, diminui-se um do PRESCALER, ou seja, diminui-se a divisão para cada pulso de clock, aumentando a velocidade do motor. Agora, se MENOS estiver ativo e PRESCALER for menor que quinze, soma-se um ao PRESCALER, ou seja, aumenta-se a divisao para cada pulso de clock, diminuindo a velocidade do motor.

        if conta /= 32 then   -- Se conta for diferente de 32, então
          conta := conta + 1; -- acrescentamos 1 no "conta".
         else                  -- Se conta for igual a 32,
           conta := 0;         -- atribuímos "0" em conta...
           if (MAIS = '0') and (PRESCALER > 1) then
            PRESCALER <= PRESCALER - 1;
            elsif (MENOS = '0') and (PRESCALER < 15) then
            PRESCALER <= PRESCALER + 1;
          end if;
         end if;

O segundo controle é referente a posição do motor. A variável "contagem" é decrementada até que o seu valor seja igual zero. Quando isso acontece, "contagem" recebe o valor de PRESCALER e o motor vai para a próxima posição. O sentido de rotação do motor, ou seja a próxima posição, dependerá também do valor de "SENTIDO", pois se estiver em 0 o motor rotacionará em sentido anti-horário, mas se estiver em 1 ele estará em sentido horário.

        if contagem /= 0 then                -- Se contagem for diferente de 0, então
           contagem := contagem - 1;          -- diminui-se 1 na contagem.
         else                                 -- Se contagem for 0,
           contagem := PRESCALER;             -- ela receberá o valor de PRESCALER e...
           if (SENTIDO = '0') then            -- Se SENTIDO estiver em 0, então
             POS_MOTOR := POS_MOTOR rol 1;    -- rotacionamos os bits de POS_MOTOR para esquerda.
           else                               -- Se SENTIDO estiver em 1, então
             POS_MOTOR := POS_MOTOR  ror 1;   -- rotacionamos os bits de POS_MOTOR para direita.
           end if;           
        end if;
       end if;

Note que as funções "rol" e "ror" rotacionam o bit, como ilustra a Figura 3.

Figura 3: Atuação das funções

Figura 3: Atuação das funções "rol" e "ror"

Por último trasmite-se o valor da variável POS_MOTOR para a saída T.

T <= POS_MOTOR;  -- Bits de POS_MOTOR vão para T (saida para o motor)
   end process;   
 end architecture LOGICA;

Depois de estruturar todo projeto, faça uma Análise e Síntese do mesmo para o programa procurar algum erro ou aviso no VHDL. Um resumo da Análise e Síntese está na Figura 4.

Figura 4: Resumo da Análise e Síntese

Figura 4: Resumo da Análise e Síntese

Simulação

Fez-se um testbench (disponível no download dos arquivos) para verificar o funcionamento do projeto na simulação com o ModelSim-Altera. Alterou-se o código em VHDL do projeto, na linha 44, para melhorar visualmente a forma de onda, pois diminuiu-se a diferença da variável "conta" de 32 para 3, logo o teste dos botões "MAIS" e "MENOS" precisa de menos pulsos para atualizar o "PRESCALER".

Observe na Figura 5, o início da simulação, onde habilita-se o motor e após um tempo "pressiona-se" o botão "MENOS" por um intervalo de tempo. Quando o botão "MENOS" atua, aumenta-se o "PRESCALER", então aumenta a quantidade de pulsos necessários para mudar a posição do motor, diminuindo sua velocidade. Percebe-se essa desaceleração no aumento do tempo para a mudança da posição do motor, ainda na Figura 5.

Figura 5: Atuação do botão

Figura 5: Atuação do botão "MENOS"

Depois, desabilitou-se o botão "MENOS" e foi acionado o botão "MAIS" por um período, diminuindo assim o "PRESCALER", como ilustra a Figura 6. Ao diminuir "PRESCALER", diminui-se a quantidade de pulsos necessários para atualizar a pocição do motor, aumentando sua velocidade. Repare essa aceleração na diminuição do tempo para a mudança da posição do motor, nos cursores 4, 5, 6 e 7.

Figura 6: Atuação do botão "MAIS"

A Figura 7 ilustra quando manteve-se a velocidade do motor e alterou-se a entrada "SENTIDO", com isso inverte-se a rotação do motor. Essa mudança na rotação acontece, pois ao alterar "SENTIDO" altera-se a rotação dos bits de saída, antes eram rotacionados para a direita, e agora são rotacionados para a esquerda.

Figura 7: Mudança na rotação dos bits

Por último, na Figura 8, resetou-se o circuito, atribuindo todas as entradas para o estado inicial.

Figura 8: Reset do Circuito

Estrutura Física

O projeto é composto pelo módulo de CPLD, uma placa de botões e uma barra de chaves, conectados respectivamente no CON2 e CON3 do kit, além de um driver de corrente, feito em uma placa de "prototipagem", conectado no CON1, como mostra a Figura 9. Lembre-se de que o CPLD usado é o EPM7064, da família MAX7000S.
 

Figura 4: Estrutura Física do projeto

Figura 9: Estrutura Física do projeto

No projeto, as saídas são conectadas à base de seu respectivo transistor, e as bobinas do motor ficam conectadas no coletor dos transistores, também seguindo uma determinada sequência. A placa montada com transistores, como mostra a Figura 10, atua no chaveamento das bobinas do motor (Animação 1). A placa de botões permite aumentar ou reduzir a velocidade do motor, enquanto a barra de chaves seleciona o sentido de rotação (horário ou anti-horário) e habilita a rotação do motor. Para resetar todo o processo, utilizou-se o botão de reset global do kit (GCLRN). As funções lógicas são implementadas pelo kit de CPLD.

Figura 5: Estrutura Física da montagem de transistores

Figura 10: Estrutura Física da Montagem de Transistores

Montagem e Roteamento

Fique atento para que o Vcc e o GND dos periféricos fiquem alinhados com o do CPLD. Este módulo foi alimentado com uma fonte de 12 V, para também poder alimentar o motor de passo e o driver de corrente. Veja em detalhe a montagem do projeto na Figura 11, feita no Fritzing.

Figura 11: Periferia ilustrada no Frizting

Figura 11: Periferia ilustrada no Frizting

Na figura acima, estamos representando também as saídas que serão conectadas aos transistores. Os quatro terminais do motor estão colocados da mesma cor que na periferia, e o Vcc indicado corresponde à alimentação dos transistores e motor (12 V), e o GND em comum (que deve ser interligado com o do kit).

A Figura 12 ilustra a pinagem atribuída para o CPLD, através da ferramenta "Pin Planner" no Quartus II, de acordo com a periferia escolhida.

Figura 12: Atribuição de Pinos no Pin Planner

Para este projeto implementamos o circuito simples com transistores apresentado anteriormente. A Figura 13 mostra a sua construção em matriz de contatos. Essa estrutura funcionará como um driver de corrente, logo fornecerá a corrente necessária para o funcionamento do motor.

Utilizamos os diodos 1N4148 [2] como diodos de roda livre, e o transistor adotado é o BC337 [3].  Os sinais  T[3..0], de saída do PLD comandam os transístores. Em nível alto, um destes sinais fará circular uma corrente de aproximadamente 7,5 mA na base do transístor correspondente, fazendo-o conduzir na saturação.  Em nível baixo, a corrente na base do transístor será nula, e ele deverá entrar na região de corte (bloqueio da corrente de coletor).

Figura 13: Driver de Corrente no Frizting

 

Gravação e Teste

Depois de implementar e atribuir os pinos do projeto, faça uma compilação do projeto para gerar o arquivo de gravação, além do programa procurar algum erro ou aviso no mesmo. Para gravar o projeto siga o tutorial do wink na etapa de "Gravação do CPLD" do artigo "Decodificador 3x8 "

Lembre-se sempre de gravar o módulo de CPLD separadamente dos periféricos, evitando problemas na pinagem atribuida em projetos anteriores. É importante também sempre lembrar de definir os pinos não utilizados como entradas tri-state.

Para testar o funcionamento desse projeto, monte a periferia indicada na sessão "Montagem e Roteamento" deste artigo e modifique os sinais de entrada nos periféricos, conferindo o resultado. O vídeo na introdução desse artigo apresenta o teste realizado.

Arquivos do Projeto

Para fazer o download do projeto completo, clique aqui.

O arquivo está no formato ".zip", e inclui os arquivos de projeto do Quartus (".qpf"), de modo VHDL (".vhd"), de gravação do CPLD (".pof"), de símbolo para usar em projetos mais avançados (".bsf"), e também inclui o testbench já configurado (".vhd"), entre outros.

Referências

[1] WIKIPEDIA. Stepper motor. Disponível em: http://en.wikipedia.org/wiki/Stepper_motor . Acesso em: 05 jul. 2012.

[2]Datasheet do 1N4148

[3]Datasheet do BC337

Quem está Online

Temos 32 visitantes e Nenhum membro online

Apoio

Login Form