me encuentro realizando un control proporcional para un motor dc tengo el codigo pero en el momento de montar el control ,este controla pero muy regular .este es el algoritmo ,podrian mirarlo y talvez ayudarme un poco
Define LCD_DREG PORTB
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5
Define LCD_LINES 2
Define LCD_BITS 4
Include "modedefs.bas"
DEFINE ADC_BITS 8 " Set number of bits in result
DEFINE ADC_CLOCK 3 " Set clock source (rc = 3)
DEFINE ADC_SAMPLEUS 50
TRISC=%00000000
TRISA=255
"--------------------------------------------------------------------
aux VAR BYTE
SP VAR BYTE "SP
SEN VAR BYTE "MOTOR
EK VAR BYTE "ERROR
MK VAR BYTE "SEÑAL CONTROLADOR
Q0 CON 22
M0 con 15
Read 0,sp
Lcdout $fe, 1 "limpiar pantalla
Lcdout "CTROL VELOCIDAD"
Lcdout $fe,$C0, "PARA UN MOTOR DC"
Pause 3000
Lcdout $fe, 1 "limpiar pantalla
Lcdout " ACTUADOR X FASE"
Lcdout $fe,$C0, " Ultimo SP:",DEC SP
Pause 5000
"--------------------------------------------------------------------
GOTO INICIO
"--------------------------------------------------------------------
" CONVERTIDOR ANALOGO DIGITAL
ANALOGO:
ADCON1 = %00000000
ADCON0.2 = 1
LOOP: IF ADCON0.2=1 THEN
GOTO LOOP
ELSE
aux = ADRESH
PAUSEUS 100
ENDIF
RETURN
"-----------------------------------------------------------------
INICIO:
ADCON0 = %11000001 "AN0
GOSUB ANALOGO
SP = aux
ADCON0 = %11001001 "AN1
GOSUB ANALOGO
SEN = aux
IF SP>SEN THEN
EK=(SP-SEN)
MK= (Q0/10)*EK - M0/10
if sen = 0 then
mk = 255
endif
portc = mk
IF MK < 0 THEN
MK= 0
ENDIF
IF MK > 255 THEN
MK=255
ENDIF
ELSE
EK=(SEN-SP)
mk = (Q0/10)*EK + 10
if sen = 255 then
mk = 0
endif
portc =- mk
IF MK < 0 THEN
MK=0
ENDIF
IF MK>255 THEN
MK=255
ENDIF
endif
Lcdout $fe, 1 "limpiar pantalla
Lcdout "Control:P", " SP:",dec sp
Lcdout $fe,$C0, "Var:",DEC SEN, " Er:",DEC ek
Pause 500
write 0,sp " espera.1 seg
GOTO INICIO
END
el programa tiene el sp en ra0 y la variable del motor atraves de convertidor frecuencia-voltage es por ra1