Hola a tod@s, estoy con un proyecto que si bien me funciona tiene un par de problemas que se pueden mejorar pero no se la forma de hacerlo.
Se trata de un programa para mover un servo a dos posiciones predeterminadas que grabo en la eeprom variando en valor del ad con un potenciometro.
Luego dando un pulso en una entrada del pic, muevo el servo a una posicion A o B.
El problema es que cuando entro en el bucle de lectura del AD para memorizar las posiciones A y B, el servo se mueve mucho como si el valor del AD no fuera estable. Pieso en hacer una filtro pot soft pero no se como hacerlo de una manera efectiva.
Por otro lado, cuando quiero que el servo se mueva de A a B, se mueve a la maxima velocidad del servo y no se como relantizar la funcion servoout para que el servo haga el movimiento mas despacio.
Os dejo el codigo por si alguien puede ayudarme. Estoy seguro que se puede mejorar el programa incluso reducirlo, si lo creeis mejorable me gustaria leer vuestras impresiones para aprender como hacerlo.
Saludos
'26/06/2011
'Mediante un pulso en GP1 al alimentarlo entramos en programacion. Con un POT conectado a GP2 seleccionamos la posicion del servo para valor max y min
'Poniendo a nivel alto o bajo GP3 seleccionamos la posicion del servo. Pensado para el starter de los motores de gasolina, no hace falta canal del RX
Define CONF_WORD = 0x30c4
AllDigital
Dim ref As Byte 'medida derl AD
Dim memo_a As Byte 'valor a memorizado
Dim memo_b As Byte 'valor b memorizado
Dim counter As Word
Dim a As Bit
'Config GPIO.0 = Output 'led testigo
Config GPIO.1 = Input 'pulsador de memoria pin 6
Config GPIO.2 = Input 'entrada A/D
Config GPIO.3 = Input 'Entrada sensor
Config GPIO.4 = Output 'salida WFM
Config GPIO.5 = Output 'salida led
ANSEL = 00000100 'CONFIGURA LAS ENTRADAS Y SALIDAS ANALOGICAS LO HE TENIDO QUE PONER PARA EL AD SI NO, NO FUNCIONABA
Define ADC_CLOCK = 3
Define ADC_SAMPLEUS = 50
Read 1, memo_a
Read 2, memo_b
GP5 = 0
counter = 0
If GP1 = 1 Then
GP5 = 1
WaitMs 2000
GP5 = 0
WaitMs 1000
Gosub memoria
Else
Endif
loop:
Select Case a
Case 1 'esta encendido
'counter = 0
loop1:
If GP3 = 0 Then
GP5 = 1
WaitMs 1000
a = 0
Else
Endif
Case 0
loop2:
If GP3 = 0 Then
GP5 = 0
WaitMs 1000
a = 1
Endif
EndSelect
If a = 1 Then ServoOut GP4, memo_a
If a = 0 Then ServoOut GP4, memo_b
Goto loop
End
memoria:
GP5 = 1
Adcin 2, ref
ServoOut GP4, ref
If GP1 = 1 Then
memo_a = ref
Write 1, memo_a
GP5 = 0
WaitMs 2000
Goto loop3
Else
Goto memoria
Endif
loop3:
GP5 = 1
Adcin 2, ref
ServoOut GP4, ref
If GP1 = 1 Then
memo_b = ref
Write 2, memo_b
GP5 = 0
WaitMs 2000
Return
Endif
Goto loop3