Autor Tema: Conversion AD con MAX187 y PIC16F877  (Leído 3088 veces)

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

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Conversion AD con MAX187 y PIC16F877
« en: 12 de Abril de 2006, 11:56:33 »
Hola muy buenas,

Ya llevo dos semanas intentando configurar mi PIC16F877 y mi conversor ADC, MAX187 de 12 bits. El problema esta en que el dato que leo a través de mi display 16x2, es el doble del valor que realmente estoy midiendo con mi tester. Después de modificar un driver de los que aporta el compilador CCS C, que es el que estoy utilizando, concretamente el del ADS8320.c, no hay forma de que me de el valor real. Hace unos días conseguí que el valor sea estable, ya que tenía oscilaciones. Leyendo el datasheet del MAX187, en modo SPI, me pide que lea los 12 bits en dos byte, pero no hay forma. ¿Alguien me puede ayudar?
Este es le código del programa principal:

#include "C:\Program Files C\20060405_prueba_spi.h"
#include <max187.c>
#include <lcd.c>
#include <math.h>
#use fast_io (A)
#use fast_io (B)
#use fast_io (C)
#use fast_io (D)
#use fast_io (E)
#byte port_a=0X05
#byte port_b=0X06
#byte port_c=0X07
#byte port_d=0X08
#byte port_e=0X09

#ifndef MAX4534_EN
   #define MAX4534_A0    PIN_A0
   #define MAX4534_A1    PIN_A1
   #define MAX4534_EN    PIN_A2
#endif

void main()
{
   float value;
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   set_tris_a(0x00);                            //Puerto A como salida
   set_tris_b(0x00);                            //Puerto B como salida
   set_tris_c(0b11010111);                //Puerto C como entrada/salida
   set_tris_d(0xFF);              //RD0...RD7 salidas
   set_tris_e(0x00);              //RE0...RE2 entradas
   port_b=0;
   port_a=0;


   /*Inicializamos LCD*/
   lcd_init();                                        //Inicia LCD
   lcd_putc("    Tension de\n");             //Saca texto
   lcd_putc("   Referencia");                 //Saca texto
   delay_ms(2000);
   lcd_putc("\f");                                 //Limpia pantalla
   lcd_putc("Valor\n");                         //Saca texto
   lcd_putc("actual");                           //Saca texto
   delay_ms(2000);
   lcd_gotoxy(14,2);                            //Acomoda cursor LCD
   lcd_putc("V");

   while (1)
            {
             output_high(MAX4534_EN);         //Inicializamos multiplexor MAX4534
             output_low(MAX4534_A1);          //Salidas para ver la tensión de referencia
             output_high(MAX4534_A0);

             init_ext_adc();                           //Inicializamos MAX187
             value = read_ext_adc();             //Leemos el valor del AD
             lcd_gotoxy(8,2);                        //Acomoda cursor LCD
             lcd_putc("      ");                        //Limpia ese sector de pantalla
             lcd_gotoxy(8,2);                        //Acomoda cursor LCD
             printf(lcd_putc,"%03.2f",value);  //Tension en [V]
             delay_ms (2000);
             value=0;
            }
}


Y este el driver del MAX187:

//////////////// Driver for MAX187 A/D Converter ///////////////////////
////                                                                 ////
////  init_ext_adc()                      Call after power up        ////
////                                                                 ////
////  value = read_ext_adc()              Converts to digital number ////
////                                      and sends to MCU           ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services         ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////

#ifndef MAX187_CS

   #define MAX187_DOUT  PIN_C4
   #define MAX187_SCLK  PIN_C3
   #define MAX187_CS    PIN_C2

#endif

void init_ext_adc() {
                     output_low(MAX187_CS);
                     output_low(MAX187_SCLK);
                    }

long read_ext_adc() {
                     int i;
                     long data;
                     data=0;
                     delay_us(86);                 //Espero 86 us, para iniciar la conversion (tCONV)
                     output_low(MAX187_CS);
                     for(i=0;i<13;++i) {           // send sample over spi
                                       output_low(MAX187_SCLK);
                                       delay_us(1);
                                       shift_left(&data,2,input(MAX187_DOUT)); //Leo en dos byte la salida del conversor
                                       output_high(MAX187_SCLK);
                                       delay_us(1);
                                       }
                     delay_us(10);
                     output_high(MAX187_CS);
                     return(data);
                    }

float convert_to_volts(long data) {
                                   return ((float)data*5.0/0xFFFF);
                                  }


Muchas gracias de antemano

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18272
    • MicroPIC
Re: Conversion AD con MAX187 y PIC16F877
« Respuesta #1 en: 12 de Abril de 2006, 12:08:48 »
No he podido examinar a fondo tu programa, y se me antoja complicado hacerlo sin poder probar con un circuito real.
Pero me he animado a responderte porque has dado una pista en tu post que creo que es bastante concluyente.
Dices que siempre lees "el doble" de lo que deberías leer. Me juego lo que quieras a que una vez leída la información que te envía tu ADC, estás leyendo un bit más, y por eso tienes el dato desplazado un bit a la izquierda, o lo que es igual, lo tienes multiplicado por dos.

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Re: Conversion AD con MAX187 y PIC16F877
« Respuesta #2 en: 12 de Abril de 2006, 16:09:55 »
Hola Nocturno,

Muchas gracias por tu rápida respuesta. Con total seguridad que es lo que comentas. He estado observando el cronograma que adjunta el datasheet del MAX187, y aunque dice: Activate SCLK for a minimum of 13 clock cycles, realmente en el cronograma son 12 los ciclos de reloj que necesita para la conversión. Posiblemente este párrafo que te comentaba anteriormente ha sido el que me ha confundido. Mañana probaré los cambios y te diré.

Un saludo,

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Re: Conversion AD con MAX187 y PIC16F877
« Respuesta #3 en: 13 de Abril de 2006, 07:28:05 »
Hola Nocturno,

Efectivamente, estoy viendo por el display, la temperatura actual que proporciona el LM35. El error estaba en el bucle for, ya que realizaba 13 iteraciones en vez de 12.

Un saludo y muchas gracias.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18272
    • MicroPIC
Re: Conversion AD con MAX187 y PIC16F877
« Respuesta #4 en: 13 de Abril de 2006, 12:20:21 »
Me alegro que lo solucinaras.


 

anything