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 }
Nenhum comentário :
Postar um comentário
olá,digite aqui seu comentário!