Como agregarle medidor de voltaje

#1
Hola a todos espero que esten bien,
Lo primero quería pedir ayuda con un proyecto que estoy realizando con un pic16f877a mido temperatura este es el programa:
///////////////////////////////////////////////////
#include "16f877.h"

#device adc=10 //Usa resolución de 10 bits
#use delay(clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect

#include "lcd.c"
#use standard_io (D)

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

void main (void)
{
float temper,medicion;

lcd_init(); //Inicia LCD
lcd_putc(" Termometro\n"); //Saca texto
lcd_putc(" con LM35"); //Saca texto
delay_ms(2000);
lcd_putc("\f"); //Limpia pantalla
lcd_putc("Temperatura\n"); //Saca texto
lcd_putc("actual"); //Saca texto
delay_ms(1000);
lcd_gotoxy(14,2); //Acomoda cursor LCD
lcd_putc("oC");

while (1)
{

lcd_gotoxy(8,2); //Acomoda cursor LCD
lcd_putc(" "); //Limpia ese sector de pantalla
lcd_gotoxy(8,2); //Acomoda cursor LCD


setup_adc (adc_clock_internal);

setup_adc_ports (all_analog);

set_adc_channel (0); //Elige canal a medir RA0
delay_us (20);
medicion=read_adc (); //Hace conversión AD
setup_adc (adc_off); //Apaga ADC

temper=medicion*(0.48875); //Pasa binario a °C

//////////////////////////////////////////////////////////////////////////////////
// el "0.48875" sale de dividir 5/1023 y el resultado de eso multiplicarlo por 100
// el 5 sale de los 5 voltios aplicado a el voltage de referencia, los 1023 salen
// de los 10 bit de resolucion del conversor analogico digital que seleccionamos.
// Si utlizaramos la resolucion de 8 bist del conversor analogico digital, la
// formula fuera (5/255)*100 ya que con 8 bits el numero maximo posible es de 0-255
//////////////////////////////////////////////////////////////////////////////////

printf(lcd_putc,"%02.1f",temper); //xxx.x °C
delay_ms (1000);
}
}


El programa ya esta probado con el proteus

Mi problema es que ocupo que mida voltaje un aproximado de de 400vcd, esa seria mi pregunta me seria mucha ayuda sus consejos.
Se acepta libros o teorías para realizar el proyecto
Nota:
Este programa lo conseguí navegando por Internet :D:D
 

Adjuntos

#2
A ver a ver... quieres medir temperatura y voltaje verdad?? y quieres que mida un voltaje maximo de una linea de 400VDC?? es asi o me equivoco?? bueno el primer paso seria "reducir" por asi decirlo los 400VDC a 5VDC que seria la entrada analogica del PIC... lo primero un divisor de tension: Vx*RT=Vt*Rx; te aconsejaria que uses una R fija de 1MΩ y ya tu puedas sacar la resistencia donde tendras los 5VDC para el PIC, claro tomando en cuenta la potencia y demas... mmm... lo segundo seria separar los 1023 datos de entrada analogica y desglosar esto en tus unidades, decenas y centenas por medio de divisiones y modulo (%) que es muy util en este caso; ya todo lo demas es facil; la verdad no estoy seguro de lo que en verdad preguntas pero a lo que yo entendi esta es mi respuesta, corrije si estoy equivocado y si quieres vuelve a plantear tu pregunta... perdon si no le entendi!!


Saludos
 
#3
yo creo que si lo entendiste lo que quiero programar es un pic que mida temperatura y voltaje y lo muestre todo en el LCD.

Tu idea es crear un divisor de tensión mmm pero de 5V si hago eso no aparesera en el LCD que muestra los 400v asi que son las instrucciones (%) todavia soy nuevo en los pic????? gracias por la ayuda
 
#4
(Asi lo interpreto yo) Tu quieres que con el mismo PIC puedas medir temperatura y voltaje verdad? ok ok entonces la parte de la temperatura ya la tienes, muy bien y ahora quieres la parte del voltaje, mira el divisor de tension es para no quemar la pata del PIC ya que meterle 400VDC a un PIC hara que este arda en llamas (hahaha) y entonces para eso hacemos el divisor... para que ahora los 400VDC que tu tienes pasen a equivaler (no que se reduzcan) a 5VDC que es mas seguro para el PIC... entonces los 400VDC que midas apareceran en la LCD sin ninguna variacion ok? bueno en el caso del modulo (%) es el residuo de dividir un numero entre otro... 5/2=2 y el residuo de esta division seria 1... entonces 5%2 = 1, digamos que el divisor ya lo tienes... bueno ahora toca la parte del PIC... yo programo en MikroC no se si te sirva de mucho pero me imagino que la idea que yo te exprese la sabras manejar en tu compilador:

son 1023 datos de entrada analogica, ya tenemos la equivalencia de voltaje:

Suponiendo que recibimos el dato en la primera pata analogica (ver datasheet) entonces:

Código:
/*En MikroC seria:*/
/*Voltimetro 0 a 10*/

int dec,uni,decimal,dato,aux;
void main()
{
ANSEL=1;
ADCON1=0x80;
TRISA=1;
TRISC=0;
while(1)
{
dato=ADC_Read(0)        /*entrada analogica 0 (ver datasheet)*/
aux=dato/102.3;  /*division perfecta para marcar rango de 0 a 10*/
dec=aux/10;       /*division para extraer decimal del dato anterior*/
uni=aux%10;      /*modulo (residuo de la division) para extraer unidades*/

/*luego ya con los datos concretos almacenados en variables y desglosados segun su valor (decenas=dec y unidades=uni) haces tu codigo para mostrar tambien en la LCD*/

}
}
Bueno creo que este es un ejemplo para comprender mejor como hacer un voltimetro con PIC, si tienes alguna otra duda puedes postearla y yo tratare la manera de ayudarte en lo que pueda ok??


Saludos inu789
 
#6
Hola iDan. Soy nueva aqui y quisiera preguntar algunas cosas.

Primero no se porque a mi no me copila el codigo que pusiste. Uno de los errores que no entiendo es porque dice que no lo declare o algo asi el ANSEL. Me salen muchos mas errores y he probado con otros codigos y un amigo le pasa lo mismo. La verdad es que no se mucho de pic. Ademas yo estoy haciendo un detector de mentiras y lo unico que me hace falta para terminarlo es el codigo del pic que es 16F84A. No se si me puedes ayudar u orientar en algo porque estoy perdida y es para el martes 7. Ayudame porfa....
 
#7
Hola a todos espero que esten bien,
Lo primero quería pedir ayuda con un proyecto que estoy realizando con un pic16f877a mido temperatura este es el programa:
///////////////////////////////////////////////////
#include "16f877.h"

#device adc=10 //Usa resolución de 10 bits
#use delay(clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect

#include "lcd.c"
#use standard_io (D)

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

void main (void)
{
float temper,medicion;

lcd_init(); //Inicia LCD
lcd_putc(" Termometro\n"); //Saca texto
lcd_putc(" con LM35"); //Saca texto
delay_ms(2000);
lcd_putc("\f"); //Limpia pantalla
lcd_putc("Temperatura\n"); //Saca texto
lcd_putc("actual"); //Saca texto
delay_ms(1000);
lcd_gotoxy(14,2); //Acomoda cursor LCD
lcd_putc("oC");

while (1)
{

lcd_gotoxy(8,2); //Acomoda cursor LCD
lcd_putc(" "); //Limpia ese sector de pantalla
lcd_gotoxy(8,2); //Acomoda cursor LCD


setup_adc (adc_clock_internal);

setup_adc_ports (all_analog);

set_adc_channel (0); //Elige canal a medir RA0
delay_us (20);
medicion=read_adc (); //Hace conversión AD
setup_adc (adc_off); //Apaga ADC

temper=medicion*(0.48875); //Pasa binario a °C

//////////////////////////////////////////////////////////////////////////////////
// el "0.48875" sale de dividir 5/1023 y el resultado de eso multiplicarlo por 100
// el 5 sale de los 5 voltios aplicado a el voltage de referencia, los 1023 salen
// de los 10 bit de resolucion del conversor analogico digital que seleccionamos.
// Si utlizaramos la resolucion de 8 bist del conversor analogico digital, la
// formula fuera (5/255)*100 ya que con 8 bits el numero maximo posible es de 0-255
//////////////////////////////////////////////////////////////////////////////////

printf(lcd_putc,"%02.1f",temper); //xxx.x °C
delay_ms (1000);
}
}


El programa ya esta probado con el proteus

Mi problema es que ocupo que mida voltaje un aproximado de de 400vcd, esa seria mi pregunta me seria mucha ayuda sus consejos.
Se acepta libros o teorías para realizar el proyecto
Nota:
Este programa lo conseguí navegando por Internet :D:D


Buenos dias estimados Solicito la Ayuda de los foristas Estoy trabajando en MIkro c pro. necesito realizar un programa extenso dividirlo en dos partes o mas.
se que se coloca la cabecera #include<ejempl2 programa.h> esto va arriba en mi primer programa .
2 abro un nuevo archivo con extencion.h . ejemplo2programa.h
3 copio y corto la porcion del codigo del primer programa
4 pego la porcion del codigo e el segundo programa
5 guardo el programa con extencion .h
6 anado el segundo programa al proyecto. ejemplo2programa.h
pero cuando lo compilo me salen errores de compilacion en el segundo programa no se si habra que definir algo adicional en el 2do programa yo antes lo hacia en asm con mplab colocaba un return; al final del segundo programa y me funcionaba bien
en mikro c no se si se puede hacer esto con la finalidad de reducir el codigo en varias partes, muchas gracias esperando por su colaboracion al foro..
 

Dr. Zoidberg

Well-known-Papá Pitufo
#8
El proyecto se solo arma con los archivos .C (o .CPP), mientras que los .h solo se usan en los #include
Además hay que proteger a los .h (que solamente deben tener declaraciones de tipos y prototipos de funciones) de múltiples inclusiones haciendo algo como, supongamos, archivo nombre.h

C:
#ifndef _NOMBRE_H
#define _NOMBRE_H

/* Aca viene el relleno de prototipos, tipos de datos e includes necesarios */

#endif
 
Arriba