TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: francpa en 18 de Abril de 2013, 17:58:45
-
hola a todos
mi problema es el siguiente estoy midiendo voltaje de una batería de plomo ácido 12 v 7Ah con un Microcontrolador, lo que pasa es que necesito encender un led dependiendo del estado de carga de la batería, por ejemplo 13.8v enciende un Led, pero la curva de carga de esta batería es como muestro en el dibujo. por lo que llega a un nivle de 13.8 pero despues llega a 14.5 y despues baja hasta 13.8 de nuevo donde se mantiene definitivamente a ese valor y es ahi donde quiero que se encienda el led no antes. ojala me haya explicado bien(http://wetfloor.ruido-blanco.net/uploaded/20130418135213/13.8-wetfloor.png)
con el código que he hecho se prende el led en la etapa de transicion no de flotación como debe de ser
adjunto el codigo
#include <PRUEBA_RS232_2.h>
void main() {
int iteracion=0;
int16 medicion1=0, medicion2=0;
float voltaje1=0, var_aux1=0, sumatoria=0, sumatoria2=0, volt=0, voltDS=0, voltaje2=0, var_aux2=0;
setup_adc_ports(sAN2|sAN3);
setup_adc(ADC_CLOCK_DIV_64);
setup_timer_4(T4_DISABLED,0,1);
setup_timer_6(T6_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
while(TRUE){
sumatoria=0;
sumatoria2=0;
iteracion=1;
for(iteracion= 1; iteracion<=50; iteracion++)
{
set_adc_channel(3);
delay_us(20);
medicion1 = read_adc();
var_aux1=medicion1;
voltaje1 = ((var_aux1/1023)*(15-5)*1/2)*2+5.16;
sumatoria=voltaje1+sumatoria;
set_adc_channel(2);
delay_us(20);
medicion2 = read_adc();
var_aux2=medicion2;
voltaje2=((var_aux2/1023)*5);
sumatoria2=voltaje2+sumatoria2;
}
volt=sumatoria/50; //tensiones de entrada
voltDS=sumatoria2/50; //tensiones de entrada
printf(/*lcd_putc,*/ "Promedio = %01.2fV\r\n", volt);
printf("VDS = %01.2fV\r\n", voltDS);
if((volt>=13.8)
output_high(PIN_C5);
delay_us(20);
}
else{
output_low(PIN_C5);
}
}
no se como hacerlo su ayuda seria de mucha ayuda
saludos y gracias de ante mano
-
Facil, con un contador. En la primera que llege a 13.8 (con una histerisis de 0.5 talvez), lo pones a 1 y cuando pase lo mismo, lo pones a 2. y ahi recien aactivas el led.
algo asi:
cont = 0; flag = 0;
while(1){
if (adc >= 13.8-0.5 && adc <= 13.8+0.5)
{if (flag == 0) { cont++; flag = 1;}}
else flag = 0;
if cont >= 2
{led = 1;}
}
-
Podría ser como dice jeremy, pero ten en cuenta la velocidad de adquisición del ADC, ya que por lo que se ve en tu código es inmediato y leer con un contador sin darle un buen retardo hará que se confunda ya que el valor de 13.08 con histéresis de 0.5 lo cumplirá muchísimas veces en la primera llegada.
-
Podría ser como dice jeremy, pero ten en cuenta la velocidad de adquisición del ADC, ya que por lo que se ve en tu código es inmediato y leer con un contador sin darle un buen retardo hará que se confunda ya que el valor de 13.08 con histéresis de 0.5 lo cumplirá muchísimas veces en la primera llegada.
una solución sería tomar cada valor y compararlo con el anterior, si el resultado es positivo, entonces el voltaje es decreciente, bastaría realizar esta comparación hasta que el voltaje medido= 13.8 (verificado varias veces también)
-
muchas gracias por su respuestas , me funciono super bien lo de la bandera y el contador mencionado por jeremylf, pero como lo puedo hacer para poner otro nivel de voltaje por ejemplo 13 volt pero donde se encienda el led en subida y luego en bajadad despues de 13.8v no quiero abusar de ustedes pero no me sale, cualquier ayuda muchas gracias
saludos