High-End Bridge LM3886 Audio amplifier – 2. deo

Filed in Audio Leave a comment

Nakon što je Dragoljub Aleksijević - Macola objavio šemu High-End audio pojačivača baziranom na mostnom spoju dva LM3886 + LME49720 o kojem sam pisao u ovom članku, u DIY krugovima je nastalo ogromno interesovanje za njegovu izradu.

Na forumu DiyAudioProjct je skoro organizovana grupna kupovina pločice koja je urađena u kombinovanoj SMD + TH tehnici.

Iako je ta verzija pločice V0.8 bila premijerno testirana tek kada su stigli prvi fabrički izrađeni primerci PCB-a, pojačivač je kao sto je autor “obećao” proradio iz prve, bez ikakvih problema i sa karateristikama koje bar ja do sad nisam sreo kod drugih home-made audio pojačivača!

IMG_4750

IMG_4759

Da vam prepričavam kako se to čuje bilo bi previše subjetivno ali zato ovaj oscilogram (ko zna da to detaljno tumači) govori sam za sebe. To je prikaz izlaznog (pojačanog) signala kada se na ulaz dovede pravougaoni test signal, inače najteži mogući test za jedan audio pojačivač.

IMG_4753

Frekventni odziv ovog pojačivača je oko +0,1dB i -0,15dB, od 20Hz do 20KHz i ta malena odstupanja su tek pri krajevima opsega što se vidi na sledecem grafikonu.

Freq-Response-BatoMM

Šum pojačivača nisam uspeo do izmerim jer je ispod granice šuma mog HP54601A osciloskopa! Izlazni offset je stabilan i kreće se oko 100µV i najviše je vezan za mogućnost preciznog podešavanja na 10-obrtnom helikoidnom trimer potenciometru.

Ovakve perfomanse su rezultat fenomenalnog pristupa i konstrukcije koju je autor odradio i jednim delom zbog upotrebe “guste” konstrukcije sa upotrebom SMD komponenti na kritičnim tj osetljivim delovima pojačivača gde prvenstveno mislim na “širokopojasni” de-coupling vodova za napajanje izlaznog stepena.

Ono što je dodatno zanimljivo je vezano za upotrebljeni LM3886 koji se pokazao superiornim u odnosu na veliki broj drugih integrisanih (pa i velikog broja diskretnih) audio pojačivača i bez preterivanja mogu da kažem da se radi o trenutno najboljem integrisanom Power Operation Amplifier na svetu! Na sve to, ogromnu pomoć ovom pojačivaču daje odličan LME49720 u ulozi ultra brzog integratora (tehnicki gledano PID regulator) koji i neke eventulane sitne anomalije izlaznog stepena može da koriguje – otuda oni skoro savršeni pravi uglovi na izlaznom signalu prikazanom na oscilogramu.

Ovaj pojačivač radi tako “brzo i pedantno” da može bez problema da se iskoristi kao RF pojačivač za 2200m tj 136kHz radio amaterski band :)

Dakle radi se zaista o veoma veoma kvalitetnom audio pojačivaču za koji i sam autor tvrdi da ništa bolje u domenu audio tehnike u životu nije konstruisao, po meni, pravo remek delo :)

BTW: Na gore prikazanoj pločici se umesto LME49720 vidi LM4562. Radi se od 100% identičnim operacionim pojačivačima! Texas Instruments je “pokušao” da re-brandiranjem jednog istog IC-a podigne cenu u “audiofilskim” krugovima ali na našu sreću to im nije pošlo za rukom! Ostale su dve različite oznake za isti IC sa istom cenom :)

Šta dalje da vam kažem, ako želite da probate ovu konstrukciju, registrujte se na forum i pogledajte ovu temu (na forumu pojačivač poznat pod imenom “BatoMM”) pošto će verovatno biti organizovana još neka grupna kupovina pločica i delova.

Takođe je u najavi od istog autora i kvalitetan SMPS (PFC + LLC) ispravljač koji će biti “optimizovan” za ovaj audio pojačivač.

So, stay tuned ;)

73 de YU3MA

, , , , , , ,

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

, , , , , ,

Texas Instruments C2000 LaunchPad XL – HRPWM

Filed in Audio | Digital Leave a comment

Skoro sam dosao u posed jednog vrlo zanimljivog razvojnog modula. U pitanju je Texas Instruments LaunchPad XL sa TMS320F28027 32bit-nim real-time kontrolerom.

C2000-LaunchPad-TMS320F28027

Nisam jos stigao prakticno da ga probam ali po karakteristikama koje su navedene u specifikaciji ovog modula i samog upotrebljenog procesora veoma obecava!

Ovakvih i slicnih modula ima puno na trzistu, recimo kao vrlo popularan SM32F4Discovery od firme ST.

Medjutim ono sto ovaj modul i generalno sam upotrebljeni procesor izdvaja od spomenutog konkurenta je set specificnih HW opcija koje se nalaze u samom kontroleru.

Glavna HW opcija koja je bar meni veoma zanimljiva je njegov HRPWM interni sklop, veoma brz/precizan PWM generator.

Cisto poredjenja radi, spomenuti STM32F4 kontroler (DSC / DSP) kao i najjaci dsPIC iz “GS” serije od Microchip imaju PWM rezoluciju koja je maksimalno 1ns. Kod svih ostalih klasicnih kontrolera je ta rezolucija mnogo puta manja.

TMS320F28027 sa svojim HRPWM modulom nudi rezoluciju od neverovatnih 180ps (piko sekunde)!

Texsas Instruments ima i jos bolji procesor, verovatno najbrzi integrisani PWM kontroler trenutno na trzistu sa 70ps u svojim modelima kontrolera iz Delfino serije, ali u ovom trenutu ce njega da presko posto se pravi u minimalno 177 pinskom PLCC kucistu koje jako nezgodno za “hobi” upotrebu. Ovaj TMS320F28027, popularniji kao Piccolo je u dosta manjem kucistu sa kojim i nekako moze da se izbori u kucnim uslovima izrade PCB.

Zasto mi je bas HRPWM interni modul toliko interesantan?

Sa pojavom sve brzih i mocnijih MOS-FET ili IGBT tranzistora, PWM kao tehnika modulacije signala postaje svakim danom sve atraktivnija.

Jos vise postaje zanimljivija od kada je PWM tehnika prebacena u digitalno upravljivi domen (nasuprot analognom koji se decenijama unazad koristi) jer je moguce signal obraditi ili pripremiti u digitalnom domenu nasuprot sto bi se to radilo u cisto analognom domenu sa podosta neophodnog analognog hadrwera.

PWM kao tehnika ima primenu u bezbroj konstrukcija ali je glavno da se moze posmatrati kao neki digitalno-analogni konverter (D/A). Uz spomenute MOS-FET koji ce raditi kao digitalni pojacivaci (samo u stanju 0/1) moguce je realizovati bezbroj konstrukcija koje imaju veoma dobro iskoriscenje energije ili baratati sa ogromnim strujama/snagama upravo zbog malih gubitaka.

Ukratko, PWM se koristi skoro kod svih vrsta prekidackih ispravljaca / pretvaraca (SMPS) i prakticno svim topologijama, buck/bust, off/online, flyback, rezonantnim tipovima (LLC) itd.

Takodje, PWM tehnika se koristi i kod Class-D Audio pojacivaca sto je meni u sustini i najvise zanimljivo (mada sa SMPS tek planiram da se igram).

Ovde dolazi HRPWM modul iz spomenutog procesora na delo. Kada imamo programski “na izvolte” tako precizan i brz PWM generator, imamo na raspolaganju fenomenalnu rezoluciju kasnije dobijenog analognog signala koje pruzaju odlicne perfomanse nekog buduceg sklopa koji pravimo sa tim. Zavisno od krajnje upotrebe, nekome je potrebna veoma visoka PWM frekvencija (reda MHz, recimo omogucava ogroman prenos energije kroz feritne transformatore – povecava se “power density” ili olaksava kasnije filtriranje) ili neka niza ucestanost ali sa vecom rezolucijom kao sto je recimo potrebno za Class-D audio pojacivace. Rezolucija naspram PWM frekvencije je u suprotnoj zavistnosti, ne moze “i jare i pare” :)

Sledeca tablica prikazuje raspolozive PWM frekvencije i efektivnu rezoluciju koju je moguce ostvariti sa HSPWM modulom (crveno uokvireno). Takodje se vidi i specifikacija za standardne PWM module koji se vidjaju po drugim procesorima, ogromna razlika!

TI-HRPWM

Kao sto se vidi iz tablice, moguce je vrsiti direktnu digitalnu modulaciju audio signala sa ovim modulom.

Ovo odprilike predstavlja buducnost Audio pojacivaca, sve ce vise konstrukcija biti realizovanih po tom principu zbog ogromnog iskoriscenja (reda 90-95%) kod Class-D topologije.

Obzirom da smo ovako zasli u digitalno signalno procesiranje (DSP), primenom raznih tehnika i matematickih algoritama je moguce izvrsiti obradu signala sa jako kompleksnim funkcijama koje prakticno uopste vise nisu izvodljive u analognoj varijanti! Ovde pre svega mislim na vrlo specificne algoritme kod modulacije signala gde se raznim matematickim cakama signal “priprema” pre nego sto udje u PWM modulator kao bi se dobilo jos bolje iskoriscenje, povecao frekventni opseg, smanjio shum, povecala dinamika, smanjila distorzija (THD, IMD), prakticno moguce je anulirati sve anomalije digitalnog pojacivaca “unapred” (feed-foward pristup) samo upotrebom matematike!

Prakticni primeri ovakvih matematichih algoritama u ovom trenutku se cuvaju bukvalno kao “tajna”, vrlo su kompleksni i potrebno je jako puno vremena za njihov razvoj. DSP procesori, izvornim konstruktorima/programerima, na taj nacin omogucavaju da zastite intelektualnu svojinu (IP – Intelectual Properties) jer neki konkretan/gotov HW moze da se prosto iskopira (procesor, tranzistori i nesto sitnih R/L/C delova okolo), ali program iz tih procesora skoro nikako ako je zasticen!

U svakom slucaju, ovim HRPWM modulom i celom razvojnom plocicom cu se tek baviti jer ima prakticno neogranicene mogucnosti za realizaciju raznih konstrukcija iz Power (SMPS) i Audio (Class-D) tehnike. Ovaj Piccolo procesor je bio samo izbor necega najboljeg po tom pitanju trenutno na trzistu.

BTW: Spomenuti TMS320F28027 ima u sebi veoma (VEOMA) brz 12bit-ni A/D konvertor sa specificiranih 4.6MSPS brzinom uzorkovanja! Mozete samo za predpostavite zasto to spominjem, sa tim moze da se napravi jedno 16 puta bolji (manji shum, veca dinamika) direct-conversion SDR prijemnik nego sto smo to videli kod vec cuvene RTL-SDR serije donglova koji ima interni A/D sa 8bit na 4MSPS. U neka doba ce i to da probamo ;)

BTW2: Spomenuti modul moze se kupiti direktno od proizvodjaca po vrlo popularnoj ceni od 17.05 US$ sa besplatnom FeDex dostavom.

Nastavak sledi …

73 de YU3MA

, , , , , , , ,

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

, , , ,

Digital Class-D amplifier with DSP

Filed in Audio | Digital Leave a comment

Nakon relativno kratkog upoznavanja sa DSP (DSC) procesorima iz Microchip-ove dsPIC serije, uzeo sam kao primer da napravim jedan Audio pojacivac.

Posto je tema oko DSP relativno obimna, evo za pocetak samo shema kako izlgeda moja varijanta digitalno modulisanog Class-D audio pojacivaca u full-bridge postavci.

Vise detalja uskoro …

YU3MA-Digital-ClassD-AMP-r3

YU3MA-Digital-ClassD-AMP-r3

YU3MA-Digital-ClassD-AMP-r3

, , , ,

Microchip PIC32 & dsPIC

Filed in Digital Leave a comment

PIC32_dsPIC

Da li ste nekad videli 32bitni procesor ili DSP u  PDIP-28 kucistu? Ja iskreno nisam video do sad :)

Igrajuci se sa upravljackim kontrolerom za Si5351 realizovan pomocu PIC16F1455 (8bitni procesor), shvatio sam da sam dosao do granice gde on prakticno vise ne moze da se izbori sa mojih zahtevima bar na neki prost nacin.

Problem je iskocio kada sam pokusao da algoritam za racionalnu akproksimaciju o kojem sam pisao u clanku Si5351A treci deo neophodan za racun izlazne frekvencije prebacim u ovako “skroman” kontroler.

U sustini sam uspeo i to radi, ali glavni problem je nastao sa matematickim mogucnostima gde sam ogranicen na “samo” 24bitnu preciznost racuna kako bih dobio one cifre poput 1000000.0Hz.

Za tako veliku tacnost mi je potreban bar 32bitni racun koji spomenuti PIC16F1455 bi i mogao da odradi ali uz podosta komplikacija i relativno sporo. Onda sam krenuo u potragu za nekim “jacim” kontrolerom …

Gledajuci ponudu raspolozivih kontrolera na Microchip-ovom sajtu, zadesih se u sekciji 32bitnih kontrolera koje sam do sad iz ne znam kog razloga zaobilazio. Kada sam malo bolje pogledao sta tu sve ima i sa kakvim mogucnosti i u kakvim kucistima, iskreno zaprepastio sam se.

Microchip je napravio seriju fenomenalnih 32bitnih procesora nakrcani sa opakim HW funkcijama od kojih bih samo naveo recimo ultra precizni PWM (koristan za razne SMPS namene) pa onda modeli sa integrisanim audio DAC-ovima, USB host kontroleri, modeli sa 512KB flash memorije u sebi i svasta nesto jos.

Hmm, to je sve na izlged bilo odlicno, ali sta je pozadina toga, sta mi je potrebno da pokrenem takav PIC, koji programator, koji kompajleri, bezbroj pitanja …

Obzirom da sam zbog spomenutog PIC16F1455 bio prinudjen da nabavim PICkit 3 programator (PICkit 2 ga ne podrzava) uvidom u listu podrzanih kontrolera shvatio sam da taj programator prakticno podrzava “skoro” sve PIC-ove, ukljucujuci 32bitne i DSP procesore. Pa to je prelepo . A sta je sa razvojnim alatima, kompajlerima i kako uopste pisati programe za takve kontrolere? Microchip je i na to sve mislio, postoje besplatne verzije XC32 C/C++ kompajlera! Hmm, pa ovo vise nije shala!

Porucio sam nekoliko modela kontrolera u plasticnom PDIP kucistu kako bih mogao malo da se igram na proto board-u. I tako se ja uhvatih 32bitnih kontrolera …

Nisam jos stigo da prakticno pokrenem neki od ovih PIC32 (dsPIC u nekoj sledecoj fazi), ali malo gledajuci po dokumentaciji za XC32 videh da u sustini to nije nista manji problem nego za bilo koji drugi PIC, prakticno je SVE ISTO!

BTW: Iako su mi kolege preporucivale da se uhvatim Atmel-a i AVR-ova, nekako nisam mogao iz razloga sto se njihovi 32bitni kontroleri ne prave u ovakvim kucistima vec samo SMD sto je komplikacija za sebe i dosta mi otezava celu pricu.

Posto je ovo sve relativno novo za mene, odlucio sam da otvorim posebnu sekciju na moj sajtu Digital gde cu pisati o ovim stvarima.

Za sad toliko, bice novih clanaka kada budem pokrenuo neki od ovih PIC32 makar da pali/gasi LED :)

73 de YU3MA

, , ,

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 :)

, ,

TOP