Avtor: Brian Millier
V zadnjem letu se je zmogljivost USB-C PD (Power Delivery) začela uporabljati v nizkocenovnih potrošniških izdelkih, kot so hitri polnilniki mobilnih telefonov.
Za razliko od običajnih USB 2.0 polnilnikov, ki zagotavljajo 5 V pri največ 500 mA, lahko „izvorne“ naprave USB-C PD proizvajajo do 20 V pri 5 A (ali več), pri čemer lahko naprava, s katero so povezane, „zahteva“ določeno napetost, ki jo zagotavljajo.
Nekoliko sem skeptičen, da lahko majhni adapterji in vtiči/vtičnice, ki se običajno uporabljajo za USB-C, prenesejo 100 W, ne da bi se pretirano segrevali. Vendar pa 30-50 W hitri polnilniki za mobilne telefone zlahka prenesejo to količino energije z uporabo standardnih kablov, ki se končajo z USB-C konektorji.
Ta vsebina je samo za naročnike
Zmožnost USB-C PD gostitelja, da zagotovi izhodno napetost (in tokovno omejitev), ki jo zahteva naprava, ki se napaja („ponor“), je urejena z ločeno signalno linijo – poleg standardnih signalnih linij D+/D-, ki se uporabljajo za prenos USB podatkov. Na sliki 1 je razvidno, da je USB-C konektor zasnovan tako, da ga je mogoče priključiti v obe smeri – za razliko od USB-A konektorjev. Priključek CC1 in njegov „dvojček“ CC2 sta priključka, ki se uporabljata za „Power Delivery“ komunikacijo.
Temu pravim „rokovanje“, saj se podatki prenašajo v obe smeri: tj. vsako zahtevo je treba potrditi. Ta dodatna signalna linija omogoča „ponoru“, da PD gostitelju („viru“) zahteva določeno napetost/tok, PD „vir“ pa potrdi, ali lahko prenese to zahtevo po napetosti/toku. Po tem „rokovanju“ bo vir PD preklopil napajanje, ki ga zagotavlja na standardnih priključkih za napajanje in ozemljitev, s standardnih 5 V na zahtevano napetostno/tokovno zmogljivost.
Ker PD gostitelj sprva zagotavlja 5 V, ga lahko varno uporabljate s starejšimi napravami, ki niso PD in od katerih se pričakuje 5 V in nič več na napajalnem priključku. Takšne naprave se ne morejo „pogovarjati“ s PD gostiteljem in zahtevati višjo napetost/tok.
Večina bralcev pozna FTDI-jeve USB-serijske vmesnike in novejše čipe podjetij, kot so Silicon Labs, Prolific itd., ki opravljajo enako funkcijo. Podjetje FTDI je razširilo svojo linijo USB-serial vmesnikov in vključilo modele, ki prav tako opravljajo PD funkcijo. Vendar so ti na voljo v ohišjih z majhnim razmikom, kot je QFN-76, in jih ni enostavno uporabljati brez prilagodilnega tiskanega vezja in možnosti reflow spajkanja.
Cypress Semiconductor (zdaj Infineon) je predstavil več Arm MCU-jev, ki vsebujejo USB-C vrata z možnostjo PD. Ti MCU-ji imajo oznake kot sta CYPM1011 in CYPM1115/1116, zanje pa so na voljo tudi razvojne plošče, kot je CY7110 EZ-PD PGM1-S0. Slednjo razvojno ploščo sem kupil za razvoj. Čeprav imam precej izkušenj z Infineonovimi PSoC mikrokontrolerji in razvojnim okoljem PSoC Creator, ki jo uporabljam za razvoj PSoC projektov, sem ugotovil, da delo s temi EZ-PD napravami ni tako „EZ“ (enostavno). Zato sem ta komplet opustil. Podjetje ST Microelectronics prodaja mikrokontroler STUSB4600 PD, ki je samostojni PD mikrokontroler, vendar z njim nimam izkušenj.
Za uporabo USB-C PD polnilnika za druge namene me je začelo zanimati odkritje majhne razvojne plošče, imenovane USB QC3.0 Spoof. Te so na voljo na Alibabi za nekaj evrov. Svojo sem dobil od lokalnega podjetja, ki jih uvaža, in plačal nekoliko več.
Na sliki 2 si oglejte fotografijo te razvojne plošče. Vsebuje USB-C priključek za površinsko montažo in 8-pin SOIC čip, ki ni označen, vendar je PD mikrokontroler. Plošča vsebuje tudi 3-pin regulator, ki napaja ta mikrokontroler iz napetosti, ki jo generira USB-C polnilnik: na začetku je napetost 5 V, po opravljenem ročnem preklapljanju zahteve za dobavo energije pa do 20 V. Na voljo je 3-polno DIP stikalo, ki izbira zahtevano izhodno napetost, kot je prikazano v Tabeli 1. Čeprav ob naročilu ni bilo očitno, sem kmalu ugotovil, da bo izhodna napetost plošče sledila nastavitvam stikala, ko jih boste spreminjali – tj. stanje stikal se ne skenira samo ob vklopu plošče, kar bi imelo za posledico fiksno napetost.
Upoštevajte, da ko to razvojno ploščo priključite na vir napajanja/polnilnik USB-C PD in izberete določeno napetost, to še ne pomeni, da boste nujno dobili to izhodno napetost. Preverite specifikacije vira USB-C PD napajanja in preverite, kakšne so njegove zmogljivosti. Pri roki sem imel 20W napajalnik USB-C za Apple iPad, ki je omogočal napetost le do 9 V, moj „uradni“ napajalnik za Raspberry Pi 5 pa je imel napetost le do 15 V.
Odkril sem, da IKEA prodaja USB-C PD polnilnike po zelo nizki ceni. Imajo model z močjo 45 W za približno 12 EUR, vendar ima dve vtičnici, tako da bi se moč razdelila med obe vtičnici. Namesto tega sem se odločil za SJOSS 30-W enoto (305.744.69), ki stane približno 7 €. Njeno naročilo je bilo nekoliko tvegano, saj v katalogu niso bile navedene specifikacije izhodne napetosti/toka, ko pa sem jo dobil, so bile na embalaži navedene vrednosti iz preglednice 2.
Upoštevajte, da je pri napetosti 5 V tokovna zmogljivost le 3 A, kar je le polovica nazivne moči polnilnika. Pričakujem, da je to posledica tokovne zmogljivosti vtičnice in običajnih USB-C kablov. Izbral sem IKEA, saj sem pričakoval, da bodo prodajali le kakovostne polnilnike. Na voljo je nešteto poceni polnilnikov neznanih proizvajalcev, enega od svojih projektov pa nisem želel priključiti na napajanje, ki ga napaja polnilnik, ki morda ne bo zagotavljal ravni napetosti, ki jo je zahtevala Spoof razvoja plošča.
Tiskano vezje namiznega napajalnika
Želel sem, da bi imel napajalnik več kot le 5-9-12-15-20 V fiksnih izhodnih napetosti brez merjenja ali omejevanja toka. Zato sem moral dodati nekaj več vezij, kot le polnilnik IKEA SJOSS in USB-3 Spoof modul. Na sliki 3 je shema vezja tega projekta. Ima nekaj skupnih značilnosti s projektom napajanja na delovni mizi v prvem delu tega članka. Uporabil sem isti MCU modul Raspberry Pi RP2040 (PICO. Uporabil sem tudi LED prikazovalnik, vendar sem za to enoto izbral 4-mestni prikazovalnik in uporabil stikalo za preklapljanje med prikazom napetosti in toka.
Na Spoof modulu sem moral vzpostaviti nekaj notranjih povezav – zlasti sem potreboval povezave do treh stikal, da sem jih lahko preklapljal pod nadzorom RP2040. Sprva sem mislil, da bi lahko za izbiro različnih fiksnih napetosti uporabil tripolno vrtljivo stikalo. To se je izkazalo za nepraktično, saj je bilo na voljo 5 različnih nastavitev napetosti, poceni 3-polna vrtljiva stikala pa so imela le 4 položaje.
Zato sem se odločil, da bo spremembe stikal izvedel sam MCU RP2040 modul z uporabo treh GPIO linij. RP2040 je 3,3-voltni MCU in njegovi GPIO priključki lahko varno obdelujejo le 3,3-voltne logične nivoje. Ko sem preveril raven napetosti na odprtih stikalih S1, S2 in S3, je bila ta približno 3,3 V, ko je bila USB-PD napetost na privzeti ravni 5 V. Ko pa se je napetost USB-PD povečala na katero koli višjo nastavitev, se je ta napetost povečala na 4 V, kar je preseglo varno vrednost signala logične ravni RP2040.
Za zmanjšanje napetosti odprtega tokokroga na stikalih sem poskušal simulirati zaprto stikalo tako, da sem visoko stran stikala potegnil na maso prek silicijeve diode, povezane z linijo GPIO RP2040, vendar krmilni čip PD modula Spoof tega ni prepoznal kot zaprto stikalo. Na koncu sem moral uporabiti NPN tranzistorje (Q3, Q4, Q5) za posnemanje stikal. Če si ogledate, kako so ti trije tranzistorji konfigurirani, boste videli, da sta Q3 in Q4 vklopljena, ko sta liniji GPIO v tristopenjskem stanju (med ponastavitvijo). Q5 je v tem času izklopljen.
Tako je konfiguracija stikala nastavljena kot: S1-ON, S2-ON in S3-OFF. To je nastavitev stikala, ki je potrebna za PD izhod 5 V – želel sem zagotoviti, da bo namizni napajalnik proizvajal 5 V in nič več, dokler se uporabnik ne odloči, da bo to spremenil.
Če si pozorno ogledate sliko 4, boste videli, da so S1, S2 in S3 povezani nekoliko drugače, kot je bilo pričakovano. S1 in S2 imata svoje z zemljo povezane priključke na vrhu stikala, S3 pa jih ima na dnu, zato so tri žice, ki povezujejo stikala z linijami GPIO RP2040, povezane s priključki, na katere kažeta rdeči puščici.
5,0 V izhod regulatorja na Spoof modulu je spodnji priključek, kot je prikazano na tej sliki. To zagotavlja 5 V pri vseh ravneh PD napetosti 9 V ali več. Ko je PD napetost nastavljena na 5 V, se napetost zmanjša na 3,6 V. Teh 3,6-5 voltov napaja RP2040 prek priključka VSYS tega modula. Na tej povezavi zaporedno uporabljam Schottkyjevo diodo, da lahko med razvojem v RP2040 priključim tudi USB kabel in ne pride do konflikta med 5 V USB in 3,6-5 V, ki jih zagotavlja Spoof modul.
Poleg petih fiksnih izhodnih napetosti sem dodal 3-pin nastavljivi regulator LM317, ki zagotavlja vmesne napetosti. Ta regulator zmore 1,5 A izhodnega toka – če padec napetosti na njej ne povzroči dovolj velike disipacije moči, da bi se regulator izklopil zaradi toplotne preobremenitve. V tem projektu bi to dosegli tako, da bi fiksno napetost nastavili na naslednjo najvišjo fiksno nastavitev in pustili LM317, da jo regulira do želene napetosti. Edino pravilo pri tem je, da LM317 potrebuje do 3 V razlike med vhodno in izhodno napetostjo, zato morate to upoštevati pri nastavitvi fiksne napetosti.
Za spremljanje napetosti in toka sem izbral drugačno metodo, kot sem jo uporabil pri napajalniku, opisanem v 1. delu. Namesto 16-bitnega ADC ADS1115, ki sem ga uporabil za spremljanje/omejitev toka, sem izbral Texas Instruments INA219B za spremljanje toka/moči. Tudi ta vsebuje 16-bitni ADC skupaj z multiplekserjem in PGA kot ADS1115, vendar je prilagojena za meritve napetosti/toka/moči. Ta čip navaja največjo delovno napetost 26 V, kar je bilo za zasnovo napajalnika v prvem delu nekoliko prenizko.
Med tem ko govorim o INA219, moram omeniti, da sem za ta senzor uporabil Adafruitovo Arduino knjižnico. Njihovo knjižnico sem moral nekoliko spremeniti, da je lahko delovala v tem projektu: Adafruitova inicializacijska rutina jo je konfigurirala za največjo vhodno napetost 16 V, ki sem jo spremenil v 32 V (to spremeni le nekatere konstante za skaliranje – ne prekorači največje dovoljene napetosti 26 V za ta senzor). Adafruit v svojih tokovnih izračunih predpostavlja, da uporabljate tokovni šent upor 0,1Ω. Uporabil bi to vrednost, če bi ga imel na zalogi, vendar sem imel na voljo le upor 0,015 Ω, zato sem uporabil to vrednost in ustrezno skaliral odčitke toka.
Na spletni strani revije Svet Elektronike je na voljo (nekoliko) spremenjena različica knjižnice INA219 podjetja Adafruit, skupaj s skico za Arduino. Sprememba, ki sem jo naredil v Adafruit_INA219.cpp, je bila v vrstici 367:
ina219SetCalibration_32V_2A();
Kot je bilo že omenjeno, napajanje za vezje dobivam iz izhoda regulatorja Spoof modula. Ta se spreminja od 3,6 V do 5 V. To je znotraj razpona napetosti, ki je potrebna za napajanje RP2040 in INA219. Vendar pa 8-mestni LED zaslon, ki sem ga uporabil v napajalniku, opisanem v 1. delu, zahteva 5 V vir napajanja. Pri napetosti 3,6 V ga še nisem preizkusil, vem pa, da pri 3,3 V ne bo deloval, zato ga nisem izbral.
Namesto tega sem uporabil poceni štirimestni LED zaslon, ki ga pogosto najdete na spletnih straneh Alibaba, Amazon itd. Ti zasloni uporabljajo gonilni čip TM1637 in stanejo manj kot 1 €. Delujejo zelo dobro pri napetosti 3,3 V. Edina manjša težava pri tistih, ki sem jih kupil, je, da imajo med 2. in 3. števko dvopičje (za prikaz ure) in ne programabilne decimalke. V tem projektu je decimalna vejica fiksirana na tem mestu, čez zgornjo „piko“ dvopičja pa sem dal malo črnega traku.
Uporabniški vmesnik, povezan z RP2040, je sestavljen iz enega vrtljivega enkoderja/tipke in stikala SPDT s sredinskim položajem izklopa. To je na shemi prikazano kot dve stikali, povezani z GP12 in GP13. Ko je to stikalo aktivirano v enem položaju, se na zaslonu odčita izhodna napetost. Ko je pritisnjena tipka vrtljivega enkoderja, se zaslon preklopi v način SET, z vrtenjem enkoderja pa se izbere fiksna vrednost 5, 9, 12, 15 ali 20 V. S ponovnim pritiskom na tipko izberete to napetost (z uporabo S1, S2, S3 modula Spoof) in se vrnete k odčitavanju dejanske izhodne napetosti.
Če je aktiviran v drugo smer, se na zaslonu prikaže tok v amperih z dvema decimalnima mestoma (tj. z ločljivostjo 10 mA). Tudi v tem primeru lahko s pritiskom na tipko enkoderja obračate vrtljivi enkoder, da prilagodite mejno vrednost toka (prav tako izraženo v amperih na 2 decimalni mesti natančno). S ponovnim pritiskom na tipko nastavite to mejno vrednost toka in se vrnete k odčitavanju dejanskega toka, ki se troši.
Izhodna napetost Spoof modula se pelje skozi P-kanalni MOSFET Q1 (AOD4189), nato pa na tokovni šent upor R3 in monitor napetosti/toka INA219. Če je izmerjeni tok večji od nastavljene mejne vrednosti toka, GP0 pade nizko in izklopi Q1 ter tako prekine napajanje bremena. Na zaslonu bo neprekinjeno utripalo „8888“. Ko odstranite vir prekomernega toka in pritisnete tipko enkoderja, se bo napajanje ponovno vzpostavilo.
Izbira fiksne izhodne napetosti ali nastavljive izhodne napetosti (z uporabo nastavljivega regulatorja LM317) se izvede s stikalom S2 – stikalo ima tudi sredinski izklopni položaj, ki popolnoma onemogoči napajanje bremena. Na sliki 5 je vidite celotno vezje pred namestitvijo v ohišje. Desno je polnilna enota IKEA PD.
Programska oprema
Ugnezdena programska oprema za RP2040 je bila napisana z uporabo okolja Arduino 2.3.2 IDE. Vsem, ki še vedno uporabljajo starejšo različico Arduino 1.x.x IDE, predlagam, da preizkusijo to novo različico, saj vsebuje veliko novih funkcij.
Potrebne knjižnice so na voljo s funkcijo iskanja knjižnic Arduino. Knjižnica pio_encoder.h je v funkciji iskanja Arduino naslovljena kot „rp2040-encoder-library“. Kot sem že omenil, sem knjižnico Adafruit_INA219 nekoliko spremenil in je vključena v izvorno kodo tega projekta.
Zaključek
Kot je razvidno iz tega dvodelnega članka, rad uporabljam odvečne elektronske komponente/enote, kadarkoli imam priložnost. Ko sem prvič slišal za zmožnost PD USB-C, sem pomislil, da bi bilo zanimivo preveriti, ali lahko uporabim MCU, ki ima tako gostiteljska USB vrata kot tudi PD zmožnost. Ko sem nekaj časa preživel z razvojno ploščo Infineon EZ-PD, sem se hitro odločil, da bi bilo kljub mojim preteklim izkušnjam z Infineon PSoC MCU zelo zamudno, če bi se naučil protokola PD/funkcijskih klicev, ki so potrebni za to.
Zato sem vesel, da so na voljo cenovno ugodne razvojne plošče, ki izvajajo PD funkcije, ne da bi mi bilo treba veliko programirati.