Red de conocimiento informático - Computadora portátil - ¿Cómo acciona el microcontrolador 51 un motor de CC en lenguaje C?

¿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)

{

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;?

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;

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