# Control PID automático de velocidad de un motor DC



## Adonayo (Jun 12, 2010)

Hola... Tengo una duda y espero que alguien me pueda ayudar...

Tengo un motor DC (12 V) en el cual quiero controlar su velocidad mediante un control PID, hasta aqui no hay problema pues ya tengo un circuito hecho el cual hace esto, solo que la velocidad de giro del motor la controlo mediante un potenciometro.

El problema aqui es que necesito quitar ese potenciometro, y meterle un "algo" que haga lo que el potenciometro pero sin que intervenga el factor hombre, para así hacerlo automático.

No tengo ni la mas minima idea de si podría modificar el circuito que ya tengo o no se que mas pueda hacer.
Para explicarme mejor, les escribo el ejemplo que me puso mi profe de control:

_"Imagínate que tienes una banda, que pasa a una cierta velocidad. Ahora imagina que le pones una carga, por lógica la velocidad en la banda con el peso proporcionado por la carga disminuye, entonces lo que queremos es que mediante el control PID tu compenses esa perdida de velocidad y automáticamente se aumente el voltaje de la señal de referencia para que así la banda se desplace a la misma velocidad que lo haría sin carga"_

 Les agradezco sus respuestas y opiniones...

*Adjunto el diagrama del circuito que ya tengo


----------



## Beah (Jun 12, 2010)

Podrías poner retroalimentación.... La misma banda tiene un motor X, que en relentí (normal) genera X voltaje, y con un comparador, se le mete el mismo voltaje, dando como salida 0... cuando vaya lento, dará un resultado X... ese voltaje irá a un circuito calibrado para que salga a un transistor con el cual puedas manejarlo dentro de la gráfica... o  algún circuito de Modulación por Ancho de Pulso...

es una idea....


----------



## Adonayo (Jun 13, 2010)

Beah, gracias por tu respuesta. 
He visto que me faltaba la retroalimentación gracias a tu comentario, (de hecho creo que si la tenia pero en el lugar equivocado) así que he modificado el diagrama, le he hecho unos ajustes de mas y me gustaria que me dieran su opinion acerca de ello.

Les explico:
Se supone que el voltaje de referencia, es eso, el nivel al cual siempre debe de estar funcionando el motor...
Despues, el potenciometro de 500k lo utilizo como simulación de carga (volviendo al ejemplo de la banda, esto seria analogo al peso sobre la banda)

Entonces, segun yo, esto ya seria un controlador PID automatico de velocidad de un motor de cd, ¿o me equivoco?


----------



## Felix Juan (Jun 13, 2010)

Adonayo dijo:


> Entonces, segun yo, esto ya seria un controlador PID automatico de velocidad de un motor de cd, ¿o me equivoco?


 
Sí, te equivocas . Fíjate en este último esquema que has mandado. Tal y como está conectado, el potenciómetro simulador de carga no hace absolutamente nada.

Volviendo al primer circuito: Veo que a las entradas de U1A tienes un potenciómetro en cada una de ellas. ¿Para qué? Se supone que a la entrada 'no inversora (+)' llevas la referencia o consigna de la velocidad a la que quieres que funcione el motor. Esta consigna la puedes sacar de un potenciómetro o de cualquier otra señal de control que te interese (una salida analógica de un PIC, por ejemplo).

A la entrada 'inversora' le debería llegar una tensión proporcional a la velocidad del motor. Simplemente con eso se produce la retroalimentación. Para conseguir una señal proporcional a la velocidad del motor debes ponerle algún sensor de velocidad a dicho motor. En motores grandes se usan dinamos tacométricas (no es el caso). En motores pequeños se usan varias opciones:

- Un circuito que entrega una señal de velocidad en función de la f.c.e.m., poco preciso pero sencillo.

- Unas marcas blancas y negras en la polea del motor, un sensor óptico, y un convertidor frecuencia tensión. Mas complicado pero muy preciso.

- Algún tipo de sensado en el resultado final. Un CD mide la velocidad con el propio CD, según el intervalo de tiempo entre las grabaciones de bits.

Espero que te sirva, porque así de forma teledirigida es difícil ayudar mucho más. Por cierto, dale un repaso a las polaridades que me parece que tienes la alimentación al revés.


----------



## Adonayo (Jun 14, 2010)

Gracias *Felix Juan* por tu magnifica respuesta...
Jeje, yo que ya me había emocionado, has matado todas mis ilusiones  ... no te creas, así ya se que mi idea es totalmente erronea 

Bueno, entonces suponiendo que elimino ese potenciometro inservible, ¿lo podria remplazar con un generador conectado al rotor del motor?

Y si es posible, ¿donde podría conectar sus terminales?

Agradezco de nuevo sus respuestas, ideas y opiniones...

Saludos.


----------



## Felix Juan (Jun 14, 2010)

De verdad que no quería matar nada, y mucho menos tus ilusiones.

No te puedo responder con un esquema porque ahora no tengo ningún programa para dibujar. Volvamos al primer esquema, que está más claro (insisto en que la alimentación, tal y como has dibujado las baterías, está al revés).

Sí podrías reemplazar el potenciómetro por un generador. De hecho, deberías hacerlo. No se qué tipo de generador podrás conseguir que sea tan pequeño como para utilizar con un motor de CD, pero ahí vas a tener tu búsqueda y tu logro. La salida de este generador la conectas entre masa y el mismo punto donde hasta ahora tenías conectado el potenciómetro. Con eso ya tienes la retroalimentación.


----------



## antiworldx (Jun 14, 2010)

Si no quieres usar un generador, usa un detector de pulsos, como un infrarrojo con su emisor, receptor, asi tu detectas la frecuencia con que se mueve la banda.

Ahora, que pasa si usas un filtro sintonizado justo en la frecuencia maxima a detectar?, pues tendras un voltaje que aumenta y baja dependiendo de la frecuencia del detector. y asi ya tienes un detector mas preciso que un generador.


----------



## Felix Juan (Jun 15, 2010)

Ahora el que necesita un poco de ayuda soy yo. La verdad es que los filtros no son lo mío.



antiworldx dijo:


> Ahora, que pasa si usas un filtro sintonizado justo en la frecuencia maxima a detectar?


 
Filtro pasabajos? Pasaaltos? Alguna referencia sobre esta técnica? Gracias.


----------



## Adonayo (Jun 15, 2010)

*Felix Juan*
Perdona mi ignorancia, pero a que te refieres con esto:


Felix Juan dijo:


> (insisto en que la alimentación, tal y como has dibujado las baterías, está al revés).


Segun esto, es una fuente dual de voltaje +/-12V, el punto que une a ambas esta referenciado a masa.
Si te refieres a que estan mal conectados los A.O. en la datasheet del TL084CN en el pin 4 entra Vcc + y en el pin 11 Vcc -
El que si esta mal conectado es el TIP32C puesto que se alimenta de tensión negativa.hno:
¿Te refieres a alguno de los puntos arriba mencionados? o ¿es en otro lado donde estan mal?


Felix Juan dijo:


> Sí podrías reemplazar el potenciómetro por un generador. De hecho, deberías hacerlo. No se qué tipo de generador podrás conseguir que sea tan pequeño como para utilizar con un motor de CD, pero ahí vas a tener tu búsqueda y tu logro. La salida de este generador la conectas entre masa y el mismo punto donde hasta ahora tenías conectado el potenciómetro. Con eso ya tienes la retroalimentación.



Gracias, he realizado esto con exito... el generador que utilice fue uno similar al que utilizo como motor.
El problema ahora es que no me controla nada... el motor gira sin control, (a lo tonto pues) puesto que el potenciometro de la señal de referencia (el potenciometro de 10k) no hace absolutamente nada, lo intente conectar con el emisor del transistor, pero se quemo  supuse que se debio a la poca resistencia ofrecida, pero... ¿que otra cosa podria causar esto?

*antiworldx* gracias por responder...


antiworldx dijo:


> Si no quieres usar un generador, usa un detector de pulsos, como un infrarrojo con su emisor, receptor, asi tu detectas la frecuencia con que se mueve la banda.
> 
> Ahora, que pasa si usas un filtro sintonizado justo en la frecuencia maxima a detectar?, pues tendras un voltaje que aumenta y baja dependiendo de la frecuencia del detector. y asi ya tienes un detector mas preciso que un generador.


Esto suena interesante, ¿nos podrias explicar mas detalladamente por favor?

Gracias de nuevo y saludos


----------



## Beah (Jun 15, 2010)

Creo que debes primero ver que voltage genera el motor antes de conectarlo, estando a relentí... y buscas un comparador para ese parametro... o creas un divisor de voltage  para no dañar al que ya tienes....


----------



## Felix Juan (Jun 15, 2010)

Adonayo dijo:


> *Felix Juan*
> Perdona mi ignorancia, pero a que te refieres con esto:
> 
> Segun esto, es una fuente dual de voltaje +/-12V, el punto que une a ambas esta referenciado a masa.
> ...


 
El TIP32C se alimenta de tensión positiva, según el esquema, ya que tiene el colector conectado a la misma linea que el pin 4 del TL084 (que como ya me has explicado, es positivo). Pero entonces debería ser un transistor NPN, no un PNP (esto es lo que me ha despistado).

El que si tienes mal conectado es U2A, ya que no puedes dejar un operacional sin realimentación de ningún tipo. Se lanza hacía positivo o negativo al menor desequilibrio entre las entradas.


----------



## Adonayo (Jun 21, 2010)

Felix Juan dijo:


> El TIP32C se alimenta de tensión positiva, según el esquema, ya que tiene el colector conectado a la misma linea que el pin 4 del TL084 (que como ya me has explicado, es positivo)...


Mmm sí, tienes razón, es por eso que decía que estaba mal conectado, debería estar alimentado de tensión negativa, jaja aunque creo que ya me confundi un poco 


Felix Juan dijo:


> ...Pero entonces debería ser un transistor NPN, no un PNP (esto es lo que me ha despistado).


Corrigeme si me equivoco, lo que tu dices es que así tal cual esta el diagrama deberia estar conectado un transistor NPN, ¿o no? Entonces ese TIP32 debería ser cambiado por un TIP31, lo probaré y vere que sucede...


Felix Juan dijo:


> El que si tienes mal conectado es U2A, ya que no puedes dejar un operacional sin realimentación de ningún tipo. Se lanza hacía positivo o negativo al menor desequilibrio entre las entradas.


Pues segun yo, la retroalimentación (realimentación) seria la suma de las señales de U1B, U1C y U1D ... de eso sí estoy seguro pues es un controlador PID y al menos así me enseñaron que es su _"estructura"_. O talvez te refieras a otra cosa, si es así, me encantaría que me orientaras al respecto 

Saludos y de nuevo muchas gracias por tu interes mostrado en este tema


----------



## Felix Juan (Jun 22, 2010)

Adonayo dijo:


> Corrigeme si me equivoco, lo que tu dices es que así tal cual esta el diagrama deberia estar conectado un transistor NPN, ¿o no? Entonces ese TIP32 debería ser cambiado por un TIP31, lo probaré y vere que sucede...


 
Si, pon un npn tal cual tienes conectado el TIP32 (colector a colector, emisor a emisor).



Adonayo dijo:


> Pues segun yo, la retroalimentación (realimentación) seria la suma de las señales de U1B, U1C y U1D ... de eso sí estoy seguro pues es un controlador PID y al menos así me enseñaron que es su _"estructura"_. O talvez te refieras a otra cosa, si es así, me encantaría que me orientaras al respecto


 
No me refiero a la retroalimentación como circuito de control. Eso ya está como tú bien dices. Me refiereo a la *realimentación* del U2A. Debería haber una resistencia (probablemente de 1k pero mejor pon una ajustable y prueba) conectada entre la entrada inversora de U2A (pin 2) y el emisor de Q2. Este paso sumador-inversor necesita su propia realimentación igual que los demás pasos.

Acabo de encontrar este tutorial en otro foro que está muy bien:

http://www.todopic.com.ar/foros/index.php?topic=30030.0

Pregunta a moderador: ¿Esto se llama canibalizar foros?


----------



## Adonayo (Jun 25, 2010)

Felix Juan dijo:


> Debería haber una resistencia (probablemente de 1k pero mejor pon una ajustable y prueba) conectada entre la entrada inversora de U2A (pin 2) y el emisor de Q2. Este paso sumador-inversor necesita su propia realimentación igual que los demás pasos.


Gracias por tu aporte!
No sabía que era necesario. Más bien no recordaba todo eso de la ganancia del A.O. se me pasó  


Felix Juan dijo:


> Acabo de encontrar este tutorial en otro foro que está muy bien:
> 
> http://www.todopic.com.ar/foros/index.php?topic=30030.0
> 
> Pregunta a moderador: ¿Esto se llama canibalizar foros?


Ese circuito ya lo había armado, y solo una vez me salio, nunca supe como funcionaba, pero este tuto esta muy bueno y muy bien explicado ... De hecho, trate de armar este mismo recientemente y "modificarlo" para hacerlo automático, no pude hacer que funcionara por X razón... entonces después de andar probando, termine por armar el circuito que postee en un principio.
Creo que iniciare desde "cero", pero anexando todo lo que han aportado...
Espero que funcione y publicar el resultado final, talvez en un futuro lo podamos mejorar! 

Una vez más, *GRACIAS Felix* por compartir tus conocimientos


----------



## Felix Juan (Jun 26, 2010)

De nada. Espero impaciente tus resultados exitosos.


----------



## tecol (Ago 23, 2010)

adoyano  !! hola !  pudiste realizar el control del motor ?


----------



## Adonayo (Sep 24, 2010)

Hola de nuevo!
Les comento mis resultados:
Mi circuito termino mal, explotaron los operacionales  debo decir que fue impresionante, pero fue aun mas desepcionante (reprobe el curso).
Ya ni supe que hice mal, de hecho desde un principio estaba funcionando mal puesto que queme 2 potenciometros de 100 k ohms, lo cambie por uno mas grande 1Mohm y ya no supe el resultado final pues explotaron los A.O.

Me gustaria que pudieran ayudarme a diseñar uno que no explote, no quiero quedarme con la duda de: ¿como demonios se hace?, ¿que hice mal? 

Disculpen la tardanza de mi respuesta pero estaba muy ocupado.


----------



## antiworldx (Sep 24, 2010)

Por que no intentas hacerlo digital con un microcontrolador?


----------



## Felix Juan (Sep 24, 2010)

Míralo por el lado bueno: has inventado un detonador. 

Para quemar un potenciómetro de 100Kohm has tenido que meter un montón de voltios en algún sitio inadecuado (por ejemplo, entre el cursor y un extremo). Por lo que cuentas las cosas te explotan por algún fallo en las conexiones, porque en el esquema no hay nada que explote (en principio).

No se, prueba con otro montaje más sencillo a ver si te funciona y luego vuelves a este a ver qué pasa. Y piensa:

- Cuantas más veces fracasas más cerca está el éxito (El vendedor más grande del mundo - Og Mandino).

- Cuanto mayor es el reto más grande es la gloria (Frase mía que después supe que también era de Jessica Cox - 



)

- Se sufre, pero se aprende (El Gran Wyoming - http://es.wikipedia.org/wiki/Gran_Wyoming).

Animo y ¡¡SUERTE!!


----------



## Adonayo (Sep 27, 2010)

*@antiworldx:*
No tenia ni idea de que se pudiera realizar con un micro, aunque aún me resulta un poco complicado el tema de los microcontroladores pues apenas voy llevando ese curso (de hecho el curso es sobre microprocesadores, pero por lo que entiendo es mas fácil de usar un microcontrolador, ¿no?). Ademas, el problema es que se tenia que hacer con una configuración PID con Amplificadores Operacionales...
Por supuesto, agradeceria que nos orientaras en esos menesteres, así podria intentar hacerlo de otra forma.

*@Felix Juan:*
Gracias por las palabras de apoyo  
Intentare de nuevo e ire paso a paso, primero simulando y si todo esta bien armare el prototipo FIJANDOME BIEN en no conectar nada mal (ya que como comenteas, seguramente fue ese el problema)

Así que, ¡a retomar el tema! Solo que iré un poco más lento puesto que mis deberes actuales me dificultaran estar de lleno en este proyecto.

¡Saludos!


----------



## antiworldx (Sep 27, 2010)

Busca informacion sobre la ecuacion de diferencias de la funcion pid (proporcional integrativo derivativo)


----------



## Adonayo (Dic 14, 2010)

Hola de nuevo, aún no abandono el tema es solo que me han tenido muy atareado...

Volviendo al asunto:
Estuve buscando más información acerca de los controladores PID y antes de armar el prototipo, me di cuenta de que no sabía en que consiste la automatización. Sé algunas cosas muy básicas sobre control, como la función de transferencia de lazo abierto y lazo cerrado, que imagino, esta última es el principio de la automatización, ¿no? 

Entonces, me podrían aclarar ¿qué es la automatización?, ¿en que consiste físicamente? o alguna forma en la que pudieran explicarme esto por favor. Creo que así tendría una mejor idea de lo que hago, o de lo que pienso hacer...

Sin mas por el momento, les agradezco su tiempo y sus respuestas... Que tengan un buen día


----------



## tecol (Dic 21, 2010)

amigo adonayo . yo hice un control PID, controlo la temperatura de un horno, el tema de automatización o control indutrial es un tema un poco complicado, yo te puedo ayudar con esto de control automatico soy ingeniero en electricidad y electronica y como te dije hice un control de temperatura de un horno indutrial. agregame al msn para que te informacion y los pasos a seguir por si queres saber mas sobre el tema ok...
Mejor leo las Normas de Participación@forosdeelectronica.com
atte jose tecol


----------



## tecol (Dic 23, 2010)

se me olvido que no se puede poner el msndeja preparar una guia y la subo


----------



## Adonayo (Mar 27, 2011)

Muchas gracias por tu interes amigo *jose tecol*, espero tu guía  ...

Perdon por abandonar por un buen rato este tema... no es que haya perdido el interes, es solo que en la escuela avanzan con otros temas y pues no puedo disponer de todo mi tiempo para algo que se supone que debi de haber hecho hace mucho tiempo  ...

Entonces, volviendo al tema! 

El controlador PID ya vi como funciona, teoricamente claro... he visto la respuesta de salida de cada bloque (control proporcional, control integrativo y control derivativo) y la salida del conjunto de estas...

El único problema es que no se en donde meter la retroalimentación  o que cosa agragar para hacer de ese control, un control automatico, aún no me queda claro el porque un control pasa a hacer automatico :cabezon:...

Ayudenme por fa... prometo estar mas al pendiente de este post! 

Saludos a todos y muchas gracias!


----------



## antiworldx (Mar 27, 2011)

retroalimentacion y bloque suma.

La retroalimentacion es la señal de salida del sistema que se resta a la entrada. Se simboliza en un diagrama de esta forma.







De manera que en un PID como es tu caso, tienes la señal de las RPM del motor, ya convertidas a un nivel de voltaje. Por ejemplo, 2000RPM = 2V.
Así que si tu referencia o señal de entrada del sistema es de 3000 RPM = 3V, el bloque suma en su salida te devera dar:

3V (de la referencia) - 2V (de tu medidor de RPM) = 1V (es el que entra en cada bloque del P I D).

En el caso de un PID análogo con operacionales pues es muy simple. El bloque suma es equivalente a este simbolo eléctrico.






Usando esta configuracion eléctrica






Y ya, la salida del opamp es la salida de lo que se representa en el bloque de suma.


----------



## Alberto91 (Abr 15, 2011)

Adonayo, El circuito que pusiste originalmente es un control de velocidad que no es automático; eso está claro, verdad?. ¿Por qué?. Porque si le pones carga al eje del motor, éste va a reducir su velocidad y si quieres compensar esa pérdida de velocidad, debes intervenir moviendo ese potenciómetro. Ahora si tomas la lectura de velocidad del motor y la traduces por ejemplo a voltaje y lo ingresas al control para que éste compense la velocidad (aumente o baje) manteniéndola constante o igual al valor puesto. Esto es lo que se llama un control automático, en éste caso de velocidad. Como ves, hay una *realimentación* que le indica al control el valor de la variable controlada. Hay que considerar otras variables para proteger al sistema, sea al control o al propio dispositivo controlado como ser límite de corriente.


----------



## Adonayo (Abr 18, 2011)

*@antiworldx:*
Mmmm  con que eso es la retroalimentación... ¡Gracias amigo, ahora me queda más claro! 

*@Alberto91:*
Gracias, con tú respuesta y la de *antiworldx* me ha quedado más claro que es lo que me falta... En este caso es un sensor, ¿no? el cual comprobará que la velocidad del motor no suba o baje mas alla de un cierto límite... 
Ahora (por favor corrijanme si me equivoco), el sensor quedara a la salida del circuito, es decir en donde esta la flecha del motor para medir su velocidad, y la salida de este sensor será la *retroalimentación* que entrara en el primer operacional (entrada inversora) para que mantenga una velociadad constante, ¿cierto?

Solo una pregunta más... ¿qué dispositivo podría usar para sensar la velocidad? Podría hacer la comparación de voltaje de salida en lugar de medir las rpm del motor, ¿cierto?

¡Muchas gracias por su ayuda! Espero sus respuestas...

¡Saludos!


----------



## antiworldx (Abr 19, 2011)

Mira, que hay sensores que conectas al eje del motor y te da una salida en voltaje proporcinal a las PRM. No recuerdo su nombre... En el foro en alguna parte ya resolvieron ese detalle, buscale buscale.

O la otra es hacerlo con una rueda dentada, un encoder y un micro, pero es mas complicado...


----------



## Alberto91 (Abr 19, 2011)

El voltaje de salida para el motor puede estar sin variación en un amplio rango de carga o de velocidad, además que si tomas el voltaje de salida para realimentar, no estarías sensando la variable a controlar. Si no requieres precisión, un buen sensor es el que te detecta las rpm en el eje del motor; éste te dará pulsos, le agrega un pequeño capacitor y obtendrás niveles de dc de acuerdo a la velocidad. El sensor lo puedes hacer óptico o magnético. Podrías aprovechar un mouse viejo (de los de bolita), ahi trae el conjunto emisor , receptor y disco ranurado. Magnético con un sensor de efecto hall digital.

Si lo quieres más preciso, puedes usar el LM2907 que es un convertidor de frecuencia a voltaje, busca en www.alldatasheet.com su hoja de datos donde hay la aplicación de tacómetro que te serviría.


----------



## antiworldx (Abr 19, 2011)

Hasta a mi me sirve esa sugerencia alberto, por que yo se hacerlo muy preciso con un microcontrolador, y para aplicaciones de PID digitales es excelente. Pero con los PID análogos ya no es buena idea usar el microcontrolador por que lo vuelve complicado usar el micro y luego un DAC.


----------



## fullmetalnzs (May 17, 2011)

Pues  asi es   ya tienes todo solo te falta el valor de retro-alimentacion que lo tienes que tomar de tu motor  y se supone que ese valor tratara de  llegar a tu voltaje de referencia  en mi caso  quiero controlar temperatura  entonces le pondre un lm35 que da voltaje  y a ver si funciona  primero lo simulare  pero si tu lo que quieres son rmp  pues  tienes que medirlas y trasformarlas a voltaje  y ese voltaje  te digo  tratara de llegar a tu voltaje de referencia .... suerte


----------



## mariacontenis (Jun 16, 2011)

Buenas, qui os dejo este projecto..

```
// Programa: Controlador Fuzzy PI LM35
         

         #include <16F877.H>
         #device adc = 10                                            // Utilizar A/D de 10 bits
         #fuses NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
         #use delay(clock = 4000000)                                 // Define clock de 4MHz
         #priority timer0, ext                                       // Define enterrupcion como priodidad
         #include <LCD.C>        

         #use fast_io(a)
         #use fast_io(b)
         #use fast_io(c)
         #use fast_io(d)
         #use fast_io(e)

         int temp_ref = 26;                                          // Temperatura de referencia
         
      // *** Interrupção que garante um tempo de amostragem de 1 segundo ***
      
         #int_timer0
         void trata_tmr0() 
      {
         static int cont_timer0;                                     // Variável de contagem para o timer 0
         set_timer0(131);                                            // Inicializa o timer no valor 131
         cont_timer0++;                                              // Incrementa a variável de contagem em uma unidade
         
         if (cont_timer0 == 125)                                     // Ocorreram 125 interrupções (1s)?
      {
         float temp;                                                 // Temperatura
         float erro;                                                 // Erro da temperatura
         static float erro_anterior;                                 // Erro anterior da temperatura
         static float out_fuzzy_anterior;                            // Saída anterior do controlador Fuzzy PI
         
         boolean control_on = 1;                                     // Variável que diz o estado do sistema de controle
         cont_timer0 = 0;                                            // Zera a variável de contagem
         
         set_ADC_channel(0);                                         // Seleciona o canal AN0 para conversão
         delay_us(20);                                               // Espera 20 microsegundos
         temp = read_adc();                                          // Lê o valor no conversor A/D
         temp = temp * 5000 / 1023 / 110 - 1;                        // Temperatura do sensor
         
         printf(lcd_putc, "\fTemp. = %2.1f ", temp);                 // Mostra a temperatura no LCD
         lcd_send_byte(1, 0b11011111);                               // Coloca o símbolo de "grau" no LCD
         printf(lcd_putc, "C\n");                                    // Mostra o C no LCD
         
         erro = temp_ref - temp;                                     // Calcula o erro
        
         if (erro >= 0.5)
         {
         control_on = 0;                                             // Desliga o sistema de controle
         set_pwm1_duty(0);                                           // Desliga o cooler
         }
         
         if (control_on) 
      {
         const int Ki = 1;                                           // Ganhos do controlador Fuzzy PI 
         const int K = 10;
         const int Ku = 40;                                          // Ganho de controle incremental
         float out_fuzzy;                                            // Saída do controlador Fuzzy PI
         signed int16 ciclo;                                         // Ciclo de trabalho do PWM1
         float taxa;                                                 // Taxa em que o erro varia
         float abs_taxa;                                             // Módulo da taxa
         float abs_erro_ant;                                         // Módulo do erro anterior
         float out_inc_fuzzy;                                        // Incremento na saída do controlador Fuzzy PI
         
         taxa = erro - erro_anterior;                                // Calcula a derivada do erro
         erro_anterior = erro;
         abs_erro_ant = abs(erro_anterior);                          // Calcula o módulo do erro
         abs_taxa = abs(taxa);                                       // Calcula o módulo da derivada do erro
         
// *** Calcula a saída da base de regras do controlador nebuloso ***
// *** Regiões IC1, IC2, IC5 e IC6 ***
         if ((K * abs_taxa <= Ki * abs_erro_ant) && (Ki * abs_erro_ant <= 1))
         out_inc_fuzzy = (Ki * erro + K * taxa) / (2 * (2 - Ki * abs_erro_ant));
// *** Regiões IC3, IC4, IC7 e IC8 ***
         else if ((Ki * abs_erro_ant <= K * abs_taxa) && (K * abs_taxa <= 1))
         out_inc_fuzzy = (Ki * erro + K * taxa) / (2 * (2 - K * abs_taxa));
// *** Regiões IC9 e IC10 ***
         else if ((Ki * erro > 1) && (K * abs_taxa < 1))
         out_inc_fuzzy = 0.5 * (K * taxa + 1);
// *** Regiões IC11 e IC12 ***
         else if ((K * taxa > 1) && (Ki * abs_erro_ant < 1))
         out_inc_fuzzy = 0.5 * (Ki * erro + 1);
// *** Regiões IC13 e IC14 ***
         else if ((Ki * erro < -1) && (K * abs_taxa < 1))
         out_inc_fuzzy = 0.5 * (K * taxa - 1);
// *** Regiões IC15 e IC16 ***
         else if ((K * taxa < -1) && (Ki * abs_erro_ant < 1))
         out_inc_fuzzy = 0.5 * (Ki * erro - 1);
// *** Região IC17 ***
         else if ((Ki * erro > 1) && (K * taxa > 1))
         out_inc_fuzzy = 1;
// *** Regiões IC19 ***
         else if ((Ki * erro < -1) && (K * taxa < -1))
         out_inc_fuzzy = -1;
// *** Regiões IC18 e IC20 ***
         else out_inc_fuzzy = 0;

// *** Calcula a saída do controlador fuzzy PI ***
         out_fuzzy = out_fuzzy_anterior + Ku * out_inc_fuzzy;
         ciclo = out_fuzzy;                                       // Seta o ciclo de trabalho do cooler
         ciclo = abs(ciclo);                                      // Calcula o módulo do ciclo de trabalho
         if (ciclo > 1020) ciclo = 1020;                          // Saturação no máximo
         if (ciclo < 255) ciclo = 255;                            // Saturação no mínimo
         out_fuzzy = ciclo;
         set_pwm1_duty(ciclo);                                    // Seta o ciclo de trabalho para o PWM1
         out_fuzzy_anterior = -out_fuzzy;
// *** Calcula a porcentagem do ciclo de trabalho ***
         out_fuzzy = out_fuzzy / 1020 * 100;
         out_fuzzy = abs(out_fuzzy);
// *** Mostra o ciclo de trabalho do PWM1 ***
         printf(lcd_putc, "Ciclo = %3.1f ", out_fuzzy);
         lcd_send_byte(1, 0b00100101);                            // Envia o símbolo de porcentagem ao LCD
      }
      }
      }
      

         #int_ext                                                 // Interrupção para o funcionamento do botâo que altera o setpoint 
         void trata_rb() 
      {
         temp_ref++;                                              // Incrementa o setpoint em uma unidade
         if (temp_ref == 31) temp_ref = 26;                       // Volta a 30º o setpoint
         printf(lcd_putc, "\fSetpoint = %u ", temp_ref);          // Mostra o setpoint no LCD
         lcd_send_byte(1, 0b11011111);                            // Coloca o símbolo de "grau" no LCD
         printf(lcd_putc, "C\n");                                 // Coloca a letra C no LCD
         delay_ms(250);                                           // Delay para exibição da mensagem
      }
      
         void main()                                              // Método principal do programa 
      {
         set_tris_a(0b11111111);                                  // Define as direção das portas 
         set_tris_b(0b11111111);
         set_tris_c(0b11111011);
         set_tris_d(0b00001000);
         set_tris_e(0b00000111);
         
         lcd_init();                                              // Inicializa o display

         setup_ADC_ports(AN0);                                    // Configura o conversor A/D, AN0, VRef+ = VDD, VRef- = VSS
         setup_ADC(ADC_CLOCK_DIV_32);                             // Divide o clock interno por 64
         setup_timer_2(T2_DIV_BY_16, 254, 1);                     // Configura as saídas PWM,Frequência de 245Hz
         set_pwm1_duty(0);                                        // Seta ciclo de trabalho em 0 para o PWM1
         setup_ccp1(CCP_PWM);                                     // Configura o CCP1 para modo PWM
         setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64);              // Configura o timer0, Clock interno e prescaler de 64
         set_timer0(131);                                         // Inicia o timer 0 em 131

         ext_int_edge(H_TO_L);                                    // Configuração da interrupção no pino Rb.0, do nível alto para o baixo
         clear_interrupt(INT_EXT);                                // Limpa a interrupção externa

         enable_interrupts(INT_TIMER0);                           // Interrupção do timer 0
         enable_interrupts(INT_EXT);                              // Interrupção externa
         enable_interrupts(GLOBAL);                               // Interrupção global

         while (true)                                             // Loop infinito
      {
      }
      }
```


----------



## MYSTERIO (Jun 21, 2011)

Mmm un PID 

Bueno, primero que nada, te sugerirìa utilizar otra estrategia de control.

Para lo que planteas, un simple controlador tipo P te podrìa servir, màximo un PI, pero un PID? se me hace demasiado y podrìa meter complicaciones a tu planta.

El control proporcional darà a tu motor la ganancia extra que necesita para cuando entre (en tu analogìa) una caja, mientras que la acciòn integral te ayudarà a seguir una referencia (una velocidad por ejemplo) y a rechazar perturbaciones.

Con un Pic? Mmm, serà mi poca experiencia en pics, pero, a mì tampoco me agrada la idea. Màs allà de que, tienes que utilizar un convertidor analògico digital y viceversa, la planta y el controlador, lo tienes que pasar al dominio discreto (transformada Z, no es sòlo poner los valores analògicos, si es que ya los tienes, si vas a intentar a prueba y error, ya cambia la cosa), pero en tal caso, si ya vas a usar un pic y algo de màs circuiterìa, una tarjeta de adquisiciòn de datos sencillita te serìa màs ùtil, pero, ... yo apoyo la idea de puro analògico.


----------



## volmort (Jun 28, 2011)

bueno quien lo diria casi un año despues desde que comenzo este foro pero bueno quiero indicar esto *ACABO DE HEREDAR TU PROYECTO =D * me lo han dejado en la universidad y bueno la idea del control pid es basica osea ya lo tengo ahora el problema es tmb lo de la retro alimentacion lo cual tengo ideas la cual es usar un disco en el motor y con un foto sensor o camellito que aca le llamamos contar las rpm en las que gira el motor normalmente ahora las ingresamos a un micro osea programa basico el cual con un contador las contaria y tendriamos en un tiempo cuantas por segundo dan las revoluciones entonces mi problema es usar un variador de frecuencia en voltaje para agregarlo al comienzo del circuito como resultado de la retroalimentacion en el cual veremos que si cuenta un numero distinto podriamos aumentar el voltaje y mantener la velocidad del motor constante.

ahora si alguien sabe como hacer esta retro alimentacion y todo seria muy amable =D o apoyarme en la idea =D


----------



## bikeking (Jul 14, 2011)

Buenas tardes, amigo mira me parece que desde el principio, tienes dudas y las sigues arrastrando hasta ejemplos mas complejos...el titulo dice controlador PID para velocidad de motor DC.

De entrada tienes que tener muy claro los conceptos de control... tal vez el circuito que dió el profesor esta correcto, el detalle es que ese circuito está diseñado para control de posición, cual es la diferencia de eso y lo que tu quieres hacer?
La posición y la velocidad son dos variables mecánicas distintas y por consecuencia se miden de distinta manera.

POSICIÓN( angular ), la estas midiendo en grados, donde cada grado representa una posición del potenciometro(sensor).

VELOCIDAD ANGULAR( integral de la posición angular), esta se mide en radianes por segundos, y no la puedes medir con un potenciometro, que tal de manera analógica con otro motor similar acoplado mecánicamente al otro motor.. o a una parte móvil de la banda...y deberia de generar un voltaje proporcional a la velocidad de giro de este....

si te interesa mi respuesta avísame falta todavía algo mas por explicar....


----------



## catire18 (Mar 10, 2012)

una preguntica adoyano o cualquiera que responda el circuito que mostrastes primero sirve? el que se controla la velocidad del motor con el potenciometro de 100k


----------



## dast90 (Sep 14, 2012)

un comentario rapido : la velocidad angular es la DERIVADA de la posicion angular.


----------



## savad (Ene 5, 2014)

Busca por un Tacogenerador (otro motor de cd puede puede generar el voltaje pero necesitaras condicionar la señal por ruidos introducidos por las escobillas del motor). Los hay de varios precios y lo que deseas especificar, ademas de las dimensiones mecanicas, son Los Volts x 1000 rpm que entrega.
Una vez teniendo esta relacion es facil acoplar y acondicionar la señal al bucle de retro-alimentacion del control de velocidad.

Ademas en el circuito inicialmente publicado tienes un error en tu sumador. Ya que tienes una referencia de hasta 12 V atenuada a 6V  por el divisor de resistencias. Pero solo 5V de feedback tambien atenuada a 2.5V por el mismo divisor. O sea despues de la referencia sea mayor a 5V, no hay forma de controlar la velocidad del motor  y esta se va al maximo gracias a la accion integral del PID,  (Si utilizas pot lineal para ajustar la referencia, esto es menos del 50% del viaje del pot).

Corrige para que tu divisor de la retro entregue un voltaje un poco mayor o igual a la referencia.

Ademas en la parte Integral .. tienes una super ganancia 100k / 10 ohms = 10K  .. o sea solo necesita un error de  .001 para saturar  el control. y la constante de tiempo es super rapida.
Increnta la constante con un capacitor mas grande ... 10uF es standard con un tiempo de 100 ms
y vaja la ganancia de dc .... Yo agregaria ademas un pot para tener ganancia ajustable a las caracteristicas de tu sistema.  Lee un poco sobre Op-amps y los circuitos de ganancia infinita.


----------

