Hola:
Estoy tratando de mover un motor paso a paso de una disketera de 5 1/4.
Hice un codigo para utilizar tres botones B0 B1 y B2. B0 cambia el sentido de giro y los otros botones son para incrementar la velocidad.
Funciona bien hasta una determinada volocidad, mientras el paso es muy lento funciona pero cuando empiezo a subir la velocidad pasa de un paso rapido a un giro del doble de velocidad y si trato de acelerar mas se frena como si tuviese un limite.
Me podrian ver el codigo para ver si estoy haciendo bien las cosas o me estoy equivocando en algo.
Muchas gracias.
#include <16f84A.h>
#include <string.h>
#fuses XT, NOWDT
#use delay(clock=4000000)
int8 Pasos_1 = 2, x = 0;
int16 TIEMPO = 100;
char Giro = 'D';
int8 Boton;
#INT_RTCC
void Reloj() {
if(x==0) {
if(GIRO=='D') {
if (Pasos_1 == 1) {
output_high(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A2);
output_high(PIN_A3);
} else if(Pasos_1 == 2) {
output_low(PIN_A0);
output_low(PIN_A1);
output_high(PIN_A2);
output_high(PIN_A3);
} else if(Pasos_1 == 3) {
output_low(PIN_A0);
output_high(PIN_A1);
output_high(PIN_A2);
output_low(PIN_A3);
} else if(Pasos_1 == 4) {
output_high(PIN_A0);
output_high(PIN_A1);
output_low(PIN_A2);
output_low(PIN_A3);
Pasos_1 = 0;
}
} else {
if (Pasos_1 == 1) {
output_high(PIN_A0);
output_high(PIN_A1);
output_low(PIN_A2);
output_low(PIN_A3);
} else if(Pasos_1 == 2) {
output_low(PIN_A0);
output_high(PIN_A1);
output_high(PIN_A2);
output_low(PIN_A3);
} else if(Pasos_1 == 3) {
output_low(PIN_A0);
output_low(PIN_A1);
output_high(PIN_A2);
output_high(PIN_A3);
} else if(Pasos_1 == 4) {
output_high(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A2);
output_high(PIN_A3);
Pasos_1 = 0;
}
}
}
if(x++ == TIEMPO) {
x = 0;
Pasos_1++;
}
}
void main(void) {
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
setup_counters(RTCC_INTERNAL,RTCC_DIV_8);
SET_TRIS_A(0x00);
while(true) {
do {
if(!input(PIN_B0)) {
Boton = 1;
}
if(!input(PIN_B1)) {
Boton = 2;
}
if(!input(PIN_B2)) {
Boton = 3;
}
restart_wdt(); // Puesta a cero del temporizador watchdog
}while(!input(PIN_B0)||!input(PIN_B1)||!input(PIN_B2));
delay_ms(30); // Antirebotes
if(Boton == 1) {
if(Giro == 'I')
Giro = 'D';
else
Giro = 'I';
}else if(Boton == 2) {
Tiempo += 5;
}else if(Boton == 3) {
Tiempo -= 5;
}
do{
restart_wdt(); // Puesta a cero del temporizador watchdog
}while(input(PIN_B0)&&input(PIN_B1)&&input(PIN_B2));
delay_ms(30); // Antirebotes
}
}