TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: xabc2007 en 14 de Septiembre de 2020, 13:28:48

Título: Voltimetro
Publicado por: xabc2007 en 14 de Septiembre de 2020, 13:28:48

Hola a todo el foro, estoy haciendo un voltimetro y me visualiza el valor del ADC pero no el voltaje, sale 0 voltios, y no se que puede ser.

Este es el programa.


//                                      VOLTIMETRO                           //
//
//               

//
//
//          ////////////////////////////////////////////////////////////////////



#include <16F876a.h>
#device adc =10
#use delay (clock=4000000)
#fuses XT, NOWDT


#define use_portb_lcd TRUE
#include <lcd.c>
 

#include <math.h>


/////////////////////////////////////////////////////////////////
//                   DECLARAMOS LAS VARIABLES
/////////////////////////////////////////////////////////////////



   float v;          // variable para calcular el voltage del ADC
   int16 q;//
   

void main()

 {


  setup_adc_ports(RA0_RA1_RA3_ANALOG); //RA0 y RA1 analógica
  setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC
 
   
  lcd_init();
 
   
while (1) //bucle infinito
{
   
   
   set_adc_channel(0);          //Habilitación canal0
      delay_us(20);              //Retardo
      q = read_adc();    //Lectura canal0
     
 
                           
   v=5.0*q/1024.0; // leemos el voltage del ADC.

      printf(lcd_putc, "\fADC: %4ld", q);
      printf(lcd_putc, "\nV: %01.2f V", v);
     
      delay_ms(1000);
   
   
     
      }
}

 

Agradezco toda la ayuda. Gracias

Título: Re:Voltimetro
Publicado por: remi04 en 14 de Septiembre de 2020, 14:51:11
Prueba con un cast:

Código: C
  1. v=(5.0*(float)q)/1024.0; // leemos el voltage del ADC.

Título: Re:Voltimetro
Publicado por: xabc2007 en 14 de Septiembre de 2020, 14:54:35
Probamos.

Gracias.
Título: Re:Voltimetro
Publicado por: xabc2007 en 14 de Septiembre de 2020, 15:07:48
Lo he probado.

Compila pero da el mismo resultado. El voltaje da 0
Título: Re:Voltimetro
Publicado por: remi04 en 14 de Septiembre de 2020, 17:26:21
Mañana lo pruebo y te digo algo.

 ¿Lo estas probando en la vida real o en un simulador?
Título: Re:Voltimetro
Publicado por: KILLERJC en 14 de Septiembre de 2020, 19:09:55
De paso te pregunto...

¿Cuanto lee el ADC?
Título: Re:Voltimetro
Publicado por: xabc2007 en 15 de Septiembre de 2020, 01:34:05
Lo estoy probando en el proteus y en placa en real.

El ADC da 512.
Título: Re:Voltimetro
Publicado por: xabc2007 en 16 de Septiembre de 2020, 11:34:31
Adjunto el código modificado.

¿Alguien podría probarlo y ver si el ADC y el valor del voltaje se corresponden? A mi el ADC va bien pero el voltaje da 0.

Muchas gracias.



//                                      VOLTIMETRO                           //
//
//               

//
//
//          ////////////////////////////////////////////////////////////////////



#include <16F876a.h>
#device adc =10
#use delay (clock=4000000)
#fuses XT, NOWDT


#define use_portb_lcd TRUE
#include <lcd.c>
 

#include <math.h>


/////////////////////////////////////////////////////////////////
//                   DECLARAMOS LAS VARIABLES
/////////////////////////////////////////////////////////////////



   float v;          // variable para calcular el voltage del ADC
   int16 q;//
   

void main()

 {


  setup_adc_ports(RA0_RA1_RA3_ANALOG); //RA0 y RA1 analógica
  setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC
 
   
  lcd_init();
 
   
while (1) //bucle infinito
{
   
   
   set_adc_channel(0);          //Habilitación canal0
      delay_us(20);              //Retardo
      q = read_adc();    //Lectura canal0
     

v=(5.0*(float)q)/1024.0; // leemos el voltage del ADC.


      printf(lcd_putc, "\fADC: %4ld", q);
      printf(lcd_putc, "\nV: %01.2f V", v);
     
      delay_ms(1000);
   
   
     
      }
}

 

Título: Re:Voltimetro
Publicado por: KILLERJC en 16 de Septiembre de 2020, 12:13:31
No tengo CCS como para probarlo, y mucho menos algun simulador.

Te diria que pruebes lo siguiente para determinar donde esta el error.

En ves de guardarlo en un float, guardalo en un entero, los valores que vas a tener van de 0 al 5.

Asi sin tocar la parte de la formula, y cambiando la muestra:

Código: C
  1. int8 v;
  2. v=(5.0*(float)q)/1024.0; // leemos el voltage del ADC.
  3.  
  4.  
  5.       printf(lcd_putc, "\fADC: %4ld", q);
  6.       printf(lcd_putc, "\nV: %u V", v);


Si esta bien la formula de arriba te va a dar entre 0 y 4, correctamente con 512, te deberia dar 2.
Si lo muestra correctamente al 2, entonces iria pensando que es tema del printf. Y si es tema del prinf, espero que sea el formato que le diste, sino usa %f, y proba.

Si no es asi entonces sera la formula. algun problema de casteo de que los trnasforma a enteros etc.. Si es la formula podes probar con otros:

Código: C
  1. v=((float)(5.0*q))/1024.0;
  2. v=(float)(5.0*q)/1024.0;
  3. v=(float)q*0.004882812;
  4. v=(float)(q*0.004882812);
Título: Re:Voltimetro
Publicado por: xabc2007 en 16 de Septiembre de 2020, 12:37:36
Yo también pienso que es del print, hay muchos ejemplos en internet que funcionan. No se porque a mi no.

Lo pruebo
Título: Re:Voltimetro
Publicado por: Eduardo2 en 16 de Septiembre de 2020, 14:18:06
..

¿Alguien podría probarlo y ver si el ADC y el valor del voltaje se corresponden? A mi el ADC va bien pero el voltaje da 0.

...

Te faltó adjuntar el archivo en Proteus.
Título: Re:Voltimetro
Publicado por: Eduardo2 en 16 de Septiembre de 2020, 14:36:56
Por otro lado, eso funciona bien; no es necesario el cast (float).

  - Tienes que ingresar para ver archivos adjuntos -  

El error está en la implementación en Proteus.
Título: Re:Voltimetro
Publicado por: KILLERJC en 16 de Septiembre de 2020, 15:47:53
El error está en la implementación en Proteus.

Pero segun el:

Lo estoy probando en el proteus y en placa en real.
Título: Re:Voltimetro
Publicado por: Eduardo2 en 16 de Septiembre de 2020, 16:04:00
El error está en la implementación en Proteus.

Pero segun el:

Lo estoy probando en el proteus y en placa en real.

 :oops:  Eso no lo había visto.   

Pero entonces... anda en Proteus y no anda en la placa?   Si es así no se para que muestra solamente el programa.
Título: Re:Voltimetro
Publicado por: xabc2007 en 16 de Septiembre de 2020, 16:17:24
No me funciona ni en proteus ni en real. Adc=512. V=0

Entonces, ¿El programa es correcto?

Título: Re:Voltimetro
Publicado por: Eduardo2 en 16 de Septiembre de 2020, 16:37:49
No me funciona ni en proteus ni en real. Adc=512. V=0

Entonces, ¿El programa es correcto?

La imagen que subí es con tu programa sin modificar nada.
Título: Re:Voltimetro
Publicado por: xabc2007 en 16 de Septiembre de 2020, 16:44:13
MUCHAS GRACIAS A TODOS.

Funciona.

También el fallo era que utilizaba una versión antigua de ccs compilador en windows 10.

Con la nueva versión da adc=512 v=2.5 v

Pido mil disculpas a todos.