¿Cómo acciona el microcontrolador 51 un motor de CC en lenguaje C?
51 programa de motor de CC que controla (usando el chip l298n):
#includelt; reg51.hgt
#includelt; >
#define uint unsigned int
#define uchar unsigned char
#define N 100
sbit?s1=P1^0; puerto de la unidad
sbit s2=P1^1 //puerto de la unidad del motor
sbit s3=P1^2 //puerto de la unidad del motor
sbit s4= P1^3; //Puerto de accionamiento del motor
sbit en1=P1^4; //Puerto de habilitación del motor
sbit en2=P1^5; //Terminal de habilitación del motor
sbit LSEN=P2^0; //tubo fotoeléctrico más a la izquierda
sbit LSEN1=P2^1; //tubo fotoeléctrico izquierdo 1
sbit LSEN2=P2^2; //Tubo fotoeléctrico izquierdo 2
sbit RSEN1=P2^3; //Tubo fotoeléctrico derecho 1
sbit RSEN2=P2^4; / /Tubo fotoeléctrico derecho 2
sbit RSEN=P2^5; //tubo fotoeléctrico más a la derecha
uint pwm1=0, pwm2=0, t=0;
retraso vacío (uint xms) p>
{
uint a;
mientras(--xms)
{
for(a=123; agt; 0; a--);
}
}
motor vacío (velocidad de uchar1, velocidad de uchar2)
{
if(velocidad1gt;=-100amp;amp;velocidad1lt;=100)
{?
pwm1 =abs(velocidad1);
if(velocidad1gt;0)?
{
s1=1;
s2=0 ?
}
si(velocidad1==0)
{
s1=1;
s2 =1;
}
if(velocidad1lt;0)?
{
s1=0;
s2=1;
}
}
if(speed2gt;=-100amp;amp;speed2lt;=100)
{
pwm2=abs( velocidad2);
if(velocidad2gt;0)?
{
s3=1;
p>
s4= 0;?
}
if(velocidad2==0)
{
s3=1 ;
s4=1;
}
si(velocidad2lt;0)?
{
s3 =0;
s4=1;
}
}?
}
void go_forward(velocidad uint)
{
s1=1;
s2=0;
s3=1;
p>
pwm1=velocidad;
pwm2=velocidad;
}
void go_back(velocidad uint)
{
s1=0;
s2=1;
s3=0; pwm1=velocidad;
pwm2=velocidad;
}
parada vacía()
{
s1 =1;
s2=1;
s3=1;
s4=1;
pwm1=0;
pwm2=0;
}
void turn_right(uint P1, uint P2) //función de giro a la derecha
{
s1=1;
s2=0;
s3=0;
s4=1;?
pwm1=P1; ;
pwm2=P2;
}
void turn_left(uint P1, uint P2) //Función de giro a la izquierda
{
s1=0;
s2=1;
s3=1;
s4=0;?
pwm1=P1;
pwm2=P2;
}
seguimiento de vacíos()
{
if((LSEN1==0)amp;amp;(LSEN2==0)amp;amp;(RSEN1==0)amp;amp;(RSEN2==0)) //No detectado
{
go_forward(100);
}
if((LSEN1==1)amp;amp;(LSEN2==0)amp;amp; (RSEN1==0)amp;amp;(RSEN2==0)) //Se detectó uno izquierdo
{
turn_left(40, 80); //Girar rueda izquierda derecha 》Retraso de la rueda izquierda
(N);
}
if((LSEN1==0)amp;amp;(LSEN2==1)amp ; amp; (RSEN1==0)amp;amp; (RSEN2==0)) //Se detectó la segunda izquierda
{
turn_left(40, 60); y rueda derecha》Rueda izquierda
retraso(N);
}
if((LSEN1==0)amp;amp;(LSEN2==0 )amp;amp;(RSEN1==1)amp;amp;(RSEN2==0)) //Se detecta el correcto
{?
turn_right(60, 4 ) ; //Girar rueda derecha > Rueda derecha
delay(N);
}?
if((LSEN1==0)amp;amp; ( LSEN2==0)amp;amp;(RSEN1==0)amp;amp;(RSEN2==1)) //Segunda derecha detectada
{
turn_right(80 , 40); //Girar rueda derecha》Rueda derecha
delay(N);
}
if((LSEN1==1)amp;amp ;(LSEN2==1))
{
turn_left(0, 100);
>retraso(1000);?
}
if((RSEN1==1)amp;amp;(RSEN2==1))
{
turn_right(100,0);
retraso(1000);?
}?
}
evitación de vacío()
{
}
void init()
{
TMOD=0x02; //timer0 también está configurado como modo 2, 8 modo de conteo de recarga automática
TH0=156; //el valor inicial del temporizador se establece en 100us de interrupción
TL0=156;? p >
ET0=1;
EA=1;
TR0=1; //Habilitar interrupción total
}
void main()
{?
init();
mientras(1)
{
seguimiento();
}
}
void timer0() interrupción 1 //El controlador del motor proporciona señal PWM
{ ?
si(tlt;pwm1)
en1=1;
¿otra cosa?
en1=0;
if(tlt;pwm2)
en2=1;
¿otra cosa?
en2=0;
t; p>
if(tgt;100)?
t=0;
}?
Información ampliada
L298N es un chip controlador de motor de puente H dual, cada puente H puede proporcionar corriente de 2 A, el rango de voltaje de la fuente de alimentación de la parte de alimentación es de 2,5 a 48 V, la parte lógica funciona con 5 V y acepta niveles de 5 VTTL. Generalmente, el voltaje de la sección de alimentación debe ser superior a 6 V; de lo contrario, es posible que el chip no funcione correctamente.
Enciclopedia Baidu-l298n