Autor Tema: PID en proton  (Leído 2874 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado TREMENS

  • PIC16
  • ***
  • Mensajes: 125
PID en proton
« en: 02 de Diciembre de 2006, 23:35:52 »
Estoy aprendiendo mucho aquí y quiero hacer un controlador pid que permita que se introduzacn ppor teclado sus cttes.
Para probar la parte del control , probé con este programa.
Debí ajustar las cttes para que m ecoincidan las salidas con las que me arroja el matlab.
La que no puedo ajustar, es la acción derivativa.
Tomando como entrada en proteus una rampa de pendiente 1, su derivada es 1 por lo que debo obtener a la salida un valor ctte de magnitud 1.

Sin embargo la magnitud es otra. Intentando ajustar consigo que en magnitud tenga un valor similar a 1, pero no es un valkor ctte sino que parecen pulsos.
Cuál es la forma de obtener realmente una contínua con la acción derivativa ante entrada en rampa?

La entrada en rampa negativa la consegui con pwlin de generators.




DEVICE =16F877
XTAL=4
;*******DEFINOVARIABLES****************
DIM sp AS BYTE
DIM sensor AS word
DIM err AS BYTE
DIM ultmerr AS BYTE
DIM P AS FLOAT
DIM I AS FLOAT
DIM D AS FLOAT
DIM PID AS FLOAT
DIM PIDB AS FLOAT
DIM salida AS FLOAT
DIM Kp AS FLOAT
DIM Ki AS FLOAT
DIM Kd AS FLOAT
DIM B AS FLOAT

;****INICIALIZO VARIABLES********
TRISD=0
PORTD=0
i=0
err=0
ultmerr=0
; ESTO ES PARA PROBAR NOMAS
SP=255
Kp=0
Ki=0
Kd=1
B=0

;***********ADQUISICION***************
 DECLARE ADIN_RES 10       ' 8-bit result required
DECLARE ADIN_TAD 32_FOSC     ' 32Fosc OSC chosen
DECLARE ADIN_STIME 50     ' Allow 50us sample time
 TRISA = %00001011         ' Configure AN0,AN1 y AN3 (PORTA.0) as an input
   ADCON1 = %10000100         ' Set analogue input on PORTA.0,1,3 conversores
                              ;Justifica a la derecha: ADCON1=1 0000100
 




;********** PRINCIPAL CONTROL***********
 
 principalcontrol:
 
 gosub adquisicion
 GOSUB calculoerror
 gosub calculoP
 GOSUB calculoI
 GOSUB calculoD
 GOSUB calculoPIDB
 gosub salidaprobe
  goto principalcontrol


;*************ADQUISICION Y CONVERSION***************
adquisicion:
sensor = ADIN 1     ;guarda la conversión del canal 1 en sensor
return



;**********CALCULO ERROR**************
calculoerror:
err=sp-sensor        ,setpoint-sensor
RETURN



;***********CALCULO PROPORCIONAL**************
calculoP:
P=Kp*err
RETURN


;***********CALCULO INTEGRAL***************
calculoI:
I=I+Ki*err
RETURN


;**********CALCULO DERIVATIVO****************
calculoD:
D=Kd*(err-ultmerr)

ultmerr=err  ;guardo el errk como ultm para usarlo en el siguiente bucle
             ;como errk-1
RETURN      


;**************CALCULO PID****************
calculoPIDB:
PID=P+I+D
PIDB=PID+B

RETURN

;*********************salida al dac*******
salidaprobe:
PORTD=pidb
return


Desconectado TREMENS

  • PIC16
  • ***
  • Mensajes: 125
Re: PID en proton
« Respuesta #1 en: 06 de Diciembre de 2006, 18:24:12 »
Les muestro lo que obtengo a la salida del dac para KP=P, KI=0 , B=0 Y KD=1. Estoy probando la accion derivativa sola.

La verdad que no entiendo porque me da esa salida que no refleja los calculos que hace el programa.
Ayudenme porfi