Autor Tema: Manejo de un DAC (AD7303)  (Leído 5320 veces)

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

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Manejo de un DAC (AD7303)
« en: 22 de Octubre de 2006, 21:14:23 »
Qué tal, estoy teniendo problemas para poder manejar el convertidor D/A AD7303, se trata de un convertidor DA serie, el cto. de control lo estoy implementando en un FPGA Spartan 3. En concreto, estoy usando el convertidor que viene en esta tarjeta:
Digilent Analog I/O 1.

Estoy trabajando en un par de proyectos y para ello necesito trabajar con los convertidores de esta tarjeta, el AD7823 es un ADC y el AD7303 es un DAC, ambos trabajan en forma serial. Con el primero tras varios intentos ya lo logré manejar a la perfección, es con AD7303 que me he encontrado con algunos problemas, sobretodo porque no tengo equipo para observar lo que en realidad le estoy enviando :P.

Este integrado se maneja con tres líneas de control: sync, sclk y din,  la primera está en 1 y se pone a 0 durante el tiempo en que se le va a enviar la información al integrado. sclk es un reloj, en cada flanco de subida el integrado lee el dato que se le envía por din. En din se envían 16 bits de información, 8 son de configuración y luego 8 que representan el dato digital a convertir (8 bits).

Este es el código que probé la última vez:
Código: VHDL
  1. -- Control AD7303
  2. -- José Jorge Enríquez Rodríguez
  3. library IEEE;
  4. use IEEE.STD_LOGIC_1164.ALL;
  5. use IEEE.STD_LOGIC_ARITH.ALL;
  6. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  7.  
  8. entity control_dac is
  9.         port(
  10.                 clk_50MHz: in std_logic;        -- Reloj de la tarjeta Spartan 3 Starter Kit (50 MHz)
  11.                 reset: in std_logic;
  12.                 dato_paralelo: in std_logic_vector( 7 downto 0 );       -- Dato a convertir
  13.                 dac_sync: out std_logic;
  14.                 dac_sclk: out std_logic;
  15.                 dac_din: out std_logic
  16.         );
  17. end control_dac;
  18.  
  19. architecture Behavioral of control_dac is
  20.  
  21. begin
  22.  
  23.         process( reset, clk_50MHz )
  24.                 variable temp: integer := 0;
  25.         begin
  26.                 if ( reset = '1' ) then
  27.                         temp := 0;
  28.                         dac_sync <= '1';
  29.                         dac_sclk <= '0';
  30.                         dac_din <= '0';
  31.                 elsif ( rising_edge( clk_50MHz ) ) then
  32.                         temp := temp + 1;
  33.                         if ( temp < 3 ) then                           
  34.                                 dac_sync <= '1'; dac_sclk <= '0';
  35.                         elsif ( temp < 5 ) then
  36.                                 dac_sync <= '1'; dac_sclk <= '1';       -- Termina nivel alto sync
  37.                         elsif ( temp < 7 ) then                         -- Inicia envío de datos (bit 16)
  38.                                 dac_sync <= '0'; dac_sclk <= '0';
  39.                                 dac_din <= '0'; -- Referencia interna
  40.                         elsif ( temp < 9 ) then
  41.                                 dac_sync <= '0'; dac_sclk <= '1';
  42.                         elsif ( temp < 11 ) then                        -- (bit 15)
  43.                                 dac_sync <= '0'; dac_sclk <= '0';
  44.                                 dac_din <= '0'; -- Uncommited bit
  45.                         elsif ( temp < 13 ) then
  46.                                 dac_sync <= '0'; dac_sclk <= '1';
  47.                         elsif ( temp < 15 ) then                        -- (bit 14)
  48.                                 dac_sync <= '0'; dac_sclk <= '0';
  49.                                 dac_din <= '0'; -- LDAC
  50.                         elsif ( temp < 17 ) then
  51.                                 dac_sync <= '0'; dac_sclk <= '1';
  52.                         elsif ( temp < 19 ) then                        -- (bit 13)
  53.                                 dac_sync <= '0'; dac_sclk <= '0';
  54.                                 dac_din <= '1'; -- Deshabilita canal B
  55.                         elsif ( temp < 21 ) then
  56.                                 dac_sync <= '0'; dac_sclk <= '1';
  57.                         elsif ( temp < 23 ) then                        -- (bit 12)
  58.                                 dac_sync <= '0'; dac_sclk <= '0';
  59.                                 dac_din <= '0'; -- Habilita canal A
  60.                         elsif ( temp < 25 ) then
  61.                                 dac_sync <= '0'; dac_sclk <= '1';
  62.                         elsif ( temp < 27 ) then                        -- (bit 11)
  63.                                 dac_sync <= '0'; dac_sclk <= '0';
  64.                                 dac_din <= '0'; -- Direcciona canal A
  65.                         elsif ( temp < 29 ) then
  66.                                 dac_sync <= '0'; dac_sclk <= '1';
  67.                         elsif ( temp < 31 ) then                        -- (bit 10)
  68.                                 dac_sync <= '0'; dac_sclk <= '0';
  69.                                 dac_din <= '0'; -- CR1
  70.                         elsif ( temp < 33 ) then
  71.                                 dac_sync <= '0'; dac_sclk <= '1';
  72.                         elsif ( temp < 35 ) then                        -- Último bit configuración (bit 9)
  73.                                 dac_sync <= '0'; dac_sclk <= '0';
  74.                                 dac_din <= '1'; -- CR0 (actualizar input reg. desde el shift reg. DAC A)
  75.                         elsif ( temp < 37 ) then
  76.                                 dac_sync <= '0'; dac_sclk <= '1';
  77.                         elsif ( temp < 39 ) then                        -- MSB dato a convertir (bit 8)
  78.                                 dac_sync <= '0'; dac_sclk <= '0';
  79.                                 dac_din <= dato_paralelo( 7 );
  80.                         elsif ( temp < 41 ) then
  81.                                 dac_sync <= '0'; dac_sclk <= '1';
  82.                         elsif ( temp < 43 ) then                        -- (bit 7)
  83.                                 dac_sync <= '0'; dac_sclk <= '0';
  84.                                 dac_din <= dato_paralelo( 6 );
  85.                         elsif ( temp < 45 ) then
  86.                                 dac_sync <= '0'; dac_sclk <= '1';
  87.                         elsif ( temp < 47 ) then                        -- (bit 6)
  88.                                 dac_sync <= '0'; dac_sclk <= '0';
  89.                                 dac_din <= dato_paralelo( 5 );
  90.                         elsif ( temp < 49 ) then
  91.                                 dac_sync <= '0'; dac_sclk <= '1';
  92.                         elsif ( temp < 51 ) then                        -- (bit 5)
  93.                                 dac_sync <= '0'; dac_sclk <= '0';
  94.                                 dac_din <= dato_paralelo( 4 );
  95.                         elsif ( temp < 53 ) then
  96.                                 dac_sync <= '0'; dac_sclk <= '1';
  97.                         elsif ( temp < 55 ) then                        -- (bit 4)
  98.                                 dac_sync <= '0'; dac_sclk <= '0';
  99.                                 dac_din <= dato_paralelo( 3 );
  100.                         elsif ( temp < 57 ) then
  101.                                 dac_sync <= '0'; dac_sclk <= '1';
  102.                         elsif ( temp < 59 ) then                        -- (bit 3)
  103.                                 dac_sync <= '0'; dac_sclk <= '0';
  104.                                 dac_din <= dato_paralelo( 2 );
  105.                         elsif ( temp < 61 ) then
  106.                                 dac_sync <= '0'; dac_sclk <= '1';
  107.                         elsif ( temp < 63 ) then                        -- (bit 2)
  108.                                 dac_sync <= '0'; dac_sclk <= '0';
  109.                                 dac_din <= dato_paralelo( 1 );
  110.                         elsif ( temp < 65 ) then
  111.                                 dac_sync <= '0'; dac_sclk <= '1';
  112.                         elsif ( temp < 67 ) then                        -- LSB dato a convertir (bit 1)
  113.                                 dac_sync <= '0'; dac_sclk <= '0';
  114.                                 dac_din <= dato_paralelo( 0 );
  115.                         elsif ( temp < 68 ) then
  116.                                 dac_sync <= '0'; dac_sclk <= '1';
  117.                         else
  118.                                 temp := 0;
  119.                         end if;
  120.                 end if;
  121.        
  122.         end process;
  123.  
  124. end Behavioral;

Adjunto la forma de onda de la simulación.

El problema es que por lo pronto, al descargarlo a la tarjeta, utilizo 8 switches para introducir el dato paralelo, pero al activarlos no obtengo ninguna variación en la salida del DAC, he hecho varios cambios al programa. Lo que ahora haré es probar con otro integrado pues aún debo verificar si el que estoy usando está en buenas condiciones :P.

Cualquier comentario me será de ayuda, gracias.

JJ (Geo).
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Manejo de un DAC (AD7303)
« Respuesta #1 en: 22 de Octubre de 2006, 21:47:16 »
La simulación parece correcta,aunque las distintas ramas del if no son excluyentes entre sí.Sería bueno que lo hicieras de forma para que en cada vez sólo una rama cumpla su condición.La inicialización de la variable temp en la parte declarativa del proceso sobra,ya la inicializas al resetear.
No entiendo exactamente cual es el problema.
¿La primera vez hace una lectura correcta de los switches y en las sucesivas no?
¿dato_paralelo está bien mapeado a los switches?
Creo que te sería mucho más fácil si implementaras un registro de desplazamiento con carga paralelo,ó usases los diferentes modelos que trae el xilinx
« Última modificación: 22 de Octubre de 2006, 21:51:05 por Modulay »

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Manejo de un DAC (AD7303)
« Respuesta #2 en: 22 de Octubre de 2006, 22:10:56 »
El problema es que la salida del DAC no varía como debiera. De hecho, no varía al mover los switches. Sin embargo, si oprimo el botón de reset el valor de salida cambia aleatoriamente :shock:.

Lo mejor sería usar un registro de desplazamientos que enviara los 16 bits al DAC, pero así me parece bastante explícito y debería funcionar ¿o no?

Sip, dato_paralelo está bien mapeado, de hecho para asegurarme que no hubiera problemas allí agregué una salida que copiara el dato recibido y encendiera los 8 leds de la tarjeta.

De cualquier forma, ahorita ya me cansé :D. Voy a probar luego con otro chip (jeje, no sé porqué se me metió la idea de que el chip pueda estar dañado :P) y a seguir con las pruebas.

Gracias.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Manejo de un DAC (AD7303)
« Respuesta #3 en: 24 de Octubre de 2006, 22:10:05 »
Ok, esto ya funciona :). De hecho ya tengo todo (es un filtro FIR implementado en un FPGA, el problema mayor lo representaban las partes de conversión al ser seriales pues nunca los había manejado), sólo tengo que verificar que estén bien sincronizados los tiempos y las ganancias en donde se supone deben estar :).

Ahora veré cómo mejorar el código porque está bastante feo, pero tiene la razón de que así cualquiera le entiende, es que en el grupo hay un par de compañeros informáticos que no tienen mucho conocimiento de hardware, y si un poco de programación, y así le entienden muy fácil ;).

Saludos,
JJ (Geo).
« Última modificación: 27 de Octubre de 2006, 01:29:42 por Geo »
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Manejo de un DAC (AD7303)
« Respuesta #4 en: 27 de Octubre de 2006, 02:38:34 »
Me alegro de que lo solucionaras
¿Dónde estaba el problema?

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Manejo de un DAC (AD7303)
« Respuesta #5 en: 28 de Octubre de 2006, 10:28:29 »
Las fases de la luna, que hacía frío, qué se yo ;).
Eso además de no tener bien conectada la referencia del integrado :lol: :P :oops:.

Este código se supone servirá de base para otros filtros (cada quien entregará uno diferente, pasa-bajas, altas, banda), y mis compañeros tuvieron problemas para implementar el pasa-altas y el pasa-banda (yo me encargué de la programación, casi ni estoy con ellos porque estoy también en el trabajo :P), así que mañana estaremos haciendo más pruebas, ya les platicaré :).
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Manejo de un DAC (AD7303)
« Respuesta #6 en: 02 de Noviembre de 2006, 16:14:55 »
Problema solucionado. El problema con el filtro pasa altas era simplemente que los coeficientes negativos tenían mucha mayor significancia y no se estaban tomando en cuenta, es obvio que el convertidor AD no los maneja así que se arregló sumándole un valor "offset" :P. Ok, filtros funcionando :D.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Bruno_AR

  • PIC12
  • **
  • Mensajes: 89
Re: Manejo de un DAC (AD7303)
« Respuesta #7 en: 26 de Diciembre de 2006, 16:39:30 »
bien que te funciona!! de todas maneras, trata de no colocar tantos IF en VHDL no es recomendable, el sintetizador no es muy amigo de los IF anidados.....

Suerte
Un saludo, desde Argentina


 

anything