Está en la página 1de 1

Inicio Acerca de Mi Contacto Política de Privacidad Política de cookies Invítame a un Café Politica de Cookies

Inicio Microcontroladores PIC Control Predictivo Control de Procesos Sistemas Dinámicos Lineales Control Realimentado

Análisis de Sistemas MATLAB Arduino Instrumentación Industrial 

19. Control PID en PIC Ejemplo 2


 > Microcontroladores (PIC) > 19. Control PID en PIC Ejemplo 2

 Sergio C -  -  Microcontroladores (PIC) -  71 comentarios TRADUCIR

Seleccionar idioma ▼
En esta entrada veremos un segundo ejemplo de un controlador PID implementado en un microcontrolador PIC. Para esta entrada
veremos el funcionamiento de este algoritmo aplicado sobre un proceso real. Recuerda que ya habíamos visto un primer ejemplo
ACERCA DE MI
totalmente detallado de la implementación de un PID, si todavía no lo has visto da CLIC ACA para ir a la entrada del control PID
PIC para un horno, pues usaremos casi que el mismo código que fue explicado en esa entrada.

El proceso escogido a ser controlado es conocido como un Motor-Generador y es mostrado en la siguiente fotografía:

SERGIO A. CASTAÑO GIRALDO

Hola lector, bienvenido a mi Blog, Mi nombre es


Sergio Andres Castaño Giraldo, y en este Blog voy
a compartir una de las cosas que más me gusta en
la vida y es sobre la Ingeniería de Control y
Automatización. El blog estará en constante
crecimiento, voy a ir publicando material sobre el
asunto desde temas básicos hasta temas un poco
más complejos. Suscríbete al blog, dale me gusta a

El funcionamiento del proceso es el siguiente: Este proceso consta de dos motores los cuales están acoplados en sus ejes por la página en Facebook y únete al canal de youtube.
Espero de corazón que la información que
medio de poleas. Uno de estos motores funciona propiamente como motor, entonces cuando dicho motor es excitado con un
comparto en este sitio, te pueda ser de utilidad. Y
voltaje de alimentación comienza a girar a una velocidad proporcional al voltaje de entrada, el giro del motor hace que el eje del
nuevamente te doy las gracias y la bienvenida a
segundo motor (Conocido como generador) comience a girar debido al acople entre ejes. Cuando el eje del generador está en
control automático educación.
movimiento, este comienza a generar voltaje directo el cual puede ser tomado de los dos terminales del motor.

Sigueme en mis redes sociales:

   
Aquí tenemos un sistema a ser Controlado, como variable manipulada tendremos el Voltaje de Entrada del Motor y como
variable controlada tendremos el Voltaje generado por el Generador.

ÚNETE A LA FANS PAGE DE FACEBOOK

Control Auto…
Adicionalmente puede ser observado en la fotografía, que el sistema cuenta con dos bombillos que simularan la carga del sistema, 4,1 mil Me gusta
esto seria la perturbación que constantemente afectan los sistemas de control. Nuestro control debe ser lo suficientemente robusto
para rechazar esas perturbaciones y llevar la variable controlada de nuevo para el Set-Point.

Te gusta

Tabla de Contenido [Esconder]


Te gusta esto
1 DESCARGAR DIAGRAMA DEL CIRCUITO
2 Identificación del Proceso
3 Algoritmo del PID
4 Código de Implementación:
4.1 Código de la Identificación
4.2 Código del Control PID para MOTOR-GENERADOR

DESCARGAR DIAGRAMA DEL CIRCUITO INVÍTAME A UN CAFÉ

Si te sirvió de algo la información de la pagina,


El circuito básico de este proceso MOTOR-GENERADOR puede ser descargado en el siguiente archivo de podrías invitarme a un café y ayudarme a seguir
manteniendo en pie el sitio WEB. Solo cuesta
Word dando CLIC ACA. $2USD y me ayudarías enormemente a seguir con
mi trabajo dando click donde dice “Pague com seu
cartão de Credito”. Muchas Gracias por tu visita.

Para este ejemplo inicialmente debemos obtener el modelo matemático del proceso (Identificar la planta) y posteriormente con la
función de transferencia identificada haremos el controlador PID. Estos fueron los mismos pasos que utilizamos en la entrada
anterior del PID del horno.

Identificación del Proceso


CONVIDAR UM CAFÉ (BRASIL)
Mostraré un procedimiento para realizar la identificación del proceso, pero aquí les dejaré su primera tarea. Lo ideal es que lo
Se a informação deste site tem ajudado você e se
siguiente que vamos a ver ustedes lo implementen con una comunicación serial (Click aca para ver entrada de comunicación
você valorou meu trabalho, vc podería-me convidar
serial), enviando los datos al computador para poder obtener la curva de reacción del proceso y posteriormente obtener la función
um café e me ajudar a manter este site para
de transferencia.
continuar aportando conteúdo de graça. Só custa
2USD. Muito obrigado pela sua visita.

Como en este momento no poseo un FT232 para poder comunicar el PIC con mi Computador, decidí por hacer una identificación
un poco más manual, utilizando un LCD 4×20. El circuito para realizar la identificación es el siguiente:

INTRODUCCIÓN AL BLOG

Bienvenido al ÚNICO cana…


cana…

SUSCRÍBETE AL BLOG POR CORREO


ELECTRÓNICO

Introduce tu correo electrónico para suscribirte a


este blog y recibir notificaciones de nuevas
entradas.

Únete a otros 3.676 suscriptores

Dirección de email

SUSC R I B IR

NOTA:
CURSOS DE LA PAGINA
En este circuito se aplica lo aprendido en la entrada del Teclado Matricial 4×4 y como se está utilizando un LCD4x20, ya habíamos
Inicio
visto que el compilador CCS C Compiler ya trae lista la librería para trabajar con este teclado, pero solo está lista para trabajarla
Microcontroladores PIC
conectandola al PUERTO B, por eso en el video de la identificación de Youtube, se muestra como hacer la modificación de la
Control Predictivo
libreria para que trabaje con el PUERTO D.
Control de Procesos
Sistemas Dinámicos Lineales
Control Realimentado
Análisis de Sistemas
MATLAB
✅ 18.1. Control PID en PIC ⚡ Motor Generador (Función de Transferencia). Parte 1 de 2.
Arduino
Instrumentación Industrial

CANALES YOUTUBE

No te pierdas mis videos cuando los subo a la red.


Únete al canal de Youtube en Español.

Sergio A. Castaño Giraldo

YouTube 999+

Você pode-se inscrever no Canal de YouTube em


Português:

Sergio Castaño BR

YouTube 226

La idea de una identificación del proceso consiste en lo siguiente:

Tenemos nuestro proceso MOTOR-GENERADOR, el cual no tenemos idea de cual puede ser su representación matemática para
poder sintonizar nuestro controlador PID, pero la idea entonces es obtener ese modelo.

Aquí estamos recayendo sobre la teoría de Control Lineal, por eso estamos obteniendo una Función de Transferencia en el
dominio de Laplace.

Todos los procesos en la industria y en la vida real en si, son procesos NO LINEALES, recayendo entonces en la teoría no lineal
que es mucho mas compleja. Ahora, dado que en la industria en la mayoría de los casos, los procesos siempre están trabajando
sombre un punto de operación (Un mismo setpoint) y raramente son movidos para otro punto de operación, podemos aproximar
ese proceso no lineal en un modelo Lineal por medio de una función de transferencia.

Entonces lo que haremos es exitar el sistema con un set-point o un escalón del mismo valor a nuestro punto de operación, para
este ejemplo yo exité el sistema con un escalón del 40%, colocando entonces un PWM en la salida del CCP1 un ancho de pulso
proporcional al 40% (Ver entrada del PWM con PIC). Adicionalmente establezco el tiempo de muestreo que quiero tomar datos
del MOTOR-GENERADOR (Dado que este sistema es sumamente Rápido, coloque un periodo de muestreo de 10mS). De esa
manera el PIC exita el motor por causa de los 40% del PWM y comienza a guardar los valores de voltaje generados por el
generador cada 10mS. Estos datos los guarda en un vector de 45 posiciones. Una vez las 45 posiciones son llenadas, el PIC
coloca el PWM en Cero y muestra todos los datos en la pantalla del LCD. Este código de identificación se encuentra al Final de
este Post o también en el Video de Youtube, donde se explica en detalle.

Como la Planta MOTOR-GENERADOR solo acepta en su entrada voltaje de 0 a 5 voltios, y nosotros estamos generando un PWM,
es necesario transformar ese PWM en un valor de voltaje continuo que dependa del ancho de pulso. Para eso se implementa el
siguiente filtro pasa bajos que hace esa función.

Los datos de voltaje mostrados en el LCD, los copie en un archivo de excel junto con los datos de tiempo (periodo de muestreo) y
los datos de entrada o escalón (que son los 40%). Estos datos los muestro tanto en Voltaje como en Porcentaje. (Click aca para
bajar el archivo en Excel)

La respuesta obtenida en porcentaje se muestra a continuación:

Tipicamente, todo proceso industrial es representado por funciones de transferencia de primer o segundo orden. A continuación es
expuesto un modelo de primero orden sobre el cual vamos a trabajar para poder modelar el comportamiento de nuestra planta.

El modelo está representado en su forma continua, es decir en el dominio de Laplace. donde es la ganancia del sistema, es la
constante de tiempo del proceso y es el retardo del proceso.

Vemos que la gráfica el voltaje generado (linea azul) comienza en 0% y llega hasta 32% y que para conseguir esta respuesta
tuvimos que alimentar el motor con una exitación del 40% (linea naranja). Así podemos obtener la ganancia del proceso con la
siguiente formula:

Notemos que el voltaje generado (linea zul), al comienzo ella se demora en comenzar a subir, ese tiempo que ella se queda en
cero, es conocido como el retardo del sistema y en este caso equivale a 0,03 segundos o 30mS

Observemos que el voltaje generado en la gráfica, se comienza a estabilizar mas o menos a los 0.26 segundos, pero debemos
restarle los 0,03 segundos del retardo, entonces el tiempo de establecimiento seria 0,23 segundos, así podemos obtener la
constante de tiempo de la variable temperatura con la siguiente formula:

Osea que el .

Así que en términos generales, nuestro proceso del MOTOR-GENERADOR está representado por la siguiente función de
transferencia:

Con nuestro proceso identificado podemos calcular los parámetros del controlador ( ), para eso utilizamos cualquiera de las
tres técnicas vistas en la entrada el PID del horno.

Si te está sirviendo de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir
manteniendo en pie el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas
Gracias por tu visita.

Para Brasil

Se você está em Brasil pode utilizar o botão que está aqui em baixo, para realizar o convite em Reais.

Algoritmo del PID

Una ves tenemos nuestro modelo matemático que representa nuestro proceso MOTOR-GENERADOR en el escalón del 40%,
podremos calcular nuestro control PID para que controle adecuadamente el proceso en ese punto de operación.

✅ 18.2. Control PID en PIC ⚡ Motor Generador (Control implementado). Parte 2 de 2.

Para este caso PARTICULAR de mi MOTOR-GENERADOR, es un proceso de muy baja NO LINEALIDAD, es decir que tiene un
comportamiento casi lineal, entonces voy a poder controlar con facilidad el proceso en cualquier punto de operación diferente a el
40%. Esto en la mayoría de los procesos NO sucede.

Utiliza el control discreto PID que vimos en la entrada pasada dado por:

donde:

Con esto, la ley de control que vamos a ingresar a nuestro PIC sale del control PID discreto (Despejando u)

aplicando transformada inversa Z obtenemos la ecuacion en diferencias:

Como tiempo de muestreo para el control PID utilizamos el criterio:

NOTA

Como vemos el tiempo de muestreo debe ser de 3mS, o sea que realmente debe ser rápido nuestro microcontrolador para poder
alcanzar tal velocidad, para ello por la alta velocidad lo más recomendable es usar un cristal externo de 20.000Mhz. En mi caso
personal, no cuento con este cristal, entonces voy a tener que implementarlo con un cristal de 4.000Mhz, por lo que no voy a poder
cumplir el criterio del tiempo de muestreo. Esto me puede traer serios problemas de estabilidad, pero al hacer las pruebas, mi
periodo de muestreo alcanzado fue de 11mS y el sistema consiguió responder adecuadamente, principalmente porque todavía es 5
veces menor que la constante de tiempo. Si se hubieran presentado problemas de estabilidad por causa que no puedo respetar el
periodo de muestreo, lo que hubiera hecho es ponderar un poco el error del controlador PID, es decir multiplicar el error por valores
entre (0 – 1).

Código de Implementación:

A continuación se presenta el código para que lo copies y lo pegues en tu compilador y puedas reproducirlo. Recuerda que para
ver el código debes compartir el contenido de este blog para que más personas se beneficien de esta información.

> Descargar los Archivos de PICC y PROTEUS 8 (Click aca)


<<<

Descargar librería del LCD4x20 para puertoD: LCD420D.C

Código de la Identificación

1 #INCLUDE <16F887.h>
2 #DEVICE ADC=10
3 #USE DELAY(CLOCK=4000000)
4 #FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
5 #DEFINE USE_PORTB_KBD   //Por defecto el teclado se conecta al puerto D,
6                         //como el microcontrolador que se esta usando
7                         //no tiene puerto D se conecta al puerto B.*/
8 #INCLUDE <LCD420D.C>
9 #INCLUDE <KBD4x4.C>  //Incluir en el encabezado el driver para
10                       //manejar el teclado telefónico MODIFICADO
11 #include <stdlib.h>
12 #include <string.h>
13  
14 #use     standard_io(b)
15 #define  KEYHIT_DELAY   200    //Tiempo de espera del teclado en milisegundos
16 #byte PORTB= 6
17 #byte PORTC= 7
18 #BYTE PORTA= 5
19 #BYTE PORTD= 8
20  
21 int16 adc,control=0;
22 long T=100; //100 ms
23 float R=0;
24 char c;
25 int opcion=0;
26  
27  
28 /*===========================================================================*/
29 /*=======================       FUNCION TECLA         =======================*/
30 /*===========================================================================*/
31 //Funcion encargada de esperar a que se presione una tecla
32 char tecla(void)
33 {
34    char c;
35    do{ //espera hasta que se presione una tecla
36       c=kbd_getc(); //Captura valor del teclado
37      }
38    while(c=='\0');
39    return(c);
40 }
41  
42 /*===========================================================================*/
43 /*=======================    FUNCION TECLA CON TIMER  =======================*/
44 /*===========================================================================*/
45 // Pregunta por una Tecla por un tiempo, si no hay actividad, deja de preguntar
46 // y deja que el PIC continue con su trabajo
47  
48 char tecla_time(void) {
49    char c='\0';
50    unsigned int16 timeout;
51    timeout=0;
52    c=kbd_getc(); //Captura valor del teclado
53    while(c=='\0' && (++timeout< (KEYHIT_DELAY*100)))
54    {
55       delay_us(10);
56       c=kbd_getc(); //Captura valor del teclado
57    }
58    return(c);
59 }
60  
61 /*===========================================================================*/
62 /*============   FUNCION PARA DIGITAR ESCALÓN/SETPOINT  =====================*/
63 /*===========================================================================*/
64 long escalon(int nd)
65 {
66    //Esta funcion captura el escalon desde el teclado, si el proceso está tomando
67    //datos el escalon sirve para exitar el sistema, por otro lado si el sistema
68    //está controlando, el escalo sirve para establecer el setpoint del sistema
69   
70    long val;
71    int i;
72    char str[5]; //Variable tipo String
73   
74    str[0]='0';
75    for(i=0;i<nd;i++)
76    {
77       
78       c=tecla();  //Lee el valor del teclado y espera hasta que alguna tecla se pulse
79       if(c!='*'){
80          //Muestra el digito presionado en el LCD
81          lcd_gotoxy(5+i,4);
82          lcd_putc(c);
83          //Almacena el dato presionado en la variable String
84          str[i]=c;
85       }
86       else{i=nd;} //Si se presiona * sale del For      
87    }
88    val = atol(str); //Convierte el String en un valor numerico
89    return(val);
90  
91 }
92 /*===========================================================================*/
93 /*======================= IDENTIFICACION DEL SISTEMA  =======================*/
94 /*===========================================================================*/
95 void identificacion(void)
96 {
97 int16 dat[45]; //Variable guarda 45 datos de la identificacion
98 float aux;
99 int i,ban=0;
100
101 LCD_PUTC("TOMANDO DATOS....");
102 control=R*10;
103 set_pwm1_duty(control); //Exita el sistema
104 for(i=0;i<45;i++)
105 {
106     //Lee los datos
107     dat[i]=read_adc(); //Leer ADC
108     //dat[i]=adc*5000.0/1024.0;
109     delay_ms(T);
110 }
111 set_pwm1_duty(0); //Desactiva el sistema
112 LCD_PUTC("\f");
113
114 //Muestra los datos en la pantalla del LCD utilizando la tecla A para subir
115 //y utilizando la tecla B para bajar, estos datos deben ser graficados (EXCEL)
116 //para poder montar la curva de reacción del sistema y poder determinar los
117 //Parametros de la Planta
118 i=0;
119 while(ban==0)
120 {
121    aux=dat[i]*5000.0/1024.0;
122    lcd_gotoxy(1,1);
123    printf(lcd_putc,"%d. %1.3f",i+1,aux/1000);
124    aux=dat[i+1]*5000.0/1024.0;
125    lcd_gotoxy(1,2);
126    printf(lcd_putc,"%d. %1.3f",i+2,aux/1000);
127    aux=dat[i+2]*5000.0/1024.0;
128    lcd_gotoxy(1,3);
129    printf(lcd_putc,"%d. %1.3f",i+3,aux/1000);
130    aux=dat[i+3]*5000.0/1024.0;
131    lcd_gotoxy(1,4);
132    printf(lcd_putc,"%d. %1.3f",i+4,aux/1000);
133   
134    c=tecla();      //Lee el valor del teclado y espera hasta que alguna tecla se pulse
135    i =(c=='B' && i!=41) ? i+1:i; //Si es B incremente i
136    i =(c=='A' && i!=0) ? i-1:i; //Si es A decremente i
137    ban =(c=='*') ? 1:0;   //Si es * salga del while
138 }
139
140 }
141 /*===========================================================================*/
142 /*=======================    FUNCION DEL PRINCIPAL    =======================*/
143 /*===========================================================================*/
144 void main()
145 {
146    port_b_pullups (0xFF);  //Utiliza las resistencias PULL UP internas del puerto B
147    set_tris_c(0);
148    set_tris_d(0);
149    setup_timer_2(t2_div_by_4,249,1);   //Configuracion de Timer 2 para establecer frec. PWM a 1kHz
150    setup_ccp1(ccp_pwm);                //Configurar modulo CCP1 en modo PWM
151    set_pwm1_duty(0);                   //Dejo en cero la salida PWM
152   
153    setup_adc_ports(sAN0);              //Configurar ADC (Lectura de temperatura)
154    setup_adc(adc_clock_internal);      //Reloj interno para la conversion analoga digital)
155    set_adc_channel(0);                 //Seleccionar Canal 0 para sensor de Temperatura
156   
157    LCD_INIT();                         //Inicializo el LCD
158    LCD_PUTC("\f");                     //Limpio el LCD
159  
160       
161    while(1)
162    {
163  
164          lcd_gotoxy(1,1);
165          LCD_PUTC("TOMAR DATOS PLANTA");
166          lcd_gotoxy(1,2);
167          LCD_PUTC("Escalon(0-100):");
168          lcd_gotoxy(1,3);
169          LCD_PUTC("y presione *");
170          lcd_gotoxy(1,4);
171          LCD_PUTC("SP:           ");
172          R=escalon(3); //Llama la funcion para digitar el escalon de exitacion
173          //Valida si R esta entre 0 y 100 (Esto es otra forma de usar el if - else)
174          R =(R > 100) ? 100:R;
175         
176          //Muestra el SETPOINT en pantalla
177          lcd_gotoxy(1,4);
178          printf(lcd_putc,"SP: %3.1f",R);
179          delay_ms(2000);
180
181          //Aprovecho la funcion escalon para digitar el periodo de muestreo
182          lcd_gotoxy(1,2);
183          LCD_PUTC("Periodo de M(0-1000):");
184          lcd_gotoxy(1,3);
185          LCD_PUTC("y presione *");
186          lcd_gotoxy(1,4);
187          LCD_PUTC(" T:        ");
188          T=escalon(4);
189         
190          //Muestra el periodo de muestreo en pantalla
191          lcd_gotoxy(1,4);
192          printf(lcd_putc,"T: %ld  ",T);
193          delay_ms(2000);
194         
195          LCD_PUTC("\f");
196          identificacion();
197         
198          opcion=0; //Regresa al menu principal
199  
200     }
201 }

Código del Control PID para MOTOR-GENERADOR

1 #INCLUDE <16F887.h>
2 #DEVICE ADC=10
3 #USE DELAY(CLOCK=4000000)
4 #FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
5 #DEFINE USE_PORTB_KBD   //Por defecto el teclado se conecta al puerto D,
6                         //como el microcontrolador que se esta usando
7                         //no tiene puerto D se conecta al puerto B.*/
8 #INCLUDE <LCD420D.C>
9 #INCLUDE <KBD4x4.C>  //Incluir en el encabezado el driver para
10                       //manejar el teclado telefónico MODIFICADO
11 #include <stdlib.h>
12 #include <string.h>
13  
14 #use     standard_io(b)
15 #define  KEYHIT_DELAY   1    //Tiempo de espera del teclado en milisegundos
16 #byte PORTB= 6
17 #byte PORTC= 7
18 #BYTE PORTA= 5
19 #BYTE PORTD= 8
20  
21 int16 adc,control=0;
22 float R=0;
23 float yM=0,e=0.0,e_1=0.0,e_2=0.0,u=0.0,u_1=0.0,T=11;
24 float kp,ti,td,q0,q1,q2;
25 float k=0.8,tao=57.5,theta=30.0;
26 float TsMA,Wn,P1,P2;
27 char c;
28 int cont=0;
29  
30  
31 /*===========================================================================*/
32 /*=======================       FUNCION TECLA         =======================*/
33 /*===========================================================================*/
34 //Funcion encargada de esperar a que se presione una tecla
35 char tecla(void)
36 {
37    char c;
38    do{ //espera hasta que se presione una tecla
39       c=kbd_getc(); //Captura valor del teclado
40      }
41    while(c=='\0');
42    return(c);
43 }
44  
45 /*===========================================================================*/
46 /*=======================    FUNCION TECLA CON TIMER  =======================*/
47 /*===========================================================================*/
48 // Pregunta por una Tecla por un tiempo, si no hay actividad, deja de preguntar
49 // y deja que el PIC continue con su trabajo
50  
51 char tecla_time(void) {
52    char c='\0';
53    unsigned int16 timeout;
54    timeout=0;
55    c=kbd_getc(); //Captura valor del teclado
56    while(c=='\0' && (++timeout< (KEYHIT_DELAY*100)))
57    {
58       delay_us(10);
59       c=kbd_getc(); //Captura valor del teclado
60    }
61    return(c);
62 }
63  
64  
65 /*===========================================================================*/
66 /*=======================    FUNCION DEL CONTROL PID  =======================*/
67 /*===========================================================================*/
68 void PID(void)
69 {
70     
71     //Comienzo la ley de control
72     float tp;
73     
74     tp= yM*100.0/5000.0; //Convierte la referencia de porcentaje a milivoltaje
75     
76     e=1*(R-tp);
77     // Controle PID
78       u = u_1 + q0*e + q1*e_1 + q2*e_2; //Ley del controlador PID discreto
79     
80     if (u >= 100.0)        //Saturo la accion de control 'uT' en un tope maximo y minimo
81      u = 100.0;
82     
83     if (u <= 0.0)
84      u = 0.0;
85     
86      control=u*10;
87     
88      //Retorno a los valores reales
89      e_2=e_1;
90      e_1=e;
91      u_1=u;
92     
93      //La accion calculada la transformo en PWM
94      set_pwm1_duty(control);
95     
96 }
97  
98  
99 /*===========================================================================*/
100 /*============   FUNCION PARA DIGITAR ESCALÓN/SETPOINT  =====================*/
101 /*===========================================================================*/
102 long escalon(int nd)
103 {
104    //Esta funcion captura el escalon desde el teclado, si el proceso está tomando
105    //datos el escalon sirve para exitar el sistema, por otro lado si el sistema
106    //está controlando, el escalo sirve para establecer el setpoint del sistema
107   
108    long val;
109    int i;
110    char str[5]; //Variable tipo String
111   
112    str[0]='0';
113    for(i=0;i<nd;i++)
114    {
115       
116       c=tecla();  //Lee el valor del teclado y espera hasta que alguna tecla se pulse
117       if(c!='*'){
118          //Muestra el digito presionado en el LCD
119          lcd_gotoxy(5+i,4);
120          lcd_putc(c);
121          //Almacena el dato presionado en la variable String
122          str[i]=c;
123       }
124       else{i=nd;} //Si se presiona * sale del For      
125    }
126    val = atol(str); //Convierte el String en un valor numerico
127 }
128  
129 /*===========================================================================*/
130 /*=======================    FUNCION DEL PRINCIPAL    =======================*/
131 /*===========================================================================*/
132 void main()
133 {
134    port_b_pullups (0xFF);  //Utiliza las resistencias PULL UP internas del puerto B
135    set_tris_c(0);
136    set_tris_d(0);
137    setup_timer_2(t2_div_by_4,249,1);   //Configuracion de Timer 2 para establecer frec. PWM a 1kHz
138    setup_ccp1(ccp_pwm);                //Configurar modulo CCP1 en modo PWM
139    set_pwm1_duty(0);                   //Dejo en cero la salida PWM
140   
141    setup_adc_ports(sAN0);              //Configurar ADC (Lectura de temperatura)
142    setup_adc(adc_clock_internal);      //Reloj interno para la conversion analoga digital)
143    set_adc_channel(0);                 //Seleccionar Canal 0 para sensor de Temperatura
144   
145    SET_RTCC(246);                               //Cargo el TIMER0 con 243
146    SETUP_COUNTERS(RTCC_INTERNAL, RTCC_DIV_256); //Configuro el TIMER0 con  prescaler 256
147   
148    ENABLE_INTERRUPTS(INT_RTCC);  //Habilito interrupcion por TIMER0
149    enable_interrupts(GLOBAL);    //Habilito las interrupciones a nivel global
150   
151    LCD_INIT();                         //Inicializo el LCD
152    LCD_PUTC("\f");                     //Limpio el LCD
153    lcd_gotoxy(1,1);
154    LCD_PUTC("CONTROL PID DE MOTOR");
155   
156   
157   
158   
159    //*************************************************************************//
160    //*************  DISEÑO POR ASIGNACIÓN DE 2 POLOS REALES   ****************//
161    //*************************************************************************//
162   
163    TsMA=5*tao;                     //Tiempo deseado en Lazo Cerrado    
164    Wn=3/(TsMA);               //Frecuencia natural del sistema
165   
166    //Ubicación de 2 Polos reales
167    P1=Wn+Wn;
168    P2=Wn*Wn;
169   
170    kp=(P1*tao-1)/k;        //Calculo de Kc
171    ti=(k*kp)/(P2*tao);     //Calculo de ti
172   
173    //*************************************************************************//
174    //*****************   DISEÑO POR CANCELACIÓN DE POLOS    *******************//
175    //*************************************************************************//
176   /*
177    TsMA=0.75*tao;                  //Tiempo deseado en Lazo Cerrado
178    kp=(tao)/(TsMA*k);      //Calculo de Kc
179    ti=tao;                  //Calculo de Ti (Igual a la constante de tiempo)
180    td=0;
181    */
182    //*************************************************************************//
183    //*****************   SINTONIA POR ZIEGLER y NICHOLS    *******************//
184    //*************************************************************************//
185    /*
186    kp=(1.2*tao)/(k*theta);
187    ti=2*theta;
188    td=0.5*theta;
189    */
190    //*************************************************************************//
191   
192   // Calculo do controle PID digital
193    q0=kp*(1+T/(2*ti)+td/T);
194    q1=-kp*(1-T/(2*ti)+(2*td)/T);
195    q2=(kp*td)/T;
196       
197    while(1)
198    {
199          adc=read_adc(); //Leer ADC
200          yM=adc*5000.0/1024.0;
201         
202          //Llama la funcion del controlador PID
203          PID();
204         
205         
206          //Muestra Resultados en LCD cada 50 veces el periodo de muestreo
207          if(cont==50)
208          {
209             cont=0;
210             lcd_gotoxy(1,2);
211             printf(lcd_putc,"V: %f  E:%f",yM*100.0/5000.0,e);
212             lcd_gotoxy(1,3);
213             printf(lcd_putc,"SP: %3.1f C   ",R);
214             lcd_gotoxy(1,4);
215             printf(lcd_putc,"U: %ld   ",control);
216          }
217         
218          //tiempo de muestreo
219          //delay_ms(2);
220         
221          cont=cont+1; //Incrementa contador para visualizar en el LCD
222          c=tecla_time();   //Lee el valor del teclado pero solo espera un tiempo determinado
223          if(c=='D')
224          {
225             lcd_gotoxy(1,2);
226             LCD_PUTC("Escalon(0-100):");
227             lcd_gotoxy(1,3);
228             LCD_PUTC("y presione *");
229             lcd_gotoxy(1,4);
230             LCD_PUTC("SP:           ");
231             R=escalon(3); //Llama la funcion para digitar el escalon de exitacion
232             //Valida si R esta entre 0 y 100 (Esto es otra forma de usar el if - else)
233             R =(R > 100) ? 100:R;
234             
235             //Muestra el SETPOINT en pantalla
236             lcd_gotoxy(1,4);
237             printf(lcd_putc,"SP: %3.1f",R);
238             delay_ms(2000);
239             LCD_PUTC("\f");
240          }
241    }
242 }

5 (100%) 10 vote[s]

Si te sirvió de algo la información de la pagina, podrías invitarme a un café y ayudarme a seguir manteniendo en pie
el sitio WEB. Solo cuesta $2USD y me ayudarías enormemente a seguir con mi trabajo. Muchas Gracias por tu visita.

Para Brasil

Se você está em Brasil pode utilizar o botão que está aqui em baixo, para realizar o convite em Reais.

Comparte esto:

 Facebook  Twitter

TAGS: CODIGO DE UN CONTROL PID, CONTROL PID, CONTROL PID EJEMPLO DE COMO IMPLEMENTARLO EN LA VIDA REAL, CONTROL PID EN
MICROCONTROLADOR, CONTROLADOR PID EN MICROCONTROLADOR, IDENTIFICACION, IMPLEMENTACION DE CONTROL PID, MICROCONTROLADOR,
MODELADO DE PROCESO, PIC, PID, PID CONTROL

 Entrada anterior Siguiente entrada 


Comunicación I2C 5. Modelado de dos tanques de Nivel en Cascada

 TAMBIÉN PODRÍA GUSTARTE

Servomotor con PIC Adquisición de Datos e


 Identificación de un Horno con
PIC

11. Manejo del LCD


 ESTA ENTRADA TIENE 71 COMENTARIOS

Miguel 1 4 M AY 2019 R ES PO ND ER

Hola que tal Sergio excelente proyecto,


Una pregunta me gustaria comunicarme con el ft232 a mi pc para reemplazar la lcd para realizar eso cambiaria
mucho la programacion que tienes que tendria que cambiar.
Muchas gracias por tu ayuda.

Sergio C 1 4 M AY 2019 R ES PO ND ER

Hola Miguel, solo debes colocar la comunicación serial en tu proyecto y listo. Eso lo hicimos en la entrada
del PID predictor de SMITH con PIC, en ese caso usamos 2 xbee, tu reemplazarias los xbee por un modulo
ft232 y un cable usb. Dale un vistazo a esa entrada en la sección del curso de microcontroladores. Saludos.

Miguel 2 4 M AY 2019 R ES PO ND ER

Muchas gracias Sergio por tu ayuda con la comunicación serial me ah servido mucho para otros proyectos
que eh montado gracias.
Sergio un favor mas lo que sucede es que me encuentro realizando tu proyecto de motor generador ya lo
tengo montado, pero cuando envió una señal al mi motor del 100% el motor que tengo como generador me
da una tensión de salida de 18 Vdc eh realizado el montaje del circuito motor generador con el amplificador
operacional como muestras en el diagrama, pero no logro una salida de 0 a 5V para el micro controlador y
poder graficar mi funcion de transferencia ya eh utilizado varios amplificados el lm324n, lf353p, lm358 la
alimentacion de ellos de -12 y +12 eh cambiado el potencionetro de 5k pero no logro la salida para el micro
de 5v no me da ningún valor, como me puedes ayudar o que me aconsejas para lograr identificar mi motor y
poder hacer la gráfica y así pasar a la siguiente etapa del PID
muchas gracias por tu colaboración estaré pendiente a tu respuesta

Sergio C 2 4 M AY 2019 R ES PO ND ER

Con el circuito del Darlington puedes regular la velocidad del motor con lo cual puedes generar menos
voltaje, sin embargo con el circuito del amplificador te debería dar para poder regular el voltaje de 0 a 5
v, ese circuito no tiene ningún misterio. Estas utilizando las mismas tierras???? Si no, debes hacerlo.

ANDRES 1 5 M AR 2019 R ES PO ND ER

Sergio muchas gracias por la recomendación, te comento que ahora debo captar la señal (flanco de subida y
bajada) que me viene de un circuito de cruce por cero y esta se me ocurrió hacerlo por interrupción puerto RB0
pero tengo el teclado 4×4 y activada las pulls, es posible asignar otro pin para el teclado matricial o asignar otro
pin para la interrupción?.
La señal del circuito cruce por cero es debido a debo sincronizar con la red 120VAC una bomba monofásica y
realizar el control por angulo fase.

Sergio C 1 5 M AR 2019 R ES PO ND ER

La interrupción no puedes cambiarla, pero puedes colocar el teclado en el puerto D y colocar las resistencias
pull up de forma física, ya que dicho puerto no posee pullup internas.

ANDRES 6 M A R 2019 R ES PO ND ER

Hola que tal…Excelente tutorial, me gustaria aplicar el pid para controlar el nivel de llenado de un tanque con
perturbaciones(una válvula de salida de agua), que debería modificar? aparte que sensor me recomiendas para
tomar datos?.

Sergio C 6 M A R 2019 R ES PO ND ER

Hola Andres, el código como tal no varía, lo que cambia sería el modelado matemático de tu proceso
(función de transferencia) para poder sintonizar los parámetros del controlador. Para medir nivel talvez la
mejor opción seria medir la presión al fondo del tanque y medir la altura por inferencia a través de la presión.

Daniel 2 3 NO V 201 8 R ES PO ND ER

Una última pregunta….puedo sustituir el 2N3019 y 2N3055 por el MPSA13 o hay diferencia?
Este último, también va conectado a 12v?

Sergio C 2 4 NO V 201 8 R ES PO ND ER

No estoy seguro Daniel, debes buscar en el manual de reemplazos para ver si cumplen con la misma
característica. Saludos

Daniel 2 2 NO V 201 8 R ES PO ND ER

El LM324 el pin 4 va a positivo (+12) y el 11 va a tierra o a -12v?

Sergio C 2 2 NO V 201 8 R ES PO ND ER

Hola Daniel, el cxto es tal cual como está ahí. LM324 (+12) y GND. Para el generador el es donde debe ir a
fuente dual (+12) y (-12) Saludos

Daniel 2 1 NO V 201 8 R ES PO ND ER

Hola…
Lo que pasa es que regulo la ganancia del motor a 5v para que sea lo más qie pueda recibir el pic….Al momento
de la toma de datos pongo el set point al 40% y la T en 10 ms….
Cuándo me empieza a dar los datos del muestreo empieza por ejemplo así
1- 4.95
2- 4.87
3- 4.9
4- 0.007
5- 0.009
6- aquí ya empieza todo normal
.
.
.
35+ también me marca 4.95
Se tienen que regular ambos potenciómetro o sólo el de la ganancia ( entiendo que es el de 5k)…
O con eso datos que me arroja puedo hacer mi función?

Sergio C 2 2 NO V 201 8 R ES PO ND ER

Estas usando una fuente Dual para los amplificadores operacionales? Eso ahi parece mas ruido que otra
cosa, prueba filtrando tu fuente de alimentación dual, mira que los potenciometros tengan buena conexión o
coloca trimmer. El cxto no es para hacer eso, sin embargo puedes intentar considerar ese ruido inicial como
retardo y probar que tal te va con una FT calculada asi.

Daniel 1 6 NO V 201 8 R ES PO ND ER

Hola, por qué el valor máximo que me arroja al momento del muestreo es de 1.18… estoy utilizando motores de
12v y setpoint de 40%

Sergio C 1 7 NO V 201 8 R ES PO ND ER

debes ajustar la ganancia del circuito que recibe el voltaje del generador. Lo que debes hacer es activar
primero el motor al 100% y con el potenciometro ajustar que el voltaje de salida sea aproximadamente 5V
(Conecta el multimetro a la salida antes de mandar ese voltaje al PIC) con eso garantizas que la máxima
tensión generada sean 5V y no vayas a quemar tu PIC.

Daniel 1 9 NO V 201 8 R ES PO ND ER

Ok, muchas gracias lo verificaré…y el potenciómetro de 50k para que se utiliza?

Sergio C 1 9 NO V 201 8 R ES PO ND ER

Ese regula la velocidad del motor.

Daniel 20 NO V 20 18

Ya hice lo de regular la ganancia, pero ahora cunado pido el muestreo…los primeros tres
datos me los arroja muy elevados(más que el setpoint) y de ahí en adelante también en los
últimos datos igual se pasa del setpoint
Qué podría estar mal?

Sergio C 21 NO V 20 18

Tendrá mucha ganancia tu motor? Eso parece problema de ruido. No entendi si Solo son los 3
primeros datos y solo los ultimos datos que sufren ese fenomeno. Que sea mayor que tu
setpoint no tiene problema ninguno, pues vos no estas controlando, estás es identificando,
eso solo nos indica que el sistema tiene una ganancia mayor que uno.

Daniel 1 6 NO V 201 8 R ES PO ND ER

Hola….cuando haces tú muestreo…el motor debe prender hasta que pones el setpoint y el periodo de
muestreo???
Por qué a mí me prende enseguida que enciendo la fuente???

Sergio C 1 7 NO V 201 8 R ES PO ND ER

A la entrada del amplificador operacional que controla el motor (donde debe ir el PWM de tu pic con el filtro
pasa bajos) debes asegurarte si colocandolo a GND el motor se queda detenido. (estoy considerando que
estás copiando el código que hay aqui), si no se detiene el motor debes tener algún problema en esa etapa
del circuito.

Daniel 4 N OV 2018 R ES PO ND ER

Hola
Por qué en los circuitos de la imágen tienes tantos capacitores, si en el archivo de word, solo aparecen 2, también
hay más resistencias y componentes extras que en el archivo no hay?

Sergio C 4 N OV 2018 R ES PO ND ER

Hola Daniel, es porque en el PCB además del circuito mostrado en el documento de Word, tiene montado la
fuente de alimentación DUAL para los amplificadores operacionales. El circuito mostrado aqui antiguamente
yo lo montaba en protoboard y hacia controles pero lo alimentaba con mis fuentes de alimentación externa.
Despues de un tiempo le pasé los circuitos a una persona para que me lo montara en un PCB junto con la
fuente de alimentación integrada, para simplemente conectar y desconectar el circuito. Saludos.

Daniel 31 OC T 2018 R ES PO ND ER

Hola buen día


Me podrías pasar los archivos PCB para reimprimirlos?
Por favor

Sergio C 1 N OV 2018 R ES PO ND ER

Hola Daniel, no tengo los archivos del PCB.

Daniel 28 S E P 20 18 R ES PO ND ER

Qué marcas de motores utilizaste?

Sergio C 28 S E P 20 18 R ES PO ND ER

Desconozco la marca, son motores que compre en una chatarrería. Puedes usar cualquier motor de 12 VDC
o incluso si lo deseas puedes usar esos motores pequeños de Juguete de 5VDC. Saludos.

Daniel 25 S E P 20 18 R ES PO ND ER

excelente proyecto…me podrías mandar una lista de los componentes eléctricos/electrónicos que utilizaste así
como sus diagramas de conexión?
en mi escuela debo implementar un proyecto para controlar una variable, y este que muestras aquí me resultó
interesante para realizarlo.
saludos desde México

Sergio C 25 S E P 20 18 R ES PO ND ER

Hola Daniel, el diagrama del circuito esta al comienzo del post, es un documento en WORD con el circuito
del MOTOR-GENERADOR. Saludos.

Daniel 26 S E P 20 18 R ES PO ND ER

Estarías interesado en vender tu proyecto?

Sergio C 28 S E P 20 18 R ES PO ND ER

Hola Daniel, en el momento NO, porque es una planta didáctica con la cual enseño teoría de
Control. Saludos.

Carmen 14 S E P 20 18 R ES PO ND ER

Hola!! muy bueno el proyecto! Una consulta, las lamparitas funcionan con el voltaje que genera el generador?? O
están alimentadas con la fuente del motor?

Sergio C 14 S E P 20 18 R ES PO ND ER

Hola Carmen, Si funcionan con el voltaje que genera el motor generador. Saludos.

Adrian 22 AG O 2 01 8 R ES PO ND ER

Por favor la descripción de los motores que usaste gracias.

Adrian 22 AG O 2 01 8 R ES PO ND ER

Hola sergio, interesante contenido. Podrias decirme la descripción de los motores que utilizastes, por favor
gracias

Sergio C 25 AG O 2 01 8 R ES PO ND ER

Adrian, usé motores de 12VDC, lo encontré en una chatarrería, pero puedes usar motores pequeños si
quieres, esos de 5VDC de juguete.

Jmar 21 AG O 2 01 8 R ES PO ND ER

sergio que tal? quisiera saber de cuanto voltage son los motores que utilizas

Sergio C 25 AG O 2 01 8 R ES PO ND ER

Jmar, son motores de 12VDC. Saludos.

Vanessa 16 AG O 2 01 8 R ES PO ND ER

Hola Sergio, excelente contenido tienes en la página, muy simple e intuitiva de usar. Felicidades.

Sergio C 16 AG O 2 01 8 R ES PO ND ER

Hola Vanessa, que bueno que te ha servido y te haya gustado la pagina. Saludos.

Juan Maureira 16 AG O 2 01 8 R ES PO ND ER

Hola Sergio C.
Primero, te felicito por tus tutoriales, no solamente tienes claro el procedimiento y como explicar su desarrollo, si
no también tienes una capacidad de dar orden y lo mantienes en tus explicaciones, concluyo que tienes memoria
fotográfica e inteligencia para su aplicación, te podría dar también más elogios. Agradezco tus tutoriales y no
sabes cuanto más, pero soy un profesional de la vieja guardia ( voy a cumplir 70 años), pero sigo estudiando y
leyendo acerca de mi profesión (telecom), y por eso te pido, si es posible, que si puedes, simplifiques tus
pantallas, están tan saturadas de info y publicidad que es un tormento tratar de descargar algún archivo, yo uso
win 7 en mis portátiles y tengo otros con win8.
No podrías simplificar algo el tema de las descargas? manteniendo tus intereses para personas como yo?
Mi otra pregunta es si puedo usar como base tus archivos, (con mención de la fuente, por supuesto), puedo
instruir a mis alumnos, para el desarrollo de la tecnología PID la cual, yo creo, será la tecnología dominante en el
este siglo, que será sin dudas, de los androides.
Gracias por tu atención, pero espero tu opinión.
Saludos cordiales desde Chile

Sergio C 16 AG O 2 01 8 R ES PO ND ER

Hola Juan, gracias por el comentário. La verdad es que trato de que la página sea bastante clara. Mi
pregunta es Si Conseguiste descargar los archivos??? El sistema implementado en la pagina de compartir
para obtener los códigos es para ayudar a difundir la página web y llegar a más personas.
Claro que puedes usar como base los archivos, están ahí justamente para ayudar a las personas a crecer a
nivel profesional e intelectual, es un honor para mi que quieras usar mis archivos para enseñar a otras
personas.
Cuéntame si has podido bajar los archivos después de haber visto el video de como descargarlos?? Si no, te
los mando por email entonces. Saludos!!

Jhimmy 7 A GO 20 18 R ES PO ND ER

Sergio hize este proyecto con el pic17F877A es bastante parecido al 16877, te cuento que cuando subo el código
del Controlador PIC16F877A se atonta todo el sistema. no sabes por que pueda ser, Si el código es el mismo.

Sergio C 8 A GO 20 18 R ES PO ND ER

Hola Jhimmy ya te respondi en YouTube. Saludos.

Henry Alejandro De la Cruz Cornelio 4 JU N 20 18 R ES PO ND ER

Sergio, antes que nada un enorme saludo, excelente blog y muy buenos aportes, quisiera poder contactarme
contigo por algunas dudas y asesorias, ¿podrias pasarme algun medio de contacto?

Sergio C 4 JU N 20 18 R ES PO ND ER

Hola Henry, en la parte superior de la página hay una sección de Contacto. Saludos.

Eddy Morales 2 7 M AR 2018 R ES PO ND ER

Hola, disculpa la molestia, de casualidad podrías orientarme de como realizar el codigo PID pero en Code
Composer Studio, ya que estoy utilizando Tiva C, y deseo controlar un Balancín con Helice.

Sergio C 2 8 M AR 2018 R ES PO ND ER

Eddy yo nunca usé ese compilador, pero sigue siendo lenguaje C, por lo que el código es práticamente lo
mismo. Lo único que debe cambiar son las funciones e instrucciones propias del compilador para configurar
el PIC, pero la función del PID se mantendría casi que intacta. Saludos y buena suerte.

César Acosta 25 OC T 2017 R ES PO ND ER

Hola Sergio muy importante tu apoyo quisiera saber si existe la posibilidad de saber si los datos que se producen
pueden ser dibujados en Matlab? Gracias espero poder realizar un aporte economico en tu bloc con tu respuesta.
Gracias

Sergio C 26 OC T 2017 R ES PO ND ER

Hola César, claro que se puede, es más, es mucho más interesante hacerlo en MATLAB que en Excel. Por
ejemplo, lo ideal es realizar una comunicación serial con el PIC para comunicarse con MATLAB y asi enviarle
los datos del proceso. En matlab se procesa la grafica y se pueden hacer todos los análisis pertinentes al
sistema como tal, incluso hasta podrias usar el Toolbox de identificación del propio matlab para generar tus
funciones de transferencia. Saludos.

Domingo Valencia 27 S E P 20 17 R ES PO ND ER

Hola Sergio, Soy nuevo en esto de los PiCS, solo quiero felicitarte y agradecer que compartas tus conocimientos
con todos ! esto nos ayudara a que como pais vayamos desarrollando tecnologia propia, y es uno de los caminos
para salir del tercermundismo, te reitero mis felicitaciones y agradecimiento, iré contribuyendo en tu blog en la
medida de mis conocimientos y experiencias adquiridos. Saqludos

Sergio C 27 S E P 20 17 R ES PO ND ER

Hola Domingo, muchas gracias por el comentario y por el apoyo. me alegra que te haya gustado el blog y
que te esté ayudando a aprender sobre este mundo fascinante de los microcontroladores. Te deseo el mejor
de los éxitos en esta curva de aprendizaje. Un fuerte abraso.

mario perez acosta 22 S E P 20 17 R ES PO ND ER

Una pregunta. Es posible hacer un programa y que se requiere, para poder tomar lectura de sensores y que
ademas te diga la fecha exacta en que fue tomada la muestra??

Sergio C 25 S E P 20 17 R ES PO ND ER

Hola Mario, claro que si!! puedes hacer eso con un microcontrolador. Para conseguirlo basicamente
necesitaras de un reloj calendario DS1307 usando comunicación I2C, que de diga la hora y fecha y también
de una memoria EEPROM externa para que vayas almacenando todos los datos de tus sensores. Si sigues
todo el curso de Microcontroladores que tengo montado en la pagina, estarás en las condiciones de
implementar tu proyecto. Te dejo aqui el link con todo el curso> Click AQUI. Saludos y éxitos en tu proyecto.

Manuel 12 S E P 20 17 R ES PO ND ER

Sergio llevo tiempo siguiendo tu blog tan interesante. Me motivaría mucho ver un pid en un motor Brushless
(como los motores que usan los drones). En la red hay vídeos pero nadie dice nada del pid con pic. Gracias

Sergio C 12 S E P 20 17 R ES PO ND ER

Buen proyecto, voy a tenerlo en cuenta. Saludos.

Cristoba Fernadez 18 JUN 2 01 7 R ES PO ND ER

Hola Sergio
Felicitaciones por el excelente trabajo y explicación, quisiera pedirle el favor de darme unas pautas de como
migrarlo su programa al pic 16F877A,es posible?, Ya que en el la ciudad donde vivo solo encontré este pic
he estado viendo todos sus vídeos y aun no puedo lograr dominarlo bien el compilador PIC C (CCS Compiler) soy
nuevo en esto de microcontroladores

Sergio C 18 JUN 2 01 7 R ES PO ND ER

Solo necesitas cambiar el encabezado y agregar la libreria del 16f877a, esos dos pics son identicos
#INCLUDE <16F877a.h>

Cristobal Fernandez 22 JUN 2 01 7 R ES PO ND ER

Gracias por responderme lo hare y ya te cuento

Cristobal Fernandez 22 JUN 2 01 7 R ES PO ND ER

Hola Sergio:
disculpe que le moleste de nuevo, cambie el encabezado como me indico pero ahora no compila me
sale este error
>>>Warning 208 “PID Contro.c” line 103(6,13):Function not void and does not return a value escalon
*** error 12 “PID Contro.c” line 14(20,24) Undefined identifier sANO
Es mismo codigo de Ud, solo lo cambie el encabezado

Sergio C 24 JUN 2 01 7 R ES PO ND ER

Es la forma de configurar el ADC, para ese PIC si no estoy mal es setup_adc_ports(AN0);

Cristobal Fernandez 25 JUN 2 017

Gracias mil Sergio si ya me funciono eres un genio una vez mas gracias por tu tiempo

sebastian 27 ABR 2 01 7 R ES PO ND ER

Hola ¿como estas?, excelente trabajo, ha sido de mucha ayuda para un proyecto que estoy realizando, tengo una
pregunta ¿como puedo obtener la función de transferencia de un motorreductor que compro en el mercado ?.

Sergio C 27 ABR 2 01 7 R ES PO ND ER

Es basicamente hacer lo mismo visto en el ejemplo. Debes tener un sensor que esté midiendo tu variable de
interes, aplicar un escalón, tomar los datos, graficar la respuesta y obtener la FT. Más adelate, cuando tenga
algo de tiempo, comenzaré a explicar temas de identificación de sistemas. Suerte con tu proyecto.

Kenzo 28 ABR 2 01 8 R ES PO ND ER

eso de identificar sistemas estará genial, lo espero con ansias!

Oscar 24 F E B 20 17 R ES PO ND ER

Hola
Como estas?
Espero que bien.
Sabes son nuevo en esto y por fin encontré a alguien que explicara bien, te felicito.
Ya baje los programas en C y el proyecto en proteus para hacer algunos ejercicios.
Pero que crees?
Cuando compilo el programa, SE QUEDA TRABADO ….. TENGO QUE ABORTARLO
Lo intenté con ambos programas y pasa lo mismo.
Compile unos programas que he hecho, y no se traba.
Que podrá ser?
GRACIAS…

Sergio C 25 F E B 20 17 R ES PO ND ER

Hola Oscar. no entendi muy bien tu pregunta. El compilador se esta quedando trabado cuando compilas mis
códigos? No se a que pueda deberse. Intenta ejecutar el compilador como administrador o utilizar otro
equipo para ir descartando problemas. Pero una excelente noticia es que SI compilan tus códigos y el
objetivo del blog es dar una inducción y que realmente uds hagan sus propios códigos para que realmente
aprendan. Saludos y muchos éxitos en tus proyectos.

emerson 2 3 ENE 2 01 7 R ES PO ND ER

Sergio excelente proyecto mas aun tu excelente explicación la verdad no savia como sacar los datos iniciales de
una proceso físico , gracias.
en manera de lo posible me gustaría me mandaras el plano del tarjeta que utilizas, lo pienso realizar físico.
de antemano muchas gracias.
Att: emerson palacio
correo: seagan_84@hotmail.com

Sergio C 2 4 ENE 2 01 7 R ES PO ND ER

Emerson ahi en el Blog esta el plano de la tarjeta para que la reproduzcas.

emerson 2 4 ENE 2 01 7 R ES PO ND ER

a si sergio es el que esta en el documento en word, que pena parcero gracia por su pronta respuesta.

Deja un comentario

Tu comentario aquí...

Nombre (obligatorio) Correo electrónico (obligatorio) Sitio web

Recibir un email con los siguientes comentarios a esta entrada.

Recibir un email con cada nueva entrada.

PUBL I C A R COMENTARIO

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

17. Control PID con microcontrolador PIC

Copyright - OceanWP Theme by Nick