MxL5007T tuner radio

 Author:   Posted on:   Updated on:  2018-10-06T18:57:33Z
MxL5007T is a tuner IC designed mostly for digital signals (DVB-T, ATSC), but it can be used for analog reception too. I will show you how I took it out from a receiver so I can use it in my projects. It has a programmable IF output and it can receive anything from 44 to 885 MHz. There is no datasheet for it, but there are Linux drivers.

Looking at the PCB of a SCART DVB-T MPEG2 receiver I found no components I could use. But, a closer look at the tuner which was basically an area of the PCB enclosed in metallic box revealed only a few tracks coming out of the tuner area. Since it’s rather easy to interface a tuner to a simple demodulator and build a high quality receiver, I decided to try to cut the receiver PCB around the tuner and see if I could reuse it in my projects.

Receiver specifications said it can receive 170 to 230 and 470 to 862 MHz. These seem to be software limits, because the product brief sheet claims this IC can receive from 44 to 885 MHz. First of all I had to trace some lines due to the lack of pinout information. Then I cut (really) the PCB and placed the tuner inside a metal box with easy to make connections. I re-used a metal box from a broken TV tuner.

Probable pinout of MxL5007T tuner on PCB
Probable pinout of MxL5007T tuner on PCB
Antenna input and loop output were very easy to identify since the original antenna connectors were soldered into those places. The power supply line was assumed to be the track that has a greater width than the others and has some capacitors connected to ground. Testing continuity revealed it comes from a 3.3V regulator. Two other tracks are pulled up with 4.7k resistors to 3.3V. I assumed those are I2C bus lines. Which is SDA and which is SCL is easy to identify because the IC will respond only if you get them right. There is even an Arduino I2C scanner sketch that can detect a device on the bus (an it will detect it only if SDA and SCL are properly connected). Another two tracks come out from MxL5007T and are capacitor coupled. Probably this is the IF output. I have no idea if this is an I-Q output or a simple differential output. The AGC track passes through a SMD inductor and is also capacitive coupled to ground. This filter suggests some sort of steady voltage will be on it, that’s why I’m saying it’s AGC. There’s one last track passing through an inductor before reaching antenna input. This can’t be anything else but the power line for an antenna amplifier.

Tuner PCB in a new metal case
Tuner PCB in a new metal case
Everything was connected with tiny pieces of thin wire to a small piece of circuit board that held also the pins on the metal case. In the end, my tuner had fewer pins than the original one in the case.

To see if I got the pinout right and test the reception I had to build a demodulator. The simplest one was an FM detector built around TA2003 IC. With this I should be able to receive broadcast FM stations on 88 to 108 MHz band.

Simple FM receiver with MxL5007T tuner
Simple FM receiver with MxL5007T tuner
A tuner takes an user chosen piece of the RF spectrum and translates it to a smaller, fixed frequency. After this frequency conversion, the resulting intermediate frequency signal is passed to a demodulator. The problem here is that TV receiving devices usually have the IF center around 36 MHz. An 8 MHz wide piece of the RF spectrum is available for demodulation at this IF. An FM radio demodulator expects a 250 kHz wide IF centered around 10.7 MHz. Knowing this there are three approaches:
  • Take the IF from tuner, consider it as any RF signal and perform an extra conversion. Frequency conversions are performed by mixing two signals (the incoming RF with a local oscillator). The mixing result must be an IF at a common frequency, such as the 10.7 MHz for FM detectors. Therefore local oscillator (L.O.) should work at a frequency that’s either 10.7 MHz higher or lower than input RF.
  • Take the IF from tuner and demodulate it at its frequency. Simpler design, but impossible to find filters. If we’d do this, Fi1 in above schematic should be replaced with a 36.125 MHz filter that has 250...300 kHz bandwidth. Also Fi2 must be replaced. Here you can use an LC pair tuned to 36.125 MHz, but I doubt you’ll ever find a replacement for Fi1 at this center frequency.
  • Take advantage of tuner’s configurable IF and large bandwidth. This IC can set IF center at 9.1915 MHz. Knowing that the output can’t be less than 6 MHz wide, you can connect IF output straight to Fi1 input. Fi1 will chop all signals except those around 10.7 MHz that can be demodulated with standard components. If you do this, remember always to tune (set tuner frequency) 10.7 – 9.1915 = 1.5085 MHz below (or above) than the signal you want to receive.

I went for the first method and built a double conversion receiver. First conversion takes place inside the tuner and the second one at the mixer of TA2003. This is actually called double superheterodyne receiver. Second approach requires impossible to find components while the third is an option only when tuner can output an IF closer to standard FM IF.

The practical disadvantage of this double conversion is that you have to build and adjust the local oscillator LC pair. This should be built inside a can (you know those RF can coils inside every radio). Adjustment is done by setting the tuner to a frequency of a radio station and then tuning the coil until you receive it. You will hear neighboring stations while adjusting local oscillator coil, because signals from a piece of 6...8 MHz of the FM band can reach the demodulator. You know you got the right L.O. frequency when you hear what you should hear at the frequency you set the tuner to. Practical build of TA2003 receiver on 36 MHz will be in the updated version of this post.

Let’s get to the digital part. The tuner is a an I2C slave device. There are no datasheets to describe I2C interface, but the existing Linux drivers for hardware using this tuner provide enough information.

I came up with an Arduino library for MxL5007T. Remember not to connect it to 5V Arduino without level shifter. 5V should not reach MxL5007T on any pin. If your tuner uses a different XTAL frequency than 24 MHz, you need to change some register settings in function MxL5007T::init from mxl5007t.cpp source (it’s around line 100). Replace those two setRegBits calls according to in use XTAL frequency.
// 16 MHz
setRegBits(init_tab, 0x03, 0xf0, 0x00);
setRegBits(init_tab, 0x05, 0x0f, 0x00);

// 20 MHz
setRegBits(init_tab, 0x03, 0xf0, 0x10);
setRegBits(init_tab, 0x05, 0x0f, 0x01);

// 20.25 MHz
setRegBits(init_tab, 0x03, 0xf0, 0x20);
setRegBits(init_tab, 0x05, 0x0f, 0x02);

// 20.48 MHz
setRegBits(init_tab, 0x03, 0xf0, 0x30);
setRegBits(init_tab, 0x05, 0x0f, 0x03);

// 24 MHz
setRegBits(init_tab, 0x03, 0xf0, 0x40);
setRegBits(init_tab, 0x05, 0x0f, 0x04);

// 25 MHz
setRegBits(init_tab, 0x03, 0xf0, 0x50);
setRegBits(init_tab, 0x05, 0x0f, 0x05);

// 25.14 MHz
setRegBits(init_tab, 0x03, 0xf0, 0x60);
setRegBits(init_tab, 0x05, 0x0f, 0x06);

// 27 MHz
setRegBits(init_tab, 0x03, 0xf0, 0x70);
setRegBits(init_tab, 0x05, 0x0f, 0x07);

// 28.8 MHz
setRegBits(init_tab, 0x03, 0xf0, 0x80);
setRegBits(init_tab, 0x05, 0x0f, 0x08);

// 32 MHz
setRegBits(init_tab, 0x03, 0xf0, 0x90);
setRegBits(init_tab, 0x05, 0x0f, 0x09);

// 40 MHz
setRegBits(init_tab, 0x03, 0xf0, 0xa0);
setRegBits(init_tab, 0x05, 0x0f, 0x0a);

// 44 MHz
setRegBits(init_tab, 0x03, 0xf0, 0xb0);
setRegBits(init_tab, 0x05, 0x0f, 0x0b);

// 48 MHz
setRegBits(init_tab, 0x03, 0xf0, 0xc0);
setRegBits(init_tab, 0x05, 0x0f, 0x0c);

// 49.3811 MHz
setRegBits(init_tab, 0x03, 0xf0, 0xd0);
setRegBits(init_tab, 0x05, 0x0f, 0x0d);
The simplest Arduino sketch using this library could look like this:
#include <mxl5007t.h>

MxL5007T tuner;

void setup() {
  tuner.init();

  Serial.begin(9600);
  Serial.println(tuner.chipId());
  
  tuner.setFrequencyAndBw(102500000, 6);
}

void loop() {
  unsigned char lock = 0, ref = 0;

  tuner.getLockStatus(lock, ref);

  if (lock) Serial.println("RF  Lock"); else Serial.println("Rf  NOT");
  if (ref) Serial.println("ReF Lock"); else Serial.println("ReF NOT");

  delay(2000);
}
The reception quality is very good (if you use proper antenna and turn the AGC potentiometer – R3). IF inversion does not affect the signal unless your detector is not centered on the right IF frequency. ISDB, DVB and ATSC modes don't seem to change anything. Each of the IF outputs can be connected to TA2003 RF input. Do not short them. Do not connect the other to the ground.

The frequency step of the tuner is 15.625 kHz, smaller than common TV tuners that have 31.25 kHz or 62.5 kHz. Although you pass frequency in Hz, it is rounded to multiples of 15625 Hz.

Whether or not you stumbled upon this IC in a receiver, it is good to know that sometimes you can work things out even without a datasheet.

No comments :

Post a Comment

Please read the comments policy before publishing your comment.