R-2R para salida de sonido HQ

0

Estoy construyendo un reproductor de MP3. Hace algún tiempo preguntaba sobre la factibilidad de construir controladores de auriculares basados en un amplificador de clase D. Ahora estoy cansado, quiero ir a la red R-2R simple, seguido de opamp.

Esto es lo que estoy tratando de hacer:

Necesito obtener un sonido estéreo de 44100 @ 16 bits.

Como no tengo cristales que sean múltiplos de 44100 (la única frecuencia que necesito admitir), sobreexploro el sonido, digamos 125kHz (de 25Mhz de cristal). Luego, envío datos desde uC a 595 contadores en serie, y los encierro en el hardware para evitar las fluctuaciones debidas a interrupciones y demás (pero si lo configurara como la interrupción de máxima prioridad, podría funcionar bien incluso cuando se maneja directamente desde uC).

Justo antes del cierre, gire 595 / uC en el estado Z para evitar picos durante la transición.

Luego R2R (0.1%), luego opamp, luego auriculares. Como puedo obtener algo de no linealidad, puedo calibrar cada código de salida individualmente en el ADC de precisión de 24 bits con la fuente de voltaje de referencia de precisión que tengo, y almacenar los valores de calibración en flash.

¿Funcionará y producirá una calidad de sonido decente, o hay alguna trampa? Sé que es más fácil obtener DAC de audio, pero parece que no hay mucho disponible, y lo que está disponible cuesta ~ 20 $, y no soy un gran fan de esperar 2-3-4 semanas por una parte ...

    
pregunta BarsMonster

3 respuestas

1

¿Funcionará y producirá una calidad de sonido decente, o hay alguna trampa?

La construcción de un DAC de 16 bits a partir de dos chips '595, una escala R-2R y un amplificador operacional para auriculares como el LM386N-3 debería darle una precisión de 8 bits; Quizás con algún esfuerzo 12 bits de precisión (ENOB), que es mejor que la calidad del teléfono. Quizás eso sea adecuado para probar / depurar el resto de su diseño mientras espera que un DAC de un solo chip llegue por correo.

El DAC de Delta-Sigma ("DAC de 1 bit") también es inteligente y tiene menos problemas de adaptación de resistencia que el R-2R. Si recorres esa ruta, puedes ver el Algoritmo de compresión de sonido Roman Black BTc , que es un poco más inteligente. Según tengo entendido, tanto delta-sigma como BTc se pueden convertir en una forma de alta eficiencia equivalente a un amplificador de clase D al reemplazar las resistencias en el filtro RC de salida con inductores, lo que da como resultado un filtro LC.

Por lo general, aliento a las personas a que construyan las cosas por sí mismas al menos una vez para poder comprenderlas mejor, en lugar de comprar siempre una caja negra. Pero en este caso particular, estoy de acuerdo con David Kessner y Olin Lathrop: Si realmente desea una resolución de más de 12 bits, probablemente gastará mucho menos tiempo y energía si compra uno de los ADC de un solo chip de bajo costo disponibles. Supongo que estoy en mal estado viviendo en un país donde puedo obtener fácilmente cualquiera de los chips mencionados en Escogiendo un DAC para un amplificador de audio en menos de una semana.

Si tiene problemas para obtener una pieza en particular de un fabricante en particular, tal vez podría consultar otro DAC de "audio de precisión" de bajo costo de otro fabricante:

  • Wolfson Microelectronics, como el WM8726
  • Texas Instruments, como el PCM1780
  • Maxim, como el MAX5556
  • Dispositivos analógicos, como el AD5662
  • Tecnología lineal, como el LTC2602
  • NXP Semiconductor, como el UDA1334
  • AKM Semiconductor, como el AK4386
  • Laboratorios de silicio, como el SI3000
  • Cirrus Logic, como el CS4334

Mientras espera que el DAC de un solo chip llegue por correo, tal vez podría lanzarse adelante con el resto de su diseño. Si realmente estás haciendo decodificación de MP3 en tiempo real, sospecho que vas a tener muchas otras partes difíciles para tu proyecto; quizás sea útil tener dos '595 chips que contengan los datos decodificados para ayudarlo a depurar el software, y quizás incluso después. Obtenga algo simple haciendo unos pocos pitidos primero y luego modifíquelo para obtener una mejor calidad de sonido.

¿Has visto la lista de reproductores de música de código abierto ?

    
respondido por el davidcary
3

Debe considerar la precisión de las resistencias necesarias para implementar una escalera R-2R. Incluso .1% como usted menciona es solo 1 parte en 1000, o es bueno para aproximadamente 10 bits. Si implementas una escalera más ancha con estos resistores, los códigos adicionales se dispersarán y no serán monotónicos.

Es mucho más fácil emparejar y recortar resistencias en un solo chip, que es cómo pueden lograr 16 bits a un costo razonable. No he mirado, pero me sorprende que la frecuencia de audio DAC de 16 bits cuesta $ 20. Mi reacción instintiva es que es demasiado alta. Tampoco tiene sentido que obtener esa parte lleve entre 2 y 4 semanas.

Una vez vi una técnica que usaba muchos más bits en una escalera R-2R de lo que podía soportar la tolerancia de resistencia. De hecho, no fue exactamente el doble entre las resistencias, de modo que los voltajes resultantes se dispersarían de manera más uniforme. Este individuo luego midió el resultado de cada último código con precisión y encontró el subconjunto que dio la respuesta deseada para la cantidad de bits que realmente quería. El valor de salida luego pasó por una tabla de búsqueda antes de conducir la escalera R-2R. Por supuesto, si la temperatura sube un poco, la asignación ya no es válida.

    
respondido por el Olin Lathrop
2

Olin dijo algunas cosas buenas. Me gustaría añadir un par de cosas:

Hay muchos DAC de audio que cuestan menos de US $ 3 cada uno. Acabo de hacer una búsqueda en Digikey para CS43 (los DAC de Cirrus Logic comienzan con eso) y encontré 46 DAC estéreo. El más caro fue de US $ 7.80, pero el 90% de ellos fue menos de US $ 5. Incluso el más barato de estos tendrá un mejor rendimiento que una escalera R-2R hecha a mano.

Mientras estás en Digikey, ofrecen docenas de osciladores a 11.2896 MHz o 22.579 MHz (que son 256 o 512 veces a 44.1 KHz). Muchos de estos son menos de US $ 2.

Un "truco" para usar los DAC de audio normales es que necesita un reloj de muestra decente (también denominado LRCLK) y un reloj de bits de serie (SCLK). Normalmente, estos no pueden ser modificados por la CPU. Pero en su esquema R-2R no podría hacerlo de una interrupción de todos modos. Incluso si estuviera en la interrupción de prioridad más alta, todavía tendrías un poco de jitter del orden de 40+ ns. Con el audio, preferirías que el jitter sea 2 ns o menos.

Su idea de usar un ADC de precisión para calibrar cada código de salida R-2R podría funcionar, pero necesitaría una tabla de 2 ^ 16 bits o 2 ^ 24 bits (dependiendo del número de bits). Y necesitarías dos tablas, una para cada canal de audio. Esto es apenas manejable para un DAC de 16 bits, y casi imposible para un DAC de 24 bits.

Si realmente desea hacer un DAC, construir un DAC delta-sigma de primer orden en un FPGA o CPLD es súper fácil y suena mucho mejor que un R casero típico. -2R DAC. Pero aún así no sonaría tan bien como un Cirrus Logic súper barato de US $ 2, Burr-Brown o AKM DAC. Aun así, he creado este tipo de DAC y me complacería proporcionar el código fuente de VHDL.

Actualización: ¡Agregué más cosas!

Aquí está el código VHDL para un DAC Delta-Sigma de primer orden:

-----------------------------------------------------------------------------
-- First Order Delta Sigma DAC
--
-- din is a signed integer where -full_scale represents a DAC output of 0 volts
-- and +full_scale is a DAC output of VCC.
-----------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;


entity dac_ds is
    generic (n_bits     :integer);
    port (reset         :in std_logic;
          clk           :in std_logic;
          din           :in std_logic_vector (n_bits-1 downto 0); -- Signed integer
          dout          :out std_logic
         );
end dac_ds;


architecture arch_dac_ds of dac_ds is
  signal err            :std_logic_vector (n_bits+1 downto 0) := (others=>'0'); -- Error accumulator is 2 bits larger
  signal dout_int       :std_logic := '0';
begin
  process (reset, clk)
    variable val        :std_logic_vector (n_bits+1 downto 0);
    variable fs_neg     :std_logic_vector (n_bits+1 downto 0);
    variable fs_pos     :std_logic_vector (n_bits+1 downto 0);
  begin
    if reset='1' then
      err <= (others=>'0');
      dout_int <= '0';
    elsif rising_edge(clk) then
      val := (din(din'high) & din(din'high) & din) + err;

      fs_neg := (others=>'0');
      fs_neg(0) := '1';
      fs_neg(fs_neg'high downto fs_neg'high-2) := "111";

      fs_pos := (others=>'0');
      fs_pos(fs_pos'high-2) := '1';

      if val(val'high) = '0' then
        dout_int <= '1';
        err <= val + fs_neg;   -- err <= value + (-full scale)
      else
        dout_int <= '0';
        err <= val + fs_pos;   -- err <= value + (+full scale)
      end if;
    end if;
  end process;

  dout <= dout_int;

end arch_dac_ds;

La salida se verá como un flujo de bits seudoaleatorio. Recomiendo ejecutarlo a la frecuencia de reloj más alta que pueda, ya que es una potencia de 2 múltiplos de la frecuencia de muestreo. 22.579 MHz sería el más lento en el que lo ejecutaría. 45.xxx o 90.xxx MHz sería aún mejor.

Normalmente, ejecutaría esta salida en un filtro RC simple. Haga que la R sea lo suficientemente grande como para que su salida FPGA / CPLD aún pueda girar de riel a riel. Hacer C lo suficientemente grande como para filtrar correctamente. He usado 3.3K y 0.1 uF y funciona bien. 0.01 uF podría ser mejor. La salida del filtro RC se almacenaría luego en un amplificador operacional. Cuanto más rápida es la frecuencia de reloj, más fácil es hacer este filtro y mayor es la precisión resultante.

Solo porque alguien lo mencionará: usted podría hacer lo mismo con una salida PWM simple, pero el filtro RC tendría que ser mucho más grande y su diseño es más crítico, con menos precisión. Irónicamente, en un FPGA este DAC Delta-Sigma es más pequeño que un circuito PWM similar.

Sí, puede convertirlo en una clase de amplificador de clase D, pero las tasas de conmutación de salida son muy altas. Esto significa que su "etapa de potencia" tendría que manejar estas velocidades y usted también tendrá más pérdidas de conmutación (menos eficiencia).

Este es un DAC delta-sigma muy simple. Hay muchas formas de mejorarlo si lo desea, pero como lo es, tendrá un mejor rendimiento que un R-2R DAC hecho en casa.

    
respondido por el user3624

Lea otras preguntas en las etiquetas