Tengo una MCU controlando un DAC de 16 bits vía SPI (y una salida LDAC adicional, que activa la actualización de la salida DAC). El MCU tiene una onda sinusoidal precalculada de 1120Hz en un buffer de 364 bytes (todos los cálculos en float32, redondeados a uint16 para la salida del DAC), muestreada a 29120Hz. En una interrupción del temporizador, la actualización del DAC se dispara a través de LDAC y luego se carga un nuevo valor desde el buffer y se envía a través de SPI. La actualización del último valor se dispara al principio para reducir el jitter debido a las carreras de acceso a la memoria contra el DMA. La interrupción tiene una prioridad suficientemente alta para no retrasarse.
A través de visualmente el seno se ve bien La FFT de mi Rigol DS1054Z detrás del DAC (antes del filtro de reconstrucción) muestra una distorsión significativa:
El pico más alto es el requerido 1120Hz, los otros están igualmente espaciados por 260Hz. ¡¡El pico derecho parece estar sólo 5dB por debajo del principal!!
El jitter en el pin LDAC es del orden de +/- 0,25us, que yo consideraría aceptable frente a un tiempo de muestreo de 34,3us. El temporizador en sí se ejecuta desde el cristal MCUs y debe ser lo suficientemente estable.
¿Qué tipo de problema podría llevar a ese patrón de distorsión? ¿Cuáles podrían ser las formas de diagnosticarlo y reducirlo?
Por si acaso es relevante: el DAC es un AD5686, la referencia a escala completa es de 5V, la amplitud del seno es de 25mV lo que resulta en que aproximadamente los 10 bits inferiores están "conmutados".