Programar pic em c motor passo

363 visualizações

Publicada em

Programar em C pic

Publicada em: Engenharia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
363
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3
Ações
Compartilhamentos
0
Downloads
7
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Programar pic em c motor passo

  1. 1. Tutorial Motores – Parte 1: Lógica de programação para motores elétricos Ao iniciarmos qualquer projeto é necessário, primeiramente, saber qual o tipo de motor a ser utilizado. Logo em seguida é preciso saber algumas especificações do mesmo tal como tensão e corrente máxima e, caso seja um motor de passo, o ângulo de giro por passo, se trabalhamos com um motor de ímã permanente, relutância variável ou híbrido e, se possível, a sequência dos cabos para manter o giro do motor. Uma boa referência para estudo dos motores elétricos é o livro “Motores Eléctricos – António Francisco”. Para ilustrar programação aplicada a motores elétricos, serão apresentados dois projetos: um com um motor de passo, e outro com um motor dc. Os motores utilizados têm características especificas como será apresentado. Por isso, se você for aplicar o que está nesse tutorial na prática, confira as especificações de seu motor e ajuste o que for necessário. Nos projetos que se seguem utilizaremos Linguagem C e PICs como nossas unidades de processamento de dados. Assim sendo, é importante também que conheçamos as especificações do microcontrolador, essas podem ser facilmente encontradas em seus datasheets disponíveis na internet. Os circuitos de controle para implementação dos microcontroladores serão tema de uma próxima postagem! PROJETO 1 Precisamos que um motor gire um determinado eixo de uma máquina em 36°, no sentido horário, sempre que o controlador aperte um botão no painel. Para tal utilizaremos um motor de passo híbrido de 1,8°/passo. O motor conta com oito cabos de cores diferentes (Amarelo, Vermelho, Branco, Laranja, Preto, Azul, Verde e Marrom). Ao estudarmos as especificações do motor, soubemos que os cabos Amarelo, Branco, Azul e Verde estão sempre conectados ao terminal de menor potencial de nossa fonte. Portanto devemos nos preocupar em criar uma lógica de programação para energizar apenas os cabos Preto, Laranja, Vermelho e Marrom. Ainda estudando o datasheet do motor vemos que para manter um movimento do motor no sentido horário devemos energizar os cabos na seguinte ordem: Vermelho, Laranja, Preto, Marrom (e reiniciarmos o ciclo). E para um movimento no sentido anti-horário basta que os energizemos na ordem inversa: Marrom, Preto, laranja, Vermelho. Podemos tratar dessa ordem de cores agora como uma palavra binária de quatro bits sendo o cabo vermelho o LSB e o cabo marrom o MSB, assim, na saída do microcontrolador poderemos usar o equivalente binário para a sequência numérica: 1, 2, 4, 8. Agora, em posse desses dados sobre o motor, construiremos a nossa lógica. O programa utilizado foi o PIC C COMPILER. A vantagem desse programa é que podemos utilizar a função Project Wizard (PW) e através dessa interface configurar o PIC da forma que quisermos (inserindo quais serão os terminais de entrada e saída de dados, freqüência de trabalho do PIC, se queremos o Master Clear ativado ou não, etc.) sem precisar gastar várias linhas de programação o fazendo manualmente. Utilizaremos aqui o PIC 16F628a. Desenvolvimentodoprojeto: Parte 1- Programa Lógico: Quando utilizamos o recurso do PW o programa gera para o programador uma biblioteca já com as
  2. 2. especificações do projeto. Essa biblioteca terá o mesmo nome do projeto e será automaticamente inserida na página de programação, como pode ser visto na figura 2. Uma boa ideia é separar sempre uma pasta para cada projeto, pois cada programa gera uma série de auxiliares de mesmo nome, porém com extensões diferentes, com o tempo e acumulo de programas pode se tornar uma grande bagunça. Caso o programador queira ele pode também incluir outras bibliotecas para o programa, mas para esse nosso caso não se faz necessário. Segue então a nossa lógica: – O que se segue em vermelho foi gerado pelo programa ao finalizarmos a configuração do microcontrolador no PW. – O que se segue após o “//” até a quebra de linha (parágrafo) são comentários e não afetam na lógica do programa. – É válido lembrar que quando dizemos que na saída do controlador sairá um número inteiro, ex.: 7, o mesmo fará a conversão para binário, logo na saída teríamos: 111. #include <motor4.h>// O nome do nosso projeto é “motor4”. Portanto, o compilador gerou uma biblioteca de mesmo nome e a inseriu em nosso programa logo após finalizarmos a configuração do microcontrolador através do PW. int s, k, botao; //variaveis inteiras (int) declaradas para execução do programa void main()//inicio do programa { s=1;//condição inicial da variável s (Saída para os cabos do motor) while (1){//início do infinite loop – Forma utilizada para que o programa nunca chegue ao fim já que 1=1 a todo momento. botao=input(PIN_A0); //Com esse comando a variável botao sempre assumirá o valor lógico da porta A0 if(botao){ //[ou “if(botão==1)”]condição para iniciar o movimento de 36° for(k=1;k<=21;k++){ // número k de passos para o movimento de 36° – Como cada passo tem 1,8°, são necessários 20 passos para completar os 36° – Aqui fizemos um contador de passos do motor. if(s>=16){ s=1; } //A lógica para o movimento no sentido horário é 1, 2, 4, 8 – Podemos facilmente perceber a progressão com o multiplicador 2. Entretanto, ao atingir o ultimo fio, queremos que o motor reinicie o ciclo para manter o movimento. Assim, o número seguinte da progressão seria 16, mas com esse regulador fazemos com que o ciclo seja retomado. output_B(s);// Aqui determinamos que nas portas da família B (B0-B7)saia o valor de s (em binário) s=s*2;//Aqui está a nossa progressão dos valores da saída em B. Ao atingir essa linha, a nossa variável s assumirá um valor duas vezes maior que o anterior. delay_ms(100);// Aqui determinamos uma pausa em milissegundos (100 ms) para que o programa reinicie o loop. Esse delay varia de motor para motor, pois alguns motores foram projetados para ter menos velocidade que outros. É importante que se faça uma pesquisa do limite de velocidade do motor para não comprometer o equipamento. Caso o motor comece a esquentar ou perca o passo, significa que você excedeu o limite do mesmo. Essa velocidade é controlada pelo programador, supondo que nosso motor suporte eu poderia ter escrito: “delay_ms(30);”. } } } }//Fim do Programa
  3. 3. Figura 1: Criando um novo projeto (Project Wizard) Figura 2: Tela de programação após configuração do microcontrolador com a função Project Wizard PROJETO 2 Precisamos de um motor que faça um movimento horizontal em um trilho. Esse motor deve ir numa direção ou outra do trilho sempre que exigido, obedecendo o final do percurso. O sistema deve permitir que o motor assuma duas velocidades diferentes. Nota: O motor a ser utilizado é um motor DC de 12V. Assim como utilizamos o PIC e a programação em C para criar um sistema de controle pra um motor de passo, podemos fazer o mesmo para o controle de um motor de corrente contínua (DC).
  4. 4. O motor DC é muito mais simples que um motor de passo. Só possui dois cabos e pode girar num sentido ou em outro a depender de qual cabo estará no terminal positivo da fonte. Entretanto o problema nos exige que seja oferecida uma mudança dinâmica do estado do motor. Para isso utilizaremos um circuito conhecido como ponte H. Esse circuito cuidará para que a polaridade do motor seja alterada sempre que o controlador exija. Uma segunda condição do problema é o controle de velocidade. Diferente do motor de passo que o controle de velocidade tem que ser feito durante a programação, o motor DC possui sua velocidade alterada pela ddp aplicada em seus terminais. Assim podemos construir um circuito auxiliar contanto com relés de forma que cada um forneça uma tensão diferente para a alimentação do motor. Vamos inserir também um comando no controlador para evitar que as duas chaves sejam abertas simultaneamente. Utilizaremos nesse projeto um componente chamado chave de fim de curso. Esta será utilizada para evitar que por algum erro do controlador o motor tente extrapolar o final do trilho. Assim como no controle do motor de passo utilizaremos o PIC C COMPILER e o Project Wizard para esse novo projeto. Parte1-ProgramaLógico: Teremos nesse circuito então seis entradas de dados e quatro saídas. As entradas e saídas cumprirão os papéis: 1) Duas entradas serão as chaves de fim de curso para parar o motor sempre que ativadas e evitar que o motor saia do trilho. 2) Duas entradas serão atribuídas para o controle de velocidade. Esse controle será feito por um divisor de tensão associado a dois relés ativados distintamente a depender da entrada. 3) Duas entradas serão atribuídas para o comando de ir e voltar. 4) Duas saídas levarão aos relés para controla-los. 5) Duas saídas levarão aos terminais de entrada da ponte H para inversão da polaridade do motor. Quando configuramos o microcontrolador através do PW desativamos a entrada Master Clear (PIN_A5) assim podemos utilizar o pino como uma simples entrada de dados. #include <motortrilho.h>// O nome do nosso projeto é “motortrilho”. Portanto, o compilador gerou uma biblioteca de mesmo nome e a inseriu em nosso programa logo após finalizarmos a configuração do microcontrolador através do PW. int a, b, ir, voltar, v1, v2;//variaveis declaradas para execução do programa void main()//inicio do programa { while (1)//início do infinite loop { ir=input(PIN_A0);//alocando a variável ‘ir’ ao valor na porta A0 voltar=input(PIN_A1);//alocando a variável ‘voltar’ ao valor na porta A1 a=input(PIN_A2);//alocando a variável ‘a’ ao valor na porta A2 – Chave de fim de curso 1 b=input(PIN_A3);//alocando a variável ‘b’ ao valor na porta A3 – Chave de fim de curso 2 v1=input(PIN_A4);//alocando a variável ‘v1 ao valor na porta A4 – maior velocidade′ v2=input(PIN_A5);//alocando a variável ‘v2 ao valor na porta A5 – menor velocidade′ if(v1==1)//Caso ativemos a velocidade 1 colocaremos na saída que levará ao relé de maior tensão o nível lógico alto (high ou 1), logo esse será ativado enquanto que o outro relé estará desativado. { output_high(PIN_B5);//associando o nivel lógico high (1) à saída output_low(PIN_B4);//associando o nivel lógico low (0) à saída } if(v2==1) // Nesse momento ocorre exatamente o inverso. Caso ativemos a velocidade 2 colocaremos
  5. 5. na saída que levará ao relé de menor tensão o nível lógico alto (high ou 1), logo esse será ativado enquanto que o outro relé de maior tensão estará desativado. { output_low(PIN_B5); //associando o nivel lógico low (0) à saída output_high(PIN_B4); //associando o nivel lógico high (1) à saída } if(v1==1 && v2==1)//condição para evitar sobrecarga e apenas as duas velocidades predefinidas. Assim, caso as duas chaves sejam acionadas ao mesmo tempo, não haverá tensão sobre o motor. As duas saídas apresentarão nível lógico baixo, logo os dois relés estarão desativados. { output_low(PIN_B5); output_low(PIN_B4); } if(a==1) //Chave de fim de curso ativada. Ok, nosso motor atingiu o final do trilho e pressionou a chave que lá se encontra marcando o final do caminho, impedimos assim que o motor continue seu percurso. A chave de fim de curso nada mais é que um push button próprio para “choques mecânicos” e que marca o final de um percurso. Com ela ativada cortaremos a tensão nas entradas da Ponte H, não mais dos relés, e impedimos que haja uma tensão sobre os terminais do motor. { output_low(PIN_B6); output_low(PIN_B7); ir=0;//Essa chave será colocada no sentido do movimento “ir” do motor, assim enquanto a chave estiver ativada será impossível mandar o motor seguir neste sentido } if(b==1) //Agora construímos a lógica para a chave de fim de curso do outro lado do trilho. Da mesma forma que a primeira ela será ativada com o contato do motor. Nesse momento a chave enviará um pulso ao microcontrolador para cortar a tensão sobre os terminais do motor e voltamos ao estado “parado”. { output_low(PIN_B6); output_low(PIN_B7); voltar=0;//Essa chave será colocada no sentido do movimento “volta” do motor, assim enquanto a chave estiver ativada será impossível mandar o motor seguir neste sentido } if(ir==1) //condição para o movimento do motor em um sentido { output_low(PIN_B6); output_high(PIN_B7); delay_ms(100); //Esse delay é uma forma de garantir que o motor possa sair da condição imposta pela chave de fim de curso. Supondo que 100ms seja suficiente para que a chave volte para seu estado normal. Assim quando a chave “b” estiver acionada podemos usar o botão “ir” para retirá-la da posição. } if(voltar==1)//condição para o movimento do motor em outro sentido { output_low(PIN_B7); output_high(PIN_B6); delay_ms(100);//Esse delay é uma forma de garantir que o motor possa sair da condição imposta pela chave de fim de curso. Supondo que 100ms seja suficiente para que a chave volte para seu estado normal. Assim quando a chave “a” estiver acionada podemos usar o botão “voltar” para retirá-la da posição. } } }//Fim do programa Em uma próxima postagem trabalharemos com a construção dos circuitos onde esses microcontroladores deverão ser implementados!

×