Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Programska podrška za programabilni ispravljač
#1
Brick 
Otvaram novu temu o softveru za upravljanje programabilnog ispravljača opisanog ovdje. Razlog za to je što ljubitelji hardvera neće nužno biti toliko zainteresirani za izazove softvera ako želimo da isti ima glavu i rep i ne dovede u pitanje sav trud na hardverskoj strani ili uništenje potrošača koji bi mogao biti spojen na programabilni ispravljač. Softver se razvija u skladu sa sljedećim minimalnim zahtjevima (lista moguće vremenom poraste):
  • "Open source" - od prve za javnost korisne i dovoljno dokumentirane verzije isti će biti objavljen na Bitbucket
  • Lokalni i daljinski (remote) režim rada - omogućiti upravljanje korištenjem jednostavnog GUI preko dispeja na prednjoj ploči ispravljača i udaljeno preko serijskog (via USB) i eternet priključka.
  • Konkurentna podrška za AVR i ARM varijante Arduino (Mega i Due)
  • Višekanalna podrška (min.2 do max.6 po jednom MCU preko SPI)
  • Podrška za različite SPI periferije, defult: vanjski EEPROM serije 25xxx, RTC PCA2115, Eternet ENC28J60, I/O Expander MCP23S08, A/D konverter ADS1120, D/A konverter DAC8552
  • Jednostavna zamjena default periferija s drugima slične funkcionalnosti za potrebe upravljanja drugim ispravljačima
  • Omogućiti funkcionalnost koja je uobičajena za ovakvu klasu uređaja koja se susreće kod sofisticiranih i profesionalnih izvedbi
Pregledom što nude različiti proizvođači lako se dolazi do zaključka da svi nešto bolji uređaji podržavaju IEEE 488 sabirnicu po kojoj se najčešće razmjenjuju SCPI komande koje služe za upravljanje mjernim instrumentima među kojima jednu od prepoznatljivih klasa čine upravo ispravljači. Podrška za sam IEEE 488 nije napravljen na hardverskoj strani pa neće biti (zasad) ni na softverskoj. Ipak, SCPI komandni set izgleda vrlo atraktivno jer omogućuje da nakon što se osigura osnovno interpretiranje komandi, funkcionalnost se može poprilično jednostavno mijenjati/nadograđivati korak po korak. SCPI podrška čini ispravljač od prvog dana otvorenim prema nizu programa koji se koriste za nadgledanje instrumentacije. Spomenuti ću ovdje NI LabView ili Agilent VEE Pro, iako još nije jasno da li će trebati napisati još nešto poput <i>VISA drivera</i> ili <i>IVI drivera</i> koji stoji kao middleware između uređaja i spomenutih aplikacija za potrebe razmjene SCPI komandi.

Prvo nešto o SCPI-ju. Riječ je o standardu kao i svima drugima: veliki ga postavljanju, veliki ga krše i mijenjaju Smile (toga sam se nagledao u softverskoj industriji koja je u stvari samo jedan aspekt igara moći, moćnika i nemoćnika). Istaknuto ime je predvidljivo HP/Agilent/Keysight i pregledao sam dosta korisničkih priručnika njegovih uređaja i vidio da ni on sam nije dosljedan, odnosno lako moguće da različiti timovi iz različitih odjela žive svoj život i imaju svoje ideje kao i što implementirati. Pored Agilenta pri specificiranju SCPI komandi konzultirao sam uređaje NI, Hamega, Keithleya i Rigola. Naravno sve skupa je uspoređivano s zadnjim važećim dokumentom SCPI (sada IVI) konzorcija 1999.0.

Kao što je već spomenuto SCPI je nadogradnja na IEEE 488 standard (HPIB/GPIB) pa zahtjeva da se podrže i neke komande iz tog seta komandi. Te komande počinju s * (npr. *CLS, *IDN?, *TST?). SCPI komande su strukturirane hijerarhijski ("ulančavaju" se dvotočkom), tekstualne su, nisu "case-sensitive" i postoje u kratkoj (3 ili 4 slova) ili dugoj varijanti. Uobičajena je praksa da za kratki dio komande piše velikim slovima, a ostatak malenim. SCPI parser mora znati interpretirati i jednu i drugu formu. Na primjer komanda measure se može pisati meas ili measure pa se onda u specifikaciji piše kao MEASure.
U nastavku ću dati par primjera onog što je već sada funkcionalno. Naravno, tu postoji čitav niz sistemskih poruka za greške kao i one "vendor-specific". Greške se također mogu formatirati u kratkoj i dugoj formi. U kratkoj to je troznamenkasti integer (može biti i negativan), a u dugoj iza broja greške slijedi još zarez i tekstualna poruka. To može biti npr. -113 ili u dugoj -113, "Undefined header".

Do sada je napravljen izvrstan napredak u definiranju interfejsa i SCPI komandi (trenutno dokument od cca 100 stranica) koje će se koristiti za daljinsku kontrolu putem seriala (via USB) ili eterneta. Klijent (ili kontroler po SCPI nomenklaturi) može biti što vam padne napamet dok god se razmjenjuju SCPI komande. Kod koji bude napisan za SCPI moći će se upotrijebiti i za lokalnu kontrolu na samoj kutiji (TFT displej) tako da bi u drugom koraku njegova realizacija mogla ići vrlo brzo i korištenjem već isprobanog s daljinskim klijentom.

Kod izbora SCPI komandi pokušano je držati se što je više standarda, no još jednom to jednostavno nije moguće: prvo zato što je standard sad već poprilično star (IVI konzorcij publicira samo važeći standard, a ne nudi i draftove na uvid) i to što su neki proizvođači jednostavno iste stvari napravili korištenjem drugačijih setova naredbi unutar važeća standarda ili izmišljanjem svojih naredbi tamo gdje to standardnom nije dopušteno. Možda tipična takva naredba (koja se možda pojavi u novoj verziji standarda) je APPLy. Kao osnova za SCPI je uzet open-source parser jednog Čeha u čiju se doradu sada aktivno uključio i kolega koji je na našoj strani zadužen za kodiranje jer neke stvari nisu bile napisane po standardu, a pojavila se i potreba za određenim optimizacijama kako bi se osiguralo dodavanje svih zamišljenih opcija unutar ograničenja prvenstveno kod Mega2560 MCU koji ima samo 8KB SRAMa.

Da krenem s načinima komuniciranja sa softverom. Već sada imamo funkcionalnu podršku za serijski terminal (ovdje prikazan gtkTerm) preko USB priključka:

[Image: 2zTSScg.png]

Kada je uključen debug onda se na serijskom terminalu mogu prikazivati određene poruke baš kao što je to vidljivo na prethodnoj slici (inicijalizacija eterneta, konekcija s DHCP, testiranje kanala i javljanje grešaka jer kanal 2 nije spojen, itd.)

Također je i komunikacija preko eternet priključka (DHCP mu je dodjelio 192.168.1.52) funkcionalna, evo prvo ping:

[Image: 0z5LTLP.png]

... pa onda i telnet:

[Image: hH2DVdR.png]

Dakle, s druge strane može biti bilo kakav program (kontroler) napisan u C/C++/C#, Javi, Pythonu, itd. koji može postavljati i čitati parametre pojedinog kanala s jednog ili više ovakvih ispravljača, tj. isti se može uklopiti u postojeću mrežu uređaja koji su nadgledani s udaljenog mjesta. Neke osnovne stvari možda bude moguće i direktno preko HTTP-a (kako zahtjeva LXI class C device specifikacija). Isto tako i lokalni TFT+touchscreen može biti jedan od SCPI kontrolera koji će se izvršavati lokalno na istom MCU (Arduino).

A sad par primjera onoga što je do sad napravljeno i istestirano, a čime je ispravljač već postao funkcionalnim. Krenuti ću s dvije IEEE488 komande, *IDN? koja vraća identifikacijske podatke o ispravljaču i *TST? koja pokreće self-test proceduru i javlja 1 ako nešto nije u redu ili 0 ako je sve u redu (pomalo obranuta logika):
Code:
*IDN?
EEZ,PSU 24005D,00001,0.22
*TST?
1
Nastavio bih s prije spomenutom nestandardnom SCPI komandom APPLy koja definira dvije stvari odjednom za željeni izlazni kanal: napon i struju. Ona se može pisati skraćeno:
Code:
APPL CH1, 20, 2.5
ili dugačko (što ovdje i nije neka prednost jer je naredba kratka, ali zato ima drugih dobrih kobasica za kratiti):
Code:
apply CH1, 20, 2.5
Velik broj naredbi ako se napišu s ? vraćaju rezultat. U slučaju APPLy to bi izgledalo ovako (namjerno ću izbaciti kanal da vrati grešku):
Code:
appl?
**ERROR: -109, "Missing parameter"

appl? ch1
CH1:40.00V/5.00A, 20.00, 2.50
Obratite pažnju da je oznaka **ERROR: samo za potrebe debuga i da se inače neće pojavljivati.
Nakon postavljanja napona i struje biti će potrebno još samo aktivirati izlaz (output enable) za što se koristi komanda OUTPut (navodim sve načine na koje se može specificirati):
Code:
outp on
outp 1
outp on, ch1
outp 1, ch1
Ova kao i mnoge  druge komande mogu se postavljati sa i bez specificiranog kanala (ili instrumenta po SCPI nomenklaturi), pa ako isti nije specificirao uzima se u obzir trenutno postavljen. Provjera trenutno postavljenog kanala može se napraviti s komandom INSTrument. Slijedi primjer upita koji je kanal postavljen i promjena trenutno postavljenog s kanala 2 u kanal 1:
Code:
INST?
CH2
INST CH1
INST?
CH1
Za dobivanje izlaznog napona biti će potrebno poslati samo dvije komande (po kanalu/instrumentu), APPLy i OUTPut, koje se mogu slati zasebno ili u jednom retku odvojene s ; pa sljedi primjer postavljanja oba kanala na 3,3V i struje na 50mA;
Code:
appl ch1,3.3,50ma
outp on,ch1
appl ch2,3.3,50ma;outp on,ch2
APPLy komanda je kombinacija dvije druge komande: VOLTage i CURRent. Njihovo korištenjem je omogućeno postavljanje samo jedog parametra. U nastavku ću postaviti napon na trenutnom kanalu (ch1) i to tako što ću koristiti rezerviranu riječ MAX što će u slučaju 0-40V/0-5A modela biti 40V. Isto tako ću na kanalu 2 postaviti struju na 1,25A:
Code:
volt max
inst ch2
curr 1.25
Za provjeru postavljenih vrijednosti mogu koristiti volt? i curr? ili appl? ch1 i appl? ch2.
Već je podržana i komanda MEASure za mjerenje napona (VOLTage), struje (CURRent), ali i snage (POWer), a pripremi je i očitavnaje temperaturnih senzora (njih do 5 na dvokanalnom ispravljaču). Ovdje dolazimo do prvog primjera ulančavanja jer će trebati specificirati što se želi mjeriti. Izuzetak je napon (volt) jer on predstavlja osnovni parametar za klasu instrumenta "ispravljač". Evo par primjera za mjerenje napona (kao default pa je VOLTage izostavljen ili deklariran), struje i snage (kanal je u CV režimu):
Code:
appl ch1, 30,max;outp 1
meas?
30.00
meas:volt?
30.00
meas:curr?
1.84
meas:pow?
55.25
Da rezimiram: za korištenje ispravljača biti će dovoljno samo nekoliko komandi:
APPLy - postavljanje napona i struje za izabrani kanal
OUTput - aktiviranje izlaza
VOLTage - zasebno postavljanje napona
CURRent - zasebno postavljanje struje
MEASure? - čitanje izmjerene vrijednosti

Pročitana vrijednost komandom MEASure trebala bi odgovarati postavljenoj vrijednosti (APPLy, VOLTage ili CURRent). To će vrijediti za kalibrirani kanal, što je tema sljedećeg posta Wink.
Reply
#2
Ispravljač bez obzira na preciznost korištene reference (u ovom slučaju REF5025) zahtjeva kalibraciju zbog odstupanja u vrijednostima komponenti kontrolnih petlji kao i grešaka A/D konvertera i D/A konvertera koji se koriste za čitanje i postavljanje željene vrijednosti. Svaki ispravljač koji podržava kalibriranje omogućuje to preko lokalnog interfejsa, a neki to nude i pomoću daljinske kontrole što u prvom trenutku može izgledati nelogično jer na licu mjesta mora netko spojiti teret kod čitanja struje i izmjeriti napon i struju, no na mjestima gdje postoji više uređaja to se sve skupa može automatizirati bez potrebe za daljnjom ljudskom intervencijom. Za daljinsku kalibraciju predviđen je zaseban CALibrate podsistem (<i>SCPI subsystem</i>) unutar kojega su definirane komande za potrebe kalibracije. Podrška SCPI kalibracije nije bila nadahnuta nekim "mission impossible" scenarijom već mogućnošću da se kroz "usitnjene" korake koje se rade preko SCPI komandi nauči kako napraviti kalibraciju koja će biti trivijalno u sljedećem koraku podržati i kroz lokalni GUI.
Krenimo prvo s nekalibriranim kanalom. U tom slučaju male su šanse da izmjerene vrijednosti (MEASure) odgovaraju postavljenim (VOLTage, CURRent, APPLy).

<i>Važna napomena: ciljana rezolucija ovog ispravljača je 10mV/10mA. Softverski se može postići bolja rezolucija, a i hardverski se zaista bolja postiže iako postoji malo smiješna situacija da je ADC rezulucija manja (15-bita) od DAC rezolucije (16-bita). Dakle ona je sada softverski ograničena pa će sve vrijednosti trebati odgovarati na drugu decimalu ako je kanal kalibriran.</i>

U nastavku postavljam napon na 10V i mjerim što ADC očitava. Isto tako postavljam struju na 1.23A i mjerim što ADC očitava.
Code:
curr max; volt 10
meas?
9.96
volt max; curr 1.23
meas:curr?
1.24
Kao što možemo vidjeti očitani napon odstupa za 40mV, a struja za 10mA. Krenimo sa kalibracijom. Za dobru kalibraciju će trebati imati multimetar koji bi trebao biti pretpostavljam barem za dva reda veličine precizniji od onoga što želimo postići tj. što točniji na 4 decimale. Takvo što nažalost nemam pri ruci, no ipak može se doći do toga da se poništi često prisutan offset u jednu ili drugu stranu koji je manje više linearan po čitavoj skali. Za potrebe mjerenja struje dobro bi došao otpornik koji može izdržati max struju (3 ili 5A). Pretpostavljam da neće smetati i da mu je temp. koeficijent što bolji tj. manji (ppm/oC).

<b>Ovdje bih zamolio sve one koji ovo čitaju s područja Zadra ili Zagreba a imaju pristup poštenom multimetru i trpili bi posjetu od pola sata/sat za pokušaj ispitivanja kalibracije da mi se jave, na što im se unaprijed zahvaljujem.</b>

Za promjenu kalibracijskog režima koristi se
Code:
CALibrate[:MODE] ON|OFF, "<password>"
<i>Napomena: MODE je opcija i ovdje i u nastavku sve opcionalno će biti pisano u uglastim zagradama.</i>
Znači u kalibraciju se ne ulazi tek tako već će trebati znati lozinku da se slučajno ne unište valjani kalibracijski parametri. Isto tako kod profesionale kalibraciju rade samo ovlašteni serviseri pa se na ovaj način osigurava garancija.
Kod nas je default lozinka eezpsu, i ista se može mijenjati s komandom
Code:
CALibrate:PASSword:NEW <old_password>,<new_password>
Komanda s kojom se postavlja kalibracijski režim može se koristiti i za provjeru da li je kanal u tom režimu.
Prije ulaska u kalibracijski režim treba maknuti trošilo ako je spojeno na kanal i aktivirati kanal s OUTPut komandom. To treba svakako učiniti prije prvog kalibracijskog koraka bez obzira radi li se kalibracija napona ili struje:
Code:
outp on
U nastavku slijedi primjer provjere režima, ulazak u kalibracijski režim s krivom lozinkom što će generirati grešku, ponovni uspješni pokušaj i još jednom provjera režima:
Code:
cal?
0
cal on, "test"
**ERROR: 102, "Invalid cal password"
cal on, "eezpsu"
cal?
1
Za kalibraciju napona koristi se komanda CALibrate:VOLTage:LEVel MIN|MID|MAX a za struju CALibrate:CURRent:LEVel MIN|MID|MAX. One postavljaju izlaz na tri različite vrijednosti napona i struje. Kada se vrijednost na izlazu postavi istu je potrebno pročitati s preciznim instrumentom i poslati korištenjem CALibrate:VOLTage[Big GrinATA] <new_value> ili CALibrate:CURRent[Big GrinATA] <new_value>. Ovdje treba uzeti u obzir dvije stvari: prvi korak kalibracije mora biti MIN i ne mogu se istovremeno kalibrirati dvije vrijednosti (napon i struja). Dok smo u određenom koraku možemo neograničeni broj puta unositi izmjerenu vrijednost sve dok se ne pomaknemo u sljedeći korak (npr. iz MIN u MID ili iz MID u MAX). Izmjerena vrijednost se unosi s proizvoljnim brojem decimala (znači to može biti preko dvije!).
Evo kako bi to izgledalo u primjeru napona za model 0-40V/0-5A:
Code:
cal:volt min
cal:volt 31.6mv
cal:volt mid
cal:volt 18.99
cal:volt max
cal:volt 37.9
... ili struje:
Code:
cal:curr min
cal:curr 10.2ma
cal:curr mid
cal:curr 2.45
cal:curr max
cal:cur 4.90
Važno je za znati da kalibracijski MIN, MID i MAX ne moraju odgovarati vrijednostima radnog područja (ali moraju biti unutar njega). Npr. kod kalibracije napona MIN ne postavlja 0V već 100mV, a MAX kod struje kod modela 0-5A ne postavlja 5A već 4,9A. MID vrijednost je kontrolna i služi za provjeru izračunatih kalibracijskih parametara (postavljeno dozvoljeno odstupanje je 1% koje ako se prekorači poništava kalibraciju).
Nakon uspješne kalibracije istu je potrebno pohraniti u EEPROM. Uz kalibracijske podatke dozvoljeno je upisati i neki komentar, kao posjetnik. Uz komentar, program će automatski dodati datum kalibracije. Za to nam služi komanda CALibrate:REMark "note". Spremanje kalibracijskih parametara vrši se komandom CALibrate:SAVE
Nakon uspješnog spremanja potrebno je izaći iz kalibacijskog režima (cal off, "password"). Evo primjera finalizacije:
Code:
cal:rem "moja prva kalibracija"
cal:save
cal off, "eezpsu"
cal?
0
Po izlasku iz kalibracije i napon i struja će biti postavljena na nulu. Kada valjani kalibracijski parametri postoje u EEPROMu kod svakog sljedećeg uključenja kanala  uzimati će se u obzir kalibracijski podaci prilikom postavljanja i mjerenja vrijednosti. Da li kanal trenutno koristi iste ili ne može se provjeriti komandom CALibrate:STATe? U slučaju da se koriste (i postoje) imamo:
Code:
cal:stat?
1
Pored toga dodali smo i jednu neobaveznu diagnostičku komandu DIAGnostic[:INFOrmation]:CALibration? [CH1|CH2] (kanal neobavezan, jer je u uglatima!). Evo što bi ona vratila u našem primjeru:
Code:
diag:cal?
remark=20151013 moja prva kalibracija
u_cal_params_exists=1
u_min_level=0.10V
u_min_data=0.03V
u_min_adc=0.06V
u_mid_level=19.05V
u_mid_data=18.99V
u_mid_adc=19.01V
u_max_level=38.00V
u_max_data=37.90V
u_max_adc=37.96V
i_cal_params_exists=1
i_min_level=0.01A
i_min_data=0.01A
i_min_adc=0.02A
i_mid_level=2.46A
i_mid_data=2.45A
i_mid_adc=2.46A
i_max_level=4.90A
i_max_data=4.90A
i_max_adc=4.91A
Tu možemo vidjeti korištene vrijednosti za kalibraciju, unešene vrijednosti i korekciju za ADC kao i to da li je kalibriran napon ili struja jer je moguće da smo kalibrirali samo jedan parametar. U slučaju da ne postoji kalibracijski podaci dobili bi sljedeće:
Code:
diag:cal?
remark=Not calibrated
u_cal_params_exists=0
i_cal_params_exists=0
Nakon uspješne kalibracije možemo se malo poigrati i vidjeti kakva su odstupanja kada se uzimaju u obzir kalibracijski podaci ili ne. Za to se također može koristiti prije spomenuta CALibrate:STATe ali ne kao upit već kao komanda. Ako želimo isključiti kalibraciju koristiti ćemo:
Code:
cal:state off
cal:stat?
0
Testirati ćemo postavljanje i čitanje napona na 12,34V i kasnije struje na 560mA:
Code:
curr max
volt 12.34
meas?
12.37
volt max
curr 560ma
meas:curr?
0.57
... i sada ćemo uključiti kalibracijske podatke i vidjeti da očitana vrijednost odgovara postavljenoj:
Code:
cal:stat on
curr max
volt 12.34
meas?
12.34
volt max
curr 560ma
meas:curr?
0.56
Ovdje smo također dodali još jednu dijagnostičku komandu koja omogućuje dobivanje (u postavljenoj točnosti od dvije decimale) prikaz očitanja na svim kanalima ADC konvertera pa bi za prethodni slučaj mogli vidjeti sljedeće:
Code:
diag:adc?
U_SET=39.92V
U_MON=9.10V
I_SET=0.56A
I_MON=0.56A
Sve postignuto preko SCPI komandi biti će omogućeno i na lokalnom displeju kada za to dođe vrijeme u formi wizarda koji će korisnika voditi kroz sve korake kako bi se kalibracija mogla što jednostavnije obaviti.
Reply
#3
Dodane su četiri vrste zaštita: naponska (OVP) i strujna (OCP) za zaštitu priključenog trošila i temperature (OTP) i snage (OPP) za potrebe zaštite samog ispravljača, ali i određenih vrsta trošila. Naponska i strujna s trenutnim dizajnom ispravljača se nadovezuju na naponsko i strujno ograničenje tj. ulazak u CV ili CC režim rada budući da ispravljač ne sadrži specijalizirane sklopove za OVP i OCP koji se mogu programirati neovisno o izlaznog napona i struje. Iz tog razloga nisu ni implementirane posebne komande kojima se definiraju pragovi okidanja (trip) već se gleda kada će kanal ući u odgovarajući režim rada i nakon toga se mjeri postavljeno vrijeme koliko smije izaz biti u programiranoj vrijednosti. Na primjer ako se želi izvesti strujna zaštita (OCP) koja će se aktivirati nakon 100ms pratiti će se trenutak kada je kanal iz CV prešao u CC režim rada. Ako ostane u CC više od 100ms izlaz se gasi (OUTPut OFF).

Zaštita od naponskog prekoračenja (OVP)
Komande za naponsku zaštitu su sljedeće:
Code:
[SOURce[<n>]]VOLTage:PROTection:STATe
[SOURce[<n>]]VOLTage:PROTection:DELay
[SOURce[<n>]]VOLTage:PROTection:TRIPped?
Prva služi za uključivanje OVP, druga za postavljanje potrebnog vremena da kanal bude u CV režimu i trećom se provjerava da li je došlo do aktivacije, tj. da li je ova vrsta zaštite isključila izlaz. Za naponski prag ne postoji specijalizirana komanda već se koristi ona za postavljanje napona: VOLTage.
Naravno da bi ovakva OVP imala smisla ista se ne može aktivirati bez priključenog trošila. Evo jedan primjer: postavljamo izlazni napon na 25V i namještamo struju od 1A koja će biti dovoljno niska da s priključenim trošilom izlaz odmah ode u CC režim. Kad se trošilo isključi, napon će porasti na postavljenu vrijednost i nakon 50ms će OVP "tripovati" što će se moći provjeriti s pripadajućom komandom:
Code:
volt 25
volt:prot:stat on
volt:prot:del 50ms
outp on
Ovako to izgleda na izlazu:

[Image: QO1bDGM.png]

Provjeru da je izlaz isključen i da je razlog za to bio OVP trip možemo dobiti sljedećim komandama:
Code:
outp?
0
volt:prot:trip?
1
Kada je zaštita aktivirana, izlaz kanala se neće moći uključiti dok god nije počišćen "trip". Pokušaj aktivacije s OUTPut ON komandom javiti će grešku koju možemo vidjeti komandom SYSTem:ERRor?
Code:
outp on
outp?
0
syst:err?
201,"Cannot execute before clearing protection"
Za reset aktivirane zaštite na kanalu koja može biti OCP, OVP ili OPP koristi se komanda:
Code:
OUTPut:PROTection:CLEar
Nakon njezina izvršavanja izlaz će biti moguće ponovno aktivirati:
Code:
outp:prot:cle
outp on
outp?
1

Zaštita od strujnog prekoračenja (OCP)
Set komandi za strujnu zaštitu odgovara onima za naponsku jer kao što smo rekli ne postoji specijalizirani OCP sklop pa tako ne postoji ni komanda za namještanje struje već se koristi vrijednost postavljena s CURRent koja je predstavljena u jednom od prethodnih postova:
Code:
[SOURce[<n>]]CURRent:PROTection:STATe
[SOURce[<n>]]CURRent:PROTection:DELay
[SOURce[<n>]]CURRent:PROTection:TRIPped?
Kod strujne zaštite prilikom inicijalizacije ne mora biti priključeno trošilo ali i može dok god ono neće povući predviđenu struju. Aktivacija strujne zaštite od recimo 1A nakon 5ms išla bi na sljedeći način:
Code:
curr 1
curr:prot:stat on
curr:prot:del 5ms
outp on
Ovako to izgleda na izlazu:

[Image: iFkr1ci.png]

Slijedi provjera OCP aktivacije, stanja izlaza, brisanja aktivacije i ponovnog uključenja izlaza:
Code:
curr:prot:trip?
1
outp?
0
outp:prot:cle
outp on
outp?
1

Zaštita od prekoračenja snage (OPP)
Prekoračenje snage za razliku od naponskog i strujnog uključuje komandu za definiranje praga pa tako imamo sljedeći set komandi:
Code:
[SOURce[<n>]]:POWer:PROTection[:LEVel]
[SOURce[<n>]]POWer:PROTection:STATe
[SOURce[<n>]]POWer:PROTection:DELay
[SOURce[<n>]]POWer:PROTection:TRIPped?
Ova zaštita ne prati režim rada (CV ili CC) već izmjerenu vrijednost snage koju, kao što smo vidjeli u jednom od prethodnih postova, možemo dobiti komandom:
Code:
MEASure[:SCALar]:POWer[:DC]?
Sekvenca za aktiviranje zaštite ako dođe do prekoračenja snage od 80W dulje od 10 sekundi bila bi sljedeća:
Code:
pow:prot  80
pow:prot:del  10
pow:prot:stat on
outp on
Po aktivaciji ove zaštite mogli bi konstatirati sljedeće:
Code:
pow:prot:trip?
1
outp?
0
Za reset zaštite i ponovno uključenje kanala imamo još jednom:
Code:
outp:prot:cle
outp on

Mjerenje temperature i zaštita od temperaturnog prekoračenja (OTP)
Temperaturna zaštita je izvedena kroz komande zasebnog SCPI podsistema TEMPerature za razliku od prije navedenih koje pripadaju SOURce podsistemu. Trenutni dizajn omogućuje rad sa do 5 temperaturnih senzora:
  • MAIN - spaja se direktno na 12-bitni ADC na Arduino shield. Aktivirane zaštite korištenjem ovog senzora ruši napajanje glavnog transformatora (ispravljač ide u stand-by režim)
  • S1, S2 - spaju se na V/F konvertere CH1 i CH2. Aktiviranje zaštite korištenjem ovih senzora gasi izlaz dotičnog kanala (što odgovara komandama OUTPut OFF, CH1 i OUTPut OFF, CH2)
  • BAT1, BAT2 - spajaju se na V/F konvertere na Arduino shieldu i izolirano prosljeđuju dotičnom kanalu. Mogu se koristiti za praćenje temperature prilikom punjenja i pražnjenja baterija koje imaju NTC. Aktiviranje zaštite korištenjem ovih senzora postavlja samo bitove odgovarajućih statusnih registara o kojima će biti riječ u budućim postovima. Na samoj aplikaciji je da odluči što će činiti kada se aktivira ovaj OTP.
Trenutno je implementirana podrška samo za MAIN senzor, koji je inače i opcionalan tj. ako komanda ne sadrži eksplicite naveden senzor radnja će se izvršiti na MAIN senzoru. Krenimo s mjerenjem temperature. Za to možemo sada koristiti sljedeću komandu:
Code:
MEASure[:SCALar]:TEMPerature[:THERmistor][:DC]? <sensor>
gdje je <sensor> jedna od gore navedenih vrijednosti. Mjerenje temperature na glavnom senzoru može se napraviti na jedan od sljedećih načina:
Code:
meas:temp? main
31.30
meas:temp?
31.30
Iako je vraćena vrijednost s dva decimalna mjesta, preciznost mjerenja temperature nije ni izbliza toliko dobra, što i nije neki problem zbog samog karaktera ove pojave. Naime pratimo li temperaturu glavnog trafa, hladila ili baterije neće veliku razliku (ni štetu!) učiniti ako postavljenih 60oC u stvarnosti bude par stupnjeva odstupalo od izmjerenog. Za aktivaciju, reset i provjeru temperaturne zaštite koriste se sljedeće komande:
Code:
TEMPerature:PROTection[:HIGH]:CLEar <sensor>
TEMPerature:PROTection[:HIGH][:LEVel] <temperature>, <sensor>
TEMPerature:PROTection[:HIGH]:STATe {ON|OFF}, <sensor>
TEMPerature:PROTection[:HIGH]:DELay[:TIME] <delay>, <sensor>
TEMPerature:PROTection[:HIGH]:TRIPped?, <sensor>
Primjer aktivacije temperaturne zaštite korištenjem MAIN senzora (koji je default) ako se temperatura popne do 70oC i ostane na toj vrijednosti 180 sekundi:
Code:
temp:prot 70
temp:prot:del 180
temp:prot:stat on
Da je došlo do aktivacije zaštite možemo ustvrditi sljedećom komandom:
Code:
temp:prot:trip?
1
Kako je prije navedeno aktivacija ove zaštite dovesti će ispravljač u stand-by što se može provjeriti komandom koja se koristi i za programsku promjenu režima rada:
Code:
SYSTem:POWer {ON|OFF}
U ovom slučaju koristimo komandu u upitnoj (query) formi:
Code:
syst:pow?
0
Za ponovno aktiviranje ispravljača biti će potrebno izvršiti sljedeću sekvencu:
Code:
temp:prot:cle
syst:pow on
Za kraj navesti ću još jednu komandu koja je dodana za pregled svih implementiranih zaštita na jednom mjestu:
Code:
DIAGnostic[:INFOrmation]:PROTection?
Trenutno ona vraća podatke u sljedećem formatu:
Code:
diag:prot?
"CH1 u_tripped=0","CH1 u_state=0","CH1 u_delay=0 ms","CH1 i_tripped=0","CH1 i_state=0","CH1 i_delay=0 ms","CH1 p_tripped=0","CH1 p_state=0","CH1 p_delay=0 s","CH1 p_level=0.00 W","CH2 u_tripped=0","CH2 u_state=0","CH2 u_delay=0 ms","CH2 i_tripped=0","CH2 i_state=0","CH2 i_delay=0 ms","CH2 p_tripped=0","CH2 p_state=0","CH2 p_delay=0 s","CH2 p_level=0.00 W","tmain_tripped=0","tmain_state=1","tmain_delay=30 s","tmain_level=41.00 oC"

Valja nešto reći i o rezoluciji svih zaštita. Ona je trenutno definirana postavljenom brzinom uzorkovanja/sempliranja ADC ulaza koji generiraju prekide/interupte što definira i vrijeme izvršavanja glavne programske petlje. U slučaju Arduino Mega2560r3 ciklus je ~2.6ms, dok je Due nešto brži pa imamo ~2ms. Ovaj podatak je važan za OCP i OVP zaštite dok za OPP i OTP koje se u praksi definiraju u sekundama ili minutama to neće predstavljati nikakvu razliku. Dakle ako bi htjeli izvršavanje OCP ili OVP bez zadrške (DELay im je 0) možemo računati da će do aktivacije u najgorem slučaju doći za 2.6ms na Megi ili 2ms na Due što pretpostavljam da je za ovakvu klasu uređaja, koja uz to nema specijalizirane OCP i OVP sklopove, sasvim solidno.

Pregledom komandi za različite zaštite završavamo dio ključnog upravljačkog seta koji referentni dizajn ispravljača čini funkcionalnim. U sljedećim postovima biti će još riječi o naprednom setu komandi i sustavu registara koje mora podržavati svaki SCPI uređaj. Tim predstavljanjem biti će zaokružen set funkcionalnosti koji će biti uključen u M1 (milestone one) verziju čiji će source kod biti javno objavljen skupa s dokumentom o podržanim komandama. Ali to nije sve Wink! Planiramo u M1 ubaciti i simulator (također sa source kodom) za Windowse i Linux kojim će se preko konzole ili vanjske SCPI controller aplikacije moći isprobati sve ovdje prikazano bez potrebe da se ima pri ruci ispravljač.

Vaši komentari, kritike i prijedlozi su dobrodošli!
Reply
#4
Evo par novih informacija o tome što se napravilo u međuvremenu. Prvo nešto o postavljenim ciljevima i njihovim nazivima:

M1 (milestone one) - firmware za Arduino Shield (Mega i Due) usklađen s SCPI specifikacijom za klasu instrumenta - ispravljač. Podržane komande za programiranje i mjerenje izlaznih parametara, različite zaštite (OVP, OCP, OPP i OTP), kalibraciju izlaznog napona i struje, kontrola izlaza i remote sense ulaza, uključenje/stand-by, sistemski datum i vrijeme, diagnostika, beeper i podrška za kompletnu strukturu SCPI statusnih registara. Podržana je serial (via USB) i eternet komunikacija. Parametri su trenutno hardkodirani (npr. eternet port je 5025).
Ova verzija također ima softverski simulator koji omogućuje da se sva implementirana SCPI funkcionalnost testira bez potrebe da se ima stvarni uređaj! Simulator se direktno kompajlira iz koda koji se koristi i za živi uređaj što omogućuje lakše održavanje koda. Isto tako simulator se može pokrenuti na Windowsima, Linuxu i OS X-u. Kada je riječ o Linux varijanti onda bi to trebalo uključivati i male sisteme poput Raspberry PI i Beaglebone Black. U simulatoru se mogu direktno zadavati komande ili se na njega može spojiti vanjskom aplikacijom poput telneta ili Keysight Command Expert.

M2 - Ima sve što i M1 s time što će biti dodana i podrška za lokalnu konzolu - TFT kolor displej na samom ispravljaču. Zahvaljujući touch-screenu kao pointing device biti će moguće na sam displej staviti veliki broj funkcija koje će biti dohvatljive jednim dodirom prsta - mogućnost koju komercijalni uređaju uglavnom još uvijek ne nude.

M3 - Sadrži prošireni set SCPI komandi koje su najavljene u M1 (vidi sekcija 11 dokumenta u prilogu). To će značiti dodavanje podrške za programabilno spajanje i odspajanje kanala u seriju ili paralelu, arbitrary waveform generator, rad s trigerima, “mass-storage” (SD-card) za data logging i podrška za SRQ (service request) preko Ethernet.

V1.0 - Uključivati će sve novododano u M3 ali sada i za lokalnu konzolu (TFT).

O ostalim već podržanim SCPI komandama više nisam pisao u novim postovima, ali je zato gotovo do kraja kompletiran priručnik za M1 verziju. U prilogu se nalazi preliminarna verzija, koji ima i svoju web verziju koja će uskoro postati vidljiva. Priručnik je na engleskom što vjerujem da onima koji su stvarno zainteresirani za ovu problematiku neće predstavljati veći problem.
M1 se usporedno testira na AVR i ARM procesorima kao i simulator na Windowsima i Linuxu i trebao bi uskoro također biti objavljen source kod, kao i spomenuti simulator da se može dosad napravljeno na neki način isprobati (dodana je i Sekcija 10 s primjerima).


Attached Files
.pdf   EEZ PSU SCPI reference M1 - preliminary DRAFT.pdf (Size: 2,96 MB / Downloads: 5)
Reply
#5
Prva verzija firmvera je zgotovljena i postavljena na GitHub. Uz nju ide dokumentacija o podržanoj funkcionalnosti preko seta SCPI komandi s kojima se ispravljač može daljinski upravljati korištenjem serijske (via USB) i eternet komunikacije.

Firmver uključuje i softverski simulator koji se može pokrenuti najmanje na Windowsima, Linuxu i OS X. Link prema instalaciji za kompajliranu Windows verziju nalazi se na spomenutoj GitHub stranici i na dnu ove stranice.

Kako se koristi simulator može se doznati u 9. poglavlju SCPI priručnika, a neki primjeri korištenja SCPI komandi navedeni su u 10. poglavlju.

Unaprijed VELIKO HVALA svima koji će investirati nešto vremena i isprobati simulator (i pretplatiti se ili dati zvjezdicu na GitHub-u) i poslati neke komentare i primjedbe bez obzira što je u ovoj verziji sve skupa poprilično "dosadno". No, već u sljedećem koraku (M2) kada će se dodati i lokalna kontrola (GUI za TFT displej), a koja će se također moći testirati na simulatoru mogla bi biti punooooo zanimljivija za mnoge.
Reply
#6
Postavljanje izlaznih parametara kanala je napokon zaokruženo i o tome sam snimio kratak video (na engleskom s jakim akcentom ali vjerujem da je razumljiv Smile).
Postoje tri načina postavljanja: "slider", "step" i "keypad" gdje prva dva još imaju opciju "interactive" i "non-interactive". Unaprijed se zahvaljujem na kritikama i prijedlozima kako ovo napraviti još upotrebljivijim.

https://youtu.be/jofIdGx2gTg
Reply
#7
Mene oduševljava tvoja posvećenost detaljima. Šta si sve uspeo da smestiš na ovaj TFT LCD! 
Sviđa mi se ideja da sa jedne strane ekrana imaš grubo podešavanje a sa druge finije. Eventualno bih dodao mogućnost da neke unapred podešene vrednosti izlaznih veličina sačuvaš u memoriji pa da ih odatle pozivaš direktno pritiskom na neko polje na ekranu. Predpostavljam da su vrednosti koje se pojavljuju po uključenju zapravo one koje si zadnji put postavio pre gašenja uređaja. Video sam tvoj projekat i na hackaday stranici a oni trenutno imaju neki nagradni program koji se odvija u par različitih etapa. Mislim da bi ovo tvoje moglo da bude ozbiljan takmac za neku od nagrada.
Reply
#8
(03-26-2016, 12:58 PM)gorankg Wrote: Mene oduševljava tvoja posvećenost detaljima. Šta si sve uspeo da smestiš na ovaj TFT LCD! 
Sviđa mi se ideja da sa jedne strane ekrana imaš grubo podešavanje a sa druge finije. Eventualno bih dodao mogućnost da neke unapred podešene vrednosti izlaznih veličina sačuvaš u memoriji pa da ih odatle pozivaš direktno pritiskom na neko polje na ekranu.

Da, to već imamo: 10 profila je podržano kroz SCPI komande (MEMory podsistem) i sad treba vidjeti kako to na zgodan način ponuditi preko lokalne kontrole. To i još puno toga će biti dodano (da se ulovi ono što je ponuđeno preko SCPI-ja). Najgori posao je napravljen. Poprilično smo se napatili s touch-screen kontrolom dok nismo shvatili kako stvari stoje. Lib (Utouch) s kojim se počelo raditi možda radi dobro s drugim displejima ali s ovim i za preciznost koja nama treba se pokazao kao loša šala. Na youtube kanalu sam ostavio dva videa na kojima se može vidjeti razlika između polaznog i novog algoritma ("otrov" za touch-screen kontroler je izgleda slabi pritisak na površinu).
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)