/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Programmering af "Fractional-N PLL"
Fra : Thomas Lykkeberg


Dato : 07-01-01 17:20

Programmering af "Fractional-N PLL"

Hej med jer.

Jeg ved ikke om det er det rette sted at spørge, men nu prøver jeg
alligevel, så I må bære over med mig.

Jeg står for at skulle lave noget C-kode som udregner 3 parametre for
opsætning af en "Fractional-N PLL". Disse 3 parametre bestemmer
deleren i PLL'ens feed-back loop. Reference frekvensen er 1MHz. N
udregnes på følgende måde:

N = B*32 + A + NF/5

De tre parametre er altså: A, B og NF og udregnes ud fra N på følgende
måder:

B = int( N/32 )

A = int(N) - 32*B

NF = ( N*5 ) mod 5

Her er mod operatoren lig:

d mod n = d - n * int( d / n )

PLL'en skal bruges i en GSM applikation, så derfor skal PLL'en kunne
indstilles til frekvenser med 200kHz "opløsning". Hvis man ønsker at
sende i uplink på GSM900 kanal 2 (ARFCN = 2) kan følgende opstilles:

PLL'ens "udgangs" frekvens:

F-PLL = 890MHz + 424MHz + 2 * 0.2MHz = 1324.4MHz

Hvis PLL'ens reference frakvens så er på 1MHz (og ikke 200kHz som
ville være en del mere beregnings venligt), kan delerens værdi, N
beregnes:

N = F-PLL / 1MHz = 1324.4MHz / 1MHz = 1324.4

Ud fra denne værdi kan A, B og NF så beregnes med "floating point".

B = int( 1324.4 / 32) = 41

A = int( 1324.4 ) - 32*41 = 12

og endelig kan NF beregnes:

NF = ( 1324.4 * 5 ) mod 5 = 2

Det gik jo altsammen fint! MEN med floating point og divisioner med
alt andet end tal af modolus 2. Det går alt for laaaaaannngsomt!!!!

Er der nogen derude som har prøvet at lave noget kode som beregner
noget lingende ud fra et kanal nummer? så ville jeg meget gerne høre
fra dem....

På forhånd mange tak.

Mvh
Thomas

 
 
Soren 'Disky' Reinke (08-01-2001)
Kommentar
Fra : Soren 'Disky' Reinke


Dato : 08-01-01 08:54


> Det gik jo altsammen fint! MEN med floating point og divisioner med
> alt andet end tal af modolus 2. Det går alt for laaaaaannngsomt!!!!

Hvis du ikke har for mange forskellige kanaler, kan du ikke udregne alle på
forhånd og bare slå op i en tabel ?

--
With many Thanks
Soren ' Disky ' Reinke ICQ #1413069 remove 'ihsyd' when email replying
Please visit my Freshwater Aquaria Webpage
http://www.disky-design.dk/fish




N/A (08-01-2001)
Kommentar
Fra : N/A


Dato : 08-01-01 19:48



Thomas Lykkeberg (08-01-2001)
Kommentar
Fra : Thomas Lykkeberg


Dato : 08-01-01 19:48

On Sun, 7 Jan 2001 19:25:22 +0100, fuzz01@spamfilter.dk (Anders Bo
Rasmussen) wrote:

>Det har jeg ikke prøvet. Kan du ikke ved at regne med passende enheder bruge
>heltal? Ellers, hvis der ikke er alt for mange kanaler, er tabelopslag vel også
>en mulighed.

Det med tabelopslaget har jeg overvejet, men der over 1000 kanaler (Rx
+ Tx), så det bliver lidt hukommelses krævende. Og det er der ikke
"plads" til.. desværre. Men jeg har en løsning med heltal, men her
skal jeg trækkes med en division med 5 og en modolus 5... Aarrrgh.

Følgende er min nuværende løsning.

#define GSM_RX_X_VALUE 6475 /* LO frekvens delt med 200kHz. */

NF = ARFCN % 5;
N = GSM_RX_X_VALUE + ARFCN;
N = N / 5;
B = N / 32;
A = N - B * 32;

Her har jeg problemet med %5 og /5, de er ikke særligt hurtige....

Mvh
Thomas

N/A (08-01-2001)
Kommentar
Fra : N/A


Dato : 08-01-01 21:59



Thomas Lykkeberg (08-01-2001)
Kommentar
Fra : Thomas Lykkeberg


Dato : 08-01-01 21:59

On Mon, 8 Jan 2001 20:10:48 +0100, fuzz01@spamfilter.dk (Anders Bo
Rasmussen) wrote:

>On Mon, 08 Jan 2001 19:47:30 +0100,
>Thomas Lykkeberg <thomas.lykkeberg@NOSPAMprivat.dk> wrote:
>
>>Følgende er min nuværende løsning.
>>
>>#define GSM_RX_X_VALUE 6475 /* LO frekvens delt med 200kHz. */
>>
>>NF = ARFCN % 5;
>>N = GSM_RX_X_VALUE + ARFCN;
>>N = N / 5;
>>B = N / 32;
>>A = N - B * 32;
>>
>>Her har jeg problemet med %5 og /5, de er ikke særligt hurtige....
>
>Så vidt jeg lige hurtig kan se, kan du konvertere den ene:
>
>//Ind: ARFCN
>//Ud: NF, A, B
>
>#define GSM_RX_X_VALUE_div_5 1295
>
>ARFCN_div_5 = ARFCN / 5
>ARFCN_div_5_mul4 = ARFCN_div_5 * 4
>NF = ARFCN - ARFCN_div_5 - ARFCN_div_5_mul4
>
>N_div5 = GSM_RX_X_VALUE_div_5 + ARFCN_div_5
>B = N_div5/32
>A = N_div5 - B * 32
>
>
>Det skulle vist gøre det hurtigere, hvis division med ikke-2-potenser er
>langsomt.
Hej og tak for indlæget.

Det var en fin ide. Jeg har testet den lidt og er kommet frem til at
jeg jo slipper for modolus 5 (som er det samme som division med den
compiler jeg bruger), men får til gengæld nogle subtraktioner...
Dejligt!! Det går meget hurtigere.. Endnu en gang tak for hjælpen.

Det trick du lavede med MOD 5, hvordan kom du frem til det? Er det mig
som har set mig blind på noget..?

Mvh
Thomas


Thomas Lykkeberg (08-01-2001)
Kommentar
Fra : Thomas Lykkeberg


Dato : 08-01-01 22:36

On Mon, 08 Jan 2001 21:58:31 +0100, Thomas Lykkeberg

>Det trick du lavede med MOD 5, hvordan kom du frem til det? Er det mig
>som har set mig blind på noget..?

Ok, nu fik jeg den.. hold da kæft hvorfor har jeg ikke set det??

X mod 5 = X - 5 * INT(X / 5) => X - ((5 * X) / 5 ) =

= X - ((4 * X) / 5 + (X / 5))

Men alligevel, tak for hjælpen.. Det hjalp!

/Thomas


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste