Red de conocimiento informático - Material del sitio web - Cómo utilizar un microcontrolador para controlar un motor CC

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

{

flotador j;

if(s1_jiasu==0) //Acelerar

{

retraso( 20);

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

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

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

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

{

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;

}

}