Nostalgisches
FM-Stereo-Radio mit TDA7021/TDA7040  


von Stephan Laage-Witt
Elektronik-Labor  Lernpakete  Projekte  HF  

Von Zeit zu Zeit beschäftige ich mich mit nostalgischem Radiobasteln - zur Entspannung und einfach, weil es Freude macht. Oft ist der Weg von der ursprünglichen Idee bis zum fertigen Gerät länger als gedacht. Aber wenn ich mir die Zeit lasse, dann ist es immer ein vergnüglicher Weg, der viele neue Erkenntnisse bringt.

Der Adventskalender vom letzten Jahr und die auf dieser Web-Page vorgestellten Versuche mit dem dazugehörigen Stereo-Dekoder haben mich auf die Idee gebracht, ein FM-Stereo-Radio anzugehen. UKW hatte es in meiner Bastelgeschichte schon öfter gegeben, aber Stereo und „richtig brauchbar“ war bisher noch nicht dabei.


Das UKW-Stereo-Radio

Zielsetzung
Was sollte es also werden? Natürlich ein praxistauglicher FM-Stereo-Empfänger. Und er sollte offen sein für neugierige Einblicke: Wie schon bei anderen Projekten wollte ich die Elektronik in einem Plexiglas-Gehäuse als freie Verdrahtung unterbringen. Bei dieser Bauweise kommt keine Platine zum Einsatz. Statt dessen wird die Schaltung so aufgebaut, dass die Bauteile über ihre Anschlussdrähte und einige Lötösen auf der durchsichtigen Grundplatte Halt finden. Das ist nun eigentlich gar nicht für Hochfrequenz geeignet. Aber zum Glück machen die Philips-Bausteine vom Adventskalender die Sache einfach, da die ICs die hohen Frequenzen weitgehend intern verarbeiten. Das sollte auch mit einem Drahtverhau funktionieren. 

Die Bedienung für Senderwahl und Lautstärke sollte über Drehknöpfe erfolgen, so wie früher, als Elektronik noch nicht über Tipptasten oder Touchscreens kontrolliert wurde. Wo ich schon einmal dabei war, wurde auch eine Frequenzskala mit beweglicher Markierung via Skalenseil in das Pflichtenheft mit aufgenommen. Und schließlich sollte noch eine Leuchtbandanzeige in Anlehnung an ein „magisches Auge“ die Empfangsstärke anzeigen und bei der manuellen Abstimmung helfen.

Planung
Für die Schaltung kam allerdings nicht der im Adventskalender verwendete TDA7088 zum Einsatz, sondern der etwas ältere TDA7021. Dieser war besser geeignet, weil er zum einen an Pin 9 die Empfangs-Feldstärke als Spannungswert zur Verfügung stellt. Zum anderen ist der 7021 für kontinuierliche, manuelle Abstimmung über einen Drehknopf besser geeignet ist. Als Stereo-Dekoder sollte ein TDA7040 dazu kommen, der sehr gut mit dem 7021 harmoniert.

Die Chips waren gar nicht so einfach zu bekommen. Aber es gibt nichts, das es im Internet nicht gibt. Ich wurde bei einem Internet-Auktionshaus fündig, so dass schließlich für wenige Euro ein kleiner Umschlag aus Hongkong mit den Philips-Bausteinen in meinem Briefkasten landete. Das ging ja einfacher, als ich gedacht hatte. 




Aber der Reihe nach. Die Schaltung wird über eine 9-Volt-Batterie versorgt, was gut für den NF-Verstärker, aber deutlich zu viel für die TDA-Chips ist. Deshalb sorgt ein 78L03 für stabile 3 Volt auf der HF-Seite. Die Schaltung folgt fast vollständig der Anwendung, die im Philips-Datenblatt gezeigt ist. Der frequenz-bestimmende Oszillatorkreis besteht aus einer Spule (Luftspule aus 4 Windungen mit 5 mm Durchmesser) und einer Kapazitätsdiode 1SV101. Die Abstimmung erfolgt über ein 47 k-Potentiometer. Mit dem Spannungsbereich von 0 bis 3 Volt lässt sich das UKW-Band sehr gut überstreichen. Die Widerstände links und rechts vom Abstimm-Poti begrenzen den Empfangsbereich auf das nutzbare Radioband. Als Antenne wird ein Drahtstück von 1 m Länge am Eingangskreise angeschlossen. Die Induktivität L3 in der Stromversorgung des TDA7021 ist übrigens in der Philips-Applikation nicht zu finden. Bei meinem Aufbau eliminierte sie Zwitschergeräusche, die andernfalls ab und zu zu hören waren.

Der Stereo-Dekoder übernimmt das MPX-Signal und liefert die Niederfrequenz an das Stereo-Poti zu Lautstärke-Einstellung.
Für die NF-Verstärkung konnte ich zwei LM386 zur Mitarbeit überreden, die sich in der Bastelkiste langweilten. Sie arbeiten hier mit niedriger Verstärkung und treiben zwei kleine Lautsprecher. Die Schaltung hat noch einige Elkos und 100 nF Blockkondensatoren zur Stabilisierung und Vermeidung von ungewollten Schwingungen. 

Für das „magische Auge“ musste auch wieder die Bastelkiste herhalten. Die Messungen an Pin 9 des TDA7021 zeigten, dass ohne Sender etwa 2.7 Volt anlagen. Je stärker der Sender, desto geringer war die Spannung bis herunter auf minimal etwa 0.3 Volt. Das Signal hätte man mit Komparator, Inverter und LED-Treiber aufbereiten können. Ein Blick in meine Vorräte brachte mich aber auf eine andere Idee. Schon vor ein paar Wochen hatte ich einen Satz ATtiny44 bekommen, die auf eine Aufgabe warteten. Dieser AVR-Controller ist dem ATtiny13 sehr ähnlich, verfügt aber über wesentlich mehr Ausgänge. Das war ideal für meinen Zweck. Der ADC des Mikrocontrollers übernimmt den Spannungswert an PA7 und steuert die Leuchtdioden an PA0 bis PA6. Die Pegelanpassung wurde komplett per Software gemacht, was den Aufbau natürlich sehr vereinfachte. Die Anzahl von 7 LEDs erschien mir als guter Kompromiss zwischen Auflösung und Stromverbrauch. Tatsächlich arbeitetet das Programm mit einer Auflösung von 14 statt 7 Stufen. Bei allen ungeraden Werten wird die jeweils nächst höhere LED im Pulsweiten-Modus mit 25 % betrieben, was etwa die halbe Helligkeit ergibt. Dadurch erscheinen die Übergänge „weicher“, schon beinahe wie mit analoger Elektronik. Der Controller läuft mit dem internen 1 Mhz-Oszillator und hat nicht wirklich viel zu tun. Er darf deshalb den größten Teil der Zeit im Sleep-Modus entspannen. Das Programm ist in C geschrieben und recht einfach. Die Details sind den Kommentaren im C-Programm zu entnehmen.

Experimente
Bevor ich mich an den Aufbau des Radios im Plexiglasgehäuse machen konnte, musste etwas Forschungsarbeit betrieben werden. Die erste Frage war: Wie bekomme ich SMD-Bausteine in eine frei-fliegende Verdrahtung? Ich habe einige Varianten probiert und bin dann mit der Montage auf einer IC-Fassung am Besten zurecht gekommen. Die SMD-Chips wurden mit einem kleine Stück Holz etwas erhöht auf die IC-Fassung geklebt und dann Pin für Pin verdrahtet. Ein spitzer Lötkolben, eine ruhige Hand (!) und eine kräftige Lesebrille machten es möglich. Die SMD-Chips mit 1,27 mm Pin-Abstand sind eigentlich recht gutmütig, und nach ein bisschen Übung geht das Löten zügig von der Hand. Die montierten ICs sind mechanisch sehr robust und können vielseitig verwendet werden. 


Montage des SMD-Chip auf einer IC-Fassung

Der nächste Schritt war ein Probeaufbau auf einem Holzbrett. Ich hatte verschiedene Varianten der Anordnung ausprobiert, um Leitungslängen klein zu halten. Als Draht kam versilberter Kupferdraht mit 1 mm Durchmesser zum Einsatz, der einerseits gute, mechanische Stabilität bietet und andererseits hübsch anzuschauen ist. Die Schaltung war erstaunlich unproblematisch und robust.


Testaufbau

Der dritte Versuchsaufbau beschäftigte sich mit dem Skalentrieb. Das Seilrad am Abstimmpoti sollte einen Durchmesser von 5 cm Durchmesser bekommen. Das ergab bei einem nutzbaren Drehwinkel von 270 Grad eine Skalenlänge von etwa 11 cm, was dann auch die wesentlichen Gehäusemasse definierte. Aus Platzgründen wurde das Abstimmpoti um 90 Grad verdreht angeordnet. Das Seil ließ sich gut über Umlenkrollen führen. Als Gegenstück arbeitete ein kleines Seilrad mit 2 cm Durchmesser, das auf einer freien Achse (eine M6-Schraube) mit Drehknopf montiert war. Die Abstimmung hat also eine Untersetzung von 2 auf 5, ein guter Wert für feinfühligen Abstimmen. Das Seil kam übrigens von einer Nylon-Drachenschnur. Es wurde mit einer kleiner Feder gespannt.


Skalentrieb

Aufbau und Abgeich
Nachdem die Forschung erfolgreich abgeschlossen war, konnte es an den Zusammenbau gehen. Als Material kamen durchgängig Plexiglas und Aluminium zum Einsatz. Die Plexiglasplatten sind leider sehr empfindlich, wenn die Schutzfolie erst einmal entfernt ist. Deshalb hatte ich die Schaltung komplett auf einem Holzbrett aufgebaut und erst dann auf die fertig bearbeitete und gebohrte Plexiglasplatte transferiert. Die aufgebaute Schaltung war auch ohne Grundplatte einigermaßen stabil, so dass sie sich gut an ihren Arbeitsplatz transferieren ließ.


Die Schaltung an ihrem Arbeitsplatz

Der Abgleich war sehr einfach. Erster Punkt war das Auseinanderziehen oder Zusammendrücken der Oszillatorspule, bis der Frequenzbereich mit dem UKW-Band übereinstimmte. Das brauchte ein bisschen Geduld und Fingerspitzengefühl.

Zum Abgleich von P2 und P3 schweigt sich das Philips-Datenblatt leider aus. Kollege Google hatte dann ein paar Tipps, die zu folgender Methode führten:
Zuerst wurde der PLL-Oszillator des Stereo-Dekoders mit P3 abgeglichen. Dazu wurde die Abstimmung in einen Bereich ohne Sender gedreht, so dass der Oszillator frei lief. Jetzt wurde der 100 nF-Kondensator an Pin 7 des TDA7040 gelöst und Pin7 über einen 10 kOhm-Widerstand an die Spannungsversorgung (3 V) gelegt. Mit einem Oszilloskop oder Frequenzzähler konnte ich an Pin 7 die Frequenz des Oszillators abnehmen. Sie wurde möglichst exakt auf 19 kHz eingestellt. Damit hat der Oszillator die optimalen Voraussetzungen, auf das Pilot-Signal eines Senders einzurasten. Zum Schluss musste ich den Umbau natürlich wieder rückgängig machen. Besonders der 100 nF-Kondensator an Pin 7 nach Masse war wichtig, weil sonst die Klangqualität leidet.  

P2 an Pin 15 des TDA7021 wurde schließlich so eingestellt, dass auch ein schwacher Sender mit deutlich erkennbarem Stereo-Sound übertragen wurde. Die Einstellung war aber unkritisch. Ein mittlerer Wert wird meistens gut passen.

Zum Schluss kam noch, sozusagen als i-Tüpfelchen, die Frequenzskala. Um die Positionen der Frequenzen zu finden, hatte ich meinen geschätzten Reiseempfänger um Unterstützung gebeten und mit dessen Hilfe die Frequenzen des Oszillators am TDA7021 ermittelt. Das klappte prima, weil die Zwischenfrequenz mit 70 kHz quasi vernachlässigbar ist. Den Empfänger stellte ich mit eingeschobener Antenne so dicht wie möglich neben mein Radio. Die gesuchte Frequenz wurde am Reiseempfänger eingestellt, z.B. 90 MHz. Jetzt war der Oszillator beim Durchdrehen der Abstimmung einwandfrei im Reiseempfänger zu finden, so dass ich die 90 MHz-Position auf der Skala übernehmen konnte. Das wurde schrittweise für mehrere Frequenzen wiederholt, bis die Skala komplett war. Die Skala habe ich dann mit dem Computer auf transparente Folie gedruckt und mit Tesafilm auf den durchsichtigen Skalenträger montiert. So, fertig.


Skala mit Zeiger

Empfangspraxis
Und dann war es soweit: Das Radio funktionierte und konnte vorgeführt und ausprobiert werden. Die Empfindlichkeit hat mich von Anfang an überrascht. Der TDA7021 kommt auch mit schwachen Sender gut zurecht und ist sicherlich mit dem UKW-Band meines Reiseempfängers auf Augenhöhe. Beim Durchdrehen des Abstimmknopfes erscheinen die Sender dicht gepackt auf der Skala. Die LED-Anzeige ist flink und beim Abstimmen hilfreich. Assoziationen an Omas Röhrenradio mit Skala und magischem Auge sind fast unvermeidlich. Auch die Klangqualität ist gut; und der Stereo-Effekt ist durch den relativ großen Abstand der beiden Lautsprecher im breiten Gehäuse schön zu hören. Der Empfang ist absolut klar, zumindest solange die Sender mit ausreichender Feldstärke hereinkommen. Wenn der Empfang schwächer ist (3 oder 4 LEDs), dann sind die Sender von ausgeprägtem Stereo-Rauschen begleitet. Aber das kann man der kleinen Schaltung nicht übel nehmen.


Interessante Einsichten

Das Radio steht nun schon seit ein paar Wochen in der Küche. Wir benutzen es oft und gerne und möchten es nicht mehr missen. Und das gut einsehbare Innenleben beschert interessante Einblicke, die auch oft Besucher in ihren Bann ziehen.

Eine Demonstration ist auf YouTube zu sehen: http://youtu.be/Yv7g0Zxqzz8
 

/*
* Magic Eye - field strength indicator for TDA7021 FM radio
*
* 2.7 V => all LEDs off, 0.3 V => all LEDs on
*
* The algorithm takes the average of 4 ADC measurement and drives a 7 LED array. It maps
* 14 voltage steps to 7 LEDs. Even step-values are mapped to half the number of LEDs.
* Odd values are mapped to half the number LEDs + the next LED at 25% (1 out of 4 cycles)
*
* Port A, Bit 0 ... 6: LED array, output
* Port A, Bit 7: ADC, input
*
* for Attiny44. Fuses: internal oscillator at 1 MHz, div128 off
*
* Created: 23.04.2013 21:11:17
* Author: Stephan Laage-Witt
*/

#define F_CPU 1000000
#define ADC_UPPER_LIMIT 231 // corresponds to 2,70 V (reference = Vcc = 3.0 V)

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

volatile uint16_t adc_result; // sum of 4 conversions
volatile uint8_t job_counter = 0;


/* Interrupt Service Handler ---------------------------------------------------------------------*/
/* Runs approx. 240 times per second, reads ADC value, counts job_counter through from 0 to 3 */

ISR(TIM0_COMPA_vect) {
adc_result += ADCH; // read ADC value, use upper 8 bits only
ADCSRA |= (1<<ADSC); // kick off new conversion
if (++job_counter == 4) // increase job_counter
job_counter = 0;
}


/* MAIN ------------------------------------------------------------------------------------------*/
int main(void)
{
const uint8_t led_array[8] = {0b01111111, // 7 LED array, 0 = on
0b01111110, // highest bit always 0
0b01111100,
0b01111000,
0b01110000,
0b01100000,
0b01000000,
0b00000000,
};
uint8_t step = 0;
uint8_t odd_flag = 0;

// I/O ports
DDRA = 0b01111111; // bits 0 to 6 drive LED array, bit 7 used for ADC input

// Initializing ADC
ADMUX = (1<<MUX2) | (1<<MUX1) | (1<<MUX0); // Vcc is reference, channel PDA7
ADCSRA = (1<<ADEN) | (1<<ADPS0); // ADC enabled, pre-scaler division factor = 2
ADCSRB = (1<<ADLAR); // result is left adjusted in ADCH
ADCSRA |= (1<<ADSC); // kick off first conversion

// Configuring timer 0 for interrupt at (approx) 240 Hz
TCCR0A |= (1<<WGM01); // CTC mode
TCCR0B |= (1<<CS02) | (0<<CS01) | (0<<CS00); // prescale = clock rate / 256
OCR0A = (16 - 1); // compare value = 16 * 256 usec -> 244 Hz
TIMSK0 |= (1<<OCIE0A); // enable timer compare interrupt
sei(); // off we go ...

// set sleep mode to idle: interrupts and adc kept running
set_sleep_mode(SLEEP_MODE_IDLE);

while(1) {
if (job_counter == 3) { // every 4th cycle:
adc_result = adc_result / 4; // take the average across 4 measurements
if (adc_result > ADC_UPPER_LIMIT) { // anything above 2.7 V counts as "all LEDs off"
step = 0;
} else {
step = ADC_UPPER_LIMIT - adc_result; // invert value
step /= 15; // one step is approx. 0.18 V
if (step > 14) step = 14; // anything below 0.3 V counts as "all LEDs on
if (step & 0b00000001) // check odd (bit 0 = 1) or even (bit 0 = 0)
odd_flag = 1;
else
odd_flag = 0;
step = step / 2; // reduce scale to 0 ... 7
adc_result = 0; // reset adc_result for the next round
};
};

if ((job_counter == 0) && (odd_flag)) // only for 1 out of 4 cycles:
PORTA = led_array[step + 1]; // if result is odd then toggle
else // highest LED between on and off
PORTA = led_array[step]; // set LED array according to ADC value

sleep_mode(); // good night - wake up via interrupt
}
}

 


Elektronik-Labor  Lernpakete  Projekte  HF