Sie sind auf Seite 1von 5

blog de avelino herrera morales - Control de velocidad tipo PID para un motor DC

blog de avelino herrera morales


Enlaces
Control de velocidad tipo PID para un motor DC
mircoles, 21 de enero de 2015, 23:25 - Desarrollo Arduino, Desarrollo embebido Principal
Contacta Conmigo

Uno de los controladores ms utilizados es el tipo PID (Proporcional Integral Derivativo). A lo largo de Estadsticas
este post se abordar la implementacin de uno en Arduino para controlar la velocidad de un motor DC. ------------
MSX
Un poco de teora Call MSX
Sntesis Analgica Musical
Cuando se quiere controlar una planta (en nuestro caso un motor DC), lo ms habitual es plantear un lazo Chameleon
de control estndar: Msica
Soft
Gameboy Advance
PIC
Nintendo DS
Guineo
------------
Matrixsynth
aOrante Blog
A travs de las gafas de una
La seal que entra al controlador es la medida que queremos que alcance la planta (llamada "consigna" en ingeniera
teora del control) menos la medida de salida de la planta o, lo que es lo mismo, el error. El objetivo del Curiosidades de la
controlador ser siempre minimizar el valor absoluto del error (que tienda a cero) actuando sobre la entrada programacin
de la planta.
Entrar
Para profundizar bien en el estudio del control habra que ver las transformadas de Laplace, los polos y los
ceros del sistema y, para el caso discreto, lo ideal sera un estudio basado en la transformada Z estudiando
tambin la ubicacin de los polos y los ceros. Sin embargo me centrar en el estudio y la implementacin Redes rociales
de un controlador estndar: el PID.
Follow @avelinohm
PID
Calendario
Los controladores PID son un tipo especial de controlador que combinan la accin proporcional (P), la
accin integral (I) y la accin derivativa (D) sobre el error. Si a la entrada del controlador (el error) la Octubre 2017
llamamos e(t) y a la salida del controlador (la entrada a la planta, en nuestro caso la entrada al motor DC) la Dom Lun Mar Mi Jue Vie Sb
llamamos u(t). Podemos definir un PID de la siguiente manera: 1 2 3 4 5 6 7
$$u(t)=K_pe(t)+K_i\int_0^t e(\tau)d\tau+K_d{de(t) \over dt}$$ 8 9 10 11 12 13 14
Como se puede apreciar, la accin proporcional vendr determinada por la constante $K_p$, la accin
15 16 17 18 19 20 21
integral por la constante $K_i$ y la accin derivativa por la constante $K_d$.
22 23 24 25 26 27 28
29 30 31
1. La accin proporcional $K_p$ hace que el error en estado estacionario tienda a cero.
07/11/17
2. La accin integral $K_i$, al ir sumando los errores en el tiempo (integral), tiende a eliminar el error
estacionario generado por la accin proporcional.

3. La accin derivativa $K_d$ tiende a suavizar las variaciones en el error. Dndole vueltas a la XBox y la
quedada de Asterisk
Para determinar los mejores valores de cada una de las constantes, lo ideal es realizar un estudio mediante Vocalista en el grupo y mi
la transformada de Laplace y buscar la mejor ubicacin de los polos y los ceros del controlador PID para madre reina de la 3 edad en
que se obtenga el comportamiento deseado. Santa Cruz
Paquetes raw ethernet en
En este caso se ha optado por realizar pruebas empricas con valores bajos e ir probando diferentes Linux
combinaciones. Reproductor MP3 para la XBox
Luces del beln controladas
Implementacin a nivel hardware por Arduino con ciclo da-
noche
En este caso la planta es un motor DC del que vamos a controlar su velocidad mediante la salida PWM de 8
bits (0 a 255) y 5 voltios. La salida PWM la conectamos a la base de un transistor NPN de potencia (en este
caso un BD139) montado en configuracin de emisor comn. Archivo

Ver Archivos

2017
octubre
Implementacin de una
interfaz VGA sobre
FPGA
25/10/17
septiembre
junio

http://avelino.atlantes.org/blog/index.php?entry=entry150121-152524[08/11/2017 12:40:53 a. m.]


blog de avelino herrera morales - Control de velocidad tipo PID para un motor DC

abril

2016
diciembre
noviembre
agosto
abril
marzo
febrero
enero

2015
La lectura de la velocidad angular la hacemos utilizando un disco pintado (mitad blanco y mitad negro) diciembre
conectado al eje de rotacin (para que gire) y un sensor reflexivo de infrarrojos CNY70 (del que se utiliza en octubre
los robots sigue lneas). septiembre
julio
mayo
abril
febrero
enero

2014
diciembre
noviembre
septiembre
agosto
junio
mayo
marzo
enero

2013
diciembre
noviembre
octubre
agosto
julio
mayo
abril
febrero

2012
diciembre
noviembre
octubre
agosto
julio
mayo
Polarizando el fototransistor y el led infrarrojo y acondicionando la seal con una puerta inversora de tipo abril
schmitt, ya tenemos un flanco de subida o de bajada por cada vuelta que da el disco. marzo

2011
diciembre
noviembre
octubre
septiembre
agosto
julio
mayo
febrero
enero

2010
diciembre
agosto
julio
junio
mayo

2009
noviembre
octubre
agosto

http://avelino.atlantes.org/blog/index.php?entry=entry150121-152524[08/11/2017 12:40:53 a. m.]


blog de avelino herrera morales - Control de velocidad tipo PID para un motor DC

junio
mayo
abril
febrero
enero
Implementacin a nivel software
2008
diciembre
Lectura de la velocidad noviembre
septiembre
Para obtener la velocidad de rotacin lo ms eficiente es conectar la salida del inversor schmitt a una agosto
entrada del microcontrolador que permita disparar interrupciones internas en cada flanco de bajada o en junio
cada flanco de subida. El pseudocdigo sera como sigue: mayo
abril
rpm = 0 marzo
anterior_t = 0
febrero
cada vez que haya un flanco de subida hacer: enero
t = microsegundos
2007
incremento = t - anterior_t
rpm = (1 / incremento) * 60000000 diciembre
anterior_t = t noviembre
fin interrupcin
octubre
septiembre
agosto
De esta forma tenemos los rpm a los que va el motor. Ntese que esta implementacin no detecta la junio
velocidad de 0 rpm. Para detectar la velocidad de 0 rpm habra que incluir un timer que, pasado un tiempo mayo
determinado, si no se produce la interrupcin, asuma que el disco se ha parado (rpm = 0). En este caso no abril
se ha implementado esta funcionalidad por simplicidad. marzo
febrero
Implementacin del PID enero

2006
Para implementar el controlador PID en el Arduino (o en cualquier otro microcontrolador) tenemos que diciembre
discretizar la ecuacin diferencial que relaciona u(t) con e(t). Separamos primero dicha ecuacin diferencial noviembre
en partes: octubre
$$u(t)=u_p(t)+u_i(t)+u_d(t)$$ septiembre
Siendo: agosto
$$u_p(t)=K_pe(t)$$ julio
$$u_i(t)=K_i\int_0^t e(\tau)d\tau$$ junio
$$u_d(t)=K_d{de(t) \over dt}$$ mayo
La discretizacin de $u_p(t)$ es trivial: abril
$$u_p[k]=K_pe[k]$$ marzo
La discretizacin de $u_i(t)$ asumiento un perodo de muestreo de $T$ lo suficientemente bajo la podemos febrero
calcular aproximando la integral mediante una suma de reas de rectngulos de base $T$ y altura $e[k]$: enero
$$u_i[k]=K_i\sum_{n=0}^kTe[n]=K_iT\sum_{n=0}^ke[n]$$
2005
De la misma manera, la discretizacin de $u_d(t)$ asumiento un perodo de muestreo $T$ lo diciembre
suficientemente bajo la podemos calcular aproximando la derivada mediante el clculo de la pendiente de noviembre
la recta que une $e[k-1]$ con $e[k]$: octubre
$$u_d[k]=K_d{e[k]-e[k-1] \over T}$$ septiembre
El PID discretizado nos quedara, por tanto, de la siguiente manera: agosto
$$u[k]=K_pe[k]+K_iT\sum_{n=0}^ke[n]+K_d{e[k]-e[k-1] \over T}$$ julio
Esta ecuacin en diferencias finitas s es fcilmente implementable en cualquier sistema. En el caso de junio
Arduino podramos realizar la siguiente implementacin:

struct pid_controller { Categoras


float kp, ki, kd;
General
float delta;
Msica
float sum;

http://avelino.atlantes.org/blog/index.php?entry=entry150121-152524[08/11/2017 12:40:53 a. m.]


blog de avelino herrera morales - Control de velocidad tipo PID para un motor DC

float prevError;
Desarrollo DSP
};
Hardware para msica

Soundart Chameleon
void pid_controller_init(struct pid_controller &pid, float delta, float kp,
Roland Fantom XR
float ki, float kd) {
Software para msica
pid.delta = delta;
Hardware para msica
pid.kp = kp; MSX
pid.ki = ki;
Desarrollo para MSX
pid.kd = kd;
SDCC
pid.sum = 0;
Sonido para MSX
pid.prevError = 0; Desarrollo en general
}

Desarrollo Android

Desarrollo Arduino
float pid_controller_run(struct pid_controller &pid, float error) {
float p = pid.kp * error;
Desarrollo embebido
pid.sum += error;
Desarrollo Teensy
float i = pid.ki * pid.delta * pid.sum;
Desarrollo LPC810
float d = pid.kd * (error - pid.prevError) / pid.delta;
Desarrollo STM32
pid.prevError = error;
Desarrollo FPGAs y CPLDs
return p + i + d; Literatura
} Consolas

Atari 2600

Gameboy Advance
Las pruebas empricas realizadas han dado muy buenos resultados para:
XBox
$$K_p=K_i=K_d=0.5$$
Nintendo DS
Con un perodo de muestreo $T=0.01$. La inicializacin, por tanto, quedara as: PIC
Electrnica
void setup() {
...
pid_controller_init(motor_pid_controller, 0.01, 0.5, 0.5, 0.5); Bsqueda
...
} Bsqueda
Enviar

Mientras que cada 10 milisegundos ($T=0.01$) habr que calcular el PID:

const float SET_POINT = 1600; // consigna en rpm Conteos Totales


unsigned long last_t = 0;

Total: 6,191
Hoy: 52
void loop() {
unsigned long t = millis(); Ayer: 52
if ((t - last_t) >= 10) {
float error = SET_POINT - current_rpm;
float u = pid_controller_run(motor_pid_controller, error); ltimos Artculos
analogWrite(PWM_OUTPUT, (int) u);
Implementacin de una
last_t = t;
interfaz VGA sobre FPGA
}
} Implementacin de un
dispositivo USB en STM32
desde cero
Implementacin de un MIDI
Pruebas realizadas shuffler sobre Arduino
Implementacin en C++ de una
Para una consigna de 1000 rpm, la velocidad angular medida utilizando el PID es la siguiente (100ms entre red neuronal tipo perceptrn
medida y medida): sobre Arduino
Conversor analgico-digital
1013.99 rpm basado en registro de
1025.57 rpm aproximaciones sucesivas
1013.03 rpm
1019.02 rpm sobre FPGA
986.13 rpm Clculo de la curva de carga
1003.95 rpm de un condensador en un
1002.00 rpm
1013.65 rpm circuito RC
999.07 rpm Transmisor de radio FM
977.64 rpm
1013.99 rpm basado en FPGA
1037.49 rpm Implementacin sobre FPGA
1018.26 rpm de una interface para leds
998.14 rpm
986.71 rpm RGB de tipo neopixel (I)
1006.64 rpm Diseo e implementacin de
1017.29 rpm
1017.43 rpm un procesador RISC desde
cero (III)
Diseo e implementacin de
Mientras que para una consigna de 1600 rpm, la velocidad angular medida fue la siguiente (100ms entre un procesador RISC desde
medida y medida): cero (II)

1632.03 rpm
1591.01 rpm ltimos Comentarios
1602.56 rpm
1583.28 rpm Administrator (Avelino Herrera

http://avelino.atlantes.org/blog/index.php?entry=entry150121-152524[08/11/2017 12:40:53 a. m.]


blog de avelino herrera morales - Control de velocidad tipo PID para un motor DC

1608.92 rpm Morales)


1578.28 rpm
1599.66 rpm 10/01/17
1583.61 rpm Hola ngel, Gracias por el
1586.29 rpm
1616.21 rpm comentario. Intentar ampliar...
1619.35 rpm
1594.39 rpm Administrator (Avelino Herrera
1601.54 rpm Morales)
1581.11 rpm
1601.37 rpm 07/04/16
1606.68 rpm Gracias Carlos! Viniendo de t
1570.52 rpm es todo un halago :-)
1602.39 rpm
Administrator (Avelino Herrera
Morales)
El cdigo fuente para Arduino puede descargarse de la seccin soft. 22/04/15
Gracias, crack
Administrator (Avelino Herrera
Morales)
26/11/14
Gracias Carlos. Atend a la
sugerencia que me hiciste y...

Administrator (Avelino Herrera


Morales)
21/03/14
Hey, gracias por comentar,
Carlos. El algoritmo se utiliza...

[ aadir comentario ]
( 1815 visualizaciones )
|[ 0 trackbacks ]
|enlace permanente
Me gusta 11
Tweet| ||| ( 3 / 2642 )

<< <Anterior | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | Siguiente> >>

- Pgina generada en 0.0249 segundos|Site Views: 6191

http://avelino.atlantes.org/blog/index.php?entry=entry150121-152524[08/11/2017 12:40:53 a. m.]

Das könnte Ihnen auch gefallen