Downloads
Download the AVRStudio assembly source for ATtiny2313 or AT90S2313 for MLX1601 PLL FM Transmitter: LMX060331D.asm
Download the AVRStudio hex file for the ATtiny2313 or AT90S2313 or MLX1601 PLL FM Transmitter: LMX060331D.hex
Find updates at www.projects.cappels.org

Overview
The common characteristic of all of the previous low power FM transmitters I’ve built over the decades, is that their operating frequency is determined by an LC resonant circuit. Some of them had excellent stability, some of them didn’t, but I had always wanted to make one that is crystal controlled. Various schemes had been considered from time-to-time, including the direct approach of modulating the load capacitance of a a crystal oscillator, a whimsical phase modulation scheme involving a phase shifter, some balanced modulators, and limiting amplifiers, and at times, the down-to-earth and sober approach of modulating a VCO within a phase locked loop (PLL). While browsing Digikey’s online catalog, I found the LMX1601 frequency synthesizer chip and thought: “Just maybe, the PLL approach is finally within my grasp.”
The LMX1601, which apparently was designed for use in cell phones, includes everything need to make two phase locked loops except for the VCOs. More importantly, one of the PLLs, specifically the “AUX” PLL, is specified to work in the FM broadcast band. The LMX1600 and the LMX1602 were also considered, but the LMX1601 was selected because it has a “500 MHz option”, meaning that it can work down to about 50 MHz.
The painful part was dealing with the packaging of the chip. The lead centers of this 16 pin package are only 0.65 mm apart. Dealing with the fine printed circuit board features that would be needed to mount this chip was the most daunting aspect of using the chip. I had only experimented with the laser printer toner etch resist method of making PC boards a few months earlier, with some success. As it turned out, the laser printer toner etch resist method could be pushed to make a board that supports this chip. But just barely.
The Phase Locked Loop
In order to function, the LM1601’s registers need to be loaded. In particular, they need to be loaded with the divide ratios for the reference and signal (VCO in this case) counters, and to set some control parameters. To load the registers, I used a Atmel AT90S2313. It could have been any microcontroller with 3 I/O pins, but I had chosen the AVR processor, and I still have a lot of AT90S2313 chips left over from another project. To the best of my knowledge, the ATtiny2313 can be substituted without changing the source code. The 20 pin DIP appears monstrously large compared to the diminutive LMX1601. The size difference is an indication of the passing of the three of four decades that elapsed between the introduction of these two packages.
The LMX1601 has a reference divider, which I used to divide the 4 MHz clock from the micro controller’s crystal oscillator, down to 12.5 kHz reference frequency. The feedback divider, referred to as “16 Bit AUX N Counter” in the data sheet, is proceeded by a divide by 8 prescaler. These factors determine the channel spacing for the phase locked loop. 8 X 12.5 kHz = 100 kHz. The AUX N register contains the divide ratio for the feedback divider, and the phase locked loop tries to make the VCO operate at a frequency equal to the value written to the AXU N register, times 100 kHz.
I say “tries” because the actual frequency of oscillation depends on the range of the VCO itself. This means that the center requency of the resulting frequency modulated oscillator can be set with 100 kHz resolution, enabling it to be set either on or between allocated FM broadcast channels throughout most of the world.
If a value of 1000 is written into the AUX N register, the PLL will try to run at 100 KHz X 1000 = 100 MHz. The math isn’t so hard, and I skipped the hard math -the loop gain and bandwidth calculations- so this should be an easy project, mathwise.
In the firmware, an 8 bit count is used as the “channel” number. The highest frequency, which occurs when the channel number is 255, is set to 108 MHz by adding an offset of 825 to the channel number. I did this because the part of the spectrum just above the FM broadcast band is used for aviation communications in most, if not all, parts of the world. When the frequency increment and decrement buttons are pressed, the channel number increments or decrements, respectively. The button increment and decrement routines that limit the channel number to those that correspond to frequencies between 88.0 Mhz and 108.0 MHz.
After the channel number is changed, the microcontroller waits for 30 seconds before writing the channel number to EEPROM. EEPROMs are only capable of a limited number of cycles, and the 30 second timer prevents the EEPROM from being written to each time a button is pressed. Going from 100 MHz to 108 MHz requires pressing the increment button 180 times. That’s not really that much work, considering that it would normally only have to be done a few times in the life of the transmitter.
The actual frequency of the oscillator depends on the microcontroller crystal oscillator. I am using this with a couple of radios with digital tuning, and one of them has a pretty narrow detector, so for low distortion, I needed to have the transmitter very close to the frequency the receiver expects it to be. In other words, the transmitter, and therefore the microcontroller crystal oscillator had to be accurate. I solved the problem in my case by selecting a 4 MHz crystal this is close, and then adding a small capacitor in series with it to drop the frequency by a few more parts per million.
The VFO
The oscillator I chose for the VCO is the same one used in the Band Switched Test Oscillator project because I know from experience, that it can tune through the entire FM band, even with a 3 volt tuning voltage, and also because it is quiet enough to use for this sort of thing. I had listened to the basic oscillator plenty on an FM radio while working on the Band Switched Oscillator project.
For more detail: A Low Power PLL FM Transmitter using LMX1601 and ATtiny2313 microcontroller