Audio-Delay mit dem Tiny3216         


Elektronik-Labor   Projekte   AVR 




Eine zeitliche Verzögerung ist ein einfaches Mittel, um aus einem Monosignal ein Stereo-ähnliches Signal zu bilden. Im Amateurfunk wird das Verfahren angewandt, um mit einem Stereo-Kopfhörer einen angenehmeren Klang zu erzielen. Eine Seite des Kopfhörers erhält das originale Signal aus dem Empfänger, die andere ein zeitversetztes Signal. Eine Verzögerung von 2 ms hat sich als günstig erwiesen. Das Hintergrundrauschen verteilt sich damit scheinbar auf den ganzen Raum, während ein Funksignal an einer bestimmten Stellte zu stehen scheint. Das Mithören ist auf diese Weise entspannter und weniger ermüdend, auch und besonders für sehr schwache Signale, die sich kaum aus dem Rauschen erheben.

Hier wird der Tiny3216 verwendet, weil er einen DA-Wandler besitzt. Das originale Audiosignal wird über den AD-Wandler mit einer Auflösung von 8 Bit und einer Abtastrate von ca. 50 kHz erfasst und in einen Ringspeicher mit einer Größe von 256 Bytes geschrieben. An einer anderen Stelle im Speicher wird das verzögerte Signal entnommen und an den DA-Wandler übergeben. Die Mess- und Ausgabeschleife benötigt ca. 20 µs für einen Durchlauf. Die analoge Ausgabe verwendet Daten, die 100 Messungen zurückliegen, sodass eine Verzögerung von 2 ms entsteht. Mit einem veränderten Abstand lassen sich ca. 0 ms bis zu 5 ms einstellen. 

//AudioDelay3216   ADC0-AIN1, DAC0-OUT
#define F_CPU 3333333
#include <avr/io.h>

int main(void){
    uint8_t ring[255];
    uint8_t pos1 = 0;
    uint8_t pos2;
    ADC0.CTRLA = ADC_ENABLE_bm;         
    ADC0.MUXPOS = ADC_MUXPOS_AIN1_gc;    
    ADC0.CTRLA = ADC_ENABLE_bm | ADC_RESSEL_8BIT_gc;  
    ADC0.CTRLC = ADC_PRESC_DIV2_gc ; 
    VREF.CTRLA =  VREF_DAC0REFSEL_2V5_gc|VREF_ADC0REFSEL_2V5_gc;
    DAC0.CTRLA  = DAC_OUTEN_bm|DAC_ENABLE_bm;
    PORTA.DIR = PIN7_bm;

    while(1){
      ADC0.MUXPOS = ADC_MUXPOS_AIN1_gc;
      ADC0.COMMAND = ADC_STCONV_bm;
      while (!(ADC0.INTFLAGS & ADC_RESRDY_bm));
      ring[pos1] = ADC0.RES;
      pos2=pos1-100;  //100*20µs=2ms
      DAC0.DATA  = ring[pos2 & 1023];  //DA an PA6
      pos1++;
      PORTA.OUTTGL = PIN7_bm;
    }
}

 

Eine Seite des Kopfhörers ist direkt an die Mono-Audioquelle, also z.B. an den Ausgang des Kurzwellenempfängers angeschlossen. Das Signal gelang gleichzeitig an den analogen Eingang des Controllers und wird auf eine mittlere Gleichspannung unterhalb 2,5 V gelegt. Der DAC-Ausgang kann dank seines internen Puffer-Verstärkers einen 32-Ohm Kopfhörer direkt treiben und steuert so die zweie Seite des Kopfhörers an. Besser ist es allerdings, wenn man beide Kapseln des Kopfhörers mit 100 Ohm in Reige schaltet.
 
Das Zweikanal-Oszillogramm oben zeigt die Phasenverschiebung eines Signals mit rund 1 kHz bei gleicher Ausgangsamplitude. Man erkennt die begrenze Auflösung des DAC-Ausgangssignals, aber sie ist akustisch kaum wahrnehmbar. Das Gerät ist damit voll einsetzbar.




Aus Kap. 4.5 Audios-Delay







Elektronik-Labor   Projekte   AVR