Autor Tema: Funcionamiento del MCP4921. Dudas  (Leído 12234 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado kukose

  • PIC10
  • *
  • Mensajes: 7
Funcionamiento del MCP4921. Dudas
« en: 08 de Marzo de 2011, 12:12:57 »
Hola a todos!!

Quiero realizar un conversor digital/analógico utilizando el MCP4921, pero a la hora de mirar la librería existente en el CCS C compiler no encuentro las funciones que utiliza para realizar la conversión digital-analógica.

Código: [Seleccionar]
//////////////// Driver for MCP4921 D/A Converter ///////////////////////
////                                                                 ////
////  init_dac()    Call this before using a MCP4921 DAC             ////
////                                                                 ////
////  write_dac( long int )   Writes command and 12 bit resolution   ////
////                          to the MCP4921 which converts it to a  ////
////                          voltage                                ////
////                          0-4095 input represents 0-vref V out.  ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
////        (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 EEPROM_SELECT

#define DAC_CS     PIN_B0
#define DAC_CLK    PIN_B1
#define DAC_DI     PIN_B2
#define DAC_LDAC   PIN_B4

#endif

void init_dac()
{
   output_high(DAC_CS);
   output_high(DAC_LDAC);
   output_high(DAC_CLK);
   output_high(DAC_DI);
}

void write_dac(int16 data) {
   BYTE cmd[3];
   BYTE i;

   cmd[0]=data;
   cmd[1]=(data>>8);
   cmd[2]=0x03;                           
   
   output_high(DAC_LDAC);
   output_low(DAC_CLK);
   output_low(DAC_CS);

   for(i=0; i<=23; ++i)
   {
      if(i<4 || (i>7 && i<12))
         shift_left(cmd,3,0);
      else
      {
         output_bit(DAC_DI, shift_left(cmd,3,0));

         output_high(DAC_CLK);
         output_low(DAC_CLK);
      }
   }
   output_high(DAC_CS);

   output_low(DAC_LDAC);
   delay_us(10);
   
   output_HIGH(DAC_LDAC);
}

Entiendo que se inicializa con el init_dac y luego con el write_dac ¿cómo convierto un número?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #1 en: 08 de Marzo de 2011, 12:16:42 »
Primero debes inicializar el dispositivo con init_dac(), y luego para realizar la conversión envias el valor con write_dac(....)  :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado kukose

  • PIC10
  • *
  • Mensajes: 7
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #2 en: 08 de Marzo de 2011, 12:24:52 »
Pero sin más? Pongo write_dac(4095) y ya me convierte ese número a cinco voltios en la salida?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #3 en: 08 de Marzo de 2011, 13:16:08 »
Pero sin más? Pongo write_dac(4095) y ya me convierte ese número a cinco voltios en la salida?

Sip.... Seguro debes controlar el PIN CS. Para más detalles lee el datasheet de MCP4921


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado kukose

  • PIC10
  • *
  • Mensajes: 7
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #4 en: 08 de Marzo de 2011, 13:36:44 »
Pero sin más? Pongo write_dac(4095) y ya me convierte ese número a cinco voltios en la salida?

Sip.... Seguro debes controlar el PIN CS. Para más detalles lee el datasheet de MCP4921


Saludos!

OK muchas gracias amigo, me quería complicar la vida mas de lo que era.

Desconectado kukose

  • PIC10
  • *
  • Mensajes: 7
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #5 en: 23 de Marzo de 2011, 06:52:00 »
Después de varios dias sin tocar nada, he vuelto y me he puesto con el circuito. Pero mi problema es que en la salida nunca tengo tensión. He probado a meter los datos en binario con diferentes bits, he probado con decimal pero nunca hay nada en la salida (VOUTA).

He cambiado el SDI por SDO y he probado a cambiar todo ya. Se que es una cosa muy simple pero no consigo dar con el problema.

Gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #6 en: 23 de Marzo de 2011, 10:18:52 »
Prodrias colocar un diagrama de lo que implementas, y el código para ver como utilizas la librería  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado kukose

  • PIC10
  • *
  • Mensajes: 7
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #7 en: 23 de Marzo de 2011, 11:59:28 »


Ahí dejo la simulacion de proteus

Código: [Seleccionar]
#include <18F4550.h>
#fuses INTHS
#use delay(internal=8Mhz)
#include <LCD_flexible2.c>
#include <mcp4921_PERSONAL.c>
long int value=001111;
//long int a;

//void display_data(long int data) ;
void main()
{
init_dac();
   lcd_init();//Inicializamos el LCD

   //output_LOW(DAC_CS);
   write_dac(value);
   delay_ms(500);
   //for(value<000001;value>010000;value++);
   write_dac(value);
   
   //lcd_putc('\f');                     
   //lcd_gotoxy(1,1);
   printf(lcd_putc,"dac=%Lu\n",value);       //entero sin signo
   //printf(lcd_putc,"analog=%Lu ",a);
   while(1);
}

La configuración de mi libreria personal es la siguiente:

#define DAC_CS     PIN_B0
#define DAC_CLK    PIN_B1
#define DAC_DI     PIN_B2
#define DAC_LDAC   PIN_B4


Y decir que utilizo la librería del MCP4921 y uso el MCP4822 pero he cambiuado el uno por el otro y nada.
« Última modificación: 24 de Marzo de 2011, 05:12:59 por kukose »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #8 en: 23 de Marzo de 2011, 12:26:37 »
En la imagen se ve poco y nada  :tongue: Pero prueba haciendo correctamente el control sobre CS, o sea:

CS=0;
write...
CS=1;


Muchos dispositivos después del CS=1 realizan la conversión.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado kukose

  • PIC10
  • *
  • Mensajes: 7
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #9 en: 24 de Marzo de 2011, 14:25:39 »
En la imagen se ve poco y nada  :tongue: Pero prueba haciendo correctamente el control sobre CS, o sea:

CS=0;
write...
CS=1;


Muchos dispositivos después del CS=1 realizan la conversión.


Saludos!

Ni aún así. No logro entender cuál es mi fallo a no ser que esté metiendo mal los datos y me de una tensión de 0 ya que no hay nada que leer.
Si por lo menos saldrían unos milivoltios para ver que funciona la salida..
En la imagen tengo VOUTB a Vcc pero solo era por probar una cosa más.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #10 en: 24 de Marzo de 2011, 14:59:04 »
La imagen no concuerda con los pines que dices usar...
Estas seguro que es esa la imagen del proteus.
Porque no conectas pin a pin, sin usar terminales de bus, asi vemos bien como esta conectado??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado kukose

  • PIC10
  • *
  • Mensajes: 7
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #11 en: 24 de Marzo de 2011, 15:14:35 »
He estado cambiando cosas y no concordaba la imagen con los pines. Lo he conectado directamente y algo sale en el polímetro, aunque son milivoltios.

#define DAC_CS     PIN_A0
#define DAC_CLK    PIN_B1
#define DAC_DI     PIN_B0
#define DAC_LDAC   PIN_B4


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #12 en: 24 de Marzo de 2011, 16:06:43 »
SDI del MCP va al SDO del micro. Si vas a utilizar RA0 asegúrate de configurar el módulo analógico y los comparadores.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #13 en: 24 de Marzo de 2011, 17:14:11 »
Asi funciona Ok !!

Esquema:



Y el codigo es el siguiente:

Código: C++
  1. #include <18F4550.h>
  2. #fuses INTHS
  3. #use delay(internal=8Mhz)
  4.  
  5. #define LCD_ENABLE_PIN  PIN_D0                                    
  6. #define LCD_RS_PIN      PIN_D2                  
  7. #define LCD_RW_PIN      PIN_D1                        
  8. #define LCD_DATA4       PIN_D4                        
  9. #define LCD_DATA5       PIN_D5                        
  10. #define LCD_DATA6       PIN_D6                      
  11. #define LCD_DATA7       PIN_D7
  12.  
  13. #include <LCD.c>
  14. #include <mcp4921.c>
  15. int16 value=20;
  16. //long int a;
  17.  
  18. //void display_data(long int data) ;
  19. void main()
  20. {
  21. init_dac();
  22.    lcd_init();//Inicializamos el LCD
  23.  
  24.    //output_LOW(DAC_CS);
  25.    write_dac(value);
  26.    delay_ms(500);
  27.    
  28.    for(value=1;value<=4095;value++)
  29.    {
  30.       write_dac(value);
  31.       delay_ms(5);
  32.    }
  33.    
  34.    //lcd_putc('\f');                    
  35.    //lcd_gotoxy(1,1);
  36.    printf(lcd_putc,"dac=%Lu\n",value);       //entero sin signo
  37.    //printf(lcd_putc,"analog=%Lu ",a);
  38.    while(1);
  39. }
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Funcionamiento del MCP4921. Dudas
« Respuesta #14 en: 24 de Marzo de 2011, 17:15:36 »
Asi funciona Ok !!

Esquema:



Y el codigo es el siguiente:

Código: C++
  1. #include <18F4550.h>
  2. #fuses INTHS
  3. #use delay(internal=8Mhz)
  4.  
  5. #define LCD_ENABLE_PIN  PIN_D0                                    
  6. #define LCD_RS_PIN      PIN_D2                  
  7. #define LCD_RW_PIN      PIN_D1                        
  8. #define LCD_DATA4       PIN_D4                        
  9. #define LCD_DATA5       PIN_D5                        
  10. #define LCD_DATA6       PIN_D6                      
  11. #define LCD_DATA7       PIN_D7
  12.  
  13. #include <LCD.c>
  14. #include <mcp4921.c>
  15. int16 value=20;
  16. //long int a;
  17.  
  18. //void display_data(long int data) ;
  19. void main()
  20. {
  21. init_dac();
  22.    lcd_init();//Inicializamos el LCD
  23.  
  24.    //output_LOW(DAC_CS);
  25.    write_dac(value);
  26.    delay_ms(500);
  27.    
  28.    for(value=1;value<=4095;value++)
  29.    {
  30.       write_dac(value);
  31.       delay_ms(5);
  32.    }
  33.    
  34.    //lcd_putc('\f');                    
  35.    //lcd_gotoxy(1,1);
  36.    printf(lcd_putc,"dac=%Lu\n",value);       //entero sin signo
  37.    //printf(lcd_putc,"analog=%Lu ",a);
  38.    while(1);
  39. }
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything