Voltímetro con el ADC del PIC

Estado
Cerrado para nuevas respuestas.
Proba asi


Código:
#include <16f877a.h>
 #fuses hs,nowdt,noput,nolvp
 #device adc=8
 #use delay(clock=20M)
 #define LCD_DATA_PORT getenv("SFR:PORTB")
 #define LCD_ENABLE_PIN PIN_B2
 #define LCD_RS_PIN PIN_B0
 #define LCD_RW_PIN PIN_B1
 #include <lcd.c>

 int8 q;
 double p=0;
 //****************** defino funcion ADC ***************
 void modulo_adc();

 //***************** programa principal ***************

 void main(){

 SETUP_ADC_PORTS(AN1); // defino el pin analogo a usar
 setup_adc(ADC_CLOCK_INTERNAL); // define el tipo de clock a usar
 lcd_init(); // inicializo el lcd

 while(true){
 modulo_adc();


 lcd_gotoxy(4,1);
 printf(lcd_putc,"VOLTS:%1.3f",p);



 }
 } 
 //*********** funcion ADC****************

 void modulo_adc()
 { set_adc_channel(1);
 delay_us(20); // tiempo de conversion
 q= read_adc(); // lectura del valor
 p=50.0*q/127.5; // conversion adc
 }
 
Última edición por un moderador:
gracias amigo me funciono de maravilla


otra pregunta como puedo poner dos programas en el mismo pic es decir el programa anterior y otro


gracias (y)
:aplauso:
 
gracias amigo me funciono de maravilla


otra pregunta como puedo poner dos programas en el mismo pic es decir el programa anterior y otro


gracias (y)
:aplauso:

De nada, que bueno que te haya funcionado.. y que otro programa queres agregarle? no podes mexclar 2 programas asi nomas, tenes que hacer uno que haga lo que hacen esos 2 programas.
 
Una consulta quiero hacer que el pic muestre hasta 380 v en el lcd acá dejo mi programa para obtener ayuda vuestra
Código:
#include <16f877.h>
#device  adc=10
#fuses   xt,nowdt
#use  delay(clock=4M)
#define LCD_ENABLE_PIN  PIN_E0
#define LCD_RS_PIN      PIN_E1
#define LCD_RW_PIN      PIN_E2
#define LCD_DATA4       PIN_D4
#define LCD_DATA5       PIN_D5
#define LCD_DATA6       PIN_D6 
#define LCD_DATA7       PIN_D7
#include  <lcd.c>

void main()
{
lcd_init();

int16 a;
float b;

setup_adc(adc_clock_div_8);
setup_adc_ports(an0);

   for(;;)
   {
   set_adc_channel(0);
   delay_us(20);
   a=read_adc();
   b=a*380/1024.0;
   
   printf(lcd_putc,"\fVoltage=%fV",b);
   delay_ms(200);
   
     
      }
   }
El problema es que en el lcd no muestra el avance que quiero
 
Última edición por un moderador:
Hola a todos, tengo una duda... programe el pic 16f887 por medio de CCS para que mida tensión por medio de la entrada analógica AN0 . Pero no estoy seguro si solo puede medir la tensión de su propia fuente o si puede medir la tensión de fuentes externas, dado que lo simulo en proteus y corre perfecto...

En el caso que solo pueda medir tensión de su propia fuente, como puedo hacer que mida de fuentes externas?
 

Adjuntos

  • Estacion de mantenimiento.rar
    15.5 KB · Visitas: 223
Por supuesto que puede medir otro tipo de tensiones, pero para eso tienes que acondicionar la entrada, ya que como recordaras al ser un circuito digital solo puede trabajar con tensiones de 5V, mas de eso destruirías el PIC, lo mas común es usar un divisor de tensión en la entrada, saludos
 
Última edición por un moderador:
Como dice Somacruz, claro que es posible realizar esa medición; yo a tensiones superiores de 5 voltios uso amplificadores operacionales para estabilizar la tensión de 0 a 5 voltios.

Un saludo
 
Podes leer cualquier tensión siempre y cuando este en el rango de los 5V; por ejemplo, si quisieras medir una tensión máxima de 8V podrías poner un divisor resistivo 10K-10K de modo que la tensión máxima en la pata del pic sea de 4V (se puede mejorar, puse 10K-10K para evitar los cálculos :D) y después hacer regla de 3 simple dentro del pic para ver que tensión estas leyendo.

Con respecto a lo de las fuentes externas, como todo circuito para que mida tiene que tener las referencias de 0V (masa) conectadas entre sí.
 
Gracias a todos! ya lo probe y funciona ... hice el divisor de tensión para que llegue al pic y salio perfecto, ya que mi propósito era medir el voltaje de una fuente externa de 12 voltios.
 
Gracias a todos! ya lo probe y funciona ... hice el divisor de tensión para que llegue al pic y salio perfecto, ya que mi propósito era medir el voltaje de una fuente externa de 12 voltios.

Erick, que bueno que te funciono, ojala y pudiera compartir tu codigo y esquema y asi sea de utilidad a otros usuarios, saludos ;)
 
Hola soy nuevo en este foro, he estado probando un programa de un voltímetro que han colgado en este foro y he hecho algunas modificaciones, lo he simulado en proteus y corre de maravilla, pero al montarlo en el protoboard solo aparece en la segunda fila unos cuadrados blanco y no registra ningún valor, no se si es el pic,
el programa, o algún error en la programación.
Aquí dejo el código fuente:

Código:
#include <16f877a.h>
#device adc=10
#fuses NOWDT,BROWNOUT,XT,NOLVP,,NOPROTECT
#use delay (clock=4M)
#define use_portb_lcd TRUE //define portb lcd
#include <lcd.c> 
//
//Programa Principal
//
void main()
{
   unsigned long valor=0;//Declaracion de variables
   float voltaje;        //Variable que contendra el resultado
//
//Se habilita el A/D y se declara el PORT a usar//
//
   setup_adc( ADC_CLOCK_INTERNAL );            
   setup_adc_ports(AN0);
   set_adc_channel(0);
//
//Se inicia la LCD//
//     
   lcd_init();
lcd_gotoxy(4,1);
lcd_putc("Iniciando");
delay_ms(2000);
lcd_gotoxy(3,2);
lcd_putc("PABLO OJEDA");
delay_ms(1000);
lcd_putc("\f" ) ;
lcd_gotoxy(2,1);
lcd_putc("VOLTIMETRO DC");
      
   do
   {
Funciona en proteus pero no me arroja ningún resultado armándolo.
Estoy usando el pic16f877a, el cristal es de 4 Mhz y los condensadores de 27pf



Estoy un poco estresado, llevo días probando cual ha sido el error, el pic lo grabo y lo regrabo y no me arroja ningún error al momento de cargar el programa en el pic con el icprog.
 
Última edición por un moderador:
¿Estas usando una resistencia en pull up para el pin MCLR (pin 1 del micro)?
En caso de que la respuesta sea no, agrega una resistencia de 10k entre el pin 1 y Vcc.

En caso contrario, probá con los siguientes FUSES:
#fuses NOWDT,BROWNOUT,XT,NOLVP,NOPROTECT,NOPUT,NODEBUG,NOLVP,NOCPD,NOWRT

Fijate también que el cristal, junto con sus capacitores, esté lo más cerca posible del micro. Para ese micro y ese cristal yo usé capacitores de 15pF, la configuración de fuses que escribí mas arriba, [#use delay(clock=4000000)] y la resistencia en pull up y no tuve ningún problema.
 
Funciona en proteus pero no me arroja ningún resultado armándolo.
Si tu código no tiene ninguna instrucción para leer el ADC ¿Como quieres obtener un resultado?

Adjunto una modificación realizada de rápido para un sencillo voltímetro hasta 50V, con el código que posteaste.

Suerte.
 

Adjuntos

  • Voltímetro.rar
    35.6 KB · Visitas: 336
:confused:holas arme el circuito y hice las modificaciones que me dijeron pero no puse la reistencia de 10k en el pin1 del masterclear y ul pulsador mas para reiniciar cambie los condensadores de 27p a 22p pero no obtube algun cambio alguno no se si es el pic que esta danado o otra cosa por que use el codigo hex de D@rkbytes para asegurarme y nada.pero al momento de la grabacion en el pic no me da ningun error:confused::cry:
bueno graciasp or la ayuda a una cosa mas al momento de pulsar en le pulsador el lcd no reinicia el programa no hay cambio alguno en la pantalla del lcd,gracias por la ayuda que me pudieran dar
 

Adjuntos

  • reenviar.rar
    727 KB · Visitas: 118
  • Snapshot_20130111_1.JPG
    Snapshot_20130111_1.JPG
    76.7 KB · Visitas: 94
El pin 1 de este micro, es el pin MCLR (Master Clear), a menos que se lo configure de otra forma, que lo que hace, justamente, es reiniciar el procesador. Al estar en alto activa el procesador y el programa se ejecuta; al estar en bajo detiene el procesador. Por este motivo es necesario ponerlo con una resistencia de 10K a Vcc (+5V).
Si la resistencia no está puesta, el pin recibe cualquier ruido eléctrico del ambiente, lo que hace que el procesador se active y/o desactive aleatoreamente.

Cabe recordar que este microcontrolador tiene alimentación de ambos lados, por lo que tenes que fijarte que estén ambas conectadas.
 
El pin 1 de este micro, es el pin MCLR (Master Clear), a menos que se lo configure de otra forma, que lo que hace, justamente, es reiniciar el procesador.
Saludos.
En este PIC el pin 1 MCLR/Vpp solamente funciona como reset del microcontrolador.
No se puede configurar de otra forma, incluso no existe el fuse MCLR ó NOMCLR (_MCLR_OFF/ON)
Aunque el compilador PCWHD permita establecerlos y compilar sin errores (Bug del compilador).
En otros compiladores esto no sucede, y si generan error al encontrar esos fuses declarados.
Existen PICs que si tienen esa posibilidad, y se puede usar ese pin como entrada, con el fuse MCLR en OFF
Si no se desea resetear el PIC, se puede conectar directamente el pin 1 a VDD
hice las modificaciones que me dijeron pero no puse la reistencia de 10k en el pin1 del masterclear y ul pulsador mas para reiniciar cambie los condensadores de 27p a 22p pero no obtuve cambio alguno
Probablemente es porque no hiciste todas las modificaciones que se te dijeron.
2cool2you ya te había mencionado en el post #34 que verificaras la conexión del pin 1.

Adjunto el diagrama, y así es como debes hacer las conexiones.

Suerte.
 

Adjuntos

  • Diagrama.jpg
    Diagrama.jpg
    75.3 KB · Visitas: 178
Última edición:
Acabo de verificar el datasheet y tenes razón, no me había dado cuenta que en ese micro es solamente MCLR o Vpp, perdón por la equivocación.
 
ok manes gracias hice las modificaiones que me dijeron, lo arme otra ves desde cero y funciona de maravilla es el primer trabajo que hago con pic y me lleno de emocion al ver que el pic estaba vivo jajaja
una consulta mas, este programa lo hice con el fin de ponerlo en una fuente simetrica pero no logro que lea el las lecturas de a/d

Código:
#include <16f877a.h>
#device adc=10
#fuses NOWDT,BROWNOUT,XT,NOLVP,PUT
#use delay (clock=4M)
#define use_portb_lcd TRUE //define portb lcd
#include <lcd.c> 
//
//Programa Principal
//
void main()
      {
//Declaracion de variables
float valor,voltaje,val,volt;        //Variable que contendra el resultado

//Se habilita el A/D y se declara el PORT a usar
   setup_adc( ADC_CLOCK_INTERNAL );            
   setup_adc_ports(AN0);
   set_adc_channel(0);
   set_adc_channel(1);
   
//Se inicia la LCD
   lcd_init();
   lcd_gotoxy(4,1);
   lcd_putc("Iniciando");
   delay_ms(2000);
   lcd_gotoxy(3,2);
   lcd_putc("PABLO OJEDA");
   delay_ms(1000);
   lcd_putc("\f");
   lcd_gotoxy(3,1);
   lcd_putc("VOLTIMETRO DC");
      delay_ms(1000);
   while (true)
   {
   valor = read_adc();
   delay_us(50);
   voltaje=(valor*50/930);
   lcd_gotoxy(3,2);
   printf(lcd_putc,"%04.2f P ",voltaje);
   delay_ms(100);
   val = read_adc();
   delay_us(80);
   voltaje=(valor*50/930);
   lcd_gotoxy(11,2);
   printf(lcd_putc,"%04.2f N ",volt);
   delay_ms(150);
   }
   
}

cunado pongo en setup_adc_ports(RA0_RA1_ANALOG); ESTE APARECE COMO ERROR no lo acepta el compilador y si pongo setup_adc_ports(AN1); el AN1 aparece como indefindo cual podria hacer pra que funcione otra entrada nalogica mas y hacer que en el lcd se muestre dos lecturas del voltaje pra ponerlo en una funete simetrica, gracias por las respectivas respuestas
 
Última edición por un moderador:
Estado
Cerrado para nuevas respuestas.
Atrás
Arriba