Watmetras, naujas firmware ir kalibravimas

Tai naujos firmware pristatymas mano savadarbiui elektros matuokliui (vatmetrui). Kaip ir minėjau senesnėse žinutėse, pirminis firmware yra tik greitas juodraštis, kad pasitikrinti ar prietaisas veikia. Sukalibruoti seną versiją tai tik skausmas šiknoje- visos konstantos surašytos ir hardcoded į programą. O tai baisuokliškai nepatogu. Specialiai pasidariau dar vieną matuoklį. Šį kartą panaudojau 3 fazių skaitiklio korpusą. Geležies lygyje matuokliai nesiskiria, nebent tuo, kad padaryti LED mirksiukai kurie demonstruoja aktyvios ir reaktyvios energijos “kvantus” ir dar sumontavau I2C duomenų šynos kištuką. Pats PCB kiektai skiriasi nuo pirminės versijos.

savadarbis vatmetras
(PF rodmenys dar neteisingai skaičiuojami)

Pagrindiniai skirtumai firmwarėje:

1. Visiškai atsisakyta slankiojo kablelio matematikos. Softo ilgis sumažėjo nuo ~9K iki 5.5K. Manau softas pasidarė ir greitesnis. Softas sumažėjo nežiūrint į tai, kad parašytas visas RS232 interaktyvus valdymas.
2. Prietaiso valdymas, kalibravimas per terminalinę programą pajungta per optinę jungtį (57600 8N1). Šiaip aš pradžioje projektavau kelis mygtukus. Bet vėliau nusprendžiau, kad dėl saugumo, jokių mygtukų nebus.

ADE skaitliukas ir terminalas
(čia matosi ATH komandos rašymas kad išjungti duomenų srautą. Plačiau apie tai kiek žemiau.)

3. Šios versijos softas naudoja didesnį LCD ekraną. Tačiau tai padaryta tik dėl mano patogumo. Programos softas leidžia visus skaičiukus sudėti kompaktiškiau. Ir šiaip, kam reikalinga dažnio indikacija? 🙂
4. Visi konfiguraciniai skaičiukai (bent jau tie kuriuos aš palaikiau svarbiais) išsaugomi atmegos EEPROMe.
5. 16 kilobaitu I2C mikroschema dar nepanaudota. Tiesa, firmware leidžia nusiskaityti per consolę jos turinį.

Kalibravimas

Kalibravimas atliekamas pagal Analog device rekomendacijas- skaityti datasheetą. Kalibracija labai sunki dėl reikiamų prietaisų ir elektros tinklo sąvybių. Mumi prireiks: kintamos srovės TRUE RMS voltmetro ir ampermetro, reguliuojamo 50Hz stabilaus (! beviltiška) šaltinio, kelių aktyvinių apkrovų (kiek galima didesnės galios- kokių 5kW, 2kW ir ko nors mažesnio). Jokių induktyvinių elementų, grynas R. Toliau reikės reaktyvinių apkrovų, irgi kiek galima didesnių- kondikų ir droselių (trafų be apkrovos)… ir gerai būtų kontrolinių vatmetrų… bet čia jau beviltiška. Pati mikroschema deklaruoja gana didelį tikslumą: 0.2%, tačiau buitinėm sąlygom tas tikslumas nepasiekiamas dėl kalibravimo sunkumų.

Primityvus kalibravimas:

Pajungiam prietaisą prie elektros tinklo, be apkrovos. Pasijungiam terminalą. Naujai užprogramuotas matuoklis rodo visiškus briedus (šimtai ar dešimtys kW ir panašiai), mirkčioja ledai, terminale bėga bet kokie skaičiai ir kas antroje eilutėje pranešimas apie pertraukimą (interrupt=454AF ar panašiai). Tai todėl, kad kai ištrini atmega (bent jau pas mane), jos epromas buna užpildytas FF reikšmėm. O tai žvėriški daugikliai.
Nekreipdami dėmesio į chaosa terminale (ir LCD ekranėlyje) rašom DIDŽIOSIOM RAIDĖM:

AT&F

Po šios komandos chaosas turi apsiraminti, voltai, amperai, vatai ir kiti turi pasidaryti bent jau panašūs į realius. Terminale nebeturi rodytis “interrupt” pranešimai. Interrupt- tai kai atmega nebesuspėja nuskaityti sukauptos energijos ir ADE registrai persipildo.
Terminale dabar turi bėgioti gražios duomenų eilutės (kurios lengvai importuojamos į elektronines lenteles). Tačiau šie skaičiai nervija. Todėl rašom komandą kuri išjungia rodymą:

ATH

Darba matome OK pranešimą ir terminalo langas nebekvailioja. Jei išjungsim maitinimą, vėl viskas bus iš pradžių, todėl šiuos “fabrikinius nustatymus” reikia surašyti į atmegos eepromą. Todėl rašom komandą:

AT&W

Dabar perkrovus visą prietaisą (cycle power) viskas turi būti normalu. Tas pats, jei išprovokuoti perkrovimą ir softwariškai su komandą ATZ , tai paprasčiausias ciklas ir atmega persikrauna dėl watchdog suveikimo.
Galima softwariškai perkrauti ir ADE7758 čipą komanda ATA.
Beja, jei norite vėl matyti duomenų eilutetes, parašykit komandą ATG.

Pajungiam voltmetrą prie prietaiso ir matuojam įtampą. Ji aišku nesutaps su prietaiso nuskaityta. Dabar reikia parinkti du 12 bitų skaičius. Tai daugiklis ir DC poslinkis (offset). Mano matuoklois naudoja tik C fazės rodmenis, tai mus dominantys registrai yra 0x26 (gain) ir 0x35 (offset). Gain galima pasikaičiuoti lyginant prietaisų parodymus ir žinant kad šis registras keičia ±50% with a resolution of 0.0244%/LSB. Vyriausias bitas yra ženklas. O galima iš palubinsko rašyti skaičius kol voltmetrai sutaps. Pas mane jie pradeda panašiai rodyti prie 0x478 reikšmės. A tiesa, užmiršau parašyti, visi skaičiai tik šešioliktainiai.
Rašom į Gain registrą su komanda:

ATX262000478

Čia ATXnnlmmmmmm. nn- registro numeris, l- ilgis baitais (1-3), mmmmmm- registro reikšmė. Būtini 000 priekyje (leading zeros).
Nuskaityti bet kurio registro reikšmę iš ADE mikroschemos:

ATYnnl

Čia nn- registras, l-ilgis baitais.
Rašant ir skaitant būtina pasidomėti kiek bitų ir atitinkamai baitų turi registras. Gain registras 12 bitų. Jį dapildom iki 24 bitų nuliais. Čia dėl to, kad softas kvailas 🙂 O SPI persiuntimas tik po 8 bitus, tai jei 12 bitų, vistiek į mikroschemą įsirašo 16 bitų. Iš čia ir ilgis- 2 baitai.
Firmware beveik neturi apsaugos nuo kvailų veiksmų, todėl laikykit šalia instrukcijas.

Grįžtam prie kalibravimo. Pakeičiam įtampą su kokių LATRu ir vėl žiūrim ką turim. Pastebim, kad įtampos rodymas kiek skiriasi. Čia paprasta matematika, priklausomybės formulė korekcijom:

U=Uin*x+a

Tas a ir yra DC offset, kurį ir rašom į registrą 0x35. Taip smaukom skaičius, kol voltmetras pradeda rodyti teisingai. Pastačius įtampą į vietą pereinam prie srovės. Čia registrai Igain=0x29 ir Ioffset=0x38.

Teoriniai paskaičiavimai, kodėl parinkti kai kurie koeficientai aprašyti firmwares source faile. Tas aktualu tiems žmonėms kurie norės panaudoti kitokius srovės transformatorius ar įtampos daliklius. Aišku galima pasiskaityti ir datasheetą, tačiau ten viskas “ant pirštų” paaiškinta.

Viskas lygiai taip pat reguliuojasi- tik dabar matuojam srovę su etaloniniu ampermetru.

Pastačius U ir I, pažvelgiam į VA parodymus. Čia paprasčiausias voltu ir amperų sudauginimas. Čia jau rodos nėra offset registro, tačiau yra gain registras (0x32). Čia reikia tai sureguliuoti, kad rodytų voltų ir amperų daugybos rezultatą.

Pastačius VA einam prie svarbiausio skaičiaus- vatų. Kol apkrova grynai aktyvinė, VA ir W parodymai turi sutapti. Tačiau vistiek rekomenduočiau pasijungti etaloninį vatmetrą. Čia mums vėl du registrai Wgain=0x2C ir Woffset=0x3B.

Dabar prasideda mistika. Datasheetas sako prijunkit 0.5 cos fi apkrovą. Nu ir kur ją gauti? Niekaip. Vienintelis sprendimas- jungti kondensatorių. Nedidelis kondensatorius- 20…40uF, naujas, geriau polipropileninis, su tikrai gera izoliacija ir storais laidais turi generuoti tik reaktyvinę galią. Ją galima net pasiskaičiuoti pasiskaičiavus kondiko reaktyvinę varžą. Taip bandom pasistatyti VAR reikšmę. VA turi rodyti tą patį ka VAR, o W turi būti 0. VARgain=0x2F, VARoffset=0x3E… Tačiau jei vistiek nesigauna, vadinasi skaitliukas biški nepataiko fazę tarp įtampos ir srovės. Tam reikalui yra 0x41, 7 bitų registras.
Nuo kondensatoriaus VAR reikšmė gaunasi neigiama. Nuo induktyvumo- teigiama.

Jei jūsų įtampos ir srovės daliklis koks nors kitoks, nei mano, dar yra registras 0x23- PGA gain registras kuris keičia visų fazių ir srovių stiprintuvo koeficientus.
Nu dar yra 0x42-0x44 registrai…

Viska sustygavus, neužmirškit viską išsaugoti su AT&W komanda.

Papildomos komandos:

ATDn – I2C mikroschemos turinio rodymas. Po 2 kilobaitus. n- rodo 2K puslapio numerį.
ATI – šiaip informacija apie aparatą.
ATE – echo išjungimas.
ATS – duomenų iš megos epromo perrašymas į ADE čipą. Tas pats kaip ATA, tik neperkraunamas čipas. T.y. be software reset. T.y. nenusinulina kiti registrai.

Ir aišku pats firmware: source ir sukompiliuotas HEX failas.

6 replies on “Watmetras, naujas firmware ir kalibravimas”

  1. Toks pastebejimas, kad zymiai patogiau butu, jei pagrindiniame lange butu straipsnis talpinamas max su 1 pastraipa, o ne praktiskai viskas, nes dabar paspaudus ant straipsnio papildomai atsiranda tik +/-1 pastraipa ir komentaru rasymas.

  2. tanx for your information about the ADE project.
    i have a question. how did you get the constant of each part? for example 0.000046882 for amper or 1.120704 for watt!?
    please help me to understand it!

  3. It is described in NEW source code. Pitty, in Lithuanian only 🙂

    Mains voltage divider is made from the string of 75K resistors. 6*75K+0.39K load. This give 450K+0.39K.
    Max voltage on the chip is 0.5V. With such divider, 300V=0.26V on the chip.
    Maximum voltage (+-0.5V) is from 0xD7AE14 (-2,642,412) to 0x2851EC (+2,642,412). This give us 1V=4576.21536. As we can use only integers, all numbers are rouded. My voltage divider is 5*1000. Something simmilar is for amperes (current transformer 5A=2mA, 10 ohm load, … blah bla, 21*1000)

    There is and “integer error” from this calculation, so I need to adjust output by these “on ADE chip” constants.
    I use KNOWN loads and change constants to get propper values. It is from datasheet. I don’t know about “0.000046882 for amper or 1.120704”. In new firmware such numbers are not used. New firmware is “integer only”.

  4. Hi.
    “Maximum voltage (+-0.5V) is from 0xD7AE14 (-2,642,412) to 0×2851EC (+2,642,412). This give us 1V=45762.21536.”
    are you sure that is true? how did you calculate this?
    is this true? 0.26/0.5=0.52 –> (2,642,412 * 0.52)/300=4580.1808 equal whith 1V.

  5. Yes, it was typing error. All calculation in software is OK.

    Uin=300V, Rt=450390Ω
    Iin=0.000666089A

    UonADC @ 300V=I*R=0.000666089A*390Ω=0.25977471V

    0.5V @ ADC=2’642’412
    0.25977471V @ ADC=1’372’863[,622] = 300V @ input
    1V @ input=1’372’863/300=4576[,21]

    Too keep math simpler, instead of 4576, I use division by 5. All math representation of values in software is multiplied by 1000 (? I don’t remmember) to keep math without floating point. Results are printed with “forced” comma and for human looks like floating point.

Leave a Reply

Your email address will not be published. Required fields are marked *