Utilice el temporizador para controlar el microcontrolador sTC del controlador del motor paso a paso L298 y solicite el código fuente de velocidad ajustable
/*----------------------------------------- ------ Nombre: Experimento con motor paso a paso Escritor: shifang Fecha: 2013.12 Revisión: Ninguna Contenido: ¿Este programa se utiliza para probar el accionamiento convencional de dos motores paso a paso de cuatro fases y utilizar un teclado matricial para ajustar la velocidad?
Medición de velocidad del sensor de infrarrojos
La pantalla LCD 1602 muestra la velocidad del 1 al 30. Cuanto mayor sea el número, mayor será la velocidad------------- ---- ----------------------------------*/
#include lt ;reg52.hgt;
p>#include "LCD1602.h"
#include "jzhjp.h"
sbit cesu1=P3^2;
sbit cesu2= P3^3;
tabla de códigos de caracteres sin firmar[11]=" 0123456789."; // Mostrar valores de código de segmento 0~9
tabla de códigos de caracteres sin signo1[]="A: "; ?//Nivel de aceleración/deceleración hacia adelante del motor 1
tabla de códigos de caracteres sin signo2[]="B: "?//Aceleración/desaceleración en retroceso; nivel del motor 1
uint count=0?//Variable de definición de conteo de pulsos de interrupción externa 0
uchar temp1=0?//Variable de definición de conteo del temporizador 1
long int v1; //Velocidad del motor 1
void Init_Timer0(void);//Función de inicialización de interrupción del temporizador
/*----- --------- ----------------------------------
Función principal
----------------------------------------- ------ ----*/
void main()
{
unsigned char num1, num2
Init_Timer0(); ?// Inicialización de interrupción del temporizador
LCD_init(); ?//Inicialización de LCD1602
write_com(0x80); p> for(num1=0; num1lt; 2 ; num1 )
{
write_data(table1[num1]);
retraso(5); /p>
}
write_com(0x80 0x40);//mostrar B:
for(num2=0;num2lt;2;num2)
{
write_data (table2[num2]);
delay(5);
}
Coil_OFF //inicializar todo apagar<
mientras (1) ?
{?
write_com( 0x8
2); // Muestra el valor de aceleración hacia adelante del motor 1
write_data(table[Speed/10]);
write_data(table[Speed10]);
write_com( 0x80 0x42); // Muestra el valor de aceleración inversa del motor 1
write_data(table[Speed1/10]);
write_data(table[Speed110]);
write_com(0x80 11); // Muestra el valor de velocidad del motor 1
write_data(table[v1/100]);
write_data(tabla[v1100/10]);
write_data(tabla[10]);
write_data(tabla[ v110]);
keyscan(); ?//keyscan de matriz
}
}
/*--------- - ----------------------------------
Subrutina de inicialización del temporizador
-------------------------------- ----------------- -- ---*/
void Init_Timer0(void)
{
TMOD |= 0x11 //Usa el modo 1, temporizador de 16 bits, usando el El símbolo "|" no se ve afectado por el uso de múltiples temporizadores
//TH0= 0x00; // Valor inicial dado
//TL0=0x00;
TH1=(65536-100000)/256; //El valor inicial dado es 50ms
TL1=(65536-100000)256;
ET1=1; la interrupción está activada
PT0=1; //La prioridad está activada
EA=1 ?//Interrupción total en IT0=1; //1 para el disparador de flanco p>
IT1=1; //1 para disparador de flanco
}
/*------------------ -- -----------------------
?Subrutina de interrupción del temporizador 0
-- -----------------------------------------------* / p>
void Timer0_isr(void) interrupción 1? //reasignar 0,5 ms
TL0=(65536-500)256
if( flag==1) ?//motor 1 positivo
{
if(times==(50-Speed))
{ p>
veces=0;
switch(i)
{
caso 0: Coil_a1; p>
caso 1: Coil_ab1; i ; romper
caso 2: Co
il_b1; i; romper;
caso 3:
caso 4: bobina_c1; p> p>
caso 6: bobina_d1; i;
caso 7: i; p>
Predeterminado.
romper
}?
}
más
veces ;
}
if(flag1==1) //motor1 invertido
{
if(times1==(50-Speed1))
{
times1=0;
switch(j)
{
caso 0: Coil_da1; 1:
caso 2: Coil_cd1; j ; romper;
caso 3: Coil_c1; j ;
caso 5: Coil_b1; j; romper;
caso 6: Coil_ab1; 8: j=0; romper;
predeterminado: romper
}
}
}
else
veces1;
}
}
}
/*----------- -------------------------------
?Programa de subrutina de interrupción del temporizador 0
------------------------------------------- -- ------*/
tiempo nulo1() interrupción 3
{
TH1=(65536-10000)/256; Recargar valor inicial 10ms
TL1=(65536-10000)256;
temp1 ;
if(temp1==100) ?//muestra 1 vez en 1s
{
temp1=0;
v1=count*3 ?//Unidad de velocidad: rpm
recuento; =0 ?//v=(cuenta/20/1)*60=cuenta*3 ?
}
}
/*------------------------------- -- ------------------
Subrutina de interrupción externa 0
------------ --------------------------------------*/
void ISR_INT0 (void) ¿Interrupción 0?
{
if(cesu1==0)?//código del motor 1 recuento de impulsos del disco
{
demora(5);
if(cesu1==0)
{
cuenta ;
}
while(!cesu1);
}
}
Hazlo tú mismo