Ayuda con conversor AD

Hola a todos,

Amigos necesito una mano explico mi problema: estoy haciendo un sensor de temp con el lm35 uso el pic 16f876 esta configurado para trabajar con 2 entradas analogas, esta programado en C ( uso el CCS) Ademas uso AN3 como ref a 2.4v. El AN0 es para ingresar la T de referencia AN1 es para el sensor todo enviado al LCD mi problema es k el CCS no me deja configurar las dos entradas analogas si pongo (setup_adc_ports(AN0_AN1_VREF)) no me acepta pero si pongo(setup_adc_ports(AN0)) si me acepta adjunto el codigo que puede ser amigos gracias de antemano , saludos


*********************************************
#include <16f876.h>
#fuses HS,NOWDT,NOPUT
#DEVICE ADC=10
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(c)
#define LCD_RS PIN_B1
#define LCD_RW PIN_B2
#define LCD_E PIN_B3
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#include "flex_lcd.c"

/********************************************************************/
/******************* PROGRAMA PRINCIPAL ************************/
void main(){

int flag=1;
int16 i=0, vs=0;
float j=0;

set_tris_a(0x0B); // pin RA0 y RA1 como entrada
set_tris_b(0x00); // todo el puerto
set_tris_c(0xF0); // RC0 salida, RC5 como entrada

setup_adc_ports(AN0_AN1_VREF); // RA0 RA1 será analógicos
setup_adc(ADC_CLOCK_INTERNAL); // config A/D con reloj interno del uc
lcd_init(); // inicializa LCD
lcd_gotoxy(1,1); // escribe en la fila 1 del LCD
printf(lcd_putc,"**** SENATI ****"); // envia SENATI al LCD
delay_ms(2000);
lcd_gotoxy(1,1);
printf(lcd_putc," "); // limpia la primera linea del LCD
output_low(PIN_C0); // apaga RELE

do{
set_adc_channel(0); // usamos el canal 0
delay_us(20); // retardo
i=read_adc(); // valor leido se almacena en i
j=120.0*i/1024.0;
lcd_gotoxy(1,1); // escribe en le fila 1
printf(lcd_putc,"Ingresar T:%01.2f",j);
if(input(pin_c5)==0){
delay_ms(20);
flag=0;
}
} while(flag==1);

flag=1;j=0;
while(1){
set_adc_channel(1); // usamos el canal 1, para el sensor
delay_us(20); // retardo
vs=read_adc();
j=2.5*vs/1024.0; // voltaje de ref en 2.5v
lcd_gotoxy(1,2);
printf(lcd_putc,"Temp real Tr:%01.2f",j);
}

output_high(PIN_A2); // apaga LED
output_high(PIN_C0); // prende RELE

}

Zorry , aqui el mensaje de error.

*** Error 12 "Dilatador.c" Line 29(20,32): Undefined identifier AN0_AN1_VREF
1 Errors, 0 Warnings.
 
Última edición:
Claro, ese PIC solo soporta esto:

Código:
// Constants used in SETUP_ADC_PORTS() are:
#define NO_ANALOGS                           7    // None
#define ALL_ANALOG                           0    // A0 A1 A2 A3 A4         
#define AN0_AN1_AN2_AN4_VSS_VREF             3    // A0 A1 A2 A4 VRefh=A3              
#define AN0_AN1_AN3                          4    // A0 A1 A3
#define AN0_AN1_VSS_VREF                     5    // A0 A1 VRefh=A3
#define AN0_AN1_AN4_VREF_VREF             0x08    // A0 A1 A4 VRefh=A3 VRefl=A2              
#define AN0_AN1_VREF_VREF                 0x0D    // A0 A1 VRefh=A3 VRefl=A2
#define AN0                               0x0E    // A0
#define AN0_VREF_VREF                     0x0F    // A0 VRefh=A3 VRefl=A2
#define ANALOG_RA3_REF         0x1         //!old only provided for compatibility
#define RA0_RA1_RA3_ANALOG     0x4         //!old only provided for compatibility
#define RA0_RA1_ANALOG_RA3_REF 0x5         //!old only provided for compatibility
#define ANALOG_RA3_RA2_REF              0x8   //!old only provided for compatibility
#define RA0_RA1_ANALOG_RA3_RA2_REF      0xD   //!old only provided for compatibility
#define RA0_ANALOG                      0xE   //!old only provided for compatibility
#define RA0_ANALOG_RA3_RA2_REF          0xF   //!old only provided for compatibility

revisa el archivo <16f876.h> que para eso está... y también revisa la hoja de datos para que te cerciores de que el archivo está en lo correcto con sus definiciones.

saludos.
 
Hola Byaxel,

Si estuve revisando el archivo 16f876.h, pero al parecer no me keda otra opcion que escojer AN0_AN1_VREF_VREF supongo el segundo VREF sera GND puesto que solo voy a medir temperaturas sobre cero (5º - 115º). Otra cosa la salida del LM35 es necesario pasarlo por un AO (ckto no inversor R1=R2, con Vcc=5v ) a la salida del lm tendria 2.8v aprox o lo puedo enviar directo al pic en culquiera de los dos casos podria poner VREF(AN3)=2.4v , gracias por tu rpta y saludos.
 
Al usar AN0_AN1_VREF_VREF los pines AN3 y AN2 son voltaje de referencia positivo y negativo; según veo tu solo quieres 3 entradas análogas incluido el Vref y no 4 entradas... en ese caso utiliza el AN0_AN1_VSS_VREF donde el pin AN3 es Vref y AN0, AN1 son entradas análogas.

Otra cosa la salida del LM35 es necesario pasarlo por un AO (ckto no inversor R1=R2, con Vcc=5v ) a la salida del lm tendria 2.8v aprox o lo puedo enviar directo al pic en culquiera de los dos casos podria poner VREF(AN3)=2.4v , gracias por tu rpta y saludos.
Si te hace necesario poner un AO, lo pones que en foro hay varios diseños justo para el mismo sensor LM35.
Si puedes poner ese valor al Vref pero eso si, asegúrate que el voltaje que entra al PIC sea menor o igual al Vref... no va a suceder nada pero la lectura del ADC seria algo errática si el voltaje en una entrada supera al Vref.

saludos
 
Hola Byaxel,

Yo voy a medir temp de 5º a 120ºC por eso que quiero duplicar la salida del lm35 para tener 2.8v (como max) a la salida del AO a este lo alimento con 5v y gnd mi Vref es 2.4 y trabajo a 10 bits.

Si uso AO en modo no inversor R1=R2:
* A 2.4v de Vref tengo en read_adc()=1024 como max pero solo senso hasta 110ºC si se supera este valor apago el LM35, pero el AO no me funciona me deberia duplicar la salida del lm35 y solo tengo un volatje de 2.8 fijo no cambia nada, uso el 741.
Si no uso AO
* Tendria a la salida del lm35 1.5v como max y nunca superaria el Vref, creo.

Espero sus comentarios gracias y saludos.
 
Mira te puedo ayudar, esa aplicación es muy sencilla yo te recomendaría que no usaras voltaje de referencia osea que el voltaje de referencia seria 5V y que conectaras el lm35 directo al micro yo lo he hecho y me funciona a la perfección. Cualquier cosa si quieres que te mande codigo y una simulación solo mandame la bien que es lo que quieres hacer este es mi correo:




 
Última edición por un moderador:
Hola Roberto,

Ya mi proyecto esta casi listo en la parte de control a nivel de simulacion ahora solo me falta agregarle la circuiteria de control para un triac, ojo que el triac es para controlar un trafo primero le doy toda la tension al trafo y luego le quito hasta llegar a cero, en la imagen no he puesto al triac.
Te cuento algo de mi proyecto se llama calentador de rodamientos por induccion, el trafo tiene un primario y en el secundario solo va un rodaje (un secundario de una sola vuelta). Ahora por el potenciometro RV2 (alimentado con 2.4v) ingreso la T presionando el pulsador (T: 120.4 en la imagen), en este momento se alimenta al relay y este alimenta al lm35 y al foco, el lm empieza a subir te T (ingresa por AN1) hasta llegar a 120.4 luego se prende el led por 2seg despues se apaga el relay y todo empieza de nuevo.
Mas adelante se le va agregar un tirac y este alimentara al trafo.
Espero me aya dejado entender adjunto archivo, gracias y saludos.
 
Atrás
Arriba