Simple Stereo FM Transmitter using an AVR Microcontroller
Simple Stereo FM Transmitter using an AVR Microcontroller


Simple Stereo FM Transmitter using an AVR Microcontroller


I had been fascinated with the idea of making simple stereo encoder for building Stereo FM Transmitter. Not that stereo means much to me away from the computer. I use an FM broadcast transmitter to relay the output of my computers to FM radios in the kitchen, the bedroom, the driveway, and out in the garden. Under those circumstances, I find that mono is plenty, whether it is music or radio programs from over the internet, since I am primarily occupied with something else anyway. When on my hands and knees in the garden, all the way up to my elbows in planting a bush, the music really does not seem any more sweet when its stereo. But that did not stop me from being fascinated with the idea of making a stereo encoder. Stereo always seemed like a lot of circuitry and bother for the slight benefit that came with it. That is, until a few weeks ago.

Simple Stereo FM Transmitter using an AVR microcontroller

Traditional Method

A composite stereo signal, as transmitted by FM radio stations, is composed of at least three parts: A base band mono signal, a double sideband channel difference signal, and a pilot carrier. The signal composition is somewhat analogous to an NTSC composite color television signal. I said at least three parts because some stations transmit other things such as data and background music that our normal FM receivers do not decode.

Simple Stereo FM Transmitter using an AVR microcontroller

The base band signal falls between 30 Hz and 15 kHz. This is the part of the audio signal that comes out of the speaker on a mono receiver, In the classical encoder, it is made by simply adding the Left and Right channel audio signals together, and is often referred to as L+R.

A double sideband channel difference signal, often referred to as L-R is also transmitter. The information in this signal is the difference between the signals in the Left and Right channels. In the classical encoder, the channel difference signal is made by subtracting the Right channel audio signal from the Left channel audio signal. The channel difference signal is then combined with a 38 kHz carrier in a balanced modulator to form a double sideband signal centered at 38 kHz.

The third signal, a pilot carrier at 19 kHz, exactly half the frequency of the carrier used to generate the 38 kHz double sideband signal. The 19 kHz signal is used to regenerate the missing 38 kHz carrier in the receiver and this 38 kHz carrier is used to demodulate the double sideband signal.

The three separate signals are not intended to affect each other. Careful filtering can minimize undesirable interactions, most of which would be some kind of beat between the 19 kHz pilot signal and the Left and Right channels and their products.

I fiddled with the classical encoder on paper a number of times over the years. The designs always had all sorts of neat blocks - an oscillator and frequency divider, a balanced modulator, one or more summing amplifiers and a few of filters. In all, something that would not result in a home project that would be easy to duplicate. The 38 kHz oscillator could be made with a 74HCT60 oscillator/counter chip and a 38 kHz crystal. The balanced modulator could be made with a Giblert cell multiplier for something nice, or a set of transmission gates switching complimentary audio signals, or ever with resistor networks being switched by micro controller I/O pins. The L+R function could be achieved with a pair or resistors and the L-R signal by a simple op amp circuit. If an op amp were to be used to sum all the signals together, it would have to be quite good - passing the 38 kHz and its sidebands and maintaining phase with respect to the baseband L+R signal. I had bought some pretty nice op amps in anticipation of using them, until I finally understood the simpler method, described below.

Simpler Approach

I came across a very simple and robust stereo encoder project on Harry Lythall website. Harry amateur radio call sign is SM0VPO, and he can be readily Goggled. The circuit was simple, it was elegant, and I did not have clue as to how it worked. After coming back to his project several times, I realized that I had seen a write-up of this technique, but I had not understood it well enough to appreciate what I was looking at.

The technique that lends itself to such an elegant implementation is explained at:
http://web.archive.org/web/20060214011755/http://transmitters.tripod.com/stereo.htm <== This will open a new window. The original link, http://transmitters.tripod.com/stereo.html, stopped working within days of the first publication of this web page, and I am grateful to Internet Archive for making it available to us.

What I added to Harry encoder was a slight twist. That of using an AVR micro controller to replace the oscillator/counter and the analog transmission gates. And that is what this circuit does. A cheap micro controller, an NPN transistor and a handful of passive components is all that it takes to make a simple stereo FM transmitter.

Simple Stereo FM Transmitter using an AVR microcontroller

This simpler approach calls for simply switching the audio channel between the Left and Right inputs. Each channel is sequentially connected for one half cycle of the 38 kHz carrier. That produces both the 38 kHz double sideband signal and the baseband signal. A low pass filter reduces the splatter, resulting from harmonics of the switching, on adjacent radio channels. I understand that this is how one of the low cost single chip encoders works. It makes sense, this method relies on matching of components and no precision circuitry. Its nearly fool proof.

Switching in this way generates a 38 kHz double sideband signal and passes both L and R through the baseband. L and R have opposite polarities in the decoder because L is allowed through to the transmitter on one half of the 38 kHz cycle and R is allowed through on the other half. When L and R are equal, the two signals average out to zero over each cycle. It could not be simpler.

Simple Stereo FM Transmitter using an AVR microcontroller

Simple Stereo FM Transmitter using an AVR microcontroller


The switch to ground is actually implemented by two separate I/O pins on a micro controller.

The only tricky part is achieving the 2:1 analog multiplex function with a micro controller. This needs to be done without switching the DC level of the signal, because that would cause the 38 kHz carrier to feed through. CMOS Micro controller I/O ports can switch between high impedance and low impedance states. But when in the low impedance state, the pin can only be at either ground (logic low) or at the positive power supply (logic high). That means that the switching action must take place by mixing the Left and Right signals resistivity, then basically shorting out one, then the other in alternation. To maintain the condition that the switch not changing the DC level of the signal, the signal will have to be centered around ground or the positive power supply. I chose ground since the input signal would be referenced to ground.

What the data sheets do not tell us is that the FET that drives the output pin low, an N-Channel FET, is pretty good a sinking current from signals above ground and sourcing current from signals below ground. Let me say that last part again: The N-Channel FET that drives the output pin can shunt signals below ground to ground. It is very much like a low value resistor that can be turned on and off. When the I/O port is in a high impedance state, if the signal tries to swing too far below ground, either the ESD protection device on the I/O pin or the parasitic diode that is intrinsic to the FET will conduct, clipping the signal. In this circuit, noticeable clipping at the I/O pin starts at several hundred millivolts below ground.

Since the FM transmitter in this circuit only needs a few tens of millivolts to attain satisfactory modulation, there is no need for amplification of the output of the multiplexer. There is more about modulation sensitivity in the part of this section that deals with the transmitter circuit.

To perform the switching between high impedance and low impedance to ground, the firmware zeros to the corresponding port registers registers, then at appropriate times, it clears the corresponding data direction register bits to make a given pin a high impedance, and at the appropriate times, the firmware sets the corresponding data direction register bits to make the a given pin a low impedance to ground.

This is about as simple of a build-it-yourself stereo transmitter as you can make. The pin assignments in the circuit above apply to the AT90S2323, ATTINY12, and ATTINY25.

Looking at the schematic in figure 4, the micro controller derives its timing from a 6 MHz crystal. 6 MHz is not an exact integer multiple of 19 kHz. In fact, it is the 315.7894th harmonic of 19 kHz. But there is no need to worry - we are talking analog here. I just count down by 316 and call it close enough, because the difference is only 0.06%. I used 6 MHz because I have a bag of them on hand. If you wanted to, you could use a crystal that is an exact integer multiple of 19 kHz. By the way, even higher frequency clocks can get you smaller errors. A 20.000 MHz crystal gets you only 0.04% error - about the same tolerance as many microcontroller crystals -just remember to modify the firmware to accommodate the different clock rate.

One might ask if using a micro controller to simply replace an oscillator, counter, and some transmission gates is kind of a waste of a good processor. It frustrates me to let most of a very competent RISC processor spend most of its time in timing loops and doing trivial bit twiddling, but when looking at the alternatives, use of a micro controller reduces the parts count, it is easily obtainable, and in very many cases, a less expensive solution than most of the other solutions available.

The Left and Right signals are AC coupled through C1 and C2, respectively. The purpose of AC coupling is remove any DC component of the source signal to allow the signals at the U1 (the AVR) I/O pins to operate symmetrically around ground.

At every half cycle of the 38 kHz clock rate, either U1 pin 7 or U1 pin 5 is grounded, while the other pin is left floating, which allows one signal at a time to get through to the input of the transmitter.

A 19 kHz square wave pilot signal is provided from U1 pin 6. Since the average DC level at pin 6 is +2.5 volts, a small capacitor is placed in series to keep this DC component out of the modulator (consisting of U1 pins 7 and 5), so there will not be any 38 kHz carrier.

All three of the signals - Left, chopped by 38 kHz, Right, chopped by 38 kHz of opposite phase, and a low level pilot signal are resistivly mixed at C4. I used the stereo indicator on my portable FM radio to find the value of R5, which in turn sets the amount of pilot signal in the composite signal, then I doubled the signal level. This should be more than enough, but feel free to decrease the value of R5. Cutting its value in half should not result in too much signal for the receiver.

The critical purpose of C4 is bypassing the base of the common base oscillator, Q1, to ground. The value was chosen so that the 38 kHz double sideband signal would not be rolled of significantly. I first calculated the maximum permissible value of C4 and then used the next smaller available size capacitor. After that, I tested it by trying a capacitor a little larger than the maximum calculated value and then then listening to a piece of music that features high frequency sounds moving from left to right. The larger capacitor significantly affected the separation of the higher frequency signals. The .001 uf capacitor shown in the schematic had no audible effect, and that is good because it was not supposed to.

Simple circuit, the workhorse of the home brew wireless microphone projects, was pressed into service for the very reason that it is so popular with hobbyists: it does not require very many parts, it can be built with or without a printed circuit board, and usually actually works with enough tweaking.

In the transmitter, C3 decouples the base to ground through C4. C7 Can be a few pf above or below 5 pf without throwing things terribly out of whack. Try to keep the variable capacitor, C6, small. If you can only find larger capacitors, say 10 to 45 pf, put a 10 or 12 pf fixed capacitor in series with it. Its important to keep this part of the capacitance of the resonant tank as low as possible. If you do not have a suitable variable capacitor, you can always just put in a 5 pf fixed capacitor and rely on your ability to tune the circuit by stretching and distorting L1.

Q1 is a common 2N4401, and it exhibits a collector to base capacitance change of about 1.5 pf per volt. This is higher and better for this application than what you would get from high frequency transistors with lower output capacitance. The more of the tank capacitance that comes from Q1 collector-to-base capacitance, the more frequency modulation of the transmitted signal you will get for a given audio level. Since the stereo modulator can only handle several hundred millivolts peak-to-peak without distortion, this sensitivity is important.

I made L1 by winding 7 turns of #22 Beldsol copper magnet wire around the smooth part of a 1/4 inch drill bit (a trick mentioned by the legendary Harry Lythall), and then slipped the coil off the drill bit. I was shooting for the lower part of the FM band. Once the coil was wound and installed, I put C6 in the center of its range and then stretched and bend the coil until I could hear the transmitter on my FM radio tuned to the only quiet spot on the dial here, 93.3 MHz. If you want to use this at the high end of the FM broadcast band, you might want to try using only 6 turns.

Another trick for winding coils like this, that have to maintain their shape without a coil form, is to cut off a piece of wire a little longer than would be needed for the coil, then holding each end of the wire with a pair of pliers, stretch the wire slightly to orient the grain so that the wire tends to stay straight. When you wrap the wire around the drill bit, it will tend to hold its new shape instead of trying to spring back to its old shape. Be careful how you hold the wire while stretching it -you would not want to hit yourself in the face with the pliers should the wire snap. Happened to me once; its not really funny.

This transmitter does not have a discreet antenna. L1 radiates plenty. An external antenna would extend the range, which is probably not what you really want anyway. It will also complicate tuning, which is something else you probably do not really want. I get nearly 10 meters to three of my portable FM receivers with this. It could be stronger, but 10 meters is more than enough. My neighbors do not really need to know what I am listening to.


The firmware is quite possibly quite likely the simplest piece of functional code that I have ever written. It merely sets the 19 kHz signal pin high, waits a bit, then sets one of the 38 kHz pins to high Z while it sets the other 38 kHz pin to low Z. It delays a little more, then makes the high Z pin low, and the low Z pin high, waits some more... I think you get the idea. The modulator outputs switch between high and low impedance at 38 kHz, the 19 kHz output is a 19 kHz square wave. It was a bit tedious, to test in AVR Studio, but worth it.

The code is very simple. Just wait loops padded out with some no ops, separating changing of the state of the I/O pins. The tiny little program only a few very basic instructions, no long jumps, interrupts or special functions, relying only on the reset vector and these seven assembly language instructions:

cbi sbi
dec brne
nop rjmp

The three signals are output on Port B as follows: Left => Port B bit 2; Right => Port B bit 0; 19 kHz subcarrier => Port B bit 1, which in the schematic are Pins 7, 5, and 6 respectively. I have provided links at the bottom of this page to code for the ATTINY12, ATTINY25, the ATTINY2313 / AT90S2313, and the AT90S2323. I have tested all five of these chips in this circuit and found them to all work as expected. I guess that is one of the benefits of keeping things simple.

You should be able to use this technique on most other, if not all CMOS micro controllers with I/O pins that are capable of being placed in a high output state. If you realize success with a PIC or another small controller, please drop me a note at the email address at the bottom of this page.


I built mine on a piece of punched phenolic board that had one pad per hole. The holes are in a 0.1 inch grid (2.54 mm). The pads help hold the components tightly to the board, but I am confident that one built on punched phenolic or fiberglass board, or even built Ugly Bug (A.K.A. Dead Bug) or Manhattan style would work just as well. Just make sure that the parts in the transmitter are mounted solidly to help with frequency stability and to reduce microphones.

I used a socket for the micro controller. This because I used a programing adapter that plugged into the socket for the purpose of programming the controllers, and also to let me change the controllers to verify that the other controllers would work. You do not need a socket, but it might give some peace of mind and some forgiveness of mistakes.

Testing and Tuning

If you use a socket for the controller, do not put the controller into the socket until you have verified that the power supply is wired properly. Apply unregulated power to the input of the 78L05 and measure pin 8 of the micro controller. It should be + 5 volts. Verify that pin 4 of the micro controller is grounded.

Tune a nearby FM radio receiver to a quiet spot on the dial, where you would like the transmitter to reside.

Tune C6 to the center of its range and touch L1 with your fingers. If you heard a signal go swishing though the band pass of your FM receiver, it means that the transmitter is tuned at a frequency higher than that which the FM receiver is tuned to. If you did not hear the signal, then stretch the coil lengthwise SLIGHTLY.

At some point, between the effects of stretching the coil and touching it with your fingers, you should be able to bring the transmitter frequency to be very close to that which the receiver is tuned to. At this point, you should be able to use C6 to fine tune the oscillator to the right frequency

After you get the transmitter tuned in, Verify that the transmitter is transmitting at the frequency that your radio is tuned to, and not to an image frequency. Do this by bringing your finger close to L1. When you do this, the frequency will shift. If the transmitter shifts to a lower frequency on your radio dial, then the transmitter is tuned to where you think it is. If the transmitter seems to shift up in frequency, then you are looking at an image and need to re-tune the transmitter.

The procedure above might be tricky, and often requires some finesse. Be patient, it will pay off.

It might be handy to have an un-tuned field strength meter at hand, just to be able to determine if the transmitter is oscillating at all. I relied upon one several times during this project. Here are a some filed strength indicator projects on this site:

Broadband RF Field Strength Probe using Atmel AT90S1200A AVR controller <= This one uses a micro controller to zero the circuit.
A Simple Field Strength Indicator <= This one does not require a micro controller.
Digital RF Field Strength Indicator with LED display using Atmel AT90S2313 AVR Processor <= This is the one I used on this project.
A Field Strength Meter Using A Biased Schottky Detector <= This is a newer design, which is quite sensitive.

The L and R designations on the audio connector are, to my knowledge correct.

Thoughts on Possible Improvements

First off, one might consider adding ESD protection to the audio inputs.

Filters with sharp 10 to 15 kHz audio cutoff on the Left and Right audio channels might help with some audio sources. This would prevent signals that might be in the audio from beating with the 19 khz pilot signal.

Pre-empahsis, a 6 db per octave boost at about 3 kHz on the Left and Right audio channels will compensate for the de-empahsis rolloff in commercial receivers. North American receivers expect one frequency, the rest of the world, something slightly different. You might be able to achieve a similar effect with a graphic equalizer ahead of the transmitter. Using an equalizer in the receiver will restore the frequency response, but will not improve your high frequency signal to noise ratio as pre emphasis was intended.

Printed Circuit Board Design

Simple Stereo FM Transmitter using an AVR microcontroller

Jeff attached a clip lead to the coil on his transmitter in order to increase the range a little bit. Note that the inductor is a sufficient antenna for most uses and the extra antenna is not recommended. He has come up with a pretty nice printed circuit board design for this simple FM Stereo Transmitter. Jeff layout accommodates 8 pin AVR controllers. The layout is intended to accept resistors mounted vertically, so you have some flexibility in that you can use any size from 1/8 up to about 1/2 watt sizes.

Simple Stereo FM Transmitter using an AVR microcontroller

This layout only requires three jumpers in order to make a single-sided board.

As for the dots per inch, Jeff wrote Opening the file up with Microsoft paint and printing out the image gives 7.5 mm from the center of pin 1 to the center of pin 4. Its a good idea to verify the dot pitch in your own system (As an example, I use a Macintosh, so the dots per inch would probably need to be adjusted.) When everything is scaled properly, the distance between centers on U1, the 8 pin dual inline package, should be 0.1 inches (2.54 mm).


Several different AVRs are directly supported. Note: The AT90S2323 and AT90S2313 are no longer manufactured, but the ATTINY parts are still in production.

The eight pin devices, AT90S2323, ATTINY12, and  ATTINY25 use the following output pins:
Left =>
Port B bit 2; Right => Port B bit 0; 19 kHz subcarrier => Port B
bit 1, as shown in the schematic.
AVR Studio 4.x assembler source file for ATTINY12 sttn12.asm
AVR Studio 4.x assembler hex file for ATTINY12 sttn12.hex
AVR Studio 4.x assembler source file for ATTINY25 sttn25.asm
AVR Studio 4.x assembler hex file for ATTINY25 sttn25.hex
AVR Studio 4.x assembler source file for AT90S2323 st2323.asm
AVR Studio 4.x assembler hex file for AT90S2323 st2323.hex

The twenty pin devices, AT90S2313 and ATTINY2313 use the following output pins:
Left =>
Port D bit 6 (pin 11) ; Right => Port D bit 4 (pin 8); 19 kHz
subcarrier => Port D bit 5 (Pin 9).
AVR Studio 4.x assembler source file for ATTINY2313 and AT90S2313 st2313v070419b.asm
AVR Studio 4.x assembler hex file for ATTINY2313 and AT90S231 st2313v070419b.hex

Accurate LC Meter Capacitance Inductance Meter with 16F628 and LCD
Volt Ampere Meter with 16F876 Microcontroller and LCD display
Accurate LC Meter

Build your own Accurate LC Meter (Capacitance Inductance Meter) and start making your own coils and inductors. This LC Meter allows to measure incredibly small inductances making it perfect tool for making all types of RF coils and inductors. LC Meter can measure inductances starting from 10nH - 1000nH, 1uH - 1000uH, 1mH - 100mH and capacitances from 0.1pF up to 900nF. The circuit includes an auto ranging as well as reset switch and produces very accurate and stable readings.
PIC Volt Ampere Meter

Volt Ampere Meter measures voltage of 0-70V or 0-500V with 100mV resolution and current consumption 0-10A or more with 10mA resolution. The meter is a perfect addition to any power supply, battery chargers and other electronic projects where voltage and current must be monitored. The meter uses PIC16F876A microcontroller with 16x2 backlighted LCD.

50MHz 60MHz Frequency Meter / Counter with 16F628 & LCD
1Hz - 2MHz XR2206 Function Generator
60MHz Frequency Meter / Counter

Frequency Meter / Counter measures frequency from 10Hz to 60MHz with 10Hz resolution. It is a very useful bench test equipment for testing and finding out the frequency of various devices with unknown frequency such as oscillators, radio receivers, transmitters, function generators, crystals, etc.
1Hz - 2MHz XR2206 Function Generator

1Hz - 2MHz XR2206 Function Generator produces high quality sine, square and triangle waveforms of high-stability and accuracy. The output waveforms can be both amplitude and frequency modulated. Output of 1Hz - 2MHz XR2206 Function Generator can be connected directly to 60MHz Counter for setting precise frequency output.

BA1404 HI-FI Stereo FM Transmitter
USB IO Board PIC18F2455 / PIC18F2550
BA1404 HI-FI Stereo FM Transmitter

Be "On Air" with your own radio station! BA1404 HI-FI Stereo FM Transmitter broadcasts high quality stereo signal in 88MHz - 108MHz FM band. It can be connected to any type of stereo audio source such as iPod, Computer, Laptop, CD Player, Walkman, Television, Satellite Receiver, Tape Deck or other stereo system to transmit stereo sound with excellent clarity throughout your home, office, yard or camp ground.
USB IO Board

USB IO Board is a tiny spectacular little development board / parallel port replacement featuring PIC18F2455/PIC18F2550 microcontroller. USB IO Board is compatible with Windows / Mac OSX / Linux computers. When attached to Windows IO board will show up as RS232 COM port. You can control 16 individual microcontroller I/O pins by sending simple serial commands. USB IO Board is self-powered by USB port and can provide up to 500mA for electronic projects. USB IO Board is breadboard compatible.

ESR Meter / Transistor Tester Kit
Audiophile Headphone Amplifier Kit
ESR Meter / Capacitance / Inductance / Transistor Tester Kit

ESR Meter kit is an amazing multimeter that measures ESR values, capacitance (100pF - 20,000uF), inductance, resistance (0.1 Ohm - 20 MOhm), tests many different types of transistors such as NPN, PNP, FETs, MOSFETs, Thyristors, SCRs, Triacs and many types of diodes. It also analyzes transistor's characteristics such as voltage and gain. It is an irreplaceable tool for troubleshooting and repairing electronic equipment by determining performance and health of electrolytic capacitors. Unlike other ESR Meters that only measure ESR value this one measures capacitor's ESR value as well as its capacitance all at the same time.
Audiophile Headphone Amplifier Kit

Audiophile headphone amplifier kit includes high quality audio grade components such as Burr Brown OPA2134 opamp, ALPS volume control potentiometer, Ti TLE2426 rail splitter, Ultra-Low ESR 220uF/25V Panasonic FM filtering capacitors, High quality WIMA input and decoupling capacitors and Vishay Dale resistors. 8-DIP machined IC socket allows to swap OPA2134 with many other dual opamp chips such as OPA2132, OPA2227, OPA2228, dual OPA132, OPA627, etc. Headphone amplifier is small enough to fit in Altoids tin box, and thanks to low power consumption may be supplied from a single 9V battery.

Arduino Prototype Kit
RF Remote Control 433MHz Four Channel
Arduino Prototype Kit

Arduino Prototype is a spectacular development board fully compatible with Arduino Pro. It's breadboard compatible so it can be plugged into a breadboard for quick prototyping, and it has VCC & GND power pins available on both sides of PCB. It's small, power efficient, yet customizable through onboard 2 x 7 perfboard that can be used for connecting various sensors and connectors. Arduino Prototype uses all standard through-hole components for easy construction, two of which are hidden underneath IC socket. Board features 28-PIN DIP IC socket, user replaceable ATmega328 microcontroller flashed with Arduino bootloader, 16MHz crystal resonator and a reset switch. It has 14 digital input/output pins (0-13) of which 6 can be used as PWM outputs and 6 analog inputs (A0-A5). Arduino sketches are uploaded through any USB-Serial adapter connected to 6-PIN ICSP female header. Board is supplied by 2-5V voltage and may be powered by a battery such as Lithium Ion cell, two AA cells, external power supply or USB power adapter.
200m 4-Channel 433MHz Wireless RF Remote Control

Having the ability to control various appliances inside or outside of your house wirelessly is a huge convenience, and can make your life much easier and fun. RF remote control provides long range of up to 200m / 650ft and can find many uses for controlling different devices, and it works even through the walls. You can control lights, fans, AC system, computer, printer, amplifier, robots, garage door, security systems, motor-driven curtains, motorized window blinds, door locks, sprinklers, motorized projection screens and anything else you can think of.

Electronics-DIY.com © 2002-2024. All Rights Reserved.