Autor Tema: Lectura ADC pic 16f688  (Leído 2793 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jroca50

  • PIC10
  • *
  • Mensajes: 5
Lectura ADC pic 16f688
« en: 13 de Abril de 2012, 14:50:04 »
Hola!!! tengo problemas con la lectura de voltaje en adc del micro, la lectura varia demasiado sin variar la entrada :5] :5] :5] :5] :5] :5], esto solo se da en el hardware por que en la simulacion todo anda excelente!!!

Mi pregunta es ¿Que estoy haciendo mal? :5] :5] :5]

les dejo el programa que hice para ver que error encuentran.

de antemano gracias!!!

// =============== Programa ==============
#include <16F688.h>    // busca en el directorio include del compilador

// ========================= CONFIGURACION DEL PIC (BK0) =======================
#device ADC=10               //conversor A/D  8 ó 10 bits (no mover de este sitio)
#FUSES INTRC_IO, NOPROTECT, NOBROWNOUT, MCLR, NOCPD, PUT, NOWDT
#use delay(clock=4M)

// ======= DECLARACION DE PUERTOS Y REGISTROS ESPECIALES DEL PIC  (BK5) ========
#BYTE pta    = 0x5 // dirección en RAM
#BYTE ptc    = 0x7 // dirección en RAM
#BYTE trisa  = 0x85 // dirección en RAM
#BYTE trisc  = 0x87 // dirección en RAM
#BYTE cmcon0 = 0x19 // dirección en RAM
#BYTE option = 0x81 // dirección en RAM
#BYTE intcon = 0x0B // dirección en RAM
#BYTE pir1   = 0x0C // dirección en RAM

//===== DECLARACION GLOBAL DE VARIABLES, VECTORES Y MATRICES EN RAM (BK3) ======
float Out_Current, power, adc, vol;
//int1 cont=0;

// ========================= DEFINICION DE CONSTANTES (BK4) ====================

// ================= DEFINICION DE BANDERAS (BK4) EN RAM (BK4) =================

// ================ NOMINACION DE PINES DEL HARDWARE (BK2) ==============
#BIT       led_state     = pta.0   // Led de estado del micro
#BIT       sw_selector   = pta.1   // Selecciona la frecuencia de salida del sistema
#BIT       pin1          = pta.4   // Indicador de corto, envia un 1 cuando no hay corto
#BIT       pin2          = pta.5   

// ================= INCLUSION  DE LIBRERIAS EXTRAS .c =========================
#include <libreria_lcd.c>           //lcd 2x16 en pines personalizados


 // ========= INICIO FUNCION PRINCIPAL MAIN (BK5 A BK7) ============
void main()
 {

init_lcd();                    // inicializacion de LCD

// =============== Configurando puertos ====================
      output_low(pin_a0);            // pta0 como salida e inicializa en 0
      output_float(pin_a1);            // pta1 como entrada
      output_low(pin_a4);              // pta4 como salida e inicializa en 0
      output_high(pin_a5);              // pta5 como salida e inicializa en 0

// ------------ configuracion CAD -------------------

  setup_adc(ADC_CLOCK_INTERNAL);      //enables the a/d module
  setup_adc_ports(sAN2);        //sets AN2 the adc pins to analog
  enable_interrupts(INT_AD);


if (sw_selector)
{
 pin2=1; // Frecuencia de 60Hz seleccionada
 lcd_gotoxy(1,1); //salto a columna 5, fila 2
 printf(lcd_putc," ELECTRIC_POWER");
 lcd_gotoxy(2,2); //salto a columna 5, fila 2
 printf(lcd_putc," F_SELEC=60Hz");
 delay_ms(500);
}
 else
{
 pin2=0; // Frecuencia de 50Hz seleccionada
 lcd_gotoxy(1,1); //salto a columna 5, fila 2
 printf(lcd_putc," ELECTRIC_POWER");
 lcd_gotoxy(2,2); //salto a columna 5, fila 2
 printf(lcd_putc," F_SELEC= 50Hz");
 delay_ms(500);
}
blink_lcd(3);
clear_lcd();*/
// =======================  MAIN PROG (BK7) ====================================
do{
//   === Configuracion ADC =====
   set_adc_channel(2);                //the next read_adc call will read channel 0
   delay_us(10);                      //a small delay is required after setting the channel and before read
   adc=read_adc();                    //starts the conversion and reads the result and store it in value
   vol=adc*0.00489;//82812;
   Out_Current=(15*vol)-75/2-0.48;
   power=Out_Current*120-0.22;

if (Out_Current<=5)
      {
       pin1=1;
       lcd_gotoxy(1,1);
       printf(lcd_putc,"L_Current:%fA\r",Out_Current);
       lcd_gotoxy(1,2);
       printf(lcd_putc,"L_Power:%fW\r",power);
       delay_ms(1000);
      }

      else
      {
       pin1=0;
       lcd_gotoxy(1,1);
       printf(lcd_putc,"POTENCIA EXEDIDA");
       lcd_gotoxy(1,2) ;
       printf(lcd_putc,"L_Power:%fW\r",power);

      }

      led_state=!led_state;
}while (TRUE);

 }   //Fin Del Programa!!!


A otra cosita, lo de la lcd es una funcion que hice y funciona 100%, no he tenido errores en ella

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Lectura ADC pic 16f688
« Respuesta #1 en: 13 de Abril de 2012, 15:23:02 »
Hola amigo, yo lo que veo es que la conversión la estás haciendo muy rápido, prueba poniendo un retardo siquiera de 200ms antes de cada conversión, veo que tienes unos retardos pero dentro de funciones, también coloca condensador de 10uF en la entrada AD.

Saludos.

Desconectado PCCM

  • PIC16
  • ***
  • Mensajes: 109
Re: Lectura ADC pic 16f688
« Respuesta #2 en: 13 de Abril de 2012, 15:34:03 »
Puede ser por ruido, en tu codigo dice que usas el canal 2, pero en el comentario dice canal 0.

y en la operacion: Out_Current=(15*vol)-75/2-0.48;
Puedes simplificarlo. una ves me trajo problemas. mejor es realizar una operacion por linea.
 

Desconectado jroca50

  • PIC10
  • *
  • Mensajes: 5
Re: Lectura ADC pic 16f688
« Respuesta #3 en: 13 de Abril de 2012, 22:47:45 »
Bueno la verdad la velocidad de lectura del adc es la misma que siempre he usado en otro programas que he hecho con otro pic y funciono muy bien, no entiendo por que con este micro no funciona pero ya en la implementacion por que en la simulacion funciona excelente...

En cuanto al canal que estoy usando es el canal dos, los comentarios solo los uso para no perderme mucho  dentro del programa!!!