/* CONTROL DE ACTUADORES Y SENSORE MEDIANTE PUERTO PARALELO Control de un motor paso a paso. Bobinas del motor conectadas a los cuatro primeros pines de datos mediante una etapa de potencia (ULN2003). D0 ----- (3 -ULN2003- 14) ------------- MOTOR (BOB. A) D1 ----- (4 -ULN2003- 13) ------------- MOTOR (BOB. B) D2 ----- (5 -ULN2003- 12) ------------- MOTOR (BOB. C) D3 ----- (6 -ULN2003- 11) ------------- MOTOR (BOB. D) GND ---- (8 -ULN2003- 9) --- Zener --- MOTOR COMéN --- +12 V 2002 V¡ctor R. Gonz lez */ #include #include /* Direcciones del puerto paralelo */ #define LPT_BASE 0x378 #define DATOS LPT_BASE #define ESTADO LPT_BASE+1 #define CONTROL LPT_BASE+2 /* Activaci¢n bobinas motor paso a paso */ #define BOBINA_A 0x01 /* Activa bobina A (amarillo-RS351-4574 / negro-RS440-290) */ #define BOBINA_B 0x02 /* Activa bobina B (marr¢n -RS351-4574 / azul -RS440-290) */ #define BOBINA_C 0x04 /* Activa bobina C (naranja -RS351-4574 / verde-RS440-290) */ #define BOBINA_D 0x08 /* Activa bobina D (negro -RS351-4574 / rojo -RS440-290) */ #define BOBINA_COM /* Com£n bobinas (rojo+verde-RS351-4574 / blanco+blanco-RS440-290 */ #define APAGA_MOTOR 0x00 /* Bobinas desactivadas */ #define PAUSA_PASO 10 /* Espera (en ms) entre pasos */ #define HORARIO 0 /* Sentidos de giro */ #define ANTIHORARIO 1 /* Macro que env¡a un valor al puerto de DATOS */ #define Activa(valor) outportb (DATOS, valor) void motor_pasos (unsigned num_pasos, unsigned sentido); main (void) { unsigned num_pasos; printf("Control de motor paso a paso:\n"); Activa (APAGA_MOTOR); /* Comienza con el motor detenido */ do { printf("\tIntroduce n£mero de pasos (0=salir): "); scanf("%u", &num_pasos); if (num_pasos > 0) { /* Secuencia de paso completo doble */ printf("\tSecuencia de paso completo doble:\n"); printf("\t\t... sentido horario ...\n"); motor_pasos(num_pasos, HORARIO); Activa(APAGA_MOTOR); delay (1000); printf("\t\t... sentido antihorario ...\n"); motor_pasos(num_pasos, ANTIHORARIO); Activa(APAGA_MOTOR); } } while (num_pasos > 0); return 0; } /* Hace girar un motor paso a paso seg£n una secuencia de paso completo doble */ void motor_pasos (unsigned num_pasos, unsigned sentido) { unsigned bobinas[][4] = { { /* secuencia para giro horario */ BOBINA_A | BOBINA_B, BOBINA_B | BOBINA_C, BOBINA_C | BOBINA_D, BOBINA_D | BOBINA_A }, { /* secuencia para giro antihorario */ BOBINA_D | BOBINA_A, BOBINA_C | BOBINA_D, BOBINA_B | BOBINA_C, BOBINA_A | BOBINA_B } }; unsigned paso; for (paso=0; paso