Voltímetro con el ADC del PIC

Estado
Cerrado para nuevas respuestas.
Hola, el cambio en código lo tendrías que hacer en esta parte: // p = 5.0 * q / 1024.0; antes de esto tendrías que realizar un acondicionamiento de la señal de entrada porque en 6V estarías sobrepasando el Vmax de entrada al convertidor AD
 
en realidad.. ncesito armar el circuito para monitorear un pack de baterias AA de 4,8 v per cuando las cargo a full en el tester.. marcan unos 5,6volts..

segun lei por ahi.. las pilas AA recargables son de 1,2 v cuando estan cargadas.. llegan a 1,4v y bueno aqui el dilema.. alguna ayuda?
 
Podrías calcular un circuito con amplificadores operacionales para acondicionar la señal de entrada, es una manera simple.
 
quieres medir hasta 6 voltios... ??
yo lo haria recontra sencillo, a la entrada del pic realizar un divisor de voltaje por ejemplo a la mitad usando 2 resistencias del mismo valor. ahora bien...en el lcd te dara el valor de 3 voltios cuando midas 6 voltios... esto se soluciona facilmente con modificar el codigo que te dijo el amigo 1024 //p = 5.0 * q / 1024.0;
tambien se lo haria con operacionales.. solo depende del tratamiento que le daras

saludos
 
bien muchas gracias... si he visto que hay alternativas asi.. modificando el codigo.. agregando divisores.. que se yo..

el tema es que ese dato 5*q /1024 parte de alguna formula.. y en este caso esta calculado para 5v.. y anda perfecto en proteus.. si yo cambio el 5 por el 6.. mide cualquier cosa.. me podrias decir como es el tema de agregar unas resistencias.. o como sugeris vos?


estoy perdido con esto :S

ya creo q no lo hago con pic y termino armando uno con el lm3914 :oops:

jajja porfas

algun esquemita -..
 
La parte de 5*q /1024 tiene que ver con el numero que entrega el convertidor AD(q), que en este caso esta configurado para una conversión de 10bits(0<q<1024) entonces para mostrar el valor de voltaje en el LCD se aplica esa operación
 
gracias por los aportes.. pero alguien me puede decir como es la formula?? como se calcula para 6 volts..?? como agrego resistencias como hago algo? ya se que modificando eso se varia la medida.. pero no se coo buscar info sobre eso :S
 
Monta dos resistencias de 10k en serie, asi:
ver imagen adjunta.

y en el codigo cambia la formula quedando asi:

p = 10.0*q/1024;

Y te voy a explicar de donde sale la forma.
Primero sabemos que el valor que entrega el read_adc(); es un numero entero entre 0 y 1024 dependiendo del valor de voltaje que halla en el pin. Recordar que este voltaje va de 0 a 5 v.

Entonces haciendo una regla de tres simple, donde q es el valor leido del adc.
1024 → 5v
q → p
asi tenemos que p = 5.0*q/1024

Al poner las dos resistencias en serie lo que hacemos es un dividor de tension, (http://es.wikipedia.org/wiki/Divisor_de_tensión), como las dos resistencias que utilizamos son iguales, el valor del voltaje en la pin del pic sera la mitad del valor que se este midiendo.

Asi podemos formar de nuevo nuestra formula.
Cuando se le aplican 10v, tenemos 5 en el pin y el valor del adc sera de 1024.

10v → 1024
p → q

de nuevo tenemos que p = 10.0*p/1024;

Espero haber sido lo suficientemente claro,

Saludos
 

Adjuntos

  • Selección_026.png
    Selección_026.png
    18.6 KB · Visitas: 946
Muchas gracias MVB, io hice el ajuste necesario para hacerme un voltimetro de 0 - 100Vdc.
Les dejo los archivos para Uds del voltimetro, por si acaso qieren hacerle modificaciones o mejor aun implementar ademas un amperimetro.
El extracto contiene:
- Archivo *.bas del programa
- Archivo *.HEX
- Esquematico en ISIS PROTEUS
Nota: el compilador que estoy usando es el PROTON IDE DEVELOPMENT SUITE. Ademas deben tener instalado el MPLAB, por si quieren hacer nuevas modificaciones.
Gracias.
 

Adjuntos

  • VOLTIMETRO.rar
    16.5 KB · Visitas: 2,549
hola amigos disculpa

1 tu voltimetro mis respetos
2 crees q sea capas de soportar la bateria de un auto
dijo por el amperaje o tengo q agregarle otra cosa


saludos
:)
 
No importa el amperaje de lo que se mide, siempre y cuando el voltaje este en el rango todo estara bien.
Eso si, a mayor amperaje mas cuidado debes tener pues si hay un corto o algo similar en la medicion las consecuencias pueden ser mayores.

saludos.
 
hola disculpen me podrian ayudar pasar este programa para el pic18f4550

se los agradeceria he tratado pero no me funciona


#include <16f877a.h>
#use delay(clock=16000000)
#fuses xt,put,nowdt,protect,nobrownout,NOLVP,NOCPD
#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#byte porte = 0x09

#include "lcd.c"

char temp;

void main(){

set_tris_a(0x01);
set_tris_b(0x00);
set_tris_c(0x00);
set_tris_d(0x00);
set_tris_e(0x00);
porta = 0x00;
portb = 0x00;
portc = 0x00;
portd = 0x00;
porte = 0x00;

setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);

lcd_init();

for(;;){
temp = read_adc();
lcd_putc("\f Pic Termometro ");
printf(lcd_putc,"\n %d%cc",temp*2,0xdf);
delay_ms(1000);
}
}
 
Tenes que hacer un divisor resistivo para que cuando entren 6volts te lo deje en 5v que es lo maximo que podes medir con el pic. Despues modificas el codigo asi... p = 6.0 * q / 1024.0;

hola amigos disculpa

1 tu voltimetro mis respetos
2 crees q sea capas de soportar la bateria de un auto
dijo por el amperaje o tengo q agregarle otra cosa


saludos
:)

No tiene nada que ver el amperaje si estas idiendo voltaje yo tengo hecho un voltimetro en mi moto con un 16f819 y anda bien. Solo tenes que hacer un divisor resistivo de acuerdo al voltaje que quieras medir, al pic nunka deben llegar mas de 5v
 
me podrian ayudar a cambiar el puerto de la señal de entrada de este programa en lugar de ra0 sea ra1 por favor me urge y como pudo unir dos programas para el mismo pic se los agradeceria


#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(AN0); // 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(0);
delay_us(20); // tiempo de conversion
q= read_adc(); // lectura del valor
p=50.0*q/127.5; // conversion adc
}
 
Estado
Cerrado para nuevas respuestas.
Atrás
Arriba