Control Motor DC 5V
Control Motor DC 5V
Control Motor DC 5V
Realizado por:
Alvaro Quisilema
NRC: 1993
2
TEMA: CONTROLADOR DE UN MOTOR DC
OBJETIVOS:
RESUMEN
Se realizó el control de un motor dc con reducción, para dicho procedimiento se realizó una
identificación utilizando un step de 127 con el que pudimos obtener los datos necesarios para
que utilizando la función arcx de Matlab se identifica la función de transferencia discreta del
motor DC.
Introducción
HMI es una interfaz de usuario asistida por ordenador, actualmente una interfaz de
uso, también conocida como interfaz hombre-máquina (IHM), forma parte del
programa informático que se comunica con el usuario.
3
Marco teórico
CONTROLADOR PID
Los miembros de la familia de controladores PID, incluyen tres acciones: proporcional (P),
integral (I) y derivativa (D). Estos controladores son los denominados P, I, PI, PD y PID.
La acción PID reúne las ventajas de cada una de las tres acciones de control individuales. La
ecuación de un controlador con esta acción combinada se obtiene mediante:
PID TIPO 2
4
El PID tipo 2 presenta la estructura mostrada en la imagen anterior, la derivada del
error provoca cambios en la salida.
Este tipo de PID tiene un sobreimpulso menor que el tipo 1, de ahí porque se lo
considera uno de los más ideales y efectivos para trabajar, a más de eso este PID es
capaz de rechazar perturbaciones.
Datos
Los datos serán tomados a partir del encoder para un step de 127.
5
Se procede a realizar la identificación de la planta a partir de los datos obtenidos y mediante la
función arx se obtiene la función de transferencia respectiva.
6
Ilustración 6 Diagrama de conexiones
Código en Matlab
Control de un Motor DC
T=0.2;
z=iddata(salida,entrada,T);
m1=arx(z,[2 2 1]);
gp = tf(m1);
%Parametros de performance
Mp = 1/100;
syms zeta;
zeta = solve(Mp == exp(pi*zeta/sqrt(1-zeta^2)),zeta);
zeta = eval(zeta(1))
ts = 6;
wn = 4/(zeta*ts)
[b,a] = tfdata(gp,'v');
s1 = -wn*zeta+wn*sqrt(1-zeta^2)*i;
s2 = conj(s1);
z1 = exp(s1*T);
z2 = conj(z1);
d = poly([z1 z2 0 0])
A = [b(2) 0 0 1;
b(3) b(2) 0 a(2)-1;
0 b(3) b(2) -a(2)+a(3);
0 0 b(3) -a(3)];
C = [d(2)-a(2)+1;
d(3)+a(2)-a(3);
d(4)+a(3);
d(5)];
B = A\C
B = B';
7
s0 = B(1);
s1 = B(2);
s2 = B(3);
r = B(4);
B
G = s0 + s1 + s2;
step(feedback(pid*gp,1))
zeta =
-0.8261
wn =
-0.8070
d =
B =
40.8003
-56.3708
19.6856
-0.2492
pid =
B =
8
Ilustración 3 Respuesta a partir de la entrada con un controlador PID
Código Arduino
#include "Filter.h";
ExponentialFilter<float> filtroMotor(90,0);
float velocidad_filtrada;
9
int out = 0;
void velocidad(){
contador++;
int tiempo = 0;
int intervaloActual = 0;
double rpm = 0;
void setup() {
Serial.begin(9600);
pinMode(pinEncoderMotor, INPUT);
attachInterrupt(digitalPinToInterrupt(pinEncoderMotor),velocidad,CHANGE);
int a = 0;
void loop() {
detachInterrupt(digitalPinToInterrupt(pinEncoderMotor));
rpm = (1000.0/pulsosPorVuelta)*(float)contador/(float)intervaloActual; //
(contador/intervaloActual)*(1 rev/200 pulsos)*(60000 milis / 1 min)
contador = 0;
tiempo = millis();
velocidad_filtrada = rpm;
filtroMotor.Filter(velocidad_filtrada);
y[0]= filtroMotor.Current();
Serial.print(rpmf);Serial.print('\t');Serial.println(out);
attachInterrupt(digitalPinToInterrupt(pinEncoderMotor),velocidad,RISING);
10
if(Serial.available()>0){
String bufferString="";
while(Serial.available()>0){
bufferString +=(char)Serial.read();
a = bufferString.toInt();
sp = a;
m[2] = m[1];
m[1] = m[0];
y[2] = y[1];
y[1] = y[0];
if(m[0]>255){m[0]=255;}
if(m[0]<0){m[0]=0;}
out = m[0];
analogWrite(6,out);
delay(199);
HMI
Para controlar de una manera más amigable para el operario se realiza un HMI de
CONTROL donde se podrá manejar el set point de la planta y poder divisar como actúa
nuestro controlador.
11
Ilustración 4 HMI a utilizarse
Para poder tomar los datos y enviarlos lo hacemos por medio de una conexión serial
con la tarjeta de adquisición de datos.
12
Resultados
13
Ilustración 8 Seguimiento a referencia
CONCLUSIONES:
14