MICROCONTROLADORES

CONTROL DE MOTOR PASO A PASO CON MICROCONTROLADOR PIC16F877

En este reciente trabajo se realizó un montaje con un teclado matricial 4×3, una pantalla LCD y un circuito integrado ULN2003 con el fin de controlar el sentido de giro de un motor paso a paso. Para esta práctica se realizó un montaje físico en la protoboard para un motor paso a paso, simulación en proteus con el adicional del código en C que permite controlar el sentido de giro del motor paso a paso.

 

OBJETIVO DEL CONTROL DE MOTOR PASO A PASO

Controlar el sentido de giro de un motor paso a paso por medio de un teclado matricial 4×3 y visualizar el sentido de giro por medio de un display LCD.

Control de motor paso a paso con microcontrolador
Figura 1. Control de motor paso a paso con microcontrolador

 

PROGRAMA DEL CONTROL DE MOTOR PASO A PASO CON EL PIC16F877

PROGRAMA.
#INCLUDE <16f887.h>
#USE DELAY(CRYSTAL=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP
#FUSES hs, nowdt
#include <lcd.c>
#DEFINE USE_PORTB_KBD
#INCLUDE <KBD.C>
#BYTE PORTB= 6
#BYTE WPUB= 0X95 // declarar registro option
#BYTE OPTION_REG = 0X81
char letra;
char sentidoDeGiro;
long i = 0;
int j = 0;
long cantidadPasos = 0;
int paso[9] = { 0b00000001,
0b00000011,
0b00000010,
0b00000110,
0b00000100,
0b00001100,
0b00001000,
0b00001001,
0b00000001};
void limpiarLCD(void){
lcd_gotoxy(1, 1);
lcd_putc(” “);
lcd_gotoxy(1, 2);
lcd_putc(” “);
lcd_gotoxy(1, 1);
}
void main()
{
OPTION_REG = 0; //en el MAIN desactivas el registro OPTION
WPUB= 0B11111111;// y seleccionas los pullups q vas a utilizar

lcd_init();
kbd_init();
set_tris_C(0b00001111);

 

//printf(lcd_putc,”Hola”);

while(1)
{
lcd_gotoxy(1, 1);
lcd_putc(“MOTOR – STEPPER.”);
lcd_gotoxy(1, 2);
lcd_putc(“PRESIONE: … “);
delay_ms(2000);

limpiarLCD();

lcd_gotoxy(1, 1);
lcd_putc(“* ANTIHORARIO “);
lcd_gotoxy(1, 2);
lcd_putc(“# HORARIO “);

while(1){
letra = 0;
letra = KBD_GETC();
if((letra == ‘*’) || (letra == ‘#’)) break;
}

if (letra == ‘*’){
limpiarLCD();
lcd_gotoxy(1, 1);
lcd_putc(“GIRAR EN SENTIDO”);
lcd_gotoxy(1, 2);
lcd_putc(” ANTIHORARIO “);
delay_ms(2000);
}

if (letra == ‘#’){
limpiarLCD();
lcd_gotoxy(1, 1);
lcd_putc(“GIRAR EN SENTIDO”);
lcd_gotoxy(1, 2);
lcd_putc(” HORARIO “);
delay_ms(2000);
}

sentidoDeGiro = letra;
limpiarLCD();
lcd_gotoxy(1, 1);
lcd_putc(” CUANTOS PASOS? “);
lcd_gotoxy(1, 2);
lcd_putc(“(1 – 9): “);

while(1){
letra = 0;
letra = KBD_GETC();
if((letra != ‘*’)&&(letra != ‘#’)&&(letra != ‘0’)&&(letra != 0)) break;
}
lcd_putc(letra);
lcd_putc(” PASOS”);
delay_ms(500);

if (letra == ‘1’) cantidadPasos = 1*64; // 45º
if (letra == ‘2’) cantidadPasos = 2*64; // 90º
if (letra == ‘3’) cantidadPasos = 3*64; // 135º
if (letra == ‘4’) cantidadPasos = 4*64; // 180º
if (letra == ‘5’) cantidadPasos = 5*64; // 225º
if (letra == ‘6’) cantidadPasos = 6*64; // 270º
if (letra == ‘7’) cantidadPasos = 7*64; // 315º
if (letra == ‘8’) cantidadPasos = 8*64; // 360º
if (letra == ‘9’) cantidadPasos = 9*64; // 405º

//# HORARIO
if(sentidoDeGiro == ‘#’){
for(i = 0; i <= cantidadPasos; i++){
for(j = 0; j < 8; j++){
output_c(paso[j]);
delay_ms(11);
}
}
}

//* ANTIHORARIO
if(sentidoDeGiro == ‘*’){
for(i = 0; i <= cantidadPasos; i++){
for(j = 8; j > 0; j–){
output_c(paso[j]);
delay_ms(11);
}
}
}

//Paramos los motores
output_c(0b00000000);
}
}

CONTENIDOS RELEVANTES

soy el administrador del sitio web. si tienes alguna duda, no dudes en contactarme

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *