News:

;) This forum is the property of Proton software developers

Main Menu

Low power FM transmitter chip.

Started by John Drew, Apr 29, 2022, 12:37 AM

Previous topic - Next topic

John Drew

G'day all,
I just read Les's post on Facebook about his work on a receiver using a si4730 chip. He's talking about a future project for a TX but sounds like it will be AM.
Does anyone know of a chip that will generate an FM transmission of up to 10kHz deviation with a carrier frequency up to 450MHz?

Some background, I've used the si4351 to generate programmable frequencies but they don't do what I want as the 4351 is very rich in harmonics (square wave) and I haven't found a way to put FM audio on a si4351 even assuming I can tolerate the harmonics.

The project is a very simple battery powered signal generator that can be taken to a repeater site for calibrating deviation levels. It should have enough output to be heard without plugging into a receiver antenna socket, perhaps 10dBm output. I'll use a programmable pot to change deviation levels with a 1kHz modulating tone which is my standard.

I have a nice Marconi sig gen but it weighs a ton and I don't want it bouncing around in the back of the 4WD on the rough tracks up the hill.

Any ideas?
Thanks
John

shantanu@india

John,
What is the compilers Facebook page?
Can you pm me?
Regards
Shantanu

rick.curl

Hi John-
Far be it from me to deprive you of the thrill of constructing this yourself, but did you see this?: 470 Mhz FM signal generator

-Rick

John Drew

G'day Rick,
I had a look at it, not bad for the price. The description is a bit strange. My application needs enough oomph to get into the antenna of the repeater 30m away and vertically above. A null in the pattern so I reckon a minimum of +10dBm output, preferably 20dBm. By feeding via the antenna I include the whole system in the test.

A friend has suggested feeding a tone into a handheld. Could be a workable idea if I arrange for differing levels of audio to match certain deviations.

Thanks anyway for the generator suggestion Rick.
Cheers
John

david

Hi John,
Was that device you used a Si5351 rather than the Si4351 you mentioned?   The Si5351B has facility for VCO input and indicates a modulation bandwidth of typ 10kHz and a pull range of +/-240ppm.  It won't hit the output frequency you want but with CMOS output the 3rd harmonic will only be about 10dB down from fundamental so you could use 150MHz output and pick off the 3rd.  Sounds like you may need an output stage anyway.
All the Silabs/Skyworks synthesized devices will be digital outputs with high harmonic levels and are aimed mainly at telco applications with differential outputs.  If you want clean outputs with digital resolution there are always DDS chips from Analog Devices but they get expensive and power hungry.

Cheers,
David

trastikata

Quote from: John Drew on Apr 29, 2022, 12:37 AMAny ideas?

Hi John,

I remember couple of years ago I "played" with AX5043 which is Narrow-Band 27-1050MHz Transceiver, supporting FM modulation and the frequency can be programmed in 1 Hz steps but for the love of God I couldn't figure out all the registers there.

Regards

Yasin

Hello John. If 1.5mW would work. The old U2740B could have been used. Maybe boosting the RF output can be the solution.

John Drew

Greetings all, thanks for your helpful comments.
QuoteWas that device you used a Si5351 rather than the Si4351 you mentioned?   The Si5351B has facility for VCO input and indicates a modulation bandwidth of typ 10kHz and a pull range of +/-240ppm.

David, you're right it was the si5351. I became dyslexic didn't I.
I used the code written by Les. Worked a treat. At the time I bought a board from somewhere. If I can find a "B" version on a board it would be good.

Some background on this project which is working but not to my liking. I now want to improve it. I used a si5351 for the RF source which was fine to replace the crystal in an old exciter module from a transmitter. This provided output on the 2M band (144-148MHz) and the 3rd harmonic for a signal on the 70cm band. The exciter had provision for modulation so it all worked OK. I had a touch pad graphic display to enter and display the required frequency and deviation. Math sorted the actual crystal frequency. Audio from an oscillator in the PIC passed through an I2C controlled pot to manage the modulation (all adjusted for multipliers etc). I'm not really happy with the exciter module operation and it's harmonic on the 70cm band is not strong. I also had problems with stability in the exciter module.

So, I thought if I dispensed with the exciter module and produced the signal directly it would be better. Because it's already made up in a nice die cast box with a LiIon battery and graphic display a simpler solution would be a winner.

My first move now (thanks to the info on the "B" version) is to see if the si5351B is available on a board - I'm hopeless at soldering the SM stuff.

Again, thanks to you all for your replies.
John

top204

#8
Excellent details John. I've been caught out quite a few times by harmonics. :-) I designed a multi-mode mobile phone detector and it used a 26MHz crystal oscillator on the PCB, and one perticular frequency in the  low GHz range had a noise on it? It had me puzzled, until I worked out that the frequency was a multiple harmonic of the 26MHz crystal oscillator feeding the local oscillator chip. :-) A change of PCB routing was needed to shield the crystal oscillator better, and it worked well.

I still remember, as a young-un, learning about frequency multiplication using tuned amplifiers at a harmonic of the original frequency. At the time it baffled me, until I created circuits myself and it all fell into place. :-)

The si5351B versions do come on boards, but they are quite expensive, for what they are:

https://www.ebay.co.uk/itm/284774469080?epid=22051667314&hash=item424de18dd8:g:S30AAOSw0PtdOqNB

For modulation, you might be better using an SPI digital resistor as a DAC, or a DAC itself, because SPI is a lot faster that I2C.

JonW

#9
TI Produce some really nice VCO/PLL that can do FM modulation, I have used the LMX2572 and the LMX2595 in many applications for test equipment.  These devices have exceptional phase noise and good output power (can get > +10dBm @ 500MHz). They generally incorporate high frequency VCO's and sub divide the output.  For sub 500MHz the next harmonic can easily be filtered with a very simple LPF, frequency step size can also be sub Hz if required.  In band spurs are very low if you have issues with fractional or integer boundary  spurs you can add dithering or adjust the sigma delta modulator parameters to reduce them.  .  I have not used the modulation function (Yet) but others have.  Check out the ERA Micro Synth, these guys have implemented FM with an external MOD input or internally generated waveform, I think this is open source so you can get access to the design info. 

Getting these going is relatively simple and all you need is a decent TCXO as the reference and a MCU at sub 6GHz FR4 on a 4 layer controlled impedance process (Something like JLCPCB 7628 is perfect). Don't be put off with the sheer number of registers with <20k of code space I managed to get them dynamically tuning to 1kHz step size over the full bandwidth by sending a simple string to the serial port.  For a fixed frequency setting you can use the TICS Pro Gui to provide all of the register info and just bang these into a lookup table.  You can then manipulate the individual registers associated with the modulation to get the required deviation etc.  Or maybe simple FSK or stepping the source +/- 10kHz can be used

https://erainstruments.com/

LMX2572

Check out Hope RF Modules as well, these are pretty flexible little devices that can be controlled easily https://www.hoperf.com/ic/rf_transmitter/CMT2119AW.html.  Many are available on modules for a few dollars

Many years ago I developed some ASK and FM transceivers and we used Saw resonators and single BJT (BFP420 from Infineon).  You can create FSK of FM fairly easily adding a varactor.  If you have any old crystals lying around you could look at building a simple oscillator using crystal at a sub divided frequency, use a varactor to pull the crystal and then pick off the harmonic, amplify and filter the response.  Be very low cost for a fixed frequency.


JonW

If you don't fancy designing the PCB, here is one already done https://www.ebay.com/itm/233317598013


top204

#12
That is an excellent price. And free shipping to here in the UK, so it should also be to Australia because it is closer (I think. LOL)

Ebay is actually getting more and more expensive, and Amazon is the king of "Rip Off Greed", and always has been. Even when it was just selling books, they were always stupidly priced for second hand books. But the "sheep" follow advertising and promotions. :-)

John Drew

Thanks David, I'll order one today and the good part (aside from price) is that the existing code will work.
I've really appreciated all the time people have put into their research.
Cheers from Oz,
John

david

Good luck with the project John and watch out for the fine print......  Make sure it is the chip you think it is.

Cheers,
David

joesaliba

Quote from: top204 on May 03, 2022, 05:09 PMand Amazon is the king of "Rip Off Greed", and always has been. Even when it was just selling books, they were always stupidly priced for second hand books. But the "sheep" follow advertising and promotions. :-)

No wonder why Jeff Bezoz is wealthiest person on earth!!

Joe

John Drew

Board ordered, it says the B version. Working on trust!!
So it will either be a good result or a lost modest sum. They reckon a fortnight to deliver - if it's that quick I'll be amazed freight free.
I'll keep the group informed of whether it works out.
John

streborc

Has anyone a sliver of code for the SI5351 that minimally wakes it up to generate any frequency that they are willing to share?  I acquired a couple Si5351 modules and neither is responsive to the commands I'm sending it.  TIA

top204

Back in 2016, I got a piece of code sent, that was written by stefano, that was, apparently, based upon some of my earlier code with charlie, that I cannot find yet.

I have not tested the code, however, I have listed the code below for you to try, as it migh give you some ideas:

'****************************************************************
'* Name : Si5351A.BAS *
'* Author : Les and Charlie with a few mods from me *
'* Notice : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 13/04/2016 *
'* Version : 1.0 *
'* Notes : frequency synthesiser si5351A *
'* : adjust cXTAL_FREQ to calibrate *
'* Stefano new device added: 18f448 & Fuse conf. 05/05/2016
'****************************************************************
;-------------------------------------------------------------------------------


;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings


    Device = 18F448


Config_Start
  OSC = HS    ;HS oscillator
  OSCS = OFF    ;Oscillator system clock switch option is disabled (main oscillator is source)
  PWRT = OFF    ;PWRT disabled
  BOR = OFF    ;Brown-out Reset disabled
  BORV = 25    ;VBOR set to 2.5V
  WDT = OFF    ;WDT disabled (control is placed on the SWDTEN bit)
  WDTPS = 128    ;1:128
  STVR = On    ;Stack Full/Underflow will cause Reset
  LVP = OFF    ;Low-Voltage ICSP disabled
  Debug = OFF    ;Background Debugger disabled. RB6 and RB7 configured as general purpose I/O pins.
  Cp0 = OFF    ;Block 0 (000200-001FFFh) not code protected
  CP1 = OFF    ;Block 1 (002000-003FFFh) not code protected
  CPB = OFF    ;Boot Block (000000-0001FFh) not code protected
  CPD = OFF    ;Data EEPROM not code protected
  WRT0 = OFF    ;Block 0 (000200-001FFFh) not write protected
  WRT1 = OFF    ;Block 1 (002000-003FFFh) not write protected
  WRTC = OFF    ;Configuration registers (300000-3000FFh) not write protected
  WRTB = OFF    ;Boot Block (000000-0001FFh) not write protected
  WRTD = OFF    ;Data EEPROM not write protected
  EBTR0 = OFF    ;Block 0 (000200-001FFFh) not protected from Table Reads executed in other blocks
  EBTR1 = OFF    ;Block 1 (002000-003FFFh) not protected from Table Reads executed in other blocks
  EBTRB = OFF    ;Boot Block (000000-0001FFh) not protected from Table Reads executed in other blocks
Config_End


;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------


    Declare Xtal = 20

    Declare SDA_Pin PORTC.0 'may need adjustment
    Declare SCL_Pin PORTC.1
    Declare Slow_Bus On

    Declare LCD_CommandUs 2000
    Declare LCD_DataUs 50

    Declare LCD_Type 0 'text type
    Declare LCD_DTPin PORTD.4 'assigns data lines to B4..7
    Declare LCD_ENPin PORTD.3 'enable pin
    Declare LCD_RSPin PORTD.2 'RS line pin
    Declare LCD_Interface 4 '4 or 8 input line interface
    Declare LCD_Lines 2 '2 line display

$define cSI_CLK0_Control 16              ' Register definitions
$define cSI_CLK1_Control 17
$define cSI_CLK2_Control 18
$define cSI_Synth_PLL_A  26
$define cSI_Synth_PLL_B  34
$define cSI_Synth_MS_0   42
$define cSI_Synth_MS_1   50
$define cSI_Synth_MS_2   58
$define cSI_PLL_Reset    177

$define cSI_R_Div_1   %00000000       ' R-division ratio definitions
$define cSI_R_Div_2   %00010000
$define cSI_R_Div_4   %00100000
$define cSI_R_Div_8   %00110000
$define cSI_R_Div_16  %01000000
$define cSI_R_Div_32  %01010000
$define cSI_R_Div_64  %01100000
$define cSI_R_Div_128 %01110000

$define cSI_Clk_Src_PLL_A %00000000
$define cSI_Clk_Src_PLL_B %00100000

$define cXtal_Freq 25000000         ' Crystal frequency
$define cI2C_Write %11000000        ' I2C address for writing to the Si5351A
$define cI2C_Read  %11000001        ' I2C address for reading to the Si5351A

    Dim SI5351A_dP1 As Dword ' Synth config register P1
    Dim SI5351A_dP2 As Dword ' Synth config register P2
    Dim SI5351A_dP3 As Dword ' Synth config register P3

    Dim dFreqM As Dword ' display MHz
    Dim dFreqK As Dword ' display kHz

'---------------------------------------------------------------------------
'
' Input     :
' Output    :
' Notes     :
'
Proc SI5351A_I2CSendRegister(pReg as Byte, pData as Byte)
    BStart
    BusOut cI2C_WRITE
    BusOut pReg
    BusOut pData
    BStop
EndProc

'---------------------------------------------------------------------------
'
' Input     :
' Output    :
' Notes     :
'
Proc SI5351A_I2CReadRegister(pReg as Byte), Byte
    BStart
    BusOut cI2C_WRITE
    BusOut pReg
    BReStart
    BusOut cI2C_READ
    Result = BusIn
    BusNack
    BStop
EndProc

'---------------------------------------------------------------------------
' Set up specified PLL with mult, num and denom
' Input     : pMult is 15..90
'           : pNum is 0..1,048,575 ($FFFFF)
'           : pDenom is 0..1,048,575 ($FFFFF)
' Output    :
' Notes     :
'
Proc SI5351A_SetupPLL(pPll as Dword, pMult as Byte, pNum as Dword, pDenom as Dword)

    Dim fNum As Float
    Dim fDenom As Float

    fNum = pNum
    fDenom = pDenom
    SI5351A_dP1 = (128 * (fNum / fDenom))
    SI5351A_dP1 = ((128 * pMult) + SI5351A_dP1 - 512)
    SI5351A_dP2 = ((128 * fNum) / fDenom)
    SI5351A_dP2 = ((128 * pNum) - (pDenom * SI5351A_dP2))
    SI5351A_dP3 = pDenom

    SI5351A_I2CSendRegister(pPll, SI5351A_dP3.Byte1)
    SI5351A_I2CSendRegister(pPll + 1, SI5351A_dP3.Byte0)
    SI5351A_I2CSendRegister(pPll + 2, SI5351A_dP1.Byte2 & $03) '(SI5351A_dP1 & $00030000) >> 16)
    SI5351A_I2CSendRegister(pPll + 3, SI5351A_dP1.Byte1)
    SI5351A_I2CSendRegister(pPll + 4, SI5351A_dP1.Byte0)
    SI5351A_I2CSendRegister(pPll + 5, ((SI5351A_dP3 & $000F0000) >> 12) | (SI5351A_dP2.Byte2 & $0F)) '((SI5351A_dP2 & $000F0000) >> 16))
    SI5351A_I2CSendRegister(pPll + 6, SI5351A_dP2.Byte1)
    SI5351A_I2CSendRegister(pPll + 7, SI5351A_dP2.Byte0)
EndProc

'---------------------------------------------------------------------------
' Set up MultiSynth with integer divider and R divider
' R divider is the bit value which is OR'ed onto the appropriate register, it is a $define
'
Proc SI5351A_SetupMultisynth(pSynth as Byte, pDiv1 as Dword, pDiv2 as byte)

    SI5351A_dP1 = (128 * pDiv1) - 512
    SI5351A_dP2 = 0 ' SI5351A_dP2 = 0, SI5351A_dP3 = 1 forces an integer value for the divider
    SI5351A_dP3 = 1

    SI5351A_I2CSendRegister(pSynth, SI5351A_dP3.Byte1)
    SI5351A_I2CSendRegister(pSynth + 1, SI5351A_dP3.Byte0)
    SI5351A_I2CSendRegister(pSynth + 2, (SI5351A_dP1.Byte2 & $03) | pDiv2) '((SI5351A_dP1 & $00030000) >> 16) | pDiv2)
    SI5351A_I2CSendRegister(pSynth + 3, SI5351A_dP1.Byte1)
    SI5351A_I2CSendRegister(pSynth + 4, SI5351A_dP1.Byte0)
    SI5351A_I2CSendRegister(pSynth + 5, ((SI5351A_dP3 & $000F0000) >> 12) | (SI5351A_dP2.Byte2 & $0F)) '((SI5351A_dP2 & $000F0000) >> 16))
    SI5351A_I2CSendRegister(pSynth + 6, SI5351A_dP2.Byte1)
    SI5351A_I2CSendRegister(pSynth + 7, SI5351A_dP2.Byte0)
EndProc

'---------------------------------------------------------------------------
' Switches off Si5351a output
' Example: SI5351A_OutputOff(cSI_CLK0_CONTROL) will switch off output CLK0
'
Proc SI5351A_OutputOff(pClk as Byte)
    SI5351A_I2CSendRegister(pClk, $80) ' Refer to SiLabs AN619 to see bit values - $80 turns off the output stage
    BStop
EndProc

'---------------------------------------------------------------------------
' Set CLK0 output On and to the specified frequency
' Frequency is in the range 1MHz to 150MHz
' Example: SI5351A_SetFrequency(10000000) will set output CLK0 to 10MHz
'
' This example sets up PLL A and MultiSynth 0 and produces the output on CLK0
'
Proc SI5351A_SetFrequency(pFreq as Dword)
    Dim dPllFreq As Dword
    Dim dFreq As Dword
    Dim fFreq As Float
    Dim bFreq_Mult As Byte
    Dim dFreq_Num As Dword
    Dim dDenom As Dword
    Dim dDivider As Dword

    dDivider = 900000000 / pFreq                ' Calculate the division ratio. 900,000,000 is the maximum internal
    If (dDivider // 2) > 0 Then Dec dDivider    ' Ensure an even integer division ratio
    dPllFreq = dDivider * pFreq                 ' Calculate the pllFrequency: the dDivider * desired output frequency
    bFreq_Mult = dPllFreq / cXTAL_FREQ          ' Determine the multiplier to get to the required pllFrequency
    dFreq = dPllFreq // cXTAL_FREQ              ' It has three parts:
    fFreq = dFreq                               ' bFreq_Mult is an integer that must be in the range 15..90
    fFreq = fFreq * 1048575                     ' dFreq_Num and dDenom are the fractional parts, the numerator and denominator
    fFreq = fFreq / cXTAL_FREQ                  ' each is 20 bits (range 0..1048575)
    dFreq_Num = fFreq                           ' the actual multiplier is bFreq_Mult + dFreq_Num / dDenom
    dDenom = 1048575                            ' For simplicity we set the denominator to the maximum 1048575
'
' Set up PLL A with the calculated multiplication ratio
'
    SI5351A_SetupPLL(cSI_SYNTH_PLL_A, bFreq_Mult, dFreq_Num, dDenom)
'
' Set up MultiSynth Divider 0, with the calculated Divider.
' The final R division stage can divide by a power of two, from 1..128.
' reprented by constants cSI_R_DIV1 to cSI_R_DIV128 (see si5351a.h header file)
' If you want to output frequencies below 1MHz, you have to use the final R division stage
'
    SI5351A_SetupMultisynth(cSI_SYNTH_MS_0, dDivider, cSI_R_DIV_1)
'
' Reset the PLL. This causes a glitch in the output. For small changes to the parameters, you don't need to reset the PLL, and there is no glitch
'
    SI5351A_I2CSendRegister(cSI_PLL_RESET, $A0)
'
' Finally switch on the CLK0 output ($4F) and set the MultiSynth0 input to be PLL A
'
    SI5351A_I2CSendRegister(cSI_CLK0_CONTROL, $4F | cSI_CLK_SRC_PLL_A)
EndProc


'----------------------------------------------------------------------------------------------------------
DisplayFreq:
'    dFreqM = pFreq / 1000000
'    dFreqK = pFreq - (dFreqM * 1000000)
'    dFreqK = dFreqK / 10 'to fit on 16 char display
    Cls
    Print At 1,1,"Freq = ",Dec dFreqM,".",Dec dFreqK,"MHz"
Return

'----------------------------------------------------------------------------------------------------------
Main:
    Clear
    'pFreq = 40000000'set the frequency of operation
    SI5351A_SetFrequency(40000000)
    GoSub DisplayFreq
    Stop

Regards
Les

Fanie

#19
Quote from: John Drew on May 03, 2022, 02:18 AMI'm hopeless at soldering the SM stuff.

Can you not get a hot air soldering station ?
A proper tweezer ?
Magnifying headset ?
A little patience ?

Some of the car lighter plug-in SD player thingies have a low power FM transmitter built in.
Maybe dissect one ?  They are very inexpensive too.
Temu have some FM transmitter things, perhaps something there ?