'************* ADAPTADO PARA TRABAJAR CON EL MODULO ADC SIN INTERRUPCIONES**************
'***************************************************************************************
'NOMBRE: 16F88_MandoJEVO_01
'MICRO: PIC16f88
'Version: 1.0
''**************************************************************************************
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define ADC_SAMPLEUS = 10
'Define ADC_CLOCK = 5
Dim duty(16) As Byte 'Duty Cicle
Dim curva(15) As Byte 'Curva grabada
Dim vg As Word 'Valor gatillo
Dim ca As Byte 'Curva actual
Dim cn As Byte 'Curva nueva
Dim mca As Byte 'Modificacion curva actual P5
Dim mcn As Byte 'Modificacion curva nueva P5
Dim asa As Byte 'Antispin Actual P4
Dim asn As Byte 'Antispin nuevo P4
Dim ai As Byte 'Contador inicio
Dim af As Byte 'Contador fin
Dim a As Byte 'contador
Dim b As Byte
Dim va(4) As Byte
Dim mc(3) As Byte
Dim i As Byte
ANSEL = %00100011 'Los pin digitales y NA5, NA1 y NA0 como analogicos
TRISB = %11110111 'Configuración input/output
TRISA = %11111111 'Configuración input/output
CMCON = 0x07 'Comparador a off
OSCCON = 0x7e 'Set intrc To 8mhz, se usara reloj interno a 8Mhz
ADCON0 = %01100001 'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
ADCON1 = %11000000 'Volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
'ADCON1.ADFM = 0 'Activa lectura 8bit del ADC
'___________________
'Ver curva actual
Gosub vercurva
Gosub leermemoria
Gosub modificarcurva
Gosub modificararranque
PWMon 1, 12
PWMduty 1, 0
'****************************************************************************
'Rutina principal
loop:
For i = 1 To 13
Gosub vercurva 'Comprueba que no se haya cambiado la curva
If cn <> ca Then Gosub leermemoria
'* Leer gatillo
Gosub salidapwm
'Adcin 0, mcn 'lee el valor de p5
ADCON0.CHS0 = 0 'Selecciono canal AN0 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 0
ADCON1.ADFM = 0 'Activa lectura 8bit del ADC
ADCON0.GO = 1 'Activo una lectura
While ADCON0.GO = 1 'Espera hasta terminar la conversion ADC
Wend
mcn = ADRESH 'ADC a 8bit
If mcn <> mca Then Gosub modificarcurva
'* Leer gatillo
Gosub salidapwm
'Adcin 5, asn 'lee el valor de p4
ADCON0.CHS0 = 1 'Selecciono canal AN5 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 1
ADCON1.ADFM = 0 'Activa lectura 8bit del ADC
ADCON0.GO = 1 'Activo una lectura
While ADCON0.GO = 1 'Espera hasta terminar la conversion ADC
Wend
asn = ADRESH 'ADC a 8bit
If asn <> asa Then Gosub modificararranque
'* Leer gatillo
Gosub salidapwm
Next i
Goto loop
End
'********************************************************
'Deteccion de la curva a leer
vercurva:
'Ver curva nueva
cn = 0
If PORTA.2 = 1 Then cn = cn + 4
If PORTA.3 = 1 Then cn = cn + 2
If PORTA.4 = 1 Then cn = cn + 1
If PORTA.5 = 1 Then cn = cn + 8
ai = cn * 16 'Posicion inicial de memoria donde leer
af = ai + 14 'Posicion final de memoria donde leer
Return
leermemoria:
'Leer valores Guardados segun la curva a leer
For a = ai To af
b = a - ai
Read a, duty(b)
curva(b) = duty(b)
Next a
'Genera los valores para las modificaciones de curvas
va(0) = (curva(10) - curva(4)) / 5 'Calculo maxima modificacion
va(1) = va(0) * 2 '(va(0) * 10) / 5 es el valor de correccion del 100 % multiplicado por 10
va(2) = va(0) '(va(0) * 10) / (2 * 5) es el valor de correccion del 50 % multiplicado por 10
va(3) = (va(0) * 10) / 15 '(va(0) * 10) / (3 * 5) es el valor de correccion del 30 % multiplicado por 10
ca = cn
Return
'********************************************************************************************
'Rutina deteccion posicion del gatillo y entrega de potencia
salidapwm:
For a = 1 To 8
'Adcin 1, vg 'lee el valor del gatillo
ADCON0.CHS0 = 1 'Selecciono canal NA1 para el modulo ADC
ADCON0.CHS1 = 0
ADCON0.CHS2 = 0
ADCON1.ADFM = 1 'Activa lectura 10bit del ADC
ADCON0.GO = 1 'Activo una lectura
While ADCON0.GO = 1 'Espera hasta terminar la conversion ADC
Wend
vg.HB = ADRESH 'ADC a 10bit
vg.LB = ADRESL 'ADC a 10bit
Select Case vg
Case < 64
PWMduty 1, 0 'Freno
Case < 128
PWMduty 1, duty(0)
Case < 192
PWMduty 1, duty(1)
Case < 256
PWMduty 1, duty(2)
Case < 320
PWMduty 1, duty(3)
Case < 384
PWMduty 1, duty(4)
Case < 448
PWMduty 1, duty(5)
Case < 512
PWMduty 1, duty(6)
Case < 576
PWMduty 1, duty(7)
Case < 640
PWMduty 1, duty(8)
Case < 704
PWMduty 1, duty(9)
Case < 768
PWMduty 1, duty(10)
Case < 832
PWMduty 1, duty(11)
Case < 896
PWMduty 1, duty(12)
Case < 960
PWMduty 1, duty(13)
Case <= 1023
PWMduty 1, duty(14)
EndSelect
Next a
Return
'*************************************************************
'Ajuste fino de la curva grabada
'Rutina para modificar el centro de la curva
modificarcurva:
Select Case mcn
Case < 22 'P -5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(1) * 5) / 10)
duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn
Return
Case < 44 'P -4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(1) * 4) / 10)
duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn
Return
Case < 66 'P -3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(1) * 3) / 10)
duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn
Return
Case < 88 'P -2
mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(1) * 2) / 10)
duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn
Return
Case < 110 'P -1
mc(0) = va(3) / 10
mc(1) = va(1) / 10
duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)
mca = mcn
Return
Case < 145 'P 0
duty(5) = curva(5)
duty(6) = curva(6)
duty(7) = curva(7)
duty(8) = curva(8)
duty(9) = curva(9)
mca = mcn
Return
Case < 165 'P +1
mc(0) = va(3) / 10
mc(1) = va(2) / 10
mc(2) = va(1) / 10
duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)
mca = mcn
Return
Case < 185 'P +2
mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(2) * 2) / 10)
mc(2) = ((va(1) * 2) / 10)
duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)
mca = mcn
Return
Case < 205 'P +3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(2) * 3) / 10)
mc(2) = ((va(1) * 3) / 10)
duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)
mca = mcn
Return
Case < 230 'P +4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(2) * 4) / 10)
mc(2) = ((va(1) * 4) / 10)
duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)
mca = mcn
Return
Case <= 255 'P +5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(2) * 5) / 10)
mc(2) = ((va(1) * 5) / 10)
duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)
mca = mcn
Return
EndSelect
Return
'*****************************************************************
'Ajuste del control de arrancada
modificararranque:
Select Case asn
Case < 25 'P 1
duty(0) = curva(0)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return
Case < 50 'P 2
duty(0) = curva(0) + (((curva(1) - curva(0)) * 50) / 100)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return
Case < 75 'P 3
duty(0) = curva(1)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return
Case < 100 'P 4
duty(0) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return
Case < 125 'P 5
duty(0) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(1) = curva(2)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return
Case < 150 'P 6
duty(0) = curva(2)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return
Case < 175 'P 7
duty(0) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(2) = curva(3)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(4) = curva(4)
asa = asn
Return
Case < 200 'p 8
duty(0) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(1) = curva(3)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(4) = curva(4)
asa = asn
Return
Case < 225 'P 9
duty(0) = curva(3)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(3) = curva(4)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
asa = asn
Return
Case <= 255 'P 10
duty(0) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(2) = curva(4)
duty(3) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 80) / 100)
asa = asn
Return
EndSelect
Return