Cómo utilizar un microcontrolador para controlar un motor CC
El circuito para controlar la parada y arranque del motor DC a través de los botones conectados al microcontrolador es como se muestra en la siguiente figura. El botón en el puerto P3.6 se activa para arrancar el motor DC. y el botón en el puerto P3.7 se activa para detener el funcionamiento del motor de CC. Se puede ver en la figura que cuando P1.0 genera un nivel alto "1", el transistor tipo NPN se enciende y el motor de CC se alimenta para girar; cuando P1.0 genera un nivel bajo "0", el NPN; El transistor tipo se apaga y el motor DC se detiene.
Información ampliada:
Generar onda PWM para controlar el programa del motor DC a través del microcontrolador
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
tabla de códigos uchar[10]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d , 0x07,0x7f,0x6f}; //*** código de visualización del tubo digital negativo (0-9)
sbit xiaoshudian=P0^7;
sbit wei1=P2^4 ; //Definición de selección de bits de tubo digital
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7 ;
sbit beep=P2^3; //Terminal de control del zumbador
sbit motor = P1^0; //Control del motor
sbit s1_jiasu = P1^ 4; //Botón de aceleración
sbit s2_jiansu= P1^5; //Botón de desaceleración
sbit s3_jiting=P1^6 //Botón de parada/inicio
>uint pulse_count; //El número de pulsos recibidos por INT0
uint num=0; //num es equivalente a la precisión del ajuste del ciclo de trabajo
uchar speed[3]; // Almacenamiento del valor de velocidad de cuatro dígitos
float bianhuasudu; //Velocidad actual (valor de cálculo teórico)
float Actuallyspeed //Velocidad realmente medida
float; vv_min =0.0;vv_max=250.0;
float vi_Ref=60.0; //valor dado
float vi_PreError,vi_PreDerror;
uint pwm=100; Equivalente a la variable de indicador de ciclo de trabajo
int sample_time=0; //Indicador de muestreo
float v_kp=1.2, v_ki=0.6, v_kd=0.2; constante
retraso nulo (uint z)
{
uint x,y;
for(x=z;x>0 ;x--)
for (y=20;y>0;y--);
}
void time_init()
{
ET1=1; //Permitir interrupción del temporizador T1
ET0=1; //Permitir interrupción del temporizador T0
TMOD = 0x15 ; /Conteo del temporizador 0, modo 1; Temporización del temporizador 1, modo 1
TH1 = (65536-100)/256; //Valor del temporizador 1, responsable de la interrupción PID, temporización de 0,1 ms
TL1 = (65536-100)%6;
TR0 = 1; //Encender el temporizador
TR1 = 1;
IP=0X08 ; //El temporizador 1 es de alta prioridad
EA=1; //Habilitar interrupción total
}
void keycan() p>
{
flotador j;
if(s1_jiasu==0) //Acelerar
{
retraso( 20); p>
if(s1_jiasu==0)
vi_Ref+=10;
j=vi_Ref;
>}
while(s1_jiasu==0);
if(s2_jiansu==0) //Desacelerar
{
retraso (20);
if(s2_jiansu==0)
vi_Ref-=10;
j=vi_Ref;
}
mientras(s2_jiansu==0);
if(s3_jiting==0)
{
retraso(20); p>
motor=0;
P1=0X00;
P3=0X00;
P0=0x00;
}
mientras(s3_jiting==0);
}
float v_PIDCalc(float vi_Ref,float vi_SpeedBack)
{
register float error1,d_error,dd_error;
error1=vi_Ref-vi_SpeedBack; //Cálculo de la desviación
d_error=error1-vi_PreError; //Desviación del error
p> p>dd_error=d_error-vi_PreDerror; //Tasa de cambio de error
vi_PreError=error1; //Desviación actual de almacenamiento
vi_PreDerror=d_error;
bianhuasudu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);
return (bianhuasudu);
}
void v_Display()
{
uint sudu;
sudu=(int)(reallyspeed*10); //Forzado a convertir a entero después de multiplicar por 10
velocidad[3]=sudu/1000; //Dígito de las centenas
velocidad[2]=(sudu00)/100; //Dígito de las decenas
velocidad[1]= (sudu0 )/10; //Un dígito
speed[0]=sudu; //Un decimal
wei1=0 //El primer dígito está activado; p>
P0=table[speed[3]];
delay(5);
wei1=1; //El primer bit está cerrado
wei2= 0;
P0=tabla[velocidad[2]];
retraso(5);
wei2=1;
wei3 =0;
P0=tabla[velocidad[1]];
xiaoshudian=1;
retraso(5);
wei3=1;
wei4=0;
P0=tabla[velocidad[0]];
retraso(5); p>
wei4=1;
}
void BEEP()
{
if((reallyspeed)>= vi_Ref+5|(realmentevelocidad
{
beep=~beep;
retraso(4);
}
}
void main()
{
time_init();
motor=0;
mientras (1)
{
v_Display();
BEEP();
}
if(s3_jiting==0) //Escanee el botón 3 para mejorar el efecto de parada de emergencia / p>
{
retraso(20);
motor=0;
P1=0X00;
P3= 0X00 ;
P0=0x00;
}
mientras(s3_jiting==0);
}
void timer0() interrupción 1
{
}
void timer1() interrupción 3
{
TH1 = (65536-100)/256; // tiempo de 1 ms
TL1 = (65536-100)%6;
tiempo_muestra++;
if( tiempo_muestra ==5000) //Tiempo de muestreo 0.1ms*5000=0.5s
{
TR0=0; //Cerrar temporizador 0
sample_time= 0;
pulse_count=TH0*255+TL0; //Guardar el número de pulso actual
keyscan(); //Escanear teclas
reallyspeed=pulse_count/( 4 *0.6); //Velocidad de cálculo
pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);
if(pwm
if(pwm>100) pwm =100;
TH0=TL0=0;
TR0=1; //Activar temporizador 0
}
num++ ;
if(num==pwm) //El valor numérico aquí es el ciclo de trabajo
{
motor=0;
}
if(num==100) //100 es equivalente a la precisión del ajuste del ciclo de trabajo
{
num=0;
p>motor=1;
}
}