🛠 Mini sample player on the 12-bit DAC
Objetivo
Construir un pequeño reproductor de muestras: almacenar una forma de onda de 8 bits en la memoria flash, reescalarla para el DAC de 12 bits en A0 y transmitirla a una tasa fija. El presupuesto es generoso para un microcontrolador: 256 KB de flash y 32 KB de SRAM, por lo que cientos de muestras de unos pocos segundos caben en el espacio de código.
Esqueleto del código
const uint8_t SND[] PROGMEM = { /* 8-bit PCM, e.g. 8 kHz */ };
const size_t N = sizeof(SND);
const float RATE = 8000.0f;
void setup {
analogWriteResolution(12);
}
void loop {
static uint32_t t0 = micros;
static size_t i = 0;
uint32_t n = (micros - t0) / (1000000UL / (uint32_t)RATE);
if (n < N) {
uint8_t s = pgm_read_byte(&SND[n]);
analogWrite(A0, (s - 128) * 8 + 2048); // 8->12 bit, mid-scale
} else {
analogWrite(A0, 2048); // silence = mid rail
if (micros - t0 > (N * 1e6f) / RATE + 100000) { t0 = micros; i = 0; }
}
}
Notas
> NO VERIFICADO: la tasa máxima de muestreo sin errores y la transmisión del DAC basada en DMA en la R4 no están documentadas en las páginas consultadas; el bucle anterior está temporizado por CPU.
- A0 solo puede suministrar ~8 mA: siempre pasa por un amplificador (por ejemplo, una placa TPA2006) antes de conectar un altavoz.
- Mantén las muestras de 8 bits centradas en 128 y sal en escala media (2048) para el silencio, con el fin de evitar clics.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-poussoir.inoArduinodac-analogique.inoArduinoentree-analogique.inoArduinopwm-respiration.inoArduinoservo-balayage.inoArduino