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