6.2 Prilagoditev funkcij za motor na povezavo CAN
6.2.1 Ročna inicializacija ter zagon povezave CAN
Da se sprejema sporočila od le določenih naprav, povezanih na vodilo CAN, je možna uporaba filtrov. Filtri strojno prepustijo samo identifikatorje, ki se jih določi. Motor ima identifikator 63D (šestnajstiški zapis). Ker je motor edina naprava na vodilu CAN poleg mikrokrmilnika, je en filter dovolj. Za inicializacijo filtra za motor smo nastavili naslednje parametre:
- tip identifikatorja filtra je standardni, - indeks filtra je 0,
- tip filtra je z uporabo bitne maske,
- sporočila s pravilnim identifikatorjem se zapiše v sprejemni FIFO 0, - identifikator za filter je 63D (šestnajstiški zapis) in
- bitna maska za filter je 7FF (šestnajstiški zapis).
Pri uporabi bitne maske je možno ignorirati določene bite identifikatorja ter s tem omogočiti več pravilnih identifikatorjev. Z uporabo maske 7FF nismo ignorirali nobenega bita in je sprejet samo identifikator 63D.
Poleg navadnega filtra smo dodali še globalni filter, v katerem smo določili, kaj se zgodi s sporočili, katerih identifikator ni ustrezal nobenemu filtru ter samodejnim sporočilom. Tu so vsi zavrnjeni. Ko smo vse nastavili, smo vodilo CAN zagnali. Za način z uporabo prekinitev bi moral dodati aktivacijo prekinitev za FDCAN2.
Sporočilom mikrokrmilnika na vodilo CAN smo specificirali parametre, ki so naslednji:
- tip identifikatorja je standardni,
- identifikator sporočila je 63C (tega sprejema motor), - tip sporočila je podatkovni (druga možnost je samodejni), - dolžina podatka je 8 bajtov,
- preklop hitrosti prenosa je onemogočen (uporabljen bi lahko bil v primeru CAN FD) in - sporočilo je klasičnega CAN formata.
Celotno inicializacijo smo napisali v fdcan.c ter z uporabo HAL struktur in funkcij.
60
Funkciji HAL_FDCAN_RxFifo0Callback in write_trq sta namenjeni pošiljanju ukazov motorju z uporabo prekinitev. write_trq je uporabljena najprej in pošlje motorju zahtevo za pošiljanje ukaza. Motor potrebuje nekaj milisekund (približno 5 do 10 milisekund, ni bilo zaznanega konstantnega časovnega intervala za odziv) in se nato odzove. Takrat se sproži prekinitvena sekvenca za FDCAN2 prekinitev 0, ki pokliče funkcijo HAL_FDCAN_RxFifo0Callback. Znotraj te funkcije se najprej preveri, če je motor potrdil možnost pošiljanja ukaza ali ne. V primeru potrditve je nato poslan željen navor, s katerim naj se motor vrti. Prvi bajt predstavlja ukaz, drugi dolžino sporočila in tretji do vključno šesti bajt predstavljajo navor v obliki zapisa s plavajočo vejico (spremenljivka tipa float).
Funkcije CAN_XCP_write in CAN_XCP_response sta namenjeni pošiljanju ukazov motorju na način poizvedovanja (ang. polling). CAN_XCP_write je uporabljena prva in motorju pošlje zahtevo za pošiljanje ukaza. Nato skoči v zanko, kjer s funkcijo CAN_XCP_response preverja, če se je motor že odzval. Ko se odzove, v funkciji CAN_XCP_response preveri, če je bila v odzivu potrditev. Če je bila, se vrne nazaj v CAN_XCP_write, kjer pošlje še dejansko vrednost želenega navora v enakem formatu kot pri prekinitvah. Nato ponovno čaka na odziv motorja s funkcijo CAN_XCP_response in preveri odziv, ko prispe. Če je potrjen sprejem navora, se vrne nazaj v program.
Funkciji CAN_XCP_INIT in CAN_XCP_connect sta specifično uporabljeni za inicializacijo motorja. Funkcija CAN_XCP_INIT najprej kliče CAN_XCP_connect in pošlje motorju željo za povezavo z njim. Njegov odziv preverja s CAN_XCP_response ter se ob potrditvi vrne v funkcijo CAN_XCP_INIT, kjer nato pošlje štiri sporočila za inicializacijo s CAN_XCP_write.
Ko uspešno pošlje vsa štiri sporočila, se vrne iz funkcije nazaj v program.
Te funkcije smo uporabili v datoteki motor.c za funkcije motor_Init in motor_SetPower.
Funkcija motor_Init kliče funkcijo CAN_XCP_INIT ter je klicana ob inicializaciji sistema.
Funkcija motor_SetPower sprejme parameter moč, ki ima vrednost od 100 do 100. Najprej preveri, če so klešče za stiskanje v kateri od končnih pozicij. Če so popolnoma razklenjene, nastavi vrednost navora na 0. Če so popolnoma sklenjene, nastavi vrednost navora na minimalni navor. Če klešče niso v končni poziciji, se željena moč pretvori v navor ter je poslana motorju.
Tu sta možnosti pošiljanja s prekinitvami ali s poizvedovanjem. Uporabljeno je pošiljanje s poizvedovanjem, saj so se pojavljali problemi pri uporabi prekinitev.
61 6.3 Implementacija logike prižiganja in ugašanja
Za delovanje želene logike s tipko za prižiganje in ugašanje je potreben mikrokrmilnik, ki odpira in zapira N-kanalni MOSFET. Tu smo izhod OFF pri inicializaciji nastavili na način odprtega ponora (ang. Open-Drain), kjer ima ali stanje 0 V, kjer je povezan na GND (logična '0') ali stanje visoke impedance, kjer je povezava na GND zaprta (stanje '1'). Njegovo stanje smo pri inicializaciji splošno namenskih vhodov in izhodov (ang. GPIO) nastavili na '0' ter s tem zaprli N-kanalni MOSFET in omogočil glavno napajalno linijo (do takrat se je vezje napajalo skozi tipko). Ob vsakem ciklu glavnega dela programa se preverja, če je bila pritisnjena tipka s funkcijo TurnOff, ki smo jo napisali v datoteki PowerStatus.c. Če zazna, da je bila pritisnjena in je njeno novo stanje logična '1', začne šteti čas pritiska. Po treh sekundah brez spremembe stanja tipke najprej motorju pošlje navor 0 Nm (se motor ustavi) ter izhod OFF spremeni na '1' in glavna napajalna linija je s tem odklopljena. Prav tako ugasne svetlečo diodo v tipki ter sistem gre v neskončno prazno zanko. Ker GUI nima več napajanja, se zaslon ugasne.
Ko je tipka spuščena, tudi vezje izgubi napajanje ter se ugasne.
62
63
7 Sestava elektronskega vezja ter odpravljanje napak
Za narisano vezje smo kreirali izhodne Gerber datoteke in jih je mentor poslal proizvajalcu tiskanih vezij. Med generiranimi so Gerber datoteke za:
- spodnjo plast,
- spodnjo spajkalno kritino, - spodnji tisk,
- mehansko plast 1 (za obliko vezja), - zgornjo plast,
- zgornjo spajkalno kritino, - zgornji tisk,
- zgornjo masko za nanos spajkalne paste (te se ni poslalo proizvajalcu) in - vrtanje.
Potrebne komponente smo naročili preko spleta. Nekatere med njimi so bile na fakulteti, tako da jih nismo naročili (večina keramičnih kondenzatorjev in uporov, BC817 npn tranzistorja, 2N7002 N-kanalni MOSFET, HPSD 3000 senzorja za tlak, regulator 1117 za 3,3 V, modul ST-LINK V3MODS ter piskač). Ko so prišle, smo začeli sestavljati vezje. Nekaterih komponent se prvič ni naročilo in smo jih naročili naknadno (regulator 1117 za 5 V REG1117-5, okenski detektor TPS3701, ESD zaščita BAT54-04 ter ESD zaščita za USB liniji TPD2E009).
7.1 Sestava vezja
SMD komponente iz prvega naročila materiala ter iz fakultete (večina vseh SMD komponent) smo spajkali v spajkalni peči na fakulteti. Za nanos spajkalne paste smo izdelali enkratno masko za nanos iz papirnate nalepke, narejeno glede na Gerber datoteko za zgornjo masko za nanos spajkalne paste. To smo izrezali na laserskem rezalniku ter nalepili na vezje in nanesli pasto.
Ko je bila pasta nanešena, smo jo odlepili ter pričel polagati SMD komponente na vezje. V tej točki poleg manjkajočih SMD komponent prav tako nismo dodali modula ST-LINK V3MODS zaradi njegove občutljivosti. Nato smo vezje s komponentami položili v spajkalno peč in pričeli postopek spajkanja.
Po spajkalni peči smo pričeli ročno spajkanje komponent. Z uporabo primerno debelih špic na spajkalniku to ni predstavljalo večjih problemov. Modula ST-LINK V3MODS takrat nismo dodali, saj se je želelo najprej preveriti delovanje napajanja. Nepravilno napajanje bi lahko uničilo modul. Okenski detektor je ključen za napajanje, ampak ga takrat še ni bilo. Ko so prispele tudi komponente v drugem naročilu, smo pričeli ročno spajkanje preostalih komponent.
6x1 priključka za ST-LINK/V2 ter serijskih uporov zanj nismo dodali, saj je bil uporabljen modul ST-LINK V3MODS. Ker ima modul na spodnji strani kontakte, smo med vezje ter modul dodali Kapton lepilni trak, da ni prišlo do neželenih povezav. Prav tako nismo dodali kratkostičnika med BOOT0 in GND (ni se zdelo potrebno v trenutku, ampak bi bil potreben pri nalaganju programa, kar se je reševalo drugače) ter priključka USB (ni bil potreben za testiranje ter bi povzročal nevšečnosti pri testiranju zaradi postavitve na spodnji strani, dodali smo ga po
64 koncu testiranja vezja). Da smo omogočili zamenjavo senzorjev za tlak, smo na njuno mesto na vezju dodali ženske 4x1 priključke z razmakom 2,54 mm med poli (v angleščini se uporablja izraz 4x1 female header).
Slika 42: Sestavljeno vezje ob testiranju napajanja s že popravljeno samodržno logiko napajanja (senzorja ter 4x1 priključki za senzorja še niso dodani).
65 7.2 Testiranje vezja ter odpravljanje napak na vezju
Prvo testiranje je bilo za napajanje. Na priključek za omrežno napajanje smo priključili 12 V DC iz laboratorijskega napajalnika. Prvi opažen problem je bila napetost skoraj 12 V na priključku za baterijo. Ko smo na priključek za baterijo med 12 V in GND dodali upor vrednosti 5,6 kΩ, je ta napetost izginila in predpostavili smo, da se pojavi zaradi inverznega toka skozi BAT120C schottky diodi za 12 V napajanje izbiralnika napajanja. Ko bi bila baterija priklopljena in bi bilo napajanje na omrežju, ne bi bilo tega problema, saj bi baterija porabila inverzni tok. Problem bi nastal pri uporabi baterijskega napajanja ter odsotnem omrežnem, saj bi inverzni tok okenskemu detektorju lažno sporočil, da je prisotno omrežno napajanje. Zaradi prioritetnega načina izbiranja napajanja bi se baterijsko napajanje zaprlo ter omrežno odprlo. V tistem trenutku bi vezje in motor porabila inverzni tok ter napetost na liniji bi padla na 0 V. S tem bi se omrežno napajanje zaprlo ter odprlo baterijsko in to bi vodilo k oscilaciji. V fazi testiranja se je uporabljalo le omrežno napajanje. To težavo se bo rešilo z uporabo drugih diod s skupno katodo in veliko manjšim inverznim tokom.
Podoben problem je kasneje, ko smo med zaganjanjem celotnega sistema ugotovili, da logika za prižiganje in ugašanje ne deluje. Problem je bil v vezju, kjer je bil inverzni tok BAT120C schottky diode tako velik, da je povlekel napetost na izhodu tipke na 9 V (dovolj, da je mikrokrmilnik prepoznal izhod delilnika kot logično '1'). Tu smo podrobneje preverili komponento BAT120C ter ugotovilo, da ima razmeroma velik inverzni tok. Po izračunu smo ugotovili, da je inverzni tok približno 60 µA. Ta problem smo rešili z uporabo uporov z nižjimi vrednostmi v napetostnem delilniku za sporočanje stanja tipke na mikrokrmilnik. Namesto 100 kΩ ter 39 kΩ smo uporabili upora s 3,3 kΩ ter 1 kΩ upornosti. To je odpravilo napetost zaradi inverznega toka.
Vezje smo testirali v stanju s kratkim stikom čez tipko, tako da se je napajalo vezje preko tipke.
Na mikrokrmilnik takrat še ni bila naložena strojna koda. Ko se je kratki stik odstranilo, je vezje še vedno imelo napajanje. Takrat smo ugotovili, da je samodržna logika napajanja na vezju napačna. To smo popravili tako, da smo odstranili 100 kΩ upor velikosti 0603 med vrati N-kanalnega MOSFET-a in GND. Na njegovo mesto smo dodali prebojno diodo s prebojno napetostjo 3 V. Prebojna dioda se je nahajala v prevelikem ohišju za 0603 velikost, zato smo ji zavili priključke pod ohišje. Vrata MOSFET-a smo prav tako povezali preko 5,6 kΩ upora na 12 V napajanje. Na srečo je bilo tam nekaj prostora ter potencial za 12 V napajanje je bil blizu.
Za povezavo na 12 V smo uporabili žico s plastično zaščito, ki se je stopila pri spajkanju. Vezje je nato primerno delovalo. Popravilo prikazuje Slika 43.
66 Slika 43: Popravilo logike samodržne vezave. Prebojna dioda je desno od Q1.
S pravilnim načinom napajanja smo pričeli nalaganje kode. Ko je bila koda naložena, smo v načinu za razhroščevanje po korakih pregledovali program. Programski števec je vsakič, ko je skočil v UART prekinitev, izginil na neznano mesto v mikrokrmilniku. Razlog za to je bilo nepravilno nalaganje programa, saj priključek BOOT0 ni bil povezan na GND ob nalaganju.
To povezavo smo naredili s prekomerno dodanim cinom med priključnima luknjama za kratkostičnik, da je nastal kratek stik med njima. S tem se je programska koda naložila pravilno in lahko sva nadaljevala testiranje kode.
Na UART za razhroščevanje se je pošiljalo enaka sporočila kot na UART za komunikacijo preko GUI. Zaslona se takrat še ni priklopilo, tako da smo preverjali poslana sporočila preko hterm aplikacije na računalniku. Tam se ni pojavilo nobenih prejetih sporočil. Po iskanju razlogov za napačno delovanje smo ugotovili, da sta liniji UART Rx in Tx povezani obratno.
To smo rešili z dvema žicama. Najprej smo z nožem za lepenko prerezali obe liniji na sredini povezave med mikrokrmilnikom in V3MODS. Na strani mikrokrmilnika smo na obeh linijah na različnih koncih odstranili prevleko in odkrili baker. Žici smo nato pravilno povezali med odkritim delom linije ter temu pripadajočim priključkom na V3MODS. S tem popravilom je UART začel delovati pravilno. Popravilo za BOOT0 in povezavo UART je na Slika 44.
67 Slika 44: Kratek stik na mestu kratkostičnika s cinom (nad napisom BOOT) ter popravilo
povezave UART na V3MODS.
Za tem smo uspešno preverili še delovanje piskača (se ga je prižgalo) ter povezavo s senzorji (v načinu za razhroščevanje smo opazovali njune vrednosti ob spreminjanju dovedenega tlaka).
Nato je bilo na vrsti preverjanje povezave CAN. To smo najprej preverjali brez motorja z osciloskopom ter nato še z motorjem. Ko smo uporabili motor in smo že dosegli pošiljanje sporočil preko vodila CAN, mikrokrmilnik še vedno ni sprejemal sporočil, ki jih je pošiljal motor. Takrat smo na sprejemni liniji med TCAN1051 in mikrokrmilnikom zaznali napetost 5 V ter ugotovili, da smo uporabili napačen TCAN1051. Od tam smo predvidevali, da je vhod mikrokrmilnika uničen (ta priključek ni 5 V toleranten) ter z uporabo vročega zraku zamenjali mikrokrmilnik. Ker ni bilo na voljo pravilnega TCAN1051, smo na sprejemno linijo dodali napetostni delilnik. 100 Ω serijski upor na liniji smo zamenjali s 470 Ω uporom ter dodali 1 kΩ med linijo (na stran mikrokrmilnika) ter GND skoznik. Sprejemanje sporočil motorja s tem še vedno ni delovalo zaradi napake v inicializaciji (opisano v naslednjem podpoglavju) in možnost je, da bi vhod na mikrokrmilniku še vedno deloval, ampak je kljub temu popravilo bilo potrebno, saj je predstavljalo preveliko negotovost pri delovanju. Popravilo prikazuje Slika 45.
68 Slika 45: Dodani napetostni delilnik desno od oznake R34, spodnji upor je previdno vezan na
GND skoznik.
Na vezju naj bi bila analogni in navadni GND povezana skupaj poleg priključka za GUI (oznaka priključka je RPi). To povezavo smo nameravali narediti ob uporabi poligona na zgornji plasti za navadni GND. Ta povezava se ni naredila in zato analogni GND ni bil povezan na navadnega. To smo popravili tako, da smo odstranili prevleko ter odkril baker na analognem ter navadnem GND, kjer naj bi bila sicer povezava, in naredili stik s cinom.
69 7.3 Odpravljanje programskih napak pri povezavi z motorjem Pri testiranju programske kode smo največ časa porabili za zagon povezave z motorjem preko vodila CAN. Tu je bilo več problemov, zaradi katerih ni delovalo. Prvi problem je bilo pošiljanje sporočil, ki so imela dolžine sporočil 0 bajtov. Razlog za to je bilo sprotno prilagajanje dolžine sporočil. Ko smo to odstranili in začeli uporabljati samo sporočila dolžine 8 bajtov (nastavljeno v inicializaciji za oddajanje sporočil), je začel mikrokrmilnik pravilno pošiljati podatke na vodilo CAN.
Drugi problem je bil, da mikrokrmilnik ni prejemal sporočil. Tu smo odkrili uporabo napačnega TCAN1051 ter to rešilo mehansko. To ni pomagalo in po nekaj urah iskanja smo odkrili, da smo v glavni inicializaciji za FDCAN2 v programski kodi specificirali število filtrov za standardne identifikatorje 0. To smo spremenili v 1 in s tem je začela delovati povezava na vodilo CAN.
Kljub uspešni povezavi mikrokrmilnika na vodilo CAN se motor še vedno ni začel vrteti, ko se mu je poslalo željen navor. Problem smo ugotovili pri inicializaciji motorja. Pri funkciji CAN_XCP_INIT mikrokrmilnik pošlje motorju štiri sporočila, s katerimi ga aktivira. Ta sporočila vsebujejo zgolj ukaz v prvem bajtu, dolžino sporočila na drugem bajtu ter 0 ali 1 vrednost na naslednjih štirih bajtih skupaj (primer šestnajstiško zapisanega sporočila bi bil F6 04 00 00 00 01). Tu se je izkazalo, da morata za uspešno inicializacijo prvi dve sporočili imeti za dolžino sporočila vrednost 4 ter temu primerno postavljeno 1 na zadnji bajt, sicer motor ni bil pravilno inicializiran. Tretje in četrto sporočilo sta dopuščali zapis z dolžino sporočila 1 (primer FF 01 01). S tem popravilom se je motor pričel vrteti ob poslanem navoru.
Trenutni program uporablja način prepoznavanja odgovora motorja s pristopom poizvedovanja.
Ta način ni najbolj efektiven in bi normalno bila uporabljena prekinitev. Razlog za uporabo poizvedovanja je nepravilno proženje prekinitvene sekvence za prejeto sporočilo v sprejemnem FIFO 0. Inicializacijo motorja smo izvedli z uporabo poizvedovanja, medtem ko smo za pošiljanje ukazov ter sprejemanje odgovorov uporabil prekinitveno sekvenco. V poskusnem programu smo najprej izvedli inicializacijo motorja in za njo aktiviral prekinitve za FDCAN2 (da ne skače program v prekinitveno sekvenco med inicializacijo). Takoj po njihovi aktivaciji je program skočil v prekinitveno sekvenco, kljub temu da ni bilo poslano nobeno sporočilo s strani motorja. Najbolj verjetna razlaga je, da se ob inicializaciji postavi prekinitvena zastavica za prejeto sporočilo v FIFO 0 kljub temu, da prekinitve niso omogočene. Dodatna možnost izboljšave je, da bi uporabili prekinitve tudi pri inicializaciji motorja, ampak zaradi pomankanja časa tega nismo izvedli, zato bo ostala kot možnost za nadgradnjo.
70
71
8 Zaključek
V tem diplomskem delu sem opisoval nadgradnjo elektronike za FEspirator V3. Glavni cilj je bil izdelava namenskega vezja, ki bo izpolnjevalo vse zahteve. Velik del sheme smo uporabili iz verzije 2, ki smo jo spremenil potrebam primerno. Tiskano vezje je moje originalno delo, na katerem bi se lahko še marsikaj postorilo bolje. Pri programskem delu smo predvsem prilagajali kodo na mikrokrmilnik, saj je večina že bila narejena (predvsem funkcije za komunikacijo z motorjem preko vodila CAN). Moj popolnoma lastni dodatek kodi je bila zgolj samodržna logika napajanja.
Na shemi ter vezju je mogočih kar nekaj izboljšav. Poleg popravila vseh napak v vezju (samodržna logika napajanja, povezava UART z V3MODS ter ostale) bi bilo nekatere smiselno izboljšati; pri samodržni logiki napajanja bi lahko uporabili dva N-kanalna MOSFET-a nad točko detekcije zadostnih napajalnih napetosti. S tem bi dodatno zmanjšali porabo v ugasnjenem stanju ter zmanjšal število različnih komponent, saj bi lahko preprosto uporabili dodaten NDC7002N z dvema N-kanalnima MOSFET-oma. Pri povezavi CAN med TCAN1051 ter mikrokrmilnikom bi poleg izbire pravilnega oddajnika/sprejemnika lahko dodali napetostni delilnik na vezje, s čemer bi lahko preprosteje prilagajali vezje.
Na vezje smo dodali možnost za popolnoma digitalno delovanje vezja z vodili I2C ter SPI. V programskem delu tega še ni dodanega, tako da bi v prihodnje bilo smiselno dodati ta dva načina. S tem bi pridobilo vezje na varnosti prenosa podatkov in veliko komponent ne bi bilo več potrebnih, kar bi zmanjšalo ceno vseh komponent ter vezje bi lahko izdelali manjše, kar bi znižalo ceno izdelave vezja. Poleg digitalnih povezav bi bilo prav tako smiselno dodati v program verzijo komuniciranja preko vodila CAN s prekinitvami, saj bi omogočilo nekoliko skrajšati čas enega poteka programa.
72
73
9 Literatura
[1] R. M. Kacmarek, „The Mechanical Ventilator: Past, Present, and Future“, Respiratory Care, let. 56, št. 8, str. 1170–1180, avg. 2011, doi: 10.4187/respcare.01420.
[2] „Modes of Mechanical Ventilation“.
https://www.openanesthesia.org/modes_of_mechanical_ventilation/ (pridobljeno jul. 25, 2021).
[3] UL Fakulteta za elektrotehniko, FEspirator - Predstavitveno predavanje. Pridobljeno:
avg. 03, 2021. [Na spletu Video]. Dostopno na:
https://www.youtube.com/watch?v=ofsfKeXbBx4
[4] „Zasnova preprostega respiratorja SIQ.pptx - Google Predstavitve“.
https://docs.google.com/presentation/d/1IyKY8yB9Txn3Hl1cg_5AJTutLMx9mGht/edit
#slide=id.p1 (pridobljeno avg. 03, 2021).
[5] „Specifications for simple open source mechanical ventilator Public“, Coronavirus Camp, mar. 29, 2020. http://coronavirus.camp/2020/03/29/specifications-for-simple-open-source-mechanical-ventilator-public/ (pridobljeno avg. 05, 2021).
[6] „Why diode is connected across IGBT and MOSFET? Body or Intrinsic Diode“, ETechnoG - Electrical, Electronics and Technology.
https://www.etechnog.com/2019/07/body-diode-connected-mosfet.html (pridobljeno
https://www.etechnog.com/2019/07/body-diode-connected-mosfet.html (pridobljeno