terça-feira, 14 de fevereiro de 2023

Acionando Motor de passo a 4 fios (topologia 2 bobinas) com o PIC16F88

         Olá tudo bem! 

     Depois de um longo período sem postar nada trago um exemplo de acionamento de motor de passo que opera no modo 2 bobinas (apenas 4 fios).

    Neste exemplo foi utilizado um motor japonês STH36C1078 retirado de uma câmera de vigilância, mas pode-se utilizar qualquer outro motor de passo de 4 fios, pic 16F88, dois CI 74HC00, 8 transistores BC548, 8 diodos 1N4148, duas microswitch(tipo push botton) , um led sendo o restante composto por resistores.

     Para este exemplo pensei em algo simples como um programa que ao pressionar o botão 1 o motor gira em sentido horário e ao pressionar outro botão 2 gira em sentido anti-horário.

    Observe que a vantagem deste drive montado é que jamais ocorrerá a condição de curto, supondo que o CI esteja bom, pois o CI74HC00 faz o trabalho de sempre alternar os estado lógicos que chegam a base do transistor assim a tabela de cada drive é ‘01’- aciona a bobina num sentido (por exemplo RB0 = 0 e RB1 = 1) ,’10’ – aciona em sentido inverso, sendo que os estado ‘00’ e ‘11’ deixam as bobinas desligados, para este motor são montados 2 circuitos deste tipo(um para cada bobina).

    Deve se estar atento a sequência de ligação dos fios do motor para que ele não fique apenas “tremendo” em vez de girar. Neste projeto coloquei um resistor de baixo valor(27R) em serie com a alimentação dos transistores drives caso ocorra alguma falha este resistor funciona com fusível, porem pode se utiliza um fusível.

    Este drive pode funcionar com 5 a 12V(teoricamente pode até 30V porém não testei isso) enquanto o resto do circuito pode funciona com 5V, isso é bom pois assim não sobrecarrega o regulador de tensão que alimenta o microcontrolador.

O esquema elétrico simulado :

O código fonte:

/* Empresa cliente: BLOG MICROCONTROLADORES
 * Compilador : MPlabXC8
 * Microcontroladores compativeis : 16F88A
 * Autor: Aguivone Moretti Fógia
 * Versão: 1.0
 * Data :  14/02/2023
 * descrição : acionando motor de passo com 4 fios 
 */

#include <stdio.h>
#include <string.h> //para usar funçoes de string deve se adicionar este header
#include <stdlib.h>
#define _XTAL_FREQ 8000000
//#define _XTAL_FREQ 20000000
#include <xc.h>

#pragma config FOSC  = INTOSCIO  // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
//#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator) -- cristal de 20mhz
#pragma config WDTE  = OFF       // Watchdog Timer Enable bit (WDT habilitado)
#pragma config PWRTE = OFF       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP   = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD   = OFF         // Data EE Memory Code Protection bit (proteção da eeprom)
#pragma config CP    = OFF         // Flash Program Memory Code Protection bit (proteção do codigo

///////////////defines utilizados///////////////////////////////////////////////////////////////////////////////////////////

/*************************** configuração dos pinos **************************************************/
////////PINOS DO MOTOR ///////////////
//a bobina 1 é o fio amarelo e vermelho --->>  bobina 2 é o fio laranja e marrom
//no motor fisico a sequencia  para o modo 1 passo é 

/*
 Passo/cor
 * 1   amarelo(+)    vermelho(-)     laranja(desl)   marrom(desl)
 * 2   amarelo(desl) vermelho(desl)  laranja(+)      marrom(-)
 * 3   amarelo(-)    vermelho(+)     laranja(desl)   marrom(desl)
 * 4   amarelo(desl) vermelho(desl)  laranja(-)      marrom(+)
 * para motor desligado = todos os pinos em zero ou em 1
 
 
 */
 #define A_0              RB0   //bobina A  //deve ser colocado corretamente para girar
 #define A_1              RB1               

 #define B_0              RB2  //bobina B   
 #define B_1              RB3                 

 #define BOT_H            RA0  
 #define BOT_ANTI         RA1  
///////// PINO DE SINALIZAÇÃO //////////////
#define  LED_STATUS       RB4

void Desligar_motor(void)
{
   A_0 = 0;
   A_1 = 0;
   B_0 = 0;
   B_1 = 0;
}
void tempo_pulso(long tempo)
{//pra pode usar tempos maiores
    while(tempo>0)
    {
     __delay_ms(1);
     tempo--;
    }
}

void Girar_motor_horario(long tempo,int num_giros)
{//o tempo ira definir a velocidade de giro
    while(num_giros>0)
    {
        A_0 = 1;
        A_1 = 0;
        B_0 = 0;
        B_1 = 0;
        tempo_pulso(tempo);
        A_0 = 0;
        A_1 = 0;
        B_0 = 1;
        B_1 = 0;
        tempo_pulso(tempo);
        A_0 = 0;
        A_1 = 1;
        B_0 = 0;
        B_1 = 0;
        tempo_pulso(tempo);
        A_0 = 0;
        A_1 = 0;
        B_0 = 0;
        B_1 = 1;
        tempo_pulso(tempo);
        num_giros--;
    }
}

}
void Girar_motor_anti_hor(long tempo,int num_giros)
{//o tempo ira definir a velocidade de giro
    while(num_giros>0)
    {
        A_0 = 0;
        A_1 = 0;
        B_0 = 0;
        B_1 = 1;
        tempo_pulso(tempo);
        A_0 = 0;
        A_1 = 1;
        B_0 = 0;
        B_1 = 0;
        tempo_pulso(tempo);
        A_0 = 0;
        A_1 = 0;
        B_0 = 1;
        B_1 = 0;
        tempo_pulso(tempo);
        A_0 = 1;
        A_1 = 0;
        B_0 = 0;
        B_1 = 0;
        tempo_pulso(tempo);
        num_giros--;
    }
}

void main(void)
{
    TRISB = 0XC0;//configura portB
    TRISA = 0XFF;//configura portA
    PORTA = 0;
    PORTB = 0;//deixa pino tx em nivel alto
    OPTION_REG = 0X80; // pull up desabilitados e prescaler para timer 0 - desabilita watchdog
    INTCON = 0;//desabilita todas as interrupções 
    CMCON = 0X07;//desliga comparadores 
    OSCTUNE = 0X1F;  // oscilador vel maxima
    OSCCON = 0XFE ; // oscilador interno com frequencia de 8mhz
    ANSEL = 0X00; //portas digitais desligado. 
    GIE = 0;   
   for(;;)
     { 
       
       if(BOT_H == 0)
       {
          Girar_motor_horario(5,10);// tempo de acionamento da bobina é de 1ms e dara 10 giros 
          LED_STATUS = 1;
       }
       else
       {
            if(BOT_ANTI == 0)
            {
               Girar_motor_anti_hor(5,10);
               LED_STATUS = 1;
            }
            else
            {
               Desligar_motor();
               LED_STATUS = 0;
            }
     }
     }//loop infinito
}

Formatado no site: http://hilite.me/   14/02/2023.

Vídeo de demonstração: