Red de conocimiento informático - Conocimiento del nombre de dominio - ¿Cuál es el programa para utilizar el microcontrolador 89C51 para controlar el motor?

¿Cuál es el programa para utilizar el microcontrolador 89C51 para controlar el motor?

Referencias:

/chary8088/blog/item/177332ce39cef70a92457ea9.html

He estado expuesto a los microcontroladores durante casi dos años, pero es solo un interés de aficionado y no tengo mucha práctica. Todavía soy un principiante. La tarea que me he propuesto estos días es solucionar el problema del microcontrolador que controla los motores paso a paso. He leído información sobre el principio y el control de los motores paso a paso antes. Después de todo, nunca lo he hecho yo mismo y los principios específicos no son muy claros. Hoy compré un motor paso a paso EPSON UMX-1 de Taobao. Este motor paso a paso es bipolar y de cuatro fases. Tiene seis cables. La apariencia es como se muestra en la siguiente imagen:

Consíguelo después de instalarlo. motor paso a paso, basándose en mi comprensión previa del motor paso a paso de cuatro fases en el libro, realicé una prueba preliminar en él, que consistía en conectar el terminal positivo de la fuente de alimentación de 5 voltios al borde de los dos cables marrones, y luego use 5 El cable de tierra de la fuente de alimentación de voltios y los otros cuatro cables (rojo, azul, blanco y naranja) se contactaron en secuencia. Se descubrió que cada vez que se contactaba, el motor paso a paso giraba un ángulo y. giró hacia adelante y hacia atrás cinco veces antes de que el motor girara una vez, lo que indica que este motor paso a paso El ángulo de paso del motor paso a paso es 360/(4×5)=18 grados. El cable de tierra y los cuatro cables entran en contacto en orden inverso y el motor gira en la dirección opuesta.

Si utilizas un microordenador de un solo chip para controlar el motor paso a paso, solo necesitas dar corrientes de pulso a los cuatro cables durante un cierto período de tiempo, y el motor puede girar continuamente. El control de velocidad se puede lograr cambiando el intervalo de tiempo de la corriente de pulso; el control de dirección se puede lograr cambiando la secuencia de corriente de pulso de los cuatro cables.

Por lo tanto, se diseña el siguiente diagrama de circuito:

El código del programa C51 es:

Código 1

#include

recuento de int estático sin firmar;

recuento final de int estático sin signo;

retraso vacío();

void main(void)

{

cuenta = 0;

P1_0 = 0;

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

EA = 1;

TMOD = 0x11; //Establece los temporizadores 0 y 1 en el modo 1 de 16 bits

ET0 = 1 ; //Permitir interrupción del temporizador 0

TH0 = 0xFC;

TL0 = 0x18; //Al configurar, interrumpir cada 1 ms

TR0 = 1; Empezar a contar

startrun:

P1_3 = 0;

P1_0 = 1;

delay();

P1_0 = 0;

P1_1 = 1;

retraso();

P1_1 = 0;

retraso(); /p>

P1_1 = 0;

P1_1 = 1;

retraso(); P1_1 = 0;

P1_2 = 1;

retraso();

P1_2 = 0;

P1_3 = 1;< / p>

delay();

goto startrun;

}

/ Procesamiento de interrupción del temporizador 0

void timeint (void ) Interrumpir 1

{

TH0=0xFC;

TL0=0x18; //Después de la configuración, interrumpe cada 1 ms

count++;

}

retraso nulo()

{

endcount=2;

count=0 ;

do{} while(count

}

Compile el programa anterior, use la línea de descarga del ISP para descargarlo al microcontrolador y ejecutarlo. en el motor paso a paso ¡Gire, éxito inicial!

Sin embargo, el programa anterior es solo el control inicial del motor paso a paso, y el control de velocidad y dirección no es lo suficientemente flexible. Además, debido al "estado intermedio" utilizado entre las bobinas del motor paso a paso. , la distancia de paso del motor paso a paso El ángulo es de 18 grados.

Por lo tanto, mejoré el código del programa de la siguiente manera:

Código 2

#include

recuento de int estáticos sin firmar;

static int step_index;

retraso nulo(unsigned int endcount);

void gorun(giro de bits, unsigned int speedlevel);

void main(void )

{

cuenta = 0;

paso _index = 0;

P1_0 = 0;

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

EA = 1; //Permitir interrupción de CPU

TMOD = 0x11; //Establece los temporizadores 0 y 1 en el modo 1 de 16 bits

ET0 = 1; //Habilita la interrupción del temporizador 0

TH0 = 0xFE

< p; >TL0 = 0x0C; //Interrumpe cada 0,5 ms durante la configuración.

TR0 = 1; //Comenzar a contar

do{

gorun(1,60);

}mientras(1) ;

}

//Procesamiento de interrupción del temporizador 0

void timeint(void) interrupción 1

{

TH0= 0xFE ;

TL0=0x0C; //interrumpe cada 0,5 ms cuando se establece

count++;

}

retraso nulo (unsigned int endcount)

{

count=0;

hacer{}mientras(count<endcount);

}

}

void gorun(giro de bits, nivel de velocidad int sin signo)

{

cambiar(step_index)

{

caso 0:

P1_0 = 1;

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

p>

ruptura;

caso 1:

P1_0 = 1;

P1_1 = 1;

P1_2 = 0 ;

P1_3 = 0;

romper;

Ejemplo 2:

P1_0 = 0;

P1_1 = 1;

P1_2 = 0;

P1_3 = 0;

romper;

Ejemplo 3:

P1_0 = 0;

P1_1 = 1;

P1_2 = 1;

P1_3 = 0;

descanso;

Ejemplo 4:

P1_0 = 0;

P1_1 = 0;

P1_2 = 1;

P1_3 = 0 ;

ruptura;

Ejemplo 5:

P1_0 = 0;

P1_1 = 0;

P1_2 = 1;

P1_3 = 1;

ruptura;

caso 6:

P1_0 = 0;

P1_1 = 0;

P1_2 = 0;

P1_3 = 1;

ruptura;

caso 7:

P1_0 = 1;

P1_1 = 0;

P1_2 = 0;

P1_3 = 1;

}

retraso(nivel de velocidad);

if (turno==0)

{

step_index++;

if ( step_index >7)

step_index=0;

}

else

{

step_index--;

if (step_index<.0)

step_index=7;

}

}

Velocidad de código mejorada Se implementan el control de dirección y dirección, y la variable global estática step_index "recordará" la posición del paso del motor paso a paso, de modo que la próxima vez que se llame a la función gorun (), pueda ser directamente

Continúe girando desde la posición de paso anterior, logrando así un paso preciso. Además, debido al uso del "estado intermedio" entre las bobinas del motor paso a paso, el ángulo de paso se reduce a la mitad a solo 9 grados y funciona a baja velocidad; es relativamente estable.

Sin embargo, en el código 2, el control de operación del motor paso a paso es la función principal. Si el programa necesita realizar otras tareas, el funcionamiento del motor paso a paso puede verse afectado y existen otros inconvenientes. En definitiva, el control no es muy perfecto. Así que mejoré el código nuevamente:

Código 3

#include

static unsigned int count //Count

static int step_index; // Número de índice del paso, el valor es 0 -7

giro del bit estático; //Dirección de rotación del motor paso a paso

bit estático stop_flag; flag

static int speedlevel; //Parámetro de velocidad del motor paso a paso, cuanto mayor es el valor, más lenta es la velocidad. El valor mínimo es 1, el más rápido

static int spcount; //Recuento de parámetros de velocidad del motor paso a paso

void delay(unsigned int endcount); //Función de retraso, el retraso es endcount * 0,5 ms

void gorun(); //Función de control de motor paso a paso

void gorun(); //Función de control de motor paso a paso

void main( vacío)

{

cuenta = 0;

step_index = 0;

spcount = 0;

stop_flag = 0;

P1_0 = 0;

step_index=0;

}

else

{

step_index--;

si (step_index<0)

step_index=7;

}

}

En el código 3, puse el control de operación del motor paso a paso en la función de interrupción programada, de modo que la función principal pueda unirse fácilmente a la ejecución de otras tareas sin afectar el funcionamiento de los motores paso a paso. En este código, no solo se implementa el control de velocidad y dirección del motor paso a paso, sino que también se agrega una función de parada Jaja, esto definitivamente es necesario.

El motor paso a paso necesita un proceso de aceleración desde parado hasta rotación a alta velocidad; de lo contrario, el motor se "atascará" fácilmente. La aceleración en el código no es muy conveniente, pero en el código tres, la aceleración es muy buena. fácil. . En este código, cuando el parámetro de velocidad speedlevel es 2, se puede calcular que la velocidad del motor paso a paso es 1500 RPM, y cuando el parámetro de velocidad speedlevel es 1, la velocidad es 3000 RPM. Cuando el motor paso a paso se detiene, si configura directamente el nivel de velocidad en 1, el motor paso a paso quedará "atascado", pero si configura el nivel de velocidad en 1 primero, el motor paso a paso quedará "atascado", pero si configura el nivel de velocidad en 1 primero, El motor se "atascará". ", y si primero establece el nivel de velocidad en 2 y deja que el motor gire a 1500 RPM, y después de unos segundos, establece el nivel de velocidad en 1, entonces el motor puede girar a una velocidad alta de 3000 RPM. Esto es "aceleración". efecto

En este circuito, considerando la corriente, el transistor NPN que utilicé es S8050, y su corriente puede alcanzar 1500 mA. En la operación real, utilicé un multímetro para medir, cuando la velocidad de rotación es de 1500 RPM. la velocidad es de 60 RPM, la corriente del motor paso a paso es de solo 90 mA y el motor genera menos calor. Cuando la velocidad de rotación es de 60 RPM, la corriente del motor paso a paso es de aproximadamente 200 mA y el motor genera menos calor.

Cuando la velocidad es de 60 RPM, la corriente del motor paso a paso es de aproximadamente 200 mA y el motor genera mucho calor, por lo que también puede usar el transistor NPN 9013. Para el problema de calentamiento del motor, puede agregar de 10 ohm a 20 ohm resistencia limitadora de corriente, pero en este paso la potencia del motor será menor.

Debido a mi superficialidad, los errores y los problemas son inevitables, ¡no dudes en iluminarme!