0,00 €

V košarici ni izdelkov.

0,00 €

V košarici ni izdelkov.

More
    DomovRevijaVFO za radioamatersko radijsko postajo z uporabo razvojne ploščice STM32F746 Discovery

    VFO za radioamatersko radijsko postajo z uporabo razvojne ploščice STM32F746 Discovery

    Svet elektronike colorPred kratkim sem za revijo Svet Elektronika (SE 289, 290) napisal serijo člankov, v katerih sem opisal svoje prve izkušnje tako s serijo STM32 ARM mikrokontrolerjev, kot tudi izkušnje s programsko opremo za razvoj programov, ki je na voljo za te naprave. Moj prvi vtis iz teh izkušenj je, da ima podjetje ST množico poceni razvojnih plošč, od katerih so nekatere v celoti opremljene tudi z zunanjimi napravami, kot so TFT zasloni na dotik, avdio kodeki in vrata za povezavo z omrežjem.

    Naslednji vtis je name naredilo ST-jevo integrirano razvojno okolje (IDE) STM32Cube, ki je sicer izjemno zmogljivo, vendar ga uporabnik brez izkušenj zelo težko uporablja.

    Moje izkušnje bi se s tem končale, če ne bi odkril razvojne platforme Mbed ARM, spletne aplikacije, ki je enostavna za uporabo. Za razliko od STM32Cube IDE pri spletnem prevajalniku Mbed na lokalni trdi disk ni treba naložiti 2-3 GB programov, knjižnic in ostalih potrebnih datotek. Drug pozitiven vidik razvojnega sistema Mbed je, da ni pomembno, kako hiter je vaš računalnik – vse računsko intenzivne postopke v zvezi s prevajanjem namreč izvajajo Mbed strežniki. V praksi je ta postopek dela veliko hitrejši od tistega, če bi isto programsko kodo prevajal na svojem vrhunskem računalniku z operacijskim sistemom Windows.

    Pred kratkim sem se odločil za načrtovanje projekta za izdelavo VFO radioamaterskega radia, postaje,  torej oddajnika in sprejemnika v eni napravi. Vem, da je na internetu že veliko primerov takšnih projektov. Vsi uporabljajo generator takta s čipom Silicon Labs Si5351, večina pa za prilagajanje frekvence uporablja majhne enkoderje in majhne LCD ali OLED zaslone. Odločil sem se, da si svoj cilj zastavim malo višje.

     

    Izboljšane funkcije

    Mogoče tega ne bi smel priznati, toda tisto, kar me je privedlo k razmišljanju o tem VFO projektu, se je zgodilo, ko sem na Banggoodu zagledal čudovito izdelan  enkoder, vrtljivi dajalnik impuzov.

    Slika 1: To je slika opisanega rotacijskega dajalnika impulzov, ki sem ga  kupil in je bil pravzaprav navdih za ta projekt. V enem obratu dobimo na njegovem izhodu 100 impulzov.

    Slika 1 prikazuje prav ta izdelek.  Spomnil me je na velike vrtljive gumbe za nastavitev frekvence, ki so jih v sedemdesetih letih prejšnjega stoletja imeli le vrhunski radioamaterski sprejemniki. Za razliko od običajnih rotacijskih dajalnikov, ki sem jih uporabljal pri mnogih preteklih projektih, je ta dajal kar 100 impulzov na vrtljaj namesto običajnih 24 ali 32 impulzov. Poceni dajalniki impulzov (enkoderji) pogosto za ustvarjanje teh pravokotnih impulzov uporabljajo drobna mehanska stikala, ki pa pri preklapljanju povzročajo motnje, ki jih moramo potem programsko izločiti z ustreznimi programskimi rutinami. Ta enota uporablja optično preklapljanje in proizvaja idealne pravokotne impulze, popolnoma brez motenj pri prehodih iz enega v drugo stanje. Z velikim, težkim gumbom in z vgrajeno ročico za hitro vrtenje se zlahka fino nastavi želena frekvenca ali pa se hitro prevrti na drugo, bolj oddaljeno frekvenco. Ker sem kupil več teh enkoderjev, je bila takrat prodajna cena približno 16 evrov za kos.

    Medtem, ko je večina VFO izdelkov, ki sem jih videl med brskanjem po internetu, uporabljala majhne in poceni LCD zaslone, sem si v svojem izdelku želel uporabiti nekaj veliko večjega. Sem pač možak v poznih 60-ih letih, zato imam težave z branjem besedila in številk na majhnih LCD-zaslonih, zlasti če zaslon hkrati prikazuje veliko parametrov.

    Če projekt vključuje veliko parametrov, ki jih je treba pogosto nastaviti in če za to uporabljate majhen zaslon, lahko to storite na več načinov. Najcenejši in najlažji način je, da za to načrtujete uporabo posebne tipke, s katero potem preklapljate med različnimi meniji, v vsakem od njih pa potem nastavljate enega ali več parametrov z enim ali več vrtljivimi dajalniki. Namesto tega lahko v ta namen uporabite tudi več različnih stikal, potenciometrov ali enkoderjev.

    Zdelo se mi je, da bi bil najboljša izbira TFT zaslon na dotik, ki hkrati omogoča nastavitev in prikaz vseh VFO parametrov na istem zaslonu. S tem je bila odpravljena potreba po številnih menijih, hkrati pa se je močno zmanjšalo število potrebnih dodatnih stikal, tipk in potenciometrov na čelni plošči. Potreboval sem torej vsaj 3,5-palčni zaslon na dotik, da bi ustrezal mojim zahtevam. Čeprav sem pred kratkim kupil 3,5-palčni Nextion inteligentni zaslon na dotik, me je prijatelj Jure (lastnik podjetja AX Elektronika) prepričal, da sem tudi s tem projektom nadaljeval serijo člankov o mikrokontrolerjih STM32 z uporabo STM razvojne plošče.

     

    STM32F746 – razvojna plošča za raziskovanje

     Če ste prebrali moj prejšnji članek o družini MCM STM32, ki je imel dva dela se morda spomnite, da sem izbral dve razvojni plošči na STM32 osnovi, od katerih sta obe vsebovali tudi zaslon na dotik. Moja prva izbira je bila sicer plošča z oznako STM32F746-Discovery, vendar je ravno ni bilo na zalogi, ko sem se začel prvič zanimati za STM32. Ker sem že po naravi neučakan, sem zato najprej kupil ploščo STM32F469 in začel delati z njo, vendar sem takoj,  ko je bila ploščica STM32F746-Discovery spet na zalogi, naročil še to in začel uporabljati le slednjo.

    Obe plošči vsebujeta velike TFT zaslone s kapacitivnim zaznavanjem dotika. Če ste kdaj uporabljali TFT zaslone z uporovnim zaznavanjem dotika, boste gotovo vedeli, da je zaslon s kapacitivnim zaznavanjem  dotika daleč prekaša uporovno tehnologijo glede natančnosti in boljše uporabniške izkušnje. Obe plošči vsebujeta visokokakovostne zvočne čipe za dekodiranje z vgrajenimi ojačevalniki za slušalke. To me je seveda tudi zanimalo, čeprav te funkcije v projektu VFO ne uporabljam. Obe plošči imata kot del vgrajene strojne opreme tudi podnožje, v katerega lahko vtaknete Arduino ploščico. Obe plošči vsebujeta zelo hitre 32-bitne ARM procesorje in zunanja Flash in SDRAM pomnilnika velike zmogljivosti in s hitrim QSPI dostopom.

    Glede na visokokakovostni zaslon s kapacitivnim  zaznavanjem dotika in vgrajeno kombinacijo zmogljivega mikrokontrolerja in zunanjih naprav se mi zdi cena katere koli od teh dveh plošč (58–65 € pri podjetju Digi-Key) čisto sprejemljiva. Za to ceno ne morete kupiti 4,3-palčnega TFT zaslona s kapacitivnim zaznavanjem dotika in primernega inteligentnega krmilnika, saj se na teh ploščah nahaja le zaslon, zraven pa gotovo ne bi dobili izjemno hitrega ARM mikrokontrolerja in vseh prej omenjenih zunanjih naprav.

     

    Razlogi, da raje delam z STM32F746 ploščo, so naslednji:

    • Ima nekoliko večji, 4,3-palčni TFT zaslon z ločljivostjo 480 x 320 točk. Plošča ‘F469-Discovery ima nekoliko manjši 4-palčni zaslon, v obliki, primerni za pametne telefone, vendar z veliko večjo ločljivostjo, 800 x 600 točk.
    • Večina splošno dostopnih Mbed knjižnic in praktičnih primerov z zaznavanjem dotika je bilo napisanih za delo s TFT zaslonom, ki je vgrajen na plošči F746. Za delo z zaslonom ‘F469’ je zato potrebno vse precej spremeniti, pa še takrat je večina razpoložljivih pisav premajhna, da bi bila čitljiva na manjšem zaslonu z večjo ločljivostjo, ki je vgrajen na plošči F469.
    • Model plošče F746 uporablja mikrokontroler ARM Cortex M7, ki deluje na 216 MHz. Model F469 na drugi strani uporablja manj zmogljiv ARM Cortex M4, ki deluje na 180 MHz. Med njima obstaja ogromna razlika glede zmogljivosti, čeprav lahko tudi priznam, da je ta razlika v tem mojem projektu čisto nepomembna, saj so zahteve za izvedbo VFO programske opreme zelo skromne.

     

    Ustvarjanje signala s Si5351

     Večina VFO vezij, ki jih najdemo v internetu, uporablja priljubljeni čip generatorja takta proizvajalca Silicon Labs z oznako Si5351. To vezje ponuja tri v bistvu čisto neodvisne vire ure v širokem območju od nekaj kilohercev (kHz) do približno 200 MHz (nad 112,5 MHz imate lahko le dve popolnoma neodvisni taktni frekvenci in ne več tri). Gre za čipe, za katere očitno obstaja ogromen trg in kljub temu, da so zelo dovršeni, stanejo le nekaj več kot 1 €, tudi pri nakupu posameznega kosa. Edina težava je njihova velikost, saj so z 10-polnim ohišjem MSOP premajhni, da bi jih povprečni elektronik- samograditelj lahko uporabljal v svojih projektih. To težavo je rešila razpoložljivost  tiskanih vezij z že prispajkanimi čipi in bolj dostopnimi priključki tudi za amatersko rabo. Sam sem uporabil ploščico Si5351 podjetja Adafruit, ki ga lahko prek distributerja Digi-Key zelo hitro dobim tudi tukaj, v Severni Ameriki. Na sliki 2 je prikazano takšno tiskano vezje podjetja Adafruit, vendar pa je mogoče dobiti tudi cenejše kitajske različice, ki so na zunaj videti skoraj enako.

    Slika 2: To je tiskano vezje Adafruit, neke vrste modul, ki vsebuje generator takta Si5351. Ta čip je premajhen, da bi ga enostavno “na roke” prispajkali na tiskano vezje brez primerne opreme za spajkanje SMD elementov.

    V teh napravah se dogaja nekaj “čarobnega”, saj lahko generirajo taktne frekvence z ločljivostjo 1 Hz v celotnem zgoraj omenjenem frekvenčnem območju. Čeprav ima uporabnik oziroma programer povsem odprt vpogled v vse te “čarobne” podrobnosti, je pri uporabi knjižnice Si5351, ki sem jo uporabil v VFO programu, dobro vedeti tudi to, kako na splošno delujejo sintetizatorji frekvenc.

    Čip za sintetizator frekvence, ki pokriva podobna frekvenčna območja, je za TV-sprejemnike in podobne naprave na voljo že približno 40 let. V zadnjih dvajsetih letih je cena teh čipov padla na 5-10 € za kos. Sodobna vezja te vrste pa na splošno pokrivajo veliko višje frekvenčno območje (2 GHz in več), s čimer so prilagojena trgom mobilnih telefonov in Wi-Fi komunikacij. Kakorkoli že, ločljivosti 1 Hz, ki jo zagotavlja Si5351, z njimi ni mogoče doseči.

    Starejši, splošno uveljavljeni frekvenčni sintetizatorji so delovali po arhitekturi, ki je prikazana na sliki 3. To vezje je v bistvu fazno sklenjena zanka (PLL), izvedena z več programirljivimi delilniki. Frekvenca referenčnega kristala se z delilnikom A deli na nizko frekvenco (običajno na frekvenco razmika med posameznimi kanali za predvideno storitev). Nato želeno frekvenco Fout delite s to frekvenco razmika med kanali, da dobite delitveno razmerje. To delitveno razmerje nato uporabljata kaskadno vezana dvomodulni delilnik C in programirljivi delilnik B.

    Slika 3: Blok shema klasične zasnove naprave za sintetizacijo frekvence.

    Ko so se pojavili prvi čipi za sintetiziranje frekvence, je bilo težko ali celo nemogoče načrtovati programirljive delilnike, ki bi delovali na frekvencah okrog 500 MHz in več (potrebnih v aplikacijah, za katere so bili ti čipi pravzaprav razviti). Mogoče pa je bilo načrtovati enostavnejši dvomodulni preddelilnik (prescaler), ki bi deloval na teh frekvencah. Takšni dvomodulni delilniki lahko na primer delijo s 16 ali 15. Gre za odstotek časa, ki ga porabijo za deljenje nekega celega števila v 8-bitnem območju (1-255) s 16, preostali čas pa bi bil na voljo za deljenje s 15. Tako bi lahko v praksi dvomodulni delilnik ustvaril veliko različnih delitvenih razmerij v območju med 15 in 16. To delno število, pomnoženo z delilnim razmerjem, programiranim v delilniku B, je ustvarilo celoten multiplikator, potreben za prilagoditev frekvence faznega detektorja (prej omenjena frekvenca razmika med kanali) do želene frekvence Fout.

    Če se malo poigrate z matematiko, boste hitro ugotovili, da z uporabo praktičnih frekvenc faznega detektorja (v tisočih Hz) ne morete doseči Fout frekvenc z ločljivostjo 1 Hz. Lahko dosežete le nekaj Fout frekvenc do ločljivosti 1 Hz, če pa želite zajeti široko frekvenčno območje, za večino frekvenc v tem izbranem območju ločljivosti 1 Hz ne morete doseči.

    Novejši čipi sintetizatorjev frekvence imajo delilnik B in C preddelilnik zamenjan s tako imenovanim delnim delilnikom. Ta delni delilnik deluje po enakem načelu, kot je bilo opisano prej, vendar se del časa deli z “x”, ves preostali čas pa z “x-1”. V teh delnih delilnikih lahko odstotek časa za deljenje z “x”, prilagodimo v zelo majhnih korakih. To zagotavlja veliko boljšo frekvenčno ločljivost. Obe takšni shemi pa gresta na račun tistega, kar je znano kot »tresenje« (jitter). Če dobro razmislimo, bo vsaka shema, ki se opira na hitrost spreminjanja delilnega razmerja med “x” in “X-1”, ustvarila neko izhodno frekvenco Fout, ki ima povprečno frekvenco sicer natančno glede na konstrukcijsko ločljivost, vendar se bo na osnovi od cikla do cikla , ta frekvenca nekoliko spremenila (specifikacija, znana kot »tresenje«).

    Tu pa zdaj nastopi “čarobnost”, vgrajena v vezje Si5351. Podatkovni list Si5351 še ne pojasnjuje na izčrpen način, kako ta naprava deluje. Za natančnejše razumevanje morate dobiti še opis aplikacije AN619 Silicon Labs (ki je tudi vključena med datoteke za podporo temu članku).

    Si5351 za vhodni signal PLL uporablja zunanji kristal v obsegu med 25 in 27 MHz, ki ga je zatem mogoče sprogramirati za ustvarjanje frekvenc v območju od 600 do 900 MHz. To PLL frekvenco lahko sprogramirate v visoki ločljivosti z uporabo delnega delilnika, povezanega s PLL. Ta visoka PLL frekvenca se nato deli na nižjo frekvenco z uporabo multisynth delilnikov, kot jih imenuje Silicon Labs. Multisynth delilnik lahko nastavite na 4, 6 ali 8 (celoštevilčne vrednosti) ali katero koli vmesno vrednost med 8 + (1 / 1048,575) in 2048. Za doseganje tako visoke ločljivosti delnega delilnika se uporabljata dva registra – MSx_P1 (s širino 18 bitov) in MSx_P2 (s širino 20 bitov). Znak “x” se v obeh primerih nanaša na CLK0-CLK2. V opisu aplikacije AN619 je natančno navodilo, kako nastaviti te registre z uporabo več enačb. V opombi k aplikaciji je tudi pojasnjeno, da bo uporaba celoštevilčnih vrednosti v posameznem ali obeh delilnikih, PLL in/ali Multisynth, vplivala na manj tresenja ali pa ga sploh ne bo. Za radioamatersko uporabo pri projektu VFO je tresenje Si5351 majhno in ne povzroča težav, tudi če za te delilne verige uporabljamo vrednosti, ki niso celoštevilčne.

    Čeprav za radioamaterske namene ne potrebujemo VFO, ki deluje v VF pasovih, Si5351 vsebuje tudi dodaten R delilnik, ki se nahaja za Multisynth delilnikom. Tega lahko nastavite tako, da se multisynth frekvenca naprej deli  še z 1,2,4,8… 128. Uporablja se v primerih, ko je treba najnižjo mogočo multisynth frekvenco (500 kHz) še naprej deliti.

    Za ta projekt sta potrebna le dva izhoda takta iz Si5351. Takt na prvem izhodu (Clock 1) se uporablja za zagotavljanje frekvence prvega lokalnega oscilatorja. To ustreza oddani (sprejeti) frekvenci plus 1. (prvi) IF frekvenci (ob predpostavki, da je LO zasnovan tako, da niha nad frekvenco signala). Lahko pa prvo uro nastavite tudi tako, da proizvaja LO frekvenco, ki je nižja od vrednosti frekvence signala za 1. (prvo) IF frekvenco. Te IF odmike je mogoče programsko določiti za vsak posamezni pas.

    Takt na drugem izhodu (Clock 0) se uporablja za zagotavljanje druge LO frekvence (BFO frekvenca). Ta BFO frekvenca bo enaka:

    1) frekvenci IF v primeru AM ali FM modulacije

    2) frekvenci IF + 1500 Hz za CW ali USB

    3) frekvenci IF -1500 Hz za način LSB.

     

    Predznak odmika 1500 Hz za USB / LSB se lahko razlikuje glede na to, če je vaš LO na nekaterih pasovih višji od signala, na drugih pa nižji. Moj program omogoča, da se odmiki za vsak način delovanja določijo za vsak posamezni pas.

     

    Delovanje in videz zaslona

    Poglejmo fotografijo čelne plošče VFO s prikazovalnikom in si razložimo, kako deluje (slika 4). Ta VFO projekt podpira deljeni način delovanja. Kar pomeni, da vam omogoča oddajanje na eni frekvenci in sprejem na drugi. Medtem, ko se ta način pogosto uporablja na VHF območjih pri dostopu do repetitorja, so določene prednosti pri deljenem načinu delovanja tudi na VF območjih. Velik zgornji številski zaslon prikazuje VFO A frekvenco (kot tudi radioamatersko področje). Spodnje okno se bo prikazalo šele takrat, ko boste pritisnili gumb “Split” na njegovi desni strani. Od tega trenutka naprej bo rotacijski dajalnik vplival na nastavitev frekvence VFO B namesto frekvence VFO A. Gumba “VFO A” in “VFO B” na levi bosta odločala o tem, kateri od VFO se bo uporabljal za sprejem, drugi pa se bo seveda uporabil za oddajanje. Ko na primer pritisnete VFO B, kot je prikazano tukaj, na tej sliki, se zraven prikaže rumena lučka (med sprejemanjem) in rdeča lučka poleg VFO A (med oddajanjem). Ko pritisnete gumb “VFO A”, se bo zgodilo ravno obratno.

    S pritiskom na “VFO A = B” prikaz spodnje frekvence izgine z zaslona in oboje, oddajanje in sprejem bo potekalo na isti frekvenci. Ne glede na izbrano frekvenco delitve pa se ta obnovi in znova prikaže, če ponovno pritisnete gumb »Split«.

    Slika 4: Fotografija videza TFT zaslona za projekt VFO.

    Obe VFO frekvenci, A in B za vsak uporabljeni pas se shranita v obstojni pomnilnik in se ob vklopu samodejno obnovita.

    Pod oknoma s prikazom frekvenc so gumbi za prehajanje navzgor in navzdol med frekvenčnimi pasovi in gumbi za način delovanja.

    Zelo me je navdušila sposobnost rotacijskega dajalnika oziroma gumba Banggood, s katerim je mogoče frekvenco zelo natančno nastaviti ali s hitrim vrtenjem bliskovito preleteti celoten frekvenčni pas. Vendar sem se kljub vsemu odločil za prilagodljivo nastavitev hitrosti. Na sliki 4 je izbran način »Acel«,  kar pomeni s pospeševanjem: pri počasnem premikanju gumba enkoderja se sprememba frekvence ob posameznem impulzu iz dajalnika (ali “kliku”) spremeni za 10 Hz (+/-, odvisno od smeri vrtenja). S hitrejšim obračanjem gumba pa se sprememba frekvence na posamezni impulz iz dajalnika  poveča v štirih korakih vse do 500 Hz na impulz. Na voljo je še šest drugih nastavitev za spremembo 10, 50, 100, 500, 1000, 5000 Hz na en impulz, ki pride iz dajalnika impulzov.

    Pod skupino za nastavitev hitrosti je okence RIT. Inkrementalna nastavitev sprejemnika lahko frekvenco sprejemnika premakne za ± 500 Hz, s čimer se lahko nekoliko “prilagodi” stranski ton CW ali tonsko višino govora pri načinih USB / LSB, ne da bi pri tem spremenila tudi frekvenca oddajnika. To območje lahko spremenite tako, da spremenite vrednost konstante »RIT RANGE«, ki se nahaja bolj na začetku programa. Vrednost RIT se prilagaja z obračanjem RIT linearnega potenciometra z upornostjo 10k, katerega napetost beremo z analognim vhodom A0 (na sponkah za priključitev Arduino ploščice).

    Vse VFO nastavitve (razen RIT) se shranijo v obstojni pomnilnik in se ob vsakem  vklopu naprave samodejno obnovijo. Vemo pa, da se VFO frekvence med delovanjem in redno uporabo pogosto in hitro spreminjajo. Nepraktično bi bilo, če bi jih pri kakršnikoli spremembi frekvence shranjevali v obstojni pomnilnik. Zato obstaja tudi gumb »Shrani«, ki ga morate pritisniti, da pred izklopom shranite trenutne nastavitve.

    Zadnji gumb je gumb “Calibrate” (umerjanje), nad njim pa okno, ki prikazuje bodisi “sprejem” ali “oddaja”, odvisno od tega, kakšen način delovanja je trenutno aktiven.

    Sam generator ure Si5351 je v bistvu 100% natančen. Če kristal 25 MHz, ki ste ga povezali z njim, niha s frekvenco natančno 25,000000 MHz, bodo izhodne frekvence do 1 Hz natančne. Vendar običajni kristali v absolutnem smislu niso popolnoma natančni in imajo prav tako tudi nek majhen temperaturni koeficient. Namesto kristala bi lahko uporabili dražji temperaturno kompenzirani kristalni oscilator (TXCO). Vendar niti Adafruit niti druge podobne plošče s Si5351, ki so dostopne na tržišču, ne vsebujejo TXCO.

    Si5351 v svoji notranjosti vsebuje vezje in ustrezen register na nivoju strojne opreme, ki uporabniku omogoča kompenzacijo morebitne netočnosti frekvence kristala. Funkcija umerjanja je enostavna. Določiti morate le količino, s katero se izhodna frekvenca uporabljenega kristala spreminja od pričakovane vrednosti, v delih na milijardo. To številko je treba potem naložiti v register Si5351.

    Funkcijo Kalibriranje bi lahko izvedli na različne načine. Osebno imam starejši analogni osciloskop Tektronix 2236 100 MHz. Ta model je edinstven med osciloskopi, saj ima vgrajen tudi 9-mestni merilnik frekvence kot tudi digitalni voltmeter. Časovna osnova (baza) za ta merilnik frekvence je zelo natančna, zato sem se odločil za izvedbo funkcije Calibrate s pomočjo merilnika frekvence na osciloskopu.

    Ko pritisnete gumb Calibrate, je Clock1 izhodni takt Si1351 nastavljen na točno 25,000000 MHz. Izhod Clock1 nato priključite na merilnik frekvence osciloskopa in zabeležite izmerjeno frekvenco. Nato z nastavitvijo vrtljivega dajalnika impulzov (enkoderja) vašega VFO nastavite frekvenco VFO A tako, da se vrednost izenači s prej zabeleženo vrednostjo. To programu omogoča izračun napake v Hz. Nato pritisnete tipko »CAL. končano « in ustrezna vrednost kompenzacije se bo naložila v register Si5351. Kot smo že omenili, gre za napako v Hz, izraženo v delcih na milijardo ustvarjenega signala (25 X 106 Hz). Ta kalibracijska vrednost je shranjena tudi na zunanjem pomnilniškem čipu plošče STM32F746 Discovery (ki ga v programu imenujem EEPROM ). Zato bo ta kalibracija še naprej veljavna tudi po  izklopu in kasnejšem ponovnem vklopu napajanja naprave (seveda ob predpostavki, da se temperatura okolice od izvedbe kalibracije do ponovnega vklopa ni bistveno spremenila.)

     

    Vezje

    Slika 5: To je shema samega VFO. Povezave s ploščo STM32F746 so označene z oznako priključkov mikrokontrolerja STM32F746 in standardnimi Arduino oznakami.

    Vezje res ni preveč zapleteno. Pri opisu glejte sliko 5. Napajalna napetost  5 V, ki jo dobimo omrežnega adapterja se na ploščo STM32F746-Discovery poveže prek USB mini priključka, ki je na plošči označen z “STA Link”. Upoštevajte, da na ploščici obstaja tudi kratkostičnik (JP1), s katerim lahko izberete vir napajalne napetosti Vcc – v našem primeru ga bo treba postaviti v položaj 5V-Link (to je na sliki 6 prikazano pod črnim gumbom “reset” za ponastavitev). Vsi dostopni GPIO priključki STM32F746 Discovery ploščice so povezane s štirimi vtičnicami, ki sestavljajo standardno podnožje za priključitev Arduina. Za čim bolj enostavno izvedbo povezav sem se odločil za uporabo PCB Arduino Protoshield PCB ploščice proizvajalca Sparkfun (Digi-key 1568-1865-ND). To se priključi na zadnji del STM32F746-Discovery plošče, kot je prikazano na sliki 6. Na tem tiskanem vezju sicer ni ravno veliko prostora za vezja, vendar čisto dovolj, da na njem izvedemo naše VFO vezje.

    Si5351 komunicira z mikrokontrolerjem prek vodila I2C. V tem projektu uporabljam na I2C vodilu hitrost 100 kHz, kar je standardno določena hitrost. V tem projektu uporabljam tudi čip za razširitev I2C vodila z oznako PCF8574, za katerega je prav tako določena hitrost komunikacije na I2C vodilu 100 kHz. V nekaterih drugih projektih, na primer v samogradnji QCX-SSB oddajnika in sprejemnika, Si5351 vodilo I2C deluje s hitrostjo 800 kHz, kar mu omogoča dovolj hitro spreminjanje frekvenc za izvajanje programsko ustvarjene različice SSB modulacije. Tudi če ga prisilite v delovanje pri 800 kHz, mora v tem projektu delovati povsem v redu, čeprav v podatkovnem listu Si5351 proizvajalec zagotavlja nemoteno komunikacijo z največjo hitrostjo do 400 kHz na I2C vodilu.

    Slika 6: Slika prikazuje spodnji del Discovery plošče, kjer je priključeno tudi prototipno tiskano vezje “Arduino protoshield” s prispajkanim VFO vezjem. Dajalnik impulzov, RIT potenciometer in preklopnik T/R niso prikazani, vendar so povezani z žicami prek dobro vidnih belih natičnih priključkov.

    Upoštevajte tudi to, da vodilo I2C zahteva upore (pull-up), povezane na Vcc, z upornostjo v območju od 2,2k do 4,7kOhmov. Ti so že vgrajeni na STM32F746 plošči. Ploščica Adafruit Si5351 ima vgrajen tudi svoj lastni regulator napetosti, ki omogoča delovanje tudi z napajalno napetostjo 5 V, zato jo v tem primeru napajam neposredno iz napajalnega priključka na ploščici STM32F746 Discovery. Adafruit tiskano vezje s čipom vsebuje tudi integrirano vezje za prilagajanje različnih napetostnih nivojev na I2C linijah, ki bo zagotavljala pravilno delovanje  s  3,3 Voltno logiko, ki se uporablja na plošči Discovery. Ta vezja za prilagajanje nivojev so izvedena s preprostim MOSFET vezjem in delujejo v redu, vendar po nekaterih virih ne delujejo zanesljivo, če se frekvenca na I2C vodilu poveča na 400 kHz ali več.

    Rotacijski dajalnik impulzov je povezan z GPIO priključki PC6 in PC7 (Arduino oznaki priključkov sta D1 in D0). Pričakovali bi, da bosta tudi na teh dveh linijah povezana upora proti Vcc. Običajni dajalniki impulzov so res le stikala in potrebujejo te upore za oblikovanje izhodnih signalov v obliki logičnih stanj,  uporabljeni Banggood dajalniki impulzov pa so optični in imajo vgrajeno lastno elektronsko vezje, zato se na izhodih A in B že privzeto pojavijo logični signali ustreznih nivojev.

    Nastavitev RIT je izvedena s spremljanjem napetostnega nivoja na izhodu 10k linearnega potenciometra, priključenega na analogni vhod PA0. Oddajno-sprejemni signal ali stikalo je priključeno na priključek PG6. To preklopi način VFO delovanja  glede na to, ali sprejemate ali oddajate. Za oddajanje mora biti priključek na nizkem logičnem nivoju.

    Odločil sem se, da bom dodal tudi vezje, ki bo omogočalo, da VFO krmili releje za vsakega od uporabljenih frekvenčnih pasov. Običajno se uporablja za preklapljanje med različnimi pasovnimi filtri za vsak izbrani pas. Najprej sem razmišljal o tem, da bi uporabil 8 neuporabljenih priključkov GPIO vrat MCU STM32F746, ki so bili pripeljani na priključke za Arduino ploščico. Edina pomanjkljivost pri tem pa je, da lahko GPIO izhode mikrokontrolerja obremenimo le z nekaj miliamperi toka – kar pa je premajhna tokovna zmogljivost za neposredno aktiviranje reed releja.

    Ker je na prototipni Arduino ploščici ostalo še nekaj prostora, sem dodal še 8-bitno vezje za razširitev PCF8574A ki ga prav tako upravljam prek I2C vodila. To vezje vsebuje osem odprtih izhodov, od katerih lahko vsak proti skupni masi nazivno poveže breme s 25 mA toka (ali 80 mA, če je uporabljen le en izhod v čipu istočasno, kot je to v mojem primeru). To pa je že čisto dovolj za pogon reed-relejev. V podatkovnem listu proizvajalca Texas Instruments ni posebej navedeno, kakšna je najvišja zaporna napetost teh izhodov, zato za preklapljanje preventivno ne bi uporabil  višjih nazivnih delovnih napetosti relejev od 5 V.

    Upoštevajte tudi to podrobnost, da sem v vezju uporabil integrirano vezje z oznako  PCF8574A, ki ima drugačen I2C naslov (0x60) kot vezje z oznako PCF8574 (0x40). Seveda bi lahko uporabili tudi vezje PCF8574, če bi programsko vrstico 29 spremenili takole:

    PCF8574 pcf (PB_9, PB_8,0, false); // true za PCF8574A, false za PCF8574

     

    Program

     Kot smo že omenili, je bil program napisan z uporabo spletnega prevajalnika  Mbed. Pripravil sem .ZIP datoteko, v kateri je moj program in vse potrebne datoteke v zvezi s tem projektom. Ta program naj bi preprosto “uvozili” v spletni prevajalnik Mbed.

    Za uporabo zaslona na dotik plošče Discovery sem moral uporabiti več knjižnic. Običajno naj bi se uporabljale naslednje tri ST mape knjižnic:

     

    BSP_DISCO_F746NG: to je podporni paket za ploščico ‘746 Discovery.

    LCD_DISCO_F746NG: to so rutine za LCD prikazovalnik.

    TS_DISCO_F746NG:  to so rutine za zaznavanje dotika.

     

    Te tri mape vam omogočajo izvajanje osnovnih funkcij LCD-prikazovalnika in poročanje o x-y lokaciji kateregakoli dotika zaslona. Vendar je to še daleč od tega, da bi vam omogočili oblikovanje podobnega grafičnega uporabniškega vmesnika (GUI), kot sem ga uporabil v tem programu. Za to potrebujete gumbe, besedilna okna in tako naprej.

    Z uporabo iskalne funkcije »Uvozi knjižnico« prevajalnika Mbed sem našel dobro knjižnico z GUI funkcijami. To knjižnico je napisal Naoki Mikami in poleg funkcij, ki sem jih sam uporabil, vsebuje še nekaj drugih GUI funkcij (kot je prikazano na sliki 4).

    Na splošno sem razložil način delovanja generatorja takta Si5351. Vendar pa samo programiranje za nastavitev enega od izhodov ure na določeno frekvenco in z ločljivostjo 1 Hz ni preprosta naloga. Knjižnična rutina, s katero je to mogoče izvesti, zajema 245 vrstic kode! Na srečo so programerji iz Arduino sveta že napisali knjižnice za Si5351, ki obravnavajo vse zahtevane operacije, kot so frekvence nalaganja, kalibracija itd. Kodo Arduino knjižnice je v okolje Mbed prenesel David Mills leta 2018. Uporabil sem prav to Si5351 knjižnico in vire za to kodo, ki so navedeni čisto na začetku Si5351.cpp datoteke.

    Če želite shraniti trenutno stanje delovanja VFO tudi za primer, ko je napajanje izklopljeno, je potrebno vse parametre, vključno z vrednostjo popravka kalibracije, shraniti v eno izmed oblik obstojnega pomnilnika. MCM STM32F746 ne vsebuje običajnega EEPROM pomnilnika, za odpravo te omejitve pa je ST na Discovery ploščo dodal 128 Mb QSPI Flash Memory čip z oznako N25Q128A. Ta sicer nima tako visoke vzdržljivosti zapisovanja kot pravi EEPROM-i, vendar zagotovljenih 100.000 ciklov pisanja povsem zadostuje za to aplikacijo. Za branje in pisanje v to pomnilniško vezje sem uporabil originalno knjižnico QSPI_DISCO_F746NG proizvajalca ST.

    Nazadnje sem za upravljanje z vhodno/izhodnim razširitvenim čipom PCF8574A uporabil knjižnico PCF8574, ki jo je napisal Bernard Borredon.

    Paket za podporo plošči BSP_DISCO_F746NG vsebuje LCD pisave do 24 točk. Ker s to velikostjo ne bi bilo mogoče prikazati tako velikih znakov, kot sem si želel za okenca, ki prikazujejo frekvence, sem ustvaril večjo, 32-točkovno pisavo (MediumFont.h) in napisal ločeno rutino, s katero jo potem prikažem.

    Ker to ni Arduino program, ne vsebuje običajnih programskih odsekov setup () in loop (). Izvajanje se začne v rutini main() in uvodoma inicializira vse potrebne naprave. Nato vstopi v izvajanje neskončne while () zanke v vrstici 204. V tej zanki se ciklično izvaja preverjanje naslednjih dogodkov:

    • Preverjanje preklopnika za sprejem / oddajanje (PG6) in ustrezna nastavitev načina delovanja.
    • Branje trenutne vrednosti rotacijskega dajalnika impulzov. Če se je vrednost spremenila, prilagodimo VFO A ali VFO B glede na način deljenja in v Si5351 naložimo ustrezno frekvenco.
    • Preberemo vrednost RIT potenciometra in če se je spremenila, ustrezno prilagodimo vrednost spremenljivke RIT in v Si5351 naložimo novo frekvenco (samo za sprejem)
    • Preverimo, če se je uporabnik dotaknil katerega od kontrolnikov TFT zaslona. V tem primeru je treba prilagoditi ustrezno spremenljivko ali v primeru gumba Save ali Calibrate skočiti na ustrezno rutino, da obdelamo zahtevano funkcijo.

     

    Program omogoča določanje odmika prve IF frekvence in odmikov USB / LSB / CW na osnovi “band-by-band” , s čimer so omogočene različne sheme strojne opreme za mešanje. Ti nizi so definirani v programskih vrsticah 40-43.

     

    Nenavaden programski hrošč

     Med pisanjem tega programa sem naletel na nenavadno obnašanje programa. Potem, ko je bila večina programa že napisana in preizkušena, sem opazil, da LCD zaslon po natanko 27 minutah (od ponastavitve ob vklopu) “ponori”. To pomeni, da je sicer prikazoval prave elemente, vendar so bili popačeni in so se hitro premikali prek zaslona (ta pojav včasih imenujejo tudi “trganje”). To stanje je potem trajalo približno minuto, nato pa se je vse vrnilo v normalno stanje. Pri tem ni bilo nobenega naključja – to se je dosledno dogajalo po 27 minutah.

    Edino, s čimer bi si lahko razložil to čudno vedenje, je bila možnost “odtekanja pomnilnika”. Do odtekanja pomnilnika pride vsakič, ko se sklad ali pa kazalnik na spremenljivko vsake toliko časa pomotoma poveča. Zaradi tega se začnejo vrednosti zapisovati prek tistega dela pomnilnika, do katerega ni dovoljeno dostopati na tak način. Običajno je bila pri mikrokontrolerjih, s katerimi sem se ukvarjal v preteklosti, velikost vgrajenega pomnilnika majhna, morda 32k ali 64k. Glede na to, kako se program izvaja, odtekanje pomnilnika v takšnem mikrokontrolerju praviloma zruši program v nekaj sekundah.

    V primeru ARM MCU STM32F746 pa obstaja en cel megabajt Flash pomnilnika in 320k SRAM pomnilnika. Ob vsem tem pomnilniku obstaja veliko zunanjih naprav, ki so v 32-bitnem naslovnem prostoru preslikane v razmaknjenih intervalih. Torej je možno tudi to, da bi odtekanje pomnilnika lahko trajalo 27 minut, preden bi napačni dostopi do pomnilnika začeli na karkoli opazno vplivati – v tem primeru na krmilnik LCD zaslona ali medpomnilnik zaslona.

    Odpravljanje težav, ki se pojavijo šele po 27 minutah, je zelo dolgotrajen proces! Plošča STM32F746 Discovery, tako kot večina ST-ovih 32-bitnih razvojnih plošč, ima na plošči vgrajen tudi čip ST-Link programatorja in hkrati razhroščevalnika za odpravljanje napak in dostop do razhroščevalnika bi najbrž znatno pospešil odkrivanje napak, vendar spletni prevajalnik Mbed do ST-link programatorja in razhroščevalnika ne more dostopati. Namesto tega se programiranje mikrokontrolerja izvaja tako, da je mogoče povleči binarno datoteko programa na MSD emulacijo diska na Discovery ploščici. Če bi lahko ta program napisal s pomočjo integriranega razvojnega okolja STM32Cube, bi razhroščevalnik ST-Link seveda lahko uporabil in mogoče se omenjena napaka v tem primeru sploh ne bi pojavila!

    Kljub temu sem končno tudi brez uporabe razhroščevalnika ugotovil, kaj povzroča omenjeno težavo. Kadarkoli sem v svojem programu v določenih rutinah definiral kakršnokoli lokalno celoštevilčno spremenljivko, je prišlo do težave, kljub temu, da te rutine v 27-minutnem intervalu sploh niso bile aktivne. To pomeni, da bi lahko VFO deloval popolnoma brez opravil, ne da bi se kdorkoli dotikal zaslona ali storil kaj podobnega, težava pa bi se po 27 minutah vseeno pojavila. Ko sem odstranil teh nekaj lokalnih spremenljivk in namesto njih uporabil globalne, je težava izginila. Z rešitvijo nisem zadovoljen, saj ne vidim razloga, zakaj v rutinah ne bi mogel uporabljati teh lokalnih spremenljivk, vendar sem s tem uspel vsaj odpraviti težave v zvezi z nenavadnim obnašanjem naprave.

     

    Upam, da mi bo v prihodnje uspelo narediti še več projektov z različnimi ARM mikrokontrolerji v programskem okolju Mbed in jih opisati v obliki člankov v reviji Svet Elektronike.

     

    Avtor: Brian Millier

    email:  bmillier1@gmail.com

    2021/293