SDR « YU3MA

Si5351 + PIC16F1455 USB controller – download

Filed in SDR Comments Off on Si5351 + PIC16F1455 USB controller – download

Si5351 USB controller GUI

Si5351 + PIC16F1455 USB kontroler je napokon dobio i prvu javnu verziju upravljačkog programa v0.2b.
Program je pisan u JavaScript sa NW.js (node-webkit) i podržan je Windows, Linux i OS X operativni sistem.
NW runtime biblioteke za odgovarajući OS možete preuzeti ovde.
Više detalja kako pokrenuti NW aplikaciju ovde.
U prilogu je i arhiva za preuzimanje sa firmware (HEX) datotekom za PIC16F1455.

Si5351 GUI v0.2b
Si5351-PIC16F1455 USB serial Firmware

, , , ,

10MHz vremenska baza sa Morion MV89A OCXO

Filed in SDR Leave a comment

Nakon pisanja o standardu frekvencije preko mobilnog telefona u ovom članku, hteo sam da praktično probam i vidim koliko je ta generisana frekvencija stabilna.

Pošto se generalno radi o vrlo stabilnom i preciznom izvoru frekvecije koja dolazi iz telefona kada se uređaj zaključa-sinhronizuje sa GSM mrežom, za bilo kakva merenja i poređenja je neophodno imati neki merni uređaj sa takođe vrlo stabilnom vremenskom bazom.

Posle pretrage raznih ponuda na Ebay, našao sam vrlo povoljno korišćen fabrički duplo temperaturno stabilisani oscilator (OCXO) ruske firme Morion, model MV89A. Po specifikaciji ovaj oscilator ima zadivljujuće karakteristike i idealan je za upotrebu kao vremenska baza sa merne uređaje poput frekvencmetra. Cena ovakvih novih modula je pozamašna i reda je nekoliko stotina USD dok se polovni moduli na Ebay mogu naći za 20-40 USD i cena im uglavnom zavisi od godine proizvodnje. Imajte u vidu da nam u ovom slučaju čak i odgovara da oscilator bude sa ranijim datumom proizvodnje jer tako možemo da budemo sigurni da je proces starenje kristala zavšen tkz “aging” (obično posle 2-4 godina aktivnog rada) te da u narednom periodu neće dolaziti do bitnog “klizanja” generisane frekvencije.

Sledeca fotografija pokazuje konkretan primerak MV89A pre nego sto sam ga ugradio u kutiju.

Morion MV89A OCXO

Oscilator sam ugradio u metalnu kutiju u kome je smešten ispravljač i 12V regulator napona baziran na LM317. Zbog prirode ovih oscilatora i potrebe za relativno većom radnom temperaturom unutar kutije, pored decoupling SMD MLCC X7R kondenzatora ugradio sam i elektrolitičke kondenzatore firme Nichicon iz HE serije koje inače preporučujem za opštu upotrebu zbog svojih sjajnih karakteristika i veoma dugim radnim vekom. Unutar kutije sam ugradio i jedan 10-obrtni trimer potenciometar koji je povezan za ulaz za fino trimovanje frekvecije (naponsko upravljanje). Sam oscilator poseduje i referetni 5V naposnki izlaz koji je upravo predviđen da se na njega spoji spomenuti potenciometar.

Sledeći korak koji sam uradio je bilo merenje osnovnih parametara ovog oscilatora i poređenja sa tehničkom specifikacijom radi utvrđivanja praktičnog stanja ovog polovnog primerka.

Morion-MV89A

Kao što se može videti na snimku sa osciloskopa, ovaj primerak i izmereni parametri zadovoljavaju tehničku specifikaciju. Nivo harmonika je u okviru specifikacije od -40dBc kao i izlazni nivo od +7.25dBm. Takođe potrošnja struje pri hladnom startu i nakon dostizanja radne temperature su u okviru specifikacije. Sve u svemu ovaj primerak je u odličnom stanju i generalno sjajna Ebay kupovina 😉

Sledeći korak je bio sastavljanje merne postavke. Sklopljen oscilator sam priključio kao spoljašnju vremensku bazu na Fluke 7260A frekvecmetar. Izlaz iz glavnog oscilatora Motorole C139 je preko 50Ω koaksialnog kabla priključen u frekvencmetar.

IMG_3603

Pošto mi je cilj bilo merenje stabilnosti generisane frekvencije koja dolazi iz oscilatora mobilnog telefona kao i apsolutna tačnost frekvencije par predpostavki tj mernih uslova sam morao da usvojim. Prva predpostavka je ta da MV89A ima dovoljnu stabilnost generisane frekvencije tj bolju od 0.05ppm (GSM specifikacija) a po specifikaciji za ovaj OCXO bi to trebalo da bude tačno. Druga predpostavka vezana za apsolutnu tačnost frekvencije je ta da mobilni telefon stvarno generiše frekvenciju u okviru 0.05ppm što je opet vrlo izvesno jer u suprotnom GSM tehnika nebi mogla da radi. Ovakve predpostavke sam morao da usvojim jer tehnički nemam etalon frekvencije sa kojim bi to inače trebalo da se odradi (rubidiumski ili ceziumski etaloni frekvencije).

Uzimajući u obzir drugu predpostavku, izvršio sam fino podešavanje generisane frekvencije MV89A oscilatora preko spomenutog trimer potenciometra i podesio tako da na frekvencmetru dobijem što tačnije 26MHz izmerenu vrednost koliko je inače frekvencija oscilatora mobilnog telefona nakon sinhronizacije sa GSM mrežom.

Napokon, nakon više stotina merenja došao sam do rezultata takvog da mi je frekvencmetar pokazivao variranje frekvencije od svega +/-0.4Hz na generisanoj frekvenciji od 26MHz ili u prevodu greška je bila u okviru 0.015ppm! To je fenomenalan rezultat za kućne uslove! Podsetiću vas samo da recimo jedan običan kristalni oscilator koje vidjamo po raznim (prostim) spravama mogu da imaju varijaciju frekvencije u okviru 100-300ppm tako da je ovaj dobijeni rezultat bolji neverovatnih 6000x do 20000x!!!

Ovde se takođe mora uzeti u obizr da su dobijene varijacije izmerene frekvencije praktično suma varijacija samog OCXO oscilatora kao i oscilatora iz telefona i ne može se pouzdano reći ko je od njih nestabilniji. Takodje je vrlo ohrabrujuća činjenica da sam dobijao potpuno iste rezultate kada kod da sam izvršio merenje, preko dana, uveče,  nakon mesec dana, itd što ukazuje na fenomenalnu dugoročnu stabilnost i otpornost (ne uticaj) na promenu temperature okoline.

Zaključak:

Morion MV89A se pokazao kao izuzetno stabilan oscilator i moja preporuka za njega pogotovo zbog cene po kojoj može sad polovan da se nađe na Ebay. Ukoliko želite da vaš trenutni frekvencmetar (ili npr signal generator, PLL, DDS itd) pretvorite u krajnje ozbiljnu spravu, ugradnjom ili povezivanjem ovog oscilatora možete dobiti za nekoliko klasa tačnije merenje/generisanje frekvencije! Takodje spomenuta metoda sa mobilnim telefonom vam može obezbediti referetnu frekvenciju u okviru 0.05ppm što je više nego dovoljno za bilo koju amatersku upotrebu pa čak i za ozbiljnu profesionalnu upotrebu!

73 de YU3MA

,

Si5351 + PIC16F1455 USB controller 2. deo

Filed in Digital | SDR Leave a comment

Posle male pauze, vratio sam se malo na temu Si5351A + PIC16F1455.

Ovom prilikom sam praktično izradio PCB i sklopio uređaj po mojoj šhemi objavljenoj u ovom postu.

Si5351A PIC16F1455 USB kontroler

Si5351miniUSB

Na izradi pločice mi je pomogao B. Jagodić (1OXB) i ovom prilikom mu se zahvaljujem.

Konstrukcija je na HW nivou proradila bez ikakvih problema. SW za PIC je bilo potrebno malo modifikovati ali se sve u suštini zasniva na već objavljenom algoritmu iz ove teme.

Jedina razlika koju sam naknadno ustanovio posle preciznog merenja generisane učestanosti je vezana za opterećenje kristala. Naime, preporučeno opterećenje od 10pF je pravilo previliku inicijalnu grešku skoro na svim primercima koje sam napravio i kretalo se izmedju 13 – 17ppm što je van specifikacije za upotrebljeni kristal 7M-27.000MEEQ-T za koji se navodi 10ppm u punom temeraturnom opsegu.

U vezi ovoga praktično ne postoji zvanična dokumentacija ali je problem verovatno vezan za samu ulaznu kapacitivnost nožica na kućistu Si5351 koji dodaju jos koji pF. U tom smislu je potrebno izabrati opterećenje od 8pF sa strane Si5351 i to upisivanjem HEX vrednosti 0x92 u registru broj 183.

Na ovaj način se inicijalna greška smanjila na 5 – 6ppm što je već prihvatljivo. Tehnički je potrebno odprilike 9pF opterećenje da bi bila još manja greška ali takva opcija ne postoji u Si5351, postoji samo 8pF ili 10pF.

Još par korisnih linkova u vezi ove teme:

Upravljački SW od SQ9NJE
https://github.com/sq9nje/si5351

Tema u vezi Si5351
http://sp-hm.pl/thread-2019-post-21090.html

Testiranje Si5351 od NT7S
http://nt7s.com/2014/05/si5351a-investigations-part-3/

PS: U planu mi je još jedna verzija ovog sklopa (DCOXO) ali koja će imati akcenat na stabilnost generisane učestanosti korišćenem veoma preciznog termo regulatora (u okviru 0.1 °C) za grejanje kristala sa kojim očekujem kratkoročnu stabilnost u okvirima ili bolju od 0.1ppm.

, , , ,

Si5351 + PIC16F1455 USB controller

Filed in Digital | SDR Leave a comment

Si5351-USB

 

U prilogu PDF verzija sheme sa dodatnom objasnjenjem.

, ,

Signal generator 0 – 30MHz LM4F120XL + AD9850

Filed in Audio | Digital | SDR Leave a comment

Probao sam jedan vrlo zanimljiv SW paket pod nazivom “Energia”. To je ultra prost IDE koji je nastao iz Arduino serije programskih okruzenja.

U paketu dolozi dosta primera koji su veoma citljivi i laki za dalju nadogradnju i sto je najbitnije radi sve iz prve!

http://energia.nu/Guide_Windows.html

U najavi je i podrska za C2000 kontrolere sto moze biti vrlo korisno u kombinaciji sa Piccolo LaunchPad.

Evo jedan praktican primer kako mi je ispao Signal Generator i Sweeper sa AD9850 (low-cost modul sa Ebay) + Stellaris LaunchPad EK-LM4F120XL. Trenutno je seriski upravljiv (eto i comm radi fino na 115200 baud) preko USB emulacije.

Ispod ovih plocica je moja proto board (busena), samo sa vezama i da mi drzi na gomili ove modulcice, nema nikakva dodatna elektronika ispod.

Trebao bih ovde jos na Stellaris da nabodem CapSense (430BOOST-SENSE1) modul da bude ceo uredjaj nezavistan od racunara ali imam “glup” problem jer mi trebaju 200k 0602 SMD otpornici koje trenutno nemam (moraju da se dodaju jer ovaj Stellaris nema HW modul za CapSense nego drugacije malo muckaju pa su neophodni ti otpornici).

BTW: Drugi BNC izlaz sam planirao da mi bude SyncOUT tj triger kada radi u Sweep modu kako bi moao na osciloskopu da crtkam neke zanimljive figure.

IMG_3224

Ovo vam je super kombinacija i povoljna (8$ LauncPad + 8$ AD9850 modul + LCD) da prosto dodjete do veoma ozbiljnog signal generatora za opseg od 0 do 20MHz (moze i do 30MHz ali opada nivo zbog atenuacije u internom LPF filteru).

Za SW sam iskoristio ovo:

http://forum.stellarisiti.com/topic/558-ad9850-with-energia/

http://forum.stellarisiti.com/topic/384-simple-hd44780-library-without-driverlib/

73 de YU3MA

UPDATE 23.08.2014

Sledeće slike prikazuju talasne oblike i spektralni sastav generisanog signala pri 20MHz i 30MHz frekvenciji.

AD9850-20MHz AD9850-30MHz

Sledeća slika prikazuje frekvetni odziv od 0Hz do 30MHz (sweep) pri 50Ω terminaciji. Primetno je da signal iz generatora zbog internog low-pass filtera ne menja amplitudu do nekih 7MHz nakon čega počinje da opada.

DS2_QuickPrint1

, , , , , ,

Princip stabilizacije operacionih pojacivaca na kapacitivno opterecenje

Filed in Audio | Linear | SDR Leave a comment

Uh sto sam jednu opaku caku primenio u ZMSDR i generalno kod SoftRock konstrukcija koje imaju niskosumne i brze OP za demodulator.

Dodavanjem JEDNOG JEDINOG (ukupno dva za dva OP-a) otpornika sam toliko unapredio konstrukciju da ja prosto ne mogu da verujem!!!

Naime sta je problem sa ovim dobrim OP-ovima koji se koriste kod demodulatora, ako dobro progledate tehnicku specifikaciju za upotrebljeni OP, primeticete stavku gde se navodi njegova sposobnost za “vozenje” kapacitivnog opterecenja, nesto izrazeno u 100 – 200pF, naravno kod drugih modela moze ta vrednost biti drugacija, uzeo sam za primer OPA1662 koji uglavom koristim za ove namene zbog svojih ostalih fenomenalnih karakteristika.

ds-spec

Sta to prakticno znaci? To znaci da ce OP raditi STABILNO ako su vrednosti kapacitivnog opterecenja na njegovim izlazima ispod tih granica. Pitate se kakve sad to veze ima kapacitivno opterecenje? Pa ima mnogo veze 🙂

Pod kapacitivnim opterecenjem se racuna sve sto je prikljuceno na njegov izlaz, dakle od stampanih vodova, preko konektora i kablova do ulaza u sledeci stepen – zvucnu katicu.

Izmerim ja parce koaksialnog NF kabla koje koristim za povezivanje (oko 1m duzine) i pokaza mi C-metar 180pF … Uf zgranuo sam se … Sa konektorima i kada se on prikljuci na ulaz zvucne kartice to se sigurno jos poveca (to nisam mogao da izmerim, smetale su mi klamp diode u samoj zvucnoj kartici) ali generalno sam prekoracio nivo preporucenog kapacitivnog opterecenja. Posledicno to znaci da mi je sam OP “brljavio”, nije potpuno prooscilovao nego “delimicno” i unosio totalno nelogicne anomalije u signal koje su mi varirale sa izabranom prijemnom ucestanoscu.

Svratio @macolakg kod mene i nesto pricali uopsteno oko OP-ova i tih pojava i on mi predlozi varijantu sa tehnikom za “izolaciju” kapacitivnog opterecenja od povratne grane kod OP-ova.

Poslusam ga, uzeo moj ZMSDR, malo secnuo stampu tamo-vamo i ugurao jedan 100Ω otpornik izmedju izlaza iz OP i povratne grane, po ovom principu:

capacitive-load

Dobio sam tako nevorovatnu promenu da ja jos ne mogu da se nacudim 🙂 Apsolutno cist signal, nema nikakvih fleka i duhova, mogu sad da stavim kolko hocu parce kabla … Totalno druga “pesma” 🙂 … Opaka caka!

Ovo je primenjeno u ZMSDR v3.1 revizija 4.

Ovo je generalni princip stabilizacije OP-ova na kapacitivno opterecenje i primeljivo je u prakticno svim konstrukcijama nevezano za SDR, posebno je zanimljivo za audio konstrukcije!

Evo ovde malo vise oko te problematike:

http://www.analog.com/library/…gue/archives/31-2/appleng.html

http://ww1.microchip.com/downloads/en/AppNotes/00884b.pdf

http://www.analog.com/library/…/38-06/capacitive_loading.html

http://www.analogzone.com/acqt0704.pdf

, , , ,

ZMSDR V3.1

Filed in SDR Leave a comment

zmsdr-v3-1

ZMSDR v3.1 PDF shematic

, ,

Si5351A treci deo

Filed in SDR 1 Comment

1000000.0Hz

Heh, kako dobiti ovako nesto na izlazu iz Si5351? 🙂

Posle duzeg vremena uspeo sam da dodjem do konkretnog algoritma za kalkulaciju frekvencije.
Ovo je samo deo (mozda najbitniji) u celoj proceduri postavljanja izlazne frekvencije na Si5351.

Da pokusam da objasnim princip generisanja ucestanosti.

Frekvencija kristala (27MHz) se interno u Si5351 prvo umnozi (u mom slucaju 30 puta za PLLA) kako bi se dobila medjufrekvencija za FVCO (810MHz) koja se posle deli nekim racionalnim brojem (iskazanim u MSx registrima) radi dobijanja zeljene izlazne frekvencije.

Npr da bi dobili 1.023MHz na izlazu treba uraditi ovakav racun:
27MHz * 30 / 791.788856304985 = 1.023MHz
Ili obrnuto kako prakticno ulazimo u racun:
27MHz * 30 / 1.023MHz = 791.788856304985

Broj 791.788856304985 kao takvog ne mozemo da upisemo direktno u delitelj vec kao razlomak npr najpriblizniji je 791+269/341 sto je prakticno srz problema i uslovljeno je samom tehnickom konstrukcijom unutar IC-a. Dakle ne moze direktno da se upise ovaj decimalni broj jer bi onda sam IC morao da radi vrlo slozenu matematiku koja zahteva poprilicno procesorskog vremena i RAM memorije pa se to “prebacuje” da neko drugi radi, obicno PC ili neki snazniji mikrokontroler gde ima takvih resursa. Dodatno je malo kriticno sto algoritam za “racionalnu aproksimaciju” zahteva u vecini slucaja oko 30-50 iteracija a za jos vecu preciznost oko 300 da bi nasao rezultat sto je prilicno zahtevno.

Resenje se svodi na to da se prvo izdvoji celobrojna vrednost 791 (u dokumentaciji referenciran kao parametar a) i ostatak 0.788856304985 da se iskaze kao razlomak dve celobrojne vrednosti (u dokumentaciji referenciran kao parametar b i c), dakle delitelj=a+b/c. Primenom algoritma “racionalne aproksimacije” je moguce naci takve dve celobrojne vrednosti za b i c koje najblize odgovaraju zahtevu (269/341=0.78885630498534) u nekom specificiranom opsegu brojeva. Kada imamo a, b i c onda se dodatnim “muckanjem” to razlozi i upise u 8 x 8bit registre. U predhodnom resenju gde sam racunao a,b i c na najprostiji nacin (delio/mnozio sa 100000) sam dobijao greske i to se manifestovalo tako sto kada krenem da “motam” LO frekvenciju iz SDR programa u jednu stranu, on ide malo unapred pa se vrati (skoci) nazad pa nastavi opet u jednu stranu, prilicno lose.

Ideja za ovo resenje je potekla od izvornog code-a linux kernel drajvera za Si5351 koje sam sasvim slucajno nasao.

Dakle radi se o racunu za MSx registre (delitelj koji generise izlaznu ucestanost pojedinacnog izlaza, setite se ima ih 3 ili 8) dok je vrednost za PLLA registar (mnozitelj ulazne frekvencije kristala) fiksno postavljena na parnu decimalnu vrednost 30 kako bi se iskoristio tkz “integer mode” (FBA_INT = 1) radi smanjivanja jitter-a (preporuka proizvodjaca).

XTAL_PPM je vrednost nakon kalibracije uredjaja i koja zavisi od svakog pojedinacnog primerka sklopa i njegovog kristala. Za racun PPM-a koristite ovaj online kalkulator:
http://www.jittertime.com/resources/ppmcalc.shtml
Kao sto se moze videti na postavljenoj fotografiji, neophodan vam je neki precizan i kalibrisan frekvencmetar ili kalibraciju uraditi nekom drugom metodom.

Ovo je samo deo cele price oko Si5351 pa je i dalje neophodno dobro protumaciti tehnicku dokumentaciju i aplikacinu notu AN619.

Ovo sam postavio zato sto o tome ne pisu ni u jednom dokumentu za ovaj IC 😉

Sledeci code prikazuje moju realizaciju te kalkulacije.
U pitanju je C jezik i ovo sam implementirao u upravljackoj aplikaciji za moj ZMSDR (ne u PIC).
Jedan deo ove kalkulacije koji se tice racionalne aproksimacije je baziran na code-u sa ove stranice i bazira se na tkz “Farey-evoj sekvenci”.

Kako dobijene vrednosti SI_REGS konkretno upisati u Si5351 preko PIC mikrokontrolera koristeci I2C protokol i sta se desava u samom PIC nekom sledecom prilikom 😉

 

    double currentFrequency = 1.0; //Zahtevana frekvencija u MHz

    bool DEBUG = FALSE;
    double XTAL = 27; //MHz

    //Korekcija / kalibracija
    //double XTAL_PPM = 0; //
    double XTAL_PPM = −13.625; //korekcija za moj primerak
   
    if (XTAL_PPM != 0) {
        double tmp_ppm;
        tmp_ppm = XTAL * XTAL_PPM / 1000000;
        XTAL = XTAL + tmp_ppm;
    }
   
    //
    // Postavimo PLLA da bude recimo 30 da bi koristili integer mod
    // i ona se upisuje jednokratno u Si5351 od strane PIC−a posle reset.
    // Reprezentacija ove vrednosti za registre (dec) 26  33 je (hex):
    // 00 01 00 0D 00 00 00 00

    double PLLA_MULT_RATIO = 30;
   
    double FVCO = XTAL * PLLA_MULT_RATIO; //810MHz
   
    double REQ_DIV; //zahtevani delitelj
   
    int p1, p2, p3;
    int r = 1;
   
    unsigned char SI_REGS[8];
 
    //koji je odnos deljenja potreban za Multisynth
    REQ_DIV = FVCO / currentFrequency;
   
    double a,b,c,d,mediant,x,N; //x = frakcioni broj, N = denominator
    double out_a, out_b, out_c;
    bool loop_break = false;
   
    double cnt;
    cnt = 0; //informativno da vidim kolkiko je prolaza napravio
   
    //
    // Algoritam za racionalnu aproksimaciju zahtevanog delitelja
    // Ovo je primenljivo za PLLA, PLLB i sve MultySinth delitelje
    //

    //koji je odnos deljenja je potreban za Multisynth
    REQ_DIV = FVCO / currentFrequency;
   
    x = REQ_DIV  (int)REQ_DIV; //uzmi samo vrednost iza zareza
   
    N = 10000; //denominator
   
    a = 0;
    b = 1;
    c = 1;
    d = 1;
   
    if (x == 0) {
        //nemamo racionalni broj
        //under construction!

        //jel kojim slucajem parni da udjemo u mod MSO_INT=1
        if ((int)REQ_DIV % 2 == 1) {
            //neparan  odd
            printf(“REQ_DIV %i je neparan \n”, (int)REQ_DIV);
            //under construction!
        } else {
            //paran  even
            printf(“REQ_DIV x%i je paran \n”, (int)REQ_DIV);
            //under construction!
        }
       
        out_b = 0;
        out_c = 1;
       
    } else {
        while (b <= N && d <= N) {
           
            cnt++;
           
            mediant = (a+c)/(b+d);
            if (x == mediant) {
                if (b + d <= N) {
                    out_b = a+c;
                    out_c = b+d;
                    loop_break = TRUE;
                    break;
                } else if (d > b) {
                    out_b = c;
                    out_c = d;
                    loop_break = TRUE;
                    break;
                } else {
                    out_b = a;
                    out_c = b;
                    loop_break = TRUE;
                    break;
                }
            } else if (x > mediant) {
                a = a+c;
                b = b+d;
            } else {
                c = a+c;
                d = b+d;
            }
        }
       
        if (loop_break == FALSE) {
            if (b > N) {
                out_b = c;
                out_c = d;
            } else {
                out_b = a;
                out_c = b;
            }
        }
    }
   
    out_a = (int)REQ_DIV;
    //
    // Kraj racuna za racionalnu aproksimaciju 
    //
   
    if(DEBUG)
    printf(“REQ_DIV=%f x=%f out_a=%i out_b=%i out_c=%i cnt=%i\n”,
         REQ_DIV, x, (int)out_a, (int)out_b, (int)out_c, (int)cnt);
   
    //
    // Pretvori u zahtevan format za registre
    //   
    p1 = 128 * out_a + floor(128*out_b/out_c)  512;
    p2 = 128 * out_b  out_c * floor(128*out_b/out_c);
    p3 = out_c;
  
    if(DEBUG)
    printf(“p1=%u p2=%u p3=%u\n”, p1, p2, p3);
   
    //
    // Raspodeli vrednosti po registrima
    //
    SI_REGS[0] = (p3 >> 8) & 0xFF;
    SI_REGS[1] = (p3 >> 0) & 0xFF;
    SI_REGS[2] = ((int)(log(r)) << 4) | (0 << 2) | ((p1 >> 16) & 0x3);
    SI_REGS[3] = (p1 >> 8) & 0xFF;
    SI_REGS[4] = (p1 >> 0) & 0xFF;
    SI_REGS[5] = (((p3 >> 16) & 0xF) << 4) | (((p2 >> 16) & 0xF) << 0);
    SI_REGS[6] = (p2 >> 8) & 0xFF;
    SI_REGS[7] = (p2 >> 0) & 0xFF;
   
    if(DEBUG)
    printf(“%X %X %X %X %X %X %X %X\n”,
           SI_REGS[0], SI_REGS[1], SI_REGS[2], SI_REGS[3],
           SI_REGS[4], SI_REGS[5], SI_REGS[6], SI_REGS[7]);
   

    //
    // Odavde nanize je pisanje SI_REGS u Si5351
    // Ovo je specificno za svaku pojedinacnu HW implementaciju
    // Ja sam koristio PIC sa USB<>I2C u CDC modu
    //
    // Napomena: Ovo je samo za delitelje, neophodno je postaviti i
    // ostale registre prema upustvu iz Silicon Labs AN619
    //

    //
    // POSIX stil pisanja u filehandler
    //

    FILE *file; //stdio definicija
   
    file = fopen(“/dev/cu.usbmodem411”, “w”); // open device
    //file = fopen(“/Users/vm/proba.txt”, “w”); // open file
   
    if (!file) {
        if(DEBUG)
        printf(“File can’t be opened!”);
    }
  
    char usb_out[12];
   
    usb_out[0] = cmd; //cmd for PIC
    usb_out[1] = SI_REG_MS0[0];
    usb_out[2] = SI_REG_MS0[1];
    usb_out[3] = SI_REG_MS0[2];
    usb_out[4] = SI_REG_MS0[3];
    usb_out[5] = SI_REG_MS0[4];
    usb_out[6] = SI_REG_MS0[5];
    usb_out[7] = SI_REG_MS0[6];
    usb_out[8] = SI_REG_MS0[7];
   
    //write to device
    fwrite(usb_out, 1, 12, file);
   
    fclose(file);
   
    if(DEBUG)
    printf(“File written!”);
   

Napomena: Ovaj algoritam je direktno primenljiv na generisanje frekvencija od nekih 0.5MHz pa do 112.5MHz (imajte u vidu da za SDR treba 4x veca brzina clock-a). Za frekvencije ispod 0.5MHz neophodno je ukljuciti dodatne izlazne delitelje (R) dok za frekvencije iznad 112.5MHz pa do 150MHz treba da se menja i vrednost mnozitelja za PLLA po istom principu/algoritmu kao za MSx. Za frekvencije od 150MHz do 160MHz se koristi treci, nesto prostiji, princip 🙂

Dodatno imajte u vidu da samo delitelji u MSx mogu “u letu” da se upisuju sto daje “glitch free frequency change” a kada se menja PLLA ili PLLB mora da se radi njihov reset sto dovodi do privremenog prekida rada oscilatora.

Inace postoji jedan vrlo specifican slucaj za ultra mali clock-jitter kada su vrednosti MSx i PLLx parne celobrojne vrednosti, setuju se posebni registri FBx_INT i MSx_INT. Primetice te u gore pokazanom programu da to nisam odradio (deo gde pise “under construction!”) jer se te kombinacije desavaju samo za vrlo specificne frekvencije (ima ih oko 4490 od bezbroj raspolozivih) a posto je prakticno nemoguce da ce te imati konstrukciju bez PPM korekcije onda one i ne vaze, tj bile bi tehnicki pomerene za tu PPM razliku. Prakticno govoreci, kome je bitniji manji clock-jitter umesto tacnosti generisane frekvencije moze ovo da iskoristi. Te frekvenciju su recimo ovakve (prikazano zadnjih 30, ostale su razbacane ispod 10MHz):

si5351_ultra_low_jitter_freqs

I za kraj, vreme promene frekvencije za Si5351 je negde oko 336µs (toliko treba da se preko I2C upise 8 registra u burst modu, nema zakljucavanja) sto je odlican rezultat i prakticno 30 puta brze od Si570 kome treba oko 10ms da se “zakljuca” 🙂

73 de YU3MA

, , , ,

RTL-SDR + Raspberry Pi

Filed in SDR Leave a comment

Pokrenuo sam RTL-SDR, tacnije RTL-TCP na Raspberry Pi minijaturnom racunaru.

RTL-SDR and Raspberry Pi

Bez ikakvih poteskoca kompletan drajver je uspesno kompajliran na ovoj platformi i to RADI!!!.

Za sad probam samo u serverskom modu, tacnije demodulaciju radim na drugom racunaru preko LAN mreze i SDR#.
U sutini radi isto kao na svakom drugom racunaru ali imam utisak da ima manje problema sa smetnjama.

Nisam jos stigo da probam demodulaciju na samom Raspberry Pi. Tu se koristi rtl_fm programcic koji iako pise FM od skora moze SVE vrste modulacija da demodulise, znaci AM, FM, LSB, USB itd.
Posto je moj stik prepravljen za DS mode, sam rtl_fm nema jos integrisanu logiku da se prebaci u taj mod pa se sad igram sa source code da prepravim da to radi.

Dakle, eto to je KOMPLETAN SDR prijemnik iz kojeg na kraju izlazi zvuk, dokle je to otislo 🙂

, ,

Si5351A drugi deo

Filed in SDR Leave a comment

Kao sto sam i predpostavio, trebalo mi je malo vise vremena da funkcionalno osposobim kontrolu Si5351A programabilnog oscilatora.

Sam IC sa svojih 10 nozica izgleda krajnje prosto ali se unutra krije poprilicno komplikovana logika.

Kao prvo, tehnicka dokumentacija ima gomilu gresaka tako da vodite racuna ako se upustite u eksperimente sa njim. Dalje, sam datasheet ne obuhvata opis svih raspolozivih registra! Nasuprot tome, aplikaciona nota AN619 daje vec detaljniji opis ali opet i u njoj sam nasao nekoliko (ne toliko kriticnih) gresaka. Nije mi jasno kako tako ozbiljan proizvodjac poput Silicon Labs moze to da dozvoli sebi!

Posto se radi o nesto komplikovanijoj problematici, na raspolaganju su dve varijante za pravljenje “frekvetnog plana”, tj proracun potrebnih vrednosti za interne registe.

Prva varijanta je izrada plana pomocu ClockBuilder Desktop Software. Ovaj program prakticno iskoriscava sve mogucnosti IC-a i evo ukratko spisak opcija:

– Mogucnost definisanja bilo koje ucestanosti na pojedinim izlazima
– Mogucnost podesavanja Sleew-rate (struje / snage izlaza)
– Mogucnost podesavanja internog opterecenja kristala (0, 6, 8 i 10pF)
– Biranje izmedju 25MHz i 27MHz frekvencije referetnog kristala
– Podesavanje stanja kada je odredeni izlaz iskljucen (Low, High, High Z)
– Inicialni fazni ofset izmedju izlaza (bug-uje IC, ima nekonzistentno ponasanje!)
– Podesavanje tolerancije kristala kroz unos ppm odstupanja (bug-uje program, tehnicki uopste ne radi!)
– Mogucnost podesavanja Spread Spectrum opcija (za modele IC koji to podrzavaju)
– Direktno programiranje preko Silicon Labs EVB modula
– Export frekvetnog plana za narucivanje pre-programiranih IC od proizvodjaca (OTP opcija)
– Export frekvetnog plana u TXT format sa spiskom vrednosti svih registra

ClockBuilderDesktop-Si5351A-x-GT

Dakle pomocu ovog programa mozemo da dobijemo izracunate vrednosti registra koje ce dalje da iskoristimo u nekom posebnom I2C kontroleru (sa pratecim adekvatnim programom) koji ce i fizicki da postavi te registe u sam Si5351.

Ali, ovako smo dobili samo jednu (ili vise) fiksnih ucestanost na izlazima od IC sto bar u prici sa SDR i nije toliko korisno. Kako da napravimo promenljivi oscilator (aka VFO) od toga?

To je vec nesto komplikovanija prica koja prakticno znaci da sve sto je ovaj spomenuti program izracunao uradimo isto u nekom nasem programu (drajver-u) ili u samom upravljackom (I2C) kontroleru i da uradimo kompletnu kalkulaciju svaki put kada zelimo da promenimo generisanu ucestanost. Na vasu a i moju radost, ovo sam “savladao” i o tome cu pisati u sledecem nastavku 😉

Za kraj samo jednu finu stvar da spomenem po kojoj se ovaj IC jos razlikuje od Si570, Si5351 radi fenomenalno brzo prvo u I2C komunikaciji koja moze da ide do 400Khz a najbitnije je da se njegov PLL veoma brzo lock-uje na zadatu ucestanost (kod Si570 je potrebno 10ms u najgorem/najcescem slucaju) i to bez prekida izlaza pa se prakticno dobija veoma glatka (smoth) kontrola sa dobrim odzivom reagovanja kao sto se vidja na svim fabrickim primoredajnicima.

Do sledeceg pisanja,
73 de YU3MA

,

TOP