… Nastavak objave AM/FM predajnik za testiranje starih radio prijemnika
Gotov FM predajnik (FM modulator) sa HS6760
U prethodnoj objavi smo zaključili kako bi kristalni oscilator sa logičkim inverterom mogao biti zadovoljavajući kandidat za frekvencijsku modulaciju VFO-a sa čipom Si5351. Međutim, svakako želimo napraviti barem osnovne testove FM modulatora koji se bazira na namjenskom čipu HS6760.
Modul FM predajnika sa HS6760 kakav za cca 7 eura možete naručiti iz Kine, prema opisu je tvornički programiran i podešen za stereo WFM odašiljanje na fiksnoj frekvenciji od 88,7 MHz. Izmjenom otpornika R1 i R2 u djelitelju napona za pin 2 (SDA) može se odabrati neka druga od šest pred-programiranih frekvencija. Napajanje mora biti u granicama 2,2 V do 4,2 V tako da je najbolje koristiti standardnih 3,3 V.
Dva stereo audio ulaza su na modulu pripremljena za spajanje kondenzatorskih electret mikrofona, odnosno na obje ulazne audio linije je doveden napon za napajanje mikrofona, s time da je na jednoj liniji već zalemljen mikrofon. To znači da ako dovodimo neke linijske audio ulaze oni moraju ići preko kondenzatora za DC odvajanje. Modul je podešen za stereo emitiranje (pin 1-SCK vezan na Vcc). Primarno je namijenjen za bežično odašiljanje vanjskih zvukova uhvaćenih preko mikrofona, odnosno kao neki baby-alarm, bežični mikrofon, električni pickup za klasične muzičke instrumente i slično.
Elektronička shema modula FM predajnika sa HS6760 i vrijednosti otpornika R1 i R2 za odabir jedne od šest pred-programiranih frekvencija.
Interna blok shema čipa HS6760.
Mjerenje frekvencijske širine izlaznog RF signala iz čipa HS6760
Prvi test ovog modula je pokazao da je prijenos zvuka na razini kvalitete komercijalnih FM radio postaja. Napravili smo usporedne snimke zauzeća frekvencijskog kanala s obzirom na amplitudu i frekvenciju modulirajućeg signala. Već smo rekli da zauzeće FM opsega ne ovisi samo o maksimalnoj frekvenciji koja se modulira, nego i o amplitudi (jačini) modulirajućeg signala.
Što se tiče amplitude, našli smo da je razina audio signala od 5 mVpp minimalna za postizanje dovoljne glasnoće na prosječnom prijemniku. Isto tako, sa razinom audio signala od 40 mVpp se već dobiva vrlo glasna demodulaciju na prijemniku. Stoga smo napravili testove na ove dvije razine amplituda.
Što se tiče frekvencijskog opsega, za kvalitetan WFM prijenos muzike potrebno je prenijeti frekvencijski opseg 20 Hz – 16 kHz. Za govornu NFM modulaciju pak je dovoljno prenijeti audio opseg raspona 300 Hz – 3 kHz. Stoga smo testove napravili i na ova dva opsega.
Ovdje su snimci zauzeća frekvencijskog opsega za MONO odašiljanje (kod mono odašiljanja aktivan je samo lijevi kanal, pin 5 – LCH). Lijepo se može vidjeti kako zauzeće kanala puno više ovisi o amplitudi, nego o frekvenciji modulirajućeg signala.
Ovdje su snimci zauzeća frekvencijskog opsega za STEREO odašiljanje (isti signal je doveden na oba stereo ulaza). Lijepo se može vidjeti kako zauzeće kanala puno više ovisi o amplitudi nego o frekvenciji modulirajućeg signala.
Na stereo načinu rada, čak i kad nema nikakve audio modulacije (oba audio ulaza spojena na masu) stalno je prisutna modulacija stereo pilot-tonom od 19 kHz.
Ostale mogućnosti čipa HS6760
Na našem modulu je predviđena jedino promjena šest pred-programiranih radnih frekvencija u uskom opsegu 76-88,7 MHz i to promjenom vrijednosti dva otpornika na pločici. Odmah ćemo reći da je čip tvornički zapravo programiran na osam frekvencija (87,5 MHz / 88,1 MHz / 88,3 MHz / 88,5 MHz / 88,7 MHz / 40,0 MHz / 64,0 MHz / 76,0 MHz), no u podacima se ne navode one izvan komercijalnog UKV FM opsega. Ako se pin 2 spoji preko potenciometra (10 kΩ) na Vcc i GND jednostavno i lako ćete mijenjati svih osam frekvencija.
Osim toga, moguće je napraviti jednostavnu modifikaciju na pinu 1, tako da možemo birati između STEREO i MONO odašiljanja. Ako je pin 1 spojen na Vcc (pozitivni pol napajanja) odašiljanje će biti STEREO, a ako je spojen na GND (masa, minus pol napajanja) odašiljanje će biti MONO.
Za sve ostalo moramo vršiti programiranje čipa, a mogućnosti za to su široke:
- programiranje do osam frekvencija u rasponu 27-125 MHz (korak 50 kHz)
- programiranje frekvencijske devijacije u tri koraka: 75kHz, 50kHz i 22,5kHz
- kontroliranje načina rada čipa: Normal, Mute, Standby, Sleep
- mogućnost rada sa četiri različita kristala: 24 MHz, 12 MHz, 7,6 MHz, 32,768 kHz i odabir načina dijeljenja frekvencije takta
- programiranje pre-emphasisa od 50 µs ili 75 µs, te podešavanje njegovog pojačanja
- programiranje pojačanja audio pojačala u rasponu -6 dB do 24 dB u 8 koraka
- programiranje izlazne RF snage u rasponu -15 dBm do 10 dBm u 30 koraka
- programiranje FM devijacije: 75 kHz, 50 kHz ili 22,5 kHz
- Automatska MUTE funkcija za audio signal sa podešavanjem pragova okidanja i vremena reakcije
- Automatska kontrola pojačanja sa podesivim pragovima reakcije
- Automatsko isključivanje audio i/ili RF pojačala kada nema ulaznog audio signala
- definiranje najniže audio frekvencije koja prelazi DC prag: 14 Hz, 28 Hz, 56 Hz, 112 Hz
- kalibracija izlaznog RF pojačala
Dostupni podaci za čip HS6760
Čip HS6760 se od početne inačice v1.0 s kraja 2015. godine postepeno razvijao tako da, prema podacima koje sam uspio naći, posljednja šesta inačica ovog čipa ima oznaku v2.4 i datira iz srpnja 2016. godine. Našao sam osnovne tvorničke podatke za inačice v1.3, v2.0 i v2.4 (datasheetna kineskom jeziku) iz kojih se mogu iščitati opće značajke i način programiranja čipa preko I2C sabirnice. Za inačicu v1.3 je dat i osnovni program u C programskom jeziku za programiranje radnih parametara čipa.
Programiranje preko I2C protokola
Već smo rekli da se programiranje čipa HS6760 vrši preko široko korištene standardne serijske I2C sabirnice za koju su dovoljne dvije žice: SCK (takt signal) i SDA (dvosmjerna razmjena podataka). Da bi se čip prebacio u mod programiranja, pin 3-SEL se mora sa visoke logičke razine (Vcc) prebaciti na nisku logičku razinu (masa). Tada pinovi SCK i SDA više se služe za setiranje mono/stereo načina i odabir kanalne frekvencije, nego za I2C komunikaciju. Također, koliko sam uspio prevesti kineski datasheet, čini se da se čip automatski resetira na tvorničke postavke svaki put kada se pin 3-SEL spoji na masu.
I2C (Inter-Integrated Circuit)
I2C (Inter-Integrated Circuit) standard omogućuje komunikaciju između velikog broja digitalnih uređaja gdje su svi paralelno povezani preko samo dvije fizičke žice. Pošto se koristi serijska komunikacija onda je u jednom trenutku moguća razmjena podataka između samo između dva uređaja, a selektiranje željenog uređaja se vrši preko njegove jedinstvene programske adrese.
O I2C komunikaciji postoji puno internetskih tutorijala tako da ovdje neću prepisivati sve detalje i specifičnosti ovog protokola, želim se bazirati samo na one segmente koji su nužni za komunikaciju sa čipom HS6760.
Glavni uređaj u I2C komunikaciji koji istom upravlja u svim segmentima naziva se MASTER. Mi ćemo kao MASTER uređaj koristiti Arduino Mega 2560 mikrokontrolersku razvojnu ploču. SLAVE uređaj je naravno čip HS6760. On izvršava naredbe koje mu daje MASTER uređaj i šalje potvrdu da li su iste izvršene. Prvo moramo vidjeti koji je točan protokol slanja (zapisa) podataka na naš SLAVE čip, a to možemo vidjeti samo sa tvorničke dokumentacije čipa.
Ovo je u osnovi standardni protokol kod I2C komunikacije. Generalno gledano, prvo se inicira 7-bitna identifikacijska adresa uređaja (čip HS6760 kao SLAVE uređaj), a onda se razmjenjuju 8-bitni paketi podataka u određene registre čipa. Nakon svake identifikacije i svakog razmijenjenog paketa, mora se dobiti potvrdni bit da je paket uredno upisan ili pročitan. Potvrdni bit je označen slovom A (acknowledge), a ukoliko nema potvrde (neuspješna prijava na adresu ili neuspješna razmjena podataka) takav bit je označen sa NA ili NACK (not-acknowledge).
Organizacija podataka u registrima čipa HS6760
Nekako sam uspio prevesti kineske znakove do te mjere da mogu donekle shvatiti organizaciju podataka u registrima. Dokumentacija daje podatke samo o registrima u koje korisnik može upisivati bitove za definiranje rada čipa.
Tablica sa prikazom značenja pojedinih binarnih vrijednosti u registrima čipa HS6760 koji se mogu mijenjati.
Usporedba definiranih tvorničkih vrijednosti registara čipa HS6760 prema datasheetu sa stvarnim pročitanim vrijednostima iz čipa. U crnim poljima su registri koji se mogu mijenjati (čitanje i pisanje), u sivim poljima su prazni (rezervirani) registri i registri u koje se ne mogu upisivati podaci.
Rezultati čitanja registara pokazuju da su vrijednosti praktično identične tvorničkima (Factory Default), a razlika je samo u registru 0x02 što je i očekivano jer za gotov modul mora biti definiran upotrijebljeni kristal u našem slučaju od 12 MHz (tvornička je vrijednost 00). Također je razlika u dijelu zapisa koji se odnosi na postavke jačine izlaznog RF signala, koji je od tvornički definiranog minimuma (4/31 ili oko -12 dBm) povećan na 20/31 ili oko 10 dBm, što je razumljivo ako se čip koristiti kao bežični mikrofon bez dodatnih pojačala.
Specifično binarno kodiranje radnih frekvencija za upis u registre
Kao što se vidi iz naše tablice, kanalna frekvencija zauzima 8 bitova registra 0x00 i prvih 6 bitova registra 0x01. Pretvaranje frekvencije u binarni niz od 14 bitova je vrlo jednostavno. Željena frekvencija u MHz se pomnoži sa 20 čime se dobije određeni decimalni broj. Taj decimalni broj se zatim pretvori u heksadecimalni ili binarni broj koji se upisuje u registre. Osam nižih (zadnjih) bitova koji predstavljaju binarni broj frekvencije se zapisuje u registar 0x00, a preostalih šest viših bitova se zapisuju u registar 0x01.
Uzmimo na primjer da želimo upisati frekvenciju 90,5 MHz:
- 90,5 x 20 = 1810
- 1810 pretvoreno u heksadecimalni broj je 0x0712 (binarno 00000111 00010010)
- u registar 0x00 se upiše niži dio heksadecimalnog broja 0x12 (00010010)
- u registar 0x01 se upiše viši dio heksadecimalnog broja 0x07 (00000111)
- nakon što je frekvencija upisana, na najniži bit registra 0x02 (D0) treba upisati nulu, a zatim uz kašnjenje od 10 ms upisati jedinicu kako bi frekvencija bila setirana
Registri 0x00 i 0x01 za upis do najviše osam radnih frekvencija su privremeni. Kad se binarni kod za određenu frekvenciju unese u ove registre, setiranjem opisanim u 5. koraku ova frekvencija se prebacuje u drugi registar za njenu trajnu pohranu. Dokumentacija ne navodi koje su adrese tih trajnih memorijskih registara.
Hardversko povezivanje
Hardversko povezivanje čipa HS6760 sa nekom Arduino razvojnom pločom je vrlo jednostavno. Osim napajanja (3,3 V) potrebno je još samo povezati I2C sabirnicu, odnosno linije SCK i SDA. Kod Arduino Mega 2560 ploče, SCK linija je na D21, a SDA linija je na D20. Već smo rekli da nam pull-up otpornici nisu potrebni jer su isti ugrađeni u sam čip.
- VCC – 3V3 V
- GND – GND
- SDA (44 D20 Arduino Mega 2560) – SDA (pin 2 HS6760)
- SCK (43 D21 Arduino Mega 2560) – SCK (pin 1 HS6760)
Programiranje čipa HS6760 (Adruino IDE)
Jedini primjer programa za programiranje čipa HS6760 uspio sam izvući iz datasheeta za v1.3. Program je pisan u C jeziku. Ako nekoga zanima, originalni kineski datasheet sa primjerom programa može skinuti ovdje.
Inicijalni programski kod iz datasheeta je svakako treba dovršiti za pokretanje na određenoj platformi. Stoga sam ovaj kod prilagodio pokretanju na Arduino IDE platformi (uz veliku i svesrdnu pomoć ChatGPT-a :-).
Međutim, ni nakon sada već možda 50-tog pokušaja, čip HS6760 se ne želi pre-programirati i stalno ostaje na svojim tvorničkim postavkama:
- pokušao sam različite kombinacije programiranja frekvencije sa različito postavljenim set i reset funkcijama, slijedeći različite procedure, do sada ni jedna nije uspjela
- izvršio sam nekoliko testova I2C komunikacije sa čipom (čitanje i pisanje), sve prolaze
- smanjio sam brzinu komunikacije na minimalnu (100000) i ubacio kod za praćenje da li se podaci stvarno upisuju u registre – podaci se upisuju, sve radi po programu, ali čip na kraju i dalje ostaje na tvorničkim postavkama
Na kraju sam detaljno preveo posljednji kineski datasheet v2.4 koji je dostupan samo kao slika niske rezolucije originalnih PDF stranica, što je bio prilično naporan posao, no iz svega nisam saznao ništa novo. Inače, originalni PDF i originalni program za programiranje čipa su besplatni. Međutim, ni jedno ni drugo se ne može skinuti bez registracije na kineske stranice „gitcode.com“, registracija se ne može napraviti bez telefona (slanje SMS registracijskog koda), a taj kod nikako ne stiže na telefon koliko god puta ponovio zahtjev za istim.
Unatoč svim pokušajima i dalje problem može biti softverski, proceduralni ili hardverski. Svakim spajanjem pina-3 na masu čip se (prema upitno prevedenim uputama) resetira na tvorničke postavke, a onda može biti i problem u proceduri odspajanja čipa sa programatora. Kako god bilo, imam još desetke što softverskih, što hardverskih ideja za daljnje pokušaje (povećanje napona napajanja čipa sa 3,3 V na 4 V, upotreba ESP32 platforme umjesto Mega 2560, daljnje izmjene programskog koda…).
Analiza I2C signala na osciloskopu
S obzirom da sam probao na desetke programskih kodova i niti jedan nije uspio pomaknuti čip sa tvorničkih postavki, sada je najizgledniji problem u samom I2C komunikacijskom linku. Stoga idemo analizirati I2C signale na osciloskopu.
Izravni I2C signal sa Mega 2560 ploče je više nalik pilastom nego pravokutnom valnom obliku.
Ovo je I2C signal sa ploče Mega 2560, izravno sa pinova SCA i SDL. Negdje sam pročitao da ploča ima ugrađene pull-up otpornike od 10 kΩ. To su otpornici koji zatvaraju strujni krug izlaznih tranzistora za SCA i SDL linije sa pozitivnim polom napajanja, odnosno dovode pozitivni napon na kolektore tranzistora (unutar samog čipa su ovi tranzistori sa otvorenim kolektorom). Snimljeni signal jasno pokazuje da napon na tranzistorima stalno postoji jer je su stalno prisutne visoke naponske razine na oba pina (cca 4,7 V). Pojavom signala te linije se zapravo spajaju na masu pa je naponska razina nula. To znači da su interni pull-up otpornici stvarno ugrađeni.
Međutim, ne može se ne primijetiti kako je oblik signala daleko od pravokutnog, odnosno vrijeme porasta signala sa nule na jedinicu je vrlo dugačko što oblik signala čini više pilastim nego pravokutnim. To je normalno jer spajanje Vcc na GND (kratki spoj napona) se dogodi relativno brzo, no onda je za oporavak, odnosno vraćanje napona ponovno na maksimum treba neko duže vrijeme.
To vrijeme porasta signala ovisi o vrijednosti ugrađenog pull-up otpornika, ali i o parazitskim kapacitetima samih žica preko kojih se prenose I2C signali. Kod nas taj kapacitet sigurno nije problem jer žice nisu duže od 10 cm. Međutim, ni sam oblik signala ne bi trebao biti problem. Unatoč izraženoj kosini, još uvijek se jasno može odvojiti logička naponska razina za nulu i jedinicu kod svake promjene tih stanja.
Kako utječe nepravilan oblik signala na I2C komunikaciju
Generalno gledano, oblik signala sa naše slike koji je pilastog oblika, kao i onaj čistog pravokutnog oblika, jednako će dobro prenijeti I2C komunikaciju. Razlog tome je što svaki impuls uspijeva dostići svoj maksimum (puni Vcc) te će biti prepoznat kao logička jedinica, bez obzira što impuls nije posve pravokutan.
Međutim, signal sa velikim bočnim nagibima svakako utječe na maksimalnu brzinu koju možemo postići digitalnom komunikacijom. Pri velikim brzinama (velikim frekvencijama prijenosa) signal kod promjene logičkog stanja sa nule na jedinicu jednostavno ne stigne doseći svoj maksimum, pa možda ne bude prepoznat kao logička jedinica.
Koliki je prag prepoznavanja logičke jedinice i nule ovisi o karakteristikama same digitalne komponente koji koristimo. Načelno se mogu odabrati tri standardne brzine za I2C razmjenu podataka: 100 kHz, 400 kHz i 1 MHz. Za najnižu brzinu od 100 kHz dozvoljeno je vrijeme porasta od maksimalno 1 µs, a na našem oscilogramu vidimo da to vrijeme dostiže do 10 µs. Ovo se uvelike može poboljšati stavljanjem pull-up otpornika niže vrijednosti.
Takav je ugrađen u čip HS6760 pa idemo vidjeti kako izgleda signal na našem konkretnom primjeru.
Ovdje vidimo I2C signal kada je čip HS6760 izravno spojen na Mega 2560, dakle samo sa internim pull-up otpornicima. Signal je loše stabilnosti i oblika te ga osciloskop ne može dekodirati.
Kao što vidimo, za naš konkretni slučaj, čini se da interni otpornici od 40 kΩ u čipu HS6760 nisu dovoljni za dobivanje stabilnog signala brzog vremena porasta. Vidimo ovdje i neke dodatne smetnje u SDA signalu (crveno) kao i nepravilne amplitude SCL signala (žuto). Razlog ovome je što čip HS6760 napajamo preko regulatora 3,3 V na Mega 2560 ploči, a već smo rekli da su interni pull-up otpornici vezani na 5 V liniju.
Ovo sam predvidio pa sam dodao pull-up otpornike od vrlo niskih 120 Ω. Ugradnjom tih otpornika signal ne samo što je dobio pravokutni signal, nego je on također ampitude 3,3 V.
Naime, ako se vrijednost pull-up otpornika smanji ispod neke razine (obično 1,5 kΩ), signal će istina biti više pravokutan ali tu će onda ujedno potrošnja struje (opterećenje) toliko porasti da će se amplituda signala početi smanjivati. Ne treba zaboraviti da se impuls u sustavu sa otvorenim kolektorom prenosi tako što se pozitivni pol napajanja (Vcc) zapravo kratko spaja na masu. Stoga neki „pull-up“ otpornik mora postojati jer ne možemo raditi baš čiste kratke spojeve između Vcc i GND. Ja sam u slučaju Mega 2560 smanjio pull-up otpornik na 120 Ω samo iz razloga jer sam time namjerno htio povećati opterećenje i smanjiti amplitudu signala sa 5 V na 3,3 V.
Pull-up otpornicima od 120 Ω sa Mega 2560 ploče se dobiva lijep pravokutni signal amplitude 3,3 V koji se ispravno dekodira.
Međutim, kad se na tako „reguliran“ signal na Mega 2560 ploči poveže čip HS6760, naponi se ipak malo destabiliziraju. Do oscilacija i izobličenja napona dolazi jer sada I2C linije praktički paralelno napajamo sa dvije različite naponske linije koje su različito opterećene kod brzih promjena logičkih stanja.
No i unatoč tim nestabilnostima, signal se ipak može dekodirati na osciloskopu, a i desetke testova slanja i primanja podataka je uredno prolazilo.
Ovdje je isti slučaj kao i gore, samo što su sada na I2C linije dodani vanjski pull-up otpornici. Signal izgleda puno bolje i osciloskop ga bez problema dekodira, međutim, jasno je da to više nije posve čist i stabilan signal kao što je bio onaj bez spojenog čipa HS6760, posebice što se tiče amplitude.
Ono što smo primijetili na ovom testu i što puno više zabrinjava, to je što nakon slanja 7-bitne SLAVE adresu čipa HS6760 (0011000), od čipa ne dobivam pozitivni odgovor (A bit je Not-Acknowledge).
Sada bi svakako trebalo uložiti malo truda i napraviti stabilniju I2C komunikaciju, tako da male nestabilnosti isključimo kao mogući izvor problema.
Problemi sa naponskim razinama 3,3 V i 5 V
Činjenica je da je čip HS6760 predviđen za standard 3,3 V dok je Arduino Mega 2560 ploča dizajnirana za naponski standard 5 V. Probao sam razne kombinacije napajanja sa Arduino Mega 2560 pločom ne bi se naponi malo više stabilizirali: napajanje ploče preko USB porta, napajanje ploče preko DC konektora 7-12 V, napajanje čipa HS6760 preko 3,3 V regulatora na samoj ploči Mega 2560 i napajanje čipa preko zasebnog napajanja. Izgled I2C signala se nije bitno mijenjao.
Iako sam htio izbjeći naponsku i logičku konverziju između 3,3 V i 5V sistema, čini se da će to ovdje biti nužno napraviti kako bi bili sigurni da čip HS6760 dobiva posve čist signal odgovarajućih naponskih razina. Stoga ću prvo modul sa čipom HS6760 nadograditi sa regulatorom napona 3,3 V te ugraditi Level shifter za podatkovne linije SCA i SDL, jednako kao što smo vidjeli da je to tvornički urađeno na modulu VFO-a sa čipom Si5351.
Uvijek težim prvo najjednostavnijem rješenju
Postavlja se pitanje zašto uopće koristim Mega 2560 ploču i 5 V sistem, kad imam ploču ESP32 od Si5351 projekta i koja radi na standardu 3,3 V. Pa evo, do sada me Mega 2560 ploča dobro služila i nikad nisam imao potrebe provjeravati podatkovne signale na osciloskopu. Očekivao bi od moderne digitalne elektronike da radi u širokoj toleranciji oblika i amplituda podatkovnih signala. Drugo, ploča Mega 2560 je jedna od jačih mikrokontrolerskih razvojnih ploča (puno memorije i puno različitih I/O pinova) te sam ju uvijek koristio za testiranje raznih projekata, istina uglavnom na (starom) 5 V standardu. Ploča je također relativno velika i pregledna te se lako povezuje. Jednostavno sam navikao na nju 🙂
Prije nego se sada uhvatim lemilice i krenem dodavati regulatore i Level shiftere za 3,3 V, moram se uvjeriti da je problem stvarno u opisanom jer ću inače samo dodatno nepotrebno potrošiti vrijeme i resurse. Zato prvo učitavam program u ESP32 ploču i analiziram signal na osciloskopu.
Ovo je signal izravno sa ESP32 ploče bez dodanih pull-up otpornika (uključeni samo interni otpornici relativno velikih vrijednosti 40+50 kΩ). Signal izgleda nešto malo bolji nego sa Mega 2560 ploče, no to je najviše zato jer je ovdje naponska razina niža (3,3 V umjesto 5 V).
Dodavanjem pull-up otpornika vrijednosti 1,5 – 1,8 kΩ (isto kao i kod Mega ploče) signal poprima pravokutni oblik.
Oblik signala za 3,3 V je svakako čišći sa ESP32 nego sa Mega 2560 ploče što je i za očekivati s obzirom da se radi o pločama sa dva različita naponska standarda.
No ono što i ovdje brine, to je što opet nemamo Acknowledge potvrdu.
Ovdje se vidi da ESP32 više puta nakon slanja SLAVE adrese pokušava dobiti odgovor od čipa, no on je uvijek Not-Acknowledge (NA ili NACK). Stoga ESP32 prekida daljnje slanje podataka i nakon nekoliko ponovljenih pokušaja završava komunikaciju.
Uvećana serija od četiri slanja SLAVE adrese, svaki put bez odgovora SLAVE čipa.
Sada dakle moramo istražiti zašto čip ne odgovara na pozive ESP32.
Napokon nekakav pomak…
Cijeli krug sam na kraju paralelno povezao sa spektralnim analizatorom za praćenje eventualne pojave novih frekvencija i sa osciloskopom za analizu I2C protokola u realnom vremenu te krenuo u nove pokušaje programiranja ovog nesretnog čipa.
Otkrio sam vrlo bitnu stvar. Nove frekvencije se zapravo upisuju u čip, međutim, nakon što se pin 3-SEL sa moda programiranja (sa GND) prebaci na mod samostalnog rada (Vcc) čip se automatski opet resetira na tvorničke postavke.
Ovo nikad ne bi otkrio da nisam paralelno pratio tijek programiranja sa spektralnim analizatorom. Ispada da su tijekom mojih pokušaja programiranja kontrolne poruke ispravno slale poruke o ispravnom prijenosu, što je i bio slučaj, no čip se nakon skidanja sa programatora i prespajanja na mod samostalnog rada jednostavno resetirao na tvorničke postavke. Stoga je na svakoj kasnijoj provjeri izgledalo kao da nismo napravili ništa. Također, vrijednost pull-up otpornika nije kritična, čip se dobro programira i sa njima i bez njih.
Sada treba samo shvatiti završnu proceduru programiranja, a čini se da taj korak mora biti napravljen programski. Kojim god redoslijedom sam odspajao napajanje i pojedine žice čipa, on bi se na kraju opet sam od sebe resetirao na tvorničke postavke. Posljednji programski kod koji sam koristio nije uključivao glavni RESET na registru 0x07 pa sve nade polažem u to.
Reset FSM
U originalnom programu je procedura za glavni reset čipa upotrijebljena dva puta: nakon upisa frekvencije kristala, audio pojačanja i načina rada u registre 0x01 i 0x02, te u potprogramu za postavljanje RF izlazne snage u registru 0x07. Tijek originalnog programa ide ovako:
- upisivanje bitova za definiranje frekvencije rada kristala i pojačanja audio pojačanja u registru 0x02
- upisivanje bitova za definiranje načina rada čipa u registru 0x01
- resetiranje čipa u registru 0x07
- upisivanje viših 6 bita za definiranje izlazne radne frekvencije u registru 0x01
- upisivanje nižih 8 bita za definiranje izlazne radne frekvencije u registru 0x00
- setiranje radne frekvencije u registru 0x02 (postavljanje najnižeg bita na nulu, a zatim nakon pauze od 10 ms na jedinicu)
- koraci 4-6 se ponavljaju osam puta za osam radnih frekvencija
- definiranje izlazne snage RF pojačala u registru 0x07
- potprogram za definiranje RF izlazne snage za FCC/CE mjerenja (-45 db)
- resetiranje čipa u registru 0x07
- upisivanje bitova za definiranje devijacije frekvencije u registru 0x03
Reset koji se poziva u 3. i 10. koraku bi trebao biti takozvani Reset FSM (Finite State Machines). Ovaj Reset bi prema originalnom programu trebao svaki puta vrijednost bita D7 u registru 0x07 prvo postaviti prvo na 0, a onda nakon 10 ms na 1. Također, čip za programiranje morao biti u Normal mode (bitovi D6 i D7 u registru 0x01).
Pokušao sam proceduru Reseta izvršiti prije i nakon upisivanja frekvencije, te u druga dva pokušaja samo prije i samo nakon upisivanja frekvencije. To nije pomoglo da se nove frekvencije zadrže u čipu. Onda sam napisao proceduru da se Reset bit prije upisa promijeni samo na 0, a na kraju upisa na 1. Ni to nije pomoglo. Taj Reset bit D7 u registru 0x07 zapravo samo onemogućava bilo kakvo programiranje kad je postavljen na 0 i obrnuto, samo kad je postavljen na 1 omogućava programiranje.
Nakon niza pokušaja programiranja na sve moguće načine, ponovnog prevođenja svega što je na kineskom pismu rečeno o čipu HS6760, zaključak je slijedeći:
- U takozvanom MCU modu, gdje čip nije kontroliran vanjskim MCU-om nego radi samostalno (pin SEL na Vcc, pin SCK kontrolira MONO/STEREO, a pin SDA mijenja frekvenciju), isti čini se može raditi jedino na tvornički programiranim postavkama. U kineskim podacima se nigdje izričito ne navodi da li se čip može preprogramirati tako da u MCU modu radi na nekim drugim frekvencijama pa sam pretpostavio da je to moguće. No, čini se da su te frekvencije upisane u neku fiksnu ROM memoriju i korisnik te tvorničke postavke ne može mijenjati. Može se eventualno naručiti čip gdje će proizvođač po zahtjevu naručitelja programirati čip na neke druge frekvencije.
- U radu sa vanjskim MCU-om čip se posve jednostavno programira. Programski kod ga lako pretvori u FM predajnik sa svim specificiranim mogućnostima, no tada ne može raditi samostalno nego mora biti stalno kontroliran tim vanjskim MCU-om. Čim čip HS6760 izgubi napajanje, kod ponovnog uključenja se automatski resetira na tvorničke postavke, osim ako nije paralelno spojen na vanjski MCU koji ga programira drugačije.
Što se tiče frekvencijskog opsega u kojem radi čip HS6760, test je pokazao da bez problema radi i na 25 MHz iako je specificiran za frekvencije više od 27 MHz. Drugi slični čipovi za UKV FM predajnike su deklarirani za frekvencije preko 70 MHz i sigurno se jednako mogu spustiti na nešto niže frekvencije, no teško da se mogu spustiti čak do 25 MHz. Zato se HS6760 za sada čini kao jedina opcija za naš projekt.
Ovdje vidimo usporedni prikaz spektralnih slika signala na 25 MHz (žuto) i 27 MHz (ljubičasto). Oba osnovna signala su jednaka (oko -15 dBm), a također su jednaki i harmonici. Na amplitudu osnovnog harmonika i ukupnu harmoničku sliku ovdje najviše utječe LC filtar za izlazni RF signal koji je na modulu dizajniran za frekvencije iznad 75 MHz. Stoga vrijednosti ovog filtra moramo promijeniti.
Slijedeće što želimo testirati to je širina frekvencijskog opsega koju zauzima modulirani signal s obzirom da smo sada frekvencijsku devijaciju sa 75 kHz smanjili na 22,5 kHz.
Širina frekvencijskog zauzeća kanala kod devijacije postavljene na 22,5 kHz.
Test sa frekvencijskom devijacijom 22,5 kHz je pokazao da je zauzeće kanala sada puno manje nego kod devijacije postavljene na 75 kHz. Za standardnu FM telefoniju (300 Hz – 3 kHz) ukupno zauzeće kanala je od 12 kHz do najviše 40 kHz ako želimo izuzetno glasan demodulirani signal. Kod devijacije postavljene 75 kHz (tvornička postavka) zauzeće kanala je deset puta veće. Zbog ovoga bi čip HS6760 svakako trebali kontrolirati vanjskim MCU-om.
U ovoj fazi nam je najvažnije vidjeti može li se čip HS6760 iskoristiti za naš projekt. Osim samog mjerenja. možemo reći da i „slušni“ test frekvencijske modulacije na 25 MHz prolazi odlično, demodulirani signal je izuzetno čist i razumljiv. Kvalitetu i mogućnosti digitalnog procesiranja signala je vrlo teško, komplicirano i skupo dostići analognim sklopovima. Stoga svakako želimo nekako iskoristiti dostupna jeftina digitalna rješenja za naš projekt. Ovdje je daleko više isplativo upotrijebiti čip HS6760 i dodati mu neki mali upravljački MCU za 2-3 eura, nego graditi FM modulator sličnih karakteristika iz diskretnih komponenti.
Z kraj testiranja čipa HS6760 isprobati ćemo još jednu mogućnost. To je stavljanje kristala niže frekvencije za rad čipa na tvorničkim postavkama. Ovo bi moglo smanjiti i tvornički postavljene izlazne frekvencije. Primjerice, jedna od tvornički memoriranih frekvencija je 76 MHz. Čip je programiran za kristal 12 MHz, no ako ga zamijenimo sa kristalom od 4 MHz, moguće je da će izlazna frekvencija iz PLL-a biti tri puta manja, dakle 25,33 MHz što bi bilo idealno za naše potrebe. Naravno, tu puno toga ovisi o tome kako su izvedeni djelitelji, preskaleri i drugi brojači u PLL petlji, no zašto ne probati i tu opciju.
Jedna od slika iz originalnog datasheeta pokazuje da se takt signal za čip HS6760 može osigurati i iz nekog vanjskog izvora pravokutnog signala preko pina 10 (XO). Kao što vidimo čip može raditi i na puno nižim taktovima, kao ovdje sa uobičajenom satnom frekvencijom 32,678 kHz.
Napravio sam testove sa kristalima drugih vrijednosti kao i sa izravnim dovođenjem različitih takt frekvencija na pin 10-XO. Generalni zaključak je da to neće funkcionirati. Kristal za referentni oscilator PLL-a nema puno veze sa frekvencijom VCO-a. Promjene su moguće unutar uskog frekvencijskog opsega koliko je raspon rada PLL stabilizacije VCO-a i ništa izvan toga. Ovo je bilo i za očekivati, no ipak smo testirali i tu mogućnost. Kristal djeluje samo na korekciju faze i jednom kad se PLL petlja zaključa, isti praktički više nije ni potreban.
Vidjeli smo u podatkovnoj tablici da se u registru 0x03 može definirati da li će interni MCU dobivati takt sa vanjskog kristala ili sa VCO-a. Tvornička postavka je dobivanje takta iz VCO-a. Možda bi se promjenom ove postavke također promijenilo i nešto glede izlazne frekvencije, no čak i da se to dogodi teško je tu očekivati neku stabilnost ili kontrolu. Kristal ovdje jednostavno ne služi za određivanje frekvencije VCO-a (tome služi programski djelitelj) nego određuje frekvenciju referentnog oscilatora za usporedbu dva signala u detektoru faze.
Konačna odluka je da ćemo za naš projekt ipak koristiti čip HS6760 jer daje vrlo čistu modulaciju kontrolirane devijacije, ugrađena su gotova audio pojačala, te ima niz drugih mogućnosti podešavanja NF i RF dijela. Kad već koristimo dodani MCU, svakako ne bi bilo loše na vanjske tipke izvesti mogućnost odabira devijacije i mono/stereo načina rada. Ostale mogućnosti u ovom trenutku nisu od značaja za naš projekt, no ako se ukaže potreba uvijek ostaje opcija nadogradnje softvera za dodatne kontrole.
Za naš projekt se ne isplati kupovati gotove module sa čipom HS6760 jer je potrebno raditi puno preinaka na minijaturnoj tiskanoj pločici. Puno bolje je kupiti čiste čipove, a onda ih eventualno zalemiti na SSOP-10/DIL-10 adaptere radi lakše manipulacije, dok projekt jednom ne bude spreman za namjensku tiskanu pločicu.
Dok čekamo da stignu čipovi, idemo se malo pozabaviti audio sklopovima našeg testnog predajnika…
… nastavak OVDJE …