Autor Tema: ¿Cómo hago PID con PBP?  (Leído 28947 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: ¿Cómo hago PID con PBP?
« Respuesta #30 en: 29 de Septiembre de 2006, 07:51:01 »
Para verificar el funcionamiento de un PID lo que se suele hacer es aplicar una entrada en escalón y comprobar la respuesta del sistema. Pero muy importante se tiene que probar el PID y el sistema a controlar todo junto. El problema del Proteus, es como simulas el sistema a controlar. Creo que tal vez se pueda integrar en algún módulo, la función de transferencia del sistema. Luego aplicando un pulso al PID y al sistema en Proteus, podremos ver el resultado en el osciloscopio.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado LETAL

  • PIC16
  • ***
  • Mensajes: 101
Re: ¿Cómo hago PID con PBP?
« Respuesta #31 en: 29 de Septiembre de 2006, 08:58:56 »
Lo que pasa es que tome una de segunda orden como planta directamente, yo la supuse.
De todas formas como te decía el tema del modelado de la planta es relativo, porque lo que quiero hacer es una estructura pid donde pueda ir cambiando las constantes y viendo el efecto que produce sobre la planta ficticia. No tiene importancia en mi caso que planta es exactamente ya que es solo para hacer pruebas variando las constantes y viendo que pasa.

Desconectado LETAL

  • PIC16
  • ***
  • Mensajes: 101
Re: ¿Cómo hago PID con PBP?
« Respuesta #32 en: 29 de Septiembre de 2006, 09:12:42 »
Ayuda por favor !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Les muestro un programa de control pid, que es una modificación de uno escrito en bassictamp. Estoy realmente frustrado porque hago la simulación y no tiene salida.
Les agradecería mucho si pueden estudiarlo y decirme que pasa, de paso quizá les dé a ustedes alguna idea.
Lo pego aquí al mío y les dejo adjunto el de basicstamp y el mío por las dudas
quieran bajarlo para verlos mejor.


Código: [Seleccionar]

 

'********* CONFIGURACIÓN Variables DEL CONTROL PID ****************
SP var byte 
Rango var byte
B VAR BYTE  ' Configuración de excitación de polarización
Kp var byte  ' Ganancia Proporcional en décimas
Ki var byte  ' Ganancia Integral en décimas
Ti var byte  ' Tiempo de Reset Integral
Kd var byte ' Ganancia Derivativa
sensor var byte
'*************************************************

' ************** Define constantes y variables

Signo VAR WORD ' Almacena el signo de los cálculos
Excitacion VAR WORD ' Cantidad de excitación total
Err VAR WORD ' Cantidad de Error
P VAR WORD ' Cantidad de excitación Proporcional
I VAR WORD ' Cantidad de excitación Integral
D VAR WORD ' Cantidad de excitación Derivativa
UltimoErr VAR WORD ' Almacena temperatura anterior para control derivativo
UltimoErr = 0
ContadorInt VAR BYTE ' Variable para contar ciclos de excitación integral
Ei VAR WORD ' Error acumulativo para cálculo integral
Ei = 0 ' Limpia error acumulativo


;********************** Defino las cttes(que en realidad son variables)
SP =200 
Rango=255' ya lo puse como 255 directlly
B =0  ' Configuración de excitación de polarización
Kp =1  ' Ganancia Proporcional
Ki =1  ' Ganancia Integral en décimas
Ti =10  ' Tiempo de Reset Interal
Kd =1

'*************** BUCLE PRINCIPAL

Principal:
GOSUB Obtenerdato
GOSUB Calc_Temp
GOSUB Calc_Excitacion
GOSUB Excitacion_Calentador


GOTO Principal


Obtenerdato:
 p1 var BYTE
 ADCON1 =%100              ;configura PortA 0,1, 3 en conversores A/
       
             
 

        ADCON0 =%0000001            ;activar canal 0 a Fosc/2
                medir:          ;subrutina para leer el conversor A/D
        Pauseus 50              ;pausa par setear el canal
        ADCON0.2 = 1            ;iniciar conversión
       verificositermino:
        if ADCON0.2 = 1 then verificositermino
       p1=ADRESH

              Return
     
       
               
Calc_Temp: ' Convierte el valor digital en Temp.
sensor=p1 
RETURN


Calc_Excitacion:
GOSUB ErrorCalc ' Cálculos de Error
GOSUB PropCalc ' Calcula error proporcional
GOSUB IntCalc ' Calcula error Integral
GOSUB DerivCalc ' Calcula error Derivativo
Excitacion = (B + P + I + D) ' Calcula excitación total

Signo = Excitacion ' Ajuste de signo para max 100 min 0
GOSUB PoneSigno
Excitacion = ABS Excitacion MAX 100   
IF Signo = 1 THEN ExcitListo
Excitacion = 0
ExcitListo:
RETURN



'********* Excitacion del calentador
Excitacion_Calentador:

PORTB=Excitacion

RETURN



'********** Calcula %Error - Signo ajustado
ErrorCalc:

Err = (SP - sensor) ' Calcula error
Signo = Err
GOSUB PoneSigno
Err = ABS Err*100/255' Calcula % error , el 255 es el RANGO
Err = Err * Signo
RETURN


'*********** Excitación Proporcional - Signo ajustado
PropCalc:
Signo = Err
GOSUB PoneSigno
P = ABS Err * KP + 5/10 ' Err prop= %Err * Kp /10 por escala,
P = P * Signo ' +5 por redondeo
RETURN


'********** Excitación Integral - Signo ajustado
IntCalc:
Ei = Ei + Err ' Acumula %err
ContadorInt = ContadorInt + 1 ' Incrementa contador
IF ContadorInt < Ti Then IntListo

Signo = Ei
Gosub PoneSigno
Ei = ABS Ei / Ti ' Encuentra error promedio
Ei = Ei * Ki + 5 /10 ' Int err = Int err * Ki
Ei = Ei * Signo
I = I + Ei ' Suma error a Int err total
Signo = I
GOSUB PoneSigno
I = ABS I MAX 100 ' limita a 100     
I = I * Signo
ContadorInt = 0 ' Reinicia contador y acumulador
Ei = 0
IntListo:
RETURN


'*********** Excitación Derivativa
DerivCalc:
D = (Err-UltimoErr) * KD ' Calcula excitación derivativa
' basándose en la diferencia del último error

DerivListo
UltimoErr = Err ' Almacena error actual para el próximo cálculo
RETURN



'********** Determina el signo de un valor
PoneSigno:
IF Signo.bit15 = 0 THEN SignoPos ' Si signobit es 1, entonces es negativo
Signo = -1
Return
SignoPos:
Signo = 1
SignoListo:
Return




 :( :( :( :(

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: ¿Cómo hago PID con PBP?
« Respuesta #33 en: 29 de Septiembre de 2006, 14:51:13 »
Lo voy a imprimir para compararlo entre el BS y PBP.

A simple vista me doy cuenta que es prácticamente lo mismo.

No te puedo ayudar en eso de Proteus como te mencioné pero, quizá puedas pedir ayuda en el tema de PBP y Proteus aqui en el subforo.

Intentaré revisarlo hoy y trataré de darte una respuesta en la noche.

El código debería funcionar.

Si en Proteus se pudiera colocar un par led-transistor en un rotor sería muy bueno, asi te darías cuenta si el motor sigue a la entrada, pero creo que no se puede hacer.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: ¿Cómo hago PID con PBP?
« Respuesta #34 en: 30 de Septiembre de 2006, 17:59:53 »
Hola.

Acabo de ver el código y:

Obtenerdato:
 p1 var BYTE
ADCON1 =%100              ;configura PortA 0,1, 3 en conversores A/
 ADCON0 =%0000001            ;activar canal 0 a Fosc/2
               


Si utilizas el FOSC/2 debes poner en el bit 7 y 6 dos ceros y tienes %0000 001 necesitas 0000 0001.

Para la configuración de AN0, AN1 y AN3 estás bien pero.
p1=ADRESH

Estás tomando los bits de de ADRESH y creo, que son solo tomarás los dos de mayor peso porque estará configurado a la derecha.

Si solo vas a tomar el ADRESH, debes colocar un 1 en el bit 7 del ADCON1 para que se justifique a la izquierda y asi tomes los 8 de mayor peso y descartes los dos de menor peso.

ADCON1=%0000 0100

Eso es lo único que yo veo diferente.

Prácticamente tomaste lo mismo del BS y lo "copy-pasteaste", lo cual no está mal ya que tuviste cuidado de seleccionar los rangos.

¿Porqué no lo pruebas en lugar de simularlo?

No recuerdo mucho de control y quizá ésta sea una pregunta tonta pero..... ¿cómo aplicas un escalón a un sistema digital? Es decir, ¿qué señal sería un escalón?

Recuerdo que es algo de µ(t), supongo que será un voltaje durante un tiempo µ(t-x) o algo asi.


Espero te sirva, es lo único que encontré.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado LETAL

  • PIC16
  • ***
  • Mensajes: 101
Re: ¿Cómo hago PID con PBP?
« Respuesta #35 en: 30 de Septiembre de 2006, 18:37:20 »
Gracias Mario.

Citar
Estás tomando los bits de de ADRESH y creo, que son solo tomarás los dos de mayor peso porque estará configurado a la derecha.

Si solo vas a tomar el ADRESH, debes colocar un 1 en el bit 7 del ADCON1 para que se justifique a la izquierda y asi tomes los 8 de mayor peso y descartes los dos de menor peso.

ADCON1=%0000 0100
   
Disculpa, pero pusiste el adcon1 igual que yo. Cuál es la diferencia?
Otra dudilla, probando el adcon0 y el adcon1 como yo los puse originalmente y visualizando
en lcd si toma los ocho bits. De todas formas voy a probar los cambios que me indicas.


Leyendo el código me dí cuenta que excitación es de tipo word y luego yo hago PORTB=excitación , y el portB sólo tiene ocho bits. Trataré de tomar los 8 bits más significativos, espero que me salga, porque no entiendo bien como se hace, voy a probar y te cuento.

Con respecto a lo del escalón sería una contínua. El tema es que en sistemas analógicos lo que realmente entra en el controlador es la señal de error, mientras que en el que usamos el pic , la señal de error la calcula internamente el micro.

Ahora lo que no entiendo bien es metodo de sintonía basado en la curva de reacción , pero aplicado al micro , por lo que dije anteriormente se me mezclan un poco las cosas.

Gracias de nuevo mario. Te comento a ver si puedo simular algo en el proteus.



Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: ¿Cómo hago PID con PBP?
« Respuesta #36 en: 01 de Octubre de 2006, 01:22:32 »
Pues parece que esto
ADCON1=%100

coloca esto:
0000 0100

en el ADCON1.


No lo sé la verdad, pero me armaré el ICD del µicrocode studio plus y me fijo en los registros a la hora de estar probándolo.


Al parecer PANTERA está haciendo un PID discreto pero creo que él es mas avanzado ya que todo parece indicar que usará C (¡punto flotante!) y como C no se....... :(

Aunque lo del punto flotante lo puedes "brincar" con DIV32, no sé si sea apropiado, como tomas lecturas continuamente y rápido (para el I, ¡y para todo!) quizá no sea una buena idea meter decimales.

Primero que salga y luego lo maquillan  :D
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado LETAL

  • PIC16
  • ***
  • Mensajes: 101
Re: ¿Cómo hago PID con PBP?
« Respuesta #37 en: 03 de Octubre de 2006, 19:01:32 »
estará bien usar el dac en lugar de pwm y un filtro?, me pareció que andaría mejor con el dac pero estoy dudando .
Qué pinan?

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: ¿Cómo hago PID con PBP?
« Respuesta #38 en: 04 de Octubre de 2006, 02:11:11 »
¿Para qué ocupas salida analógica?

Esa sería la pregunta.

Recuerda que el DAC no tiene una frecuencia de salida; simplemente produce voltaje de salida.

Un PWM proporciona voltaje en medida de su ciclo de trabajo pero a una frecuencia fija.

Si tu sistema soporta el estrés de frecuencia puedes usar el PWM. Si solamente necesitas voltaje usa el DAC; todo depende de qué controlarás.


¿Ya te funcionó bien el PID?

Yo creo que voy a utilizar el pseudocódigo que menciono aquí:
http://abrobotics.tripod.com/ControlLaws/PID_ControlLaws.htm

Intentaré  adaptarlo a PBP.

Apenas estoy armando el carrito y colocando la resolución de las llantas. Creo lo haré óptico porque los sensores de efecto hall que tengo simplemente no levantan nada de magnetismo.  :lol:
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado LETAL

  • PIC16
  • ***
  • Mensajes: 101
Re: ¿Cómo hago PID con PBP?
« Respuesta #39 en: 04 de Octubre de 2006, 16:20:08 »
Todavía no hice andar el pid, pero te tengo al tanto de novedades.
Con respesto a la salida utilizaré rl dac para probar ya que necesito mostrar como es la señal de salida.
Soy un poco desordenado para hacer las cosas.

El cycle es lo que da la frecuencia al pwm, verdad??? Le yendo ví 1 ciclo con reloj de 20 Mhz dura 1ms, eso signifia que no puedo obtener frecuancias DE PWM mayores de 1KHZ??

Nos vemos teneme al tanto de tus avances y yo te cuento los míos.

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: ¿Cómo hago PID con PBP?
« Respuesta #40 en: 04 de Octubre de 2006, 20:35:03 »
Hola.

El ciclo de trabajo es el tiempo que estará en alto el pulso durante la frecuencia, son cosas diferentes.

Tu frecuencia es de X Hz, y tu ciclo de trabajo varía entre el 0% y el 100%.

Usemos 1 khz de ejemplo:
0% significa que durante esa frecuencia, no saldrá voltaje. Cada 1 khz se repetirá esto.

50% significa que durante la frecuencia, la mitad saldrá voltaje y la otra no (500 Hz con voltaje y 500 sin voltaje). Cada 1 kHz se repite.

100% quiere decir que siempre saldrá voltaje durante TODA la frecuencia.


Si pones 0% o 100% no notarás la diferencia pero, si pones 50% o cualquier otro, si la verás.

Si tienes acceso a un osciloscopio (digital de preferencia) observarás lo que digo.


Si usas el 877, tienes dos canales para PWM.
Revisa el manual de PBP en HPWM y observarás que ya hay una instrucción para hacer esto en hardware.

HPWM canal, ciclo de trabajo, frecuencia.

El manual te dice cuánto es la mínima frecuencia permisible con esta instrucción.

Una desventaja con esto es que deverás llamar a la instrucción cada vez que desees cambiar el ciclo de trabajo para cada canal; recuerda que será la misma frecuencia para los dos canales pero, puede ser diferente el ciclo de trabajo.

Otra (pudiera ser desventaja) es que solo te deja usar de 0 (0%) hasta 255 (100%).

Si lo haces directamente en hardware, moviendo y acomodando los registros necesarios tendrás los 10 bits (0=0%,1023=100%) por lo que la resolución del ancho de pulso se hace mas fina.


Yo usaré esto:
http://www.microengineeringlabs.com/resources/samples/pbp/hardpwm.bas

Es un programa para configurar los registros del hardware con los 10 bits.

Espero te sirva.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado LETAL

  • PIC16
  • ***
  • Mensajes: 101
Re: ¿Cómo hago PID con PBP?
« Respuesta #41 en: 05 de Octubre de 2006, 12:13:51 »
Yo te hablaba del PWM , no del HPWM. Como es eso de pwm en hardware??? como son las conexiones externas al pic??

Te comento que fraccione el cóodigo del pid y estuve haciendo una prueba muy básica con el control p en proteus y funciona. Digo básica porque hay salida que antes ni siquiera eso tenía y verifiqué que cuando el error es negativo tiene salida 0 y cuando es positivo tiene salida 255.

Tengo dudas una respecto a las siguientes líneas:
Control P
…………
…………..
ErrorCalc:

Err = (SP - sensor) ' Calcula error de la temperatura
Signo = Err
GOSUB PoneSigno
Err = (ABS Err*100)/255' Calcula % error , el 255 es el RANGO
Err = Err * Signo
RETURN


'*********** Excitación Proporcional - Signo ajustado
PropCalc:
Signo = Err
GOSUB PoneSigno
P = ABS Err * KP + 5/10 ' Err prop= %Err * Kp /10 por escala,
P = P * Signo ' +5 por redondeo
RETURN

De acuerdo a esta línea
Err = (ABS Err*100)/255' Calcula % error , el 255 es el RANGO
Solo cuando abs err*100 sea mayor de 255, el error será mayor a 0 y además Err cambiaría de a 1 cuando abs err*100 cambie en 255, verdad?? Esto no lo haría muy impreciso al calculo del error??


En esta otra línea :

P = ABS Err * KP + 5/10 ' Err prop= %Err * Kp /10 por escala

La secuencia con que hace el calculo el satmp es :
ABS Err*kp=a
a+5=b
b/10=p

O sea que abs err*kp debería variar en 5 para que varíe en 1 P, otra vez , esto lo hace muy impreciso o no es tan grave la cosa??
Y hay algo que no entiendo para que suma el 5 y divide en 10, es realmente eso mejor que directamente poner P=ABS Err*KP ?????

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: ¿Cómo hago PID con PBP?
« Respuesta #42 en: 06 de Octubre de 2006, 02:59:43 »
Sobre lo del PWM en Hardware:
http://www.interq.or.jp/japan/se-inoue/e_pic7_4.htm

Hace referencia al 16F873, que tiene casi lo mismo que el 16F877, solo que el 877 tiene un puerto paralelo. Para fines de explicación es lo mismo.


Sobre lo que comentas:
Tengo dudas una respecto a las siguientes líneas:

ErrorCalc:
Err = (SP - sensor) ' Calcula error de la temperatura
Signo = Err
GOSUB PoneSigno
Err = (ABS Err*100)/255' Calcula % error , el 255 es el RANGO
Err = Err * Signo
RETURN

Si te fijas en el código de Basic Stamp, rango es el valor que se encuentra entre los umbrales máximos y mínimos de temperatura. Revisa la página 157 del manual industrial de basic stamp (donde viene este programa en Basic).
Quizá te aclare un poco la duda.

De todas maneras seguiré viendo el código a ver qué se le puede sacar.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: ¿Cómo hago PID con PBP?
« Respuesta #43 en: 06 de Octubre de 2006, 03:18:35 »
Un comentario mas:

Recuerda que el error = (SP- la variable a medir)

Mira cómo el ejemplo de BS colocó un 20 (20=2’F porque los grados están en décimas) en el rango.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado LETAL

  • PIC16
  • ***
  • Mensajes: 101
Re: ¿Cómo hago PID con PBP?
« Respuesta #44 en: 10 de Octubre de 2006, 12:16:26 »
electronando hizo con matlab el pasaje de la funcion de transferencia en S a una función de transferencia en Z Y luego la correspondiente en diferencias.

Lo que yo quiero hacer es pasar de una en diferencias a una en Z. Esto es debido a que estoy usando el pbp que trabaja con matematica entera.
Entonces tomé como ejemplo el código que coloqué en un mensaje anterior, de donde puedo deducir la ecuación en diferencias pero no la ecuacion en Z.

En definitiva necesito que me ayuden a pasar la ecuacion en diferencias del pid a una ecuación en  variable Z. Quizá electronando sepa como hacerlo, ya que maneja bien el matlab.




 

anything