Pero porque una o la otra, cual conviene?
como podría modelarla sacando el modelo yo o algún ejemplo concreto desarrollado referido a temperatura.Esa es la pregunta del millón.
Aunque el libro que menciono de modelado de robots está muy bueno, con ecuaciones de estado y diagramas en Matlab y todo.
¿Qué libro es?
Por ahí leí que alguien recomendaba usar controles analógicos, no creo que sea lo mejor , es dar un paso atrás
Por ahí leí que alguien recomendaba usar controles analógicos, no creo que sea lo mejor , es dar un paso atrás, hoy en día todos los controles se hacen de forma digital, ya dejo de ser una tendencia para ser los estándar.
Es cuestión de ponerse manos a la obraDiste en el clavo 8).
'********* 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
Obtenerdato:
p1 var BYTE
ADCON1 =%100 ;configura PortA 0,1, 3 en conversores A/
ADCON0 =%0000001 ;activar canal 0 a Fosc/2
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.Disculpa, pero pusiste el adcon1 igual que yo. Cuál es la diferencia?
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
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