Projekto įdėja ne mano. Mano tik algoritmai, programa ir šiaip biški matematikos, nes kažkodėl realaus pasaulio matematika neatitiko to ką rodė jutikliai.
Taigi, Trimix arba trimix dujų mišinys. Tai deguonies, azoto ir helio mišinys naudojamas nardant į kiek gilesnius vandenius. Aš tiksliai nežinau, kam buvo kuriamas šis prietaisas, nes yra ir komerciniai dujų analizatoriai (vieną tokį ir turėjau kai testavau) ir dar šis modelis gavosi kaip ir didesnis (dėl fizikos).

Matavimo principas- deguonies kiekį parodo jutiklis, jis taip pat parodo dujų temperatūrą. O helio kiekis matuojamas netiesiogiai- matuojamas garso greitis. Visi žino, kad įkvėpus helio, balso tembras pasidaro aukštesnis. Tai vyksta ne dėl to, kad kažkas pasikeičia balso stygose, o dėl to, kad garsas sklinda greičiau ir atitinkamai keičiasi “balso dėžutės” parametrai. Garso greitį matuojam… matuodami atstumą su ultragarsiniu jutikliu. Kuo didesnis garso greitis, tuo mažesnį atstumą rodo jutiklis.
Hardwarė labai paprasta, nes čia prototipas. Aš paėmiau vieną iš savo dev PCB su LCD ir priejos pradėjau klijuoti kitus elementus.

Deguonies jutiklis kompiuterizuotas ir jungiasi prie MCU per UARTą. O štai atstumo jutiklis analoginis ir industrinis. Ne vien tik reikia maitinti didesne įtampa nei 12V, bet ir išėjimas kinta nuo nulio iki 10V. STM32F tikrai nepatinka tokios įtampos prie ADC. Todėl pastatėm įtampos daliklį. Tačiau STM32F103 serijos ADC šiaip nėra labai geras, o pridėjus netoliese DC/DC keitiklį, prototipinius laidus gavosi nelabai jau tikslūs skaičiai. Nes vienu metu norėjau statyti kitus ADC, iš kinijos užsakiau beveik visus gatavus modelius, taip pat ištraukiau iš stalčiaus ultra brangų senovinį 24 bitų ADC. Tačiau užsakovas pristabdė projektą ir išsinešė testuoti su esamu MCU ADC.
Kita bėda- atstumo jutiklis turi didelį “užkaitimo” driftą. Tai industrinis jutiklis (UNAM 12U9914/S14D), kuris tikrai tikslus, tačiau po įjungimo jis turi bent 10 minučių paveikti kol stabilizuojasi. Todėl teko daryti užnulinimo (tarinimo) mygtuką. Paleidus gryną orą reikia nuspausti mygtuką ir MCU persikalibruoja vieną tašką.
Kitas kalibracijos taškas- 100% helis. Paleidus gryną helį kalibruojam. Taip gaunam kitą tašką.
O dar yra “fabrikinė” kalibracija- taip jau gaunasi, kad keičiant dujų procentus, priklausomybė tarp ilgio ir helio nėra tiesinė. O ir atstumo jutiklis kiek kvailioja, Todėl programoje yra numatyta kita funkcija- raw duomenų nuskaitymas. Paleidus žinomą mišinį nuskaitom papildomai dar vieną ar du taškus. Tada turėdami 0, 100 ir tarpinius skaičius suskaičiuojam kreivės parametrus ir išvedam kreivės “išlenkimo” koeficientą. Šis koeficientas suvedamas į prietaiso EEPROM. Naujai kalibruojant (100% helis) ar taruojant (0% helis) šis koeficientas naudojamas perskaičiuoti kreivę. Iš esmės tai kreivės paišymas per 3 taškus.
Po tokių skaičiavimų rezultatai jau atitiko pramoninio prietaiso parodymams.
Aš paviešimu ne galutinį firmwaro source kodą ir negalutinis vidines instrukcijas. Taip pat neviešinu diskusijų su užsakovu ir excelio lentelių kur skaičiavom kitus parametrus (kad ir temperatūrą). Tačiau gal kam nors bus įdomu. Bendravimas su MCU per virtualų COM portą.
Vidinės instrukcijos– čia kaip koks kursinis darbas. Biški teorijos, biški praktikos.
Trimix source code STM32F103 gcc STM32CubeMX griaučiai (ne galutinis, bet veikiantis).
Pastebėti visokie įdomumai. Pavyzdžiui- helio įsigėrimas į 3D spausdintą plastiką:

Ar visokie gliukai su jutikliais.
Projektas tikrai žalias, bet jį galima iš čia pateiktų duomenų pasikartoti. Aš dalinuosi tik todėl, kad pas nepamirščiau ir dėl to, kad esami source kodai internete – totalus Arduinas su klaidom.
O helis skaičiuojamas labai paprastai 🙂
void Calc_Helis(double atstumas)
{
double a=coef_a;
double b=coef_b;
double c=coef_c;
helis=atstumas*atstumas*a+atstumas*b+c;
}
Sėkmės!
P.S. Dėkui Dianai už įdėją. Sėkmės doktarantūroje.