48
49
5 Risanje tiskanega vezja
Ko smo narisali shemo, smo pričeli risati tiskano vezja. Tega smo prav tako risali s programskim orodjem Altium Designer. V tem poglavju bodo opisane nastavitve načrtovalskih pravil za to vezje, risanje vezja (oblika vezja in okvirna postavitev sklopov iz blokovne sheme v 3. poglavju) ter posebne točke v vezju, ki so zahtevale več pozornosti.
5.1 Nastavitev načrtovalskih pravil
Pri načrtovalskih pravilih smo prilagodili pravila za razmake med različnimi vozlišči, širino povezav med komponentami, velikost skoznikov, nastavitve za diferencialne pare ter povezave priključnih površin (ang. pad) komponent na poligone njim pripadajočega vozlišča (ang. net).
Za razmake med različnimi vozlišči smo nastavili dve pravili. Osnovno določa razmak med vsemi vozlišči najmanj 0,1 mm. To pravilo smo nastavili, da ignorira samo priključne površine z različnimi vozlišči znotraj ene komponente. Poleg tega smo dodali pravilo za razmak najmanj 0,254 mm med vozlišči, če je na eni od njih napetost 12 V (pri napajalnem delu vezja). Ta vozlišča smo definirali že v shemi z uporabo funkcije Parameter set. To pravilo ima višjo prioriteto od osnovnega.
Širine povezav smo nastavili za minimalno 0,254 mm, srednjo 0,508 mm in maksimalno 1,27 mm. Kjer je bila na vezju potrebna širša povezava, smo uporabili poligon (funkcija Place polygon plane).
Velikosti skoznikov smo nastavili za minimalno velikost 0,3 mm premer luknje in 0,6 mm premer skoznika, za srednjo velikost 0,4 mm premer luknje in 0,8 mm premer skoznika ter za maksimalno velikost 0,6 mm premer luknje in 1,2 mm premer skoznika. Na vezju smo uporabili najmanj srednje velikosti (0,4 in 0,8 mm), saj smo s tem zagotovili razmerje med debelino vezja in najmanjšo luknjo manj kot 5:1 (za vezje je uporabljena standardna plošča z debelino 1,6 mm), kar se lahko pričakuje od vseh proizvajalcev vezij.
Diferencialnim parom smo nastavili minimalni razmak med linijama 0,1 mm in minimalno širino linij 0,2 mm. Srednji in maksimalni razmak med linijama smo nastavili na 0,254 mm ter srednja in maksimalna širina linije na 0,381 mm. Ker na vezju ni visokofrekvenčnih diferencialnih linij (linija USB 2.0 dosega maksimalno hitrost prenosa do 12 Mbps in vodilo CAN deluje pri hitrosti 500 kbps), nismo uporabljali impedančnih profilov.
Za povezavo priključnih površin komponent ter skoznikov na poligone smo uporabili dve pravili. Prvo in prioritetno višje je pravilo za povezavo na GND poligone. Za priključke THT ter SMD smo uporabili štiri povezave s kotnimi zamiki 90˚ s širinami 0,5 mm in dolžinami 0,127 mm, saj bi direktne povezave na GND povzročale zelo dobro odvajanje toplote, kar predstavlja nepotreben problem pri ročnem spajkanju komponent. Pri skoznikih tega problema ni, zato smo uporabili direktne povezave skoznikov na GND poligone. Drugo in prioritetno nižje pravilo določa direktno povezavo priključnih površin in skoznikov na poligone za vsa ostala vozlišča.
50 Zaradi doseganja čim manjšega možnega vezja smo nekatere komponente prekrili eno čez drugo, če na vezje ne bosta dodani obe komponenti (modul ST-LINK V3MODS in priključek za Nucleo ST-LINK/V2 z upori). Da Altium Designer to omogoči brez javljanja napake, smo onemogočili pravilo za razmak med komponentami (pravilo ComponentClearance).
51 5.2 Risanje tiskanega vezja
Z določenimi načrtovalskimi pravili smo lahko pričeli risati tiskano vezje. Vezju smo morali najprej določiti primerno obliko. Ta je lahko odvisna od oblike ohišja. Tu ni posebne oblike ohišja, zato smo naredili vezje pravokotne oblike ter kolikor se da majhno, saj se s tem znižajo tako stroški izdelave vezja kot zasedeni prostor v ohišju ventilatorja.
Slika 36: Sprednja plast vezja v Altium Designer-ju.
Vse SMD komponente smo postavili na zgornjo plast tiskanega vezja. To omogoča hitrejšo in cenejšo sestavo vezja. THT komponente smo prav tako postavili vse na zgornjo plast kot SMD komponente. Izjema je priključek USB, ki smo ga dodali na spodnjo plast, saj mora biti do njega fizični dostop iz zunanje strani ohišja (v ohišju je zanj dodana odprtina). Ker ima večina THT komponent priključke na spodnji strani, kjer ni SMD komponent, se lahko v primeru potrebe po večjem številu vezij THT komponente valno spajka in je ob tem potrebno zaščiti samo priključne luknje za priključek USB, da jih cin ne zalije.
Komponente smo po vezju razporedili v podobnih sklopih kot v shemi. Napajalni del (izbiralnik napajanja ter vse pretvorbe) se nahaja v spodnjem levem kotu ter zasega prostor do sredine ter s tem zasede velik del vezja, saj nekatere komponente potrebujejo dodatno hladilno površino.
V zgornjem delu ter na desni strani vezja se nahaja krmilni del s senzorji ter priključki za senzorje, povezavo na motor ter piskačem.
52 Povezave na vezju smo izvedli na zgornji in spodnji plasti, ampak smo poskusili čim več povezav narediti na zgornji plasti, saj je spodnja plast predvsem namenjena GND površini, ki zagotavlja čim krajše povezave za povratne tokove.
5.2.1 Oblikovanje vezja ter določanje območja s komponentami Preden smo lahko pričeli postavljati komponente na vezje, smo morali določiti njegovo obliko.
V postopku risanja smo najprej izbrali površino 150×100 mm. To smo postopoma manjšali z novimi razporeditvami komponent. Končna velikost vezja je 110×80 mm, pri kateri smo vsaki strani dodali 5 mm širok pas, namenjen samo luknjam za pritrditev vezja na ohišje ter fiducialnim markerjem (ang. fiducial). Komponente se nahajajo med tema pasovoma v pravokotniku 100×80 mm. Obliko vezja smo definirali z mehansko plastjo 1.
Vse štiri luknje smo postavili vsako v svoj kot vezja in se nahajajo 4 mm od daljšega robu ter 3 mm od krajšega robu v notranjost vezja. Njihov premer znaša 3,2 mm. Poleg lukenj smo na isto oddaljenost od krajšega robu (3 mm) dodali tri fiducialne markerje, narejene glede na IPC-7351 (krog s premerom 1 mm z okroglim odprtjem spajkalne kritine premera 2 mm). Zaradi lažje izvedbe smo jih dodali kot komponente že v glavno shemo. Nahajajo se v zgornjih kotih ter v spodnjem levem kotu. V spodnjem desnem kotu ga nismo dodali, da niso simetrično postavljeni. V zgornjih kotih sta postavljena 8 mm od daljšega robu, spodaj pa 10 mm, s čemer smo dodatno preprečili možnost nepravilne postavitve vezja, ne da bi naprava to prepoznala (fiducialni markerji so predvsem uporabljeni za strojno polaganje komponent ter optično preverjanje sestave vezja). Na spodnji levi fiducialni marker smo prav tako postavili izhodiščno točko vezja v namen pravilnejšega in lažjega strojnega polaganja komponent.
Območje, v katerem se nahajajo vse priključne površine komponent in povezave med njimi, je poravnano na sredino vezja in je velikosti 98×78 mm (na vsakem robu sem odvzel 1 mm kot tehnološki rob). Za komponente to območje ne velja popolnoma, saj lahko njihova ohišja ležijo čez mejo. Take komponente so predvsem priključki Wűrth za napajanje ter prejemanje in oddajanje signalov.
5.2.2 Postavljanje ter povezovanje komponent.
Komponente na vezju smo razdelili na osem sklopov (glej Slika 37). Ti sklopi so naslednji:
- z 1 je označen izbiralnik napajanja ter priključek za tipko s potrebnimi komponentami, - z 2 je označena pretvorba napajalne napetosti za vezje najprej na 5 V in nato na 3,3 V, - s 3 je označena stikalna pretvorba napetosti ter komponente za povezavo UART z GUI, - s 4 je označen krmilnik, ki zajema mikrokrmilnik, povezavo USB, modul ST-LINK
V3MODS in povezavo Nucleo ST-LINK/V2 ter tipko RESET,
- s 5 sta označena senzorja tlaka in pretoka s potrebnimi napetostnimi delilniki ter povezava na baterijski krmilni sistem, prav tako se tu nahajata dvižna upora za vodilo I2C,
53 - s 6 je označena analogna in digitalna povezava na senzor pozicije motorja s potrebno
pretvorbo in zaščito,
- s 7 je označena povezava krmilnika na vodilo CAN in - z 8 je označeno krmilno vezje za piezoelektrični piskač.
Slika 37: Razdelitev sklopov na vezju.
Pri izbiralniku napajanja smo povezave za glavni napajalni liniji naredili dovolj široke, da omogočajo prenos toka do 16 A ter na močnostne P-kanalne MOSFET-e dodal dovolj velike površine bakra, ki skrbijo za hlajenje MOSFET-ov. To smo naredili z uporabo poligonov. Da je za hlajenje večja površina, smo uporabili še spodnjo plast ter med plasti dodal nekaj skoznikov, ki skrbijo za razporeditev toplote. Tu imajo največjo vlogo pri razporeditvi toplote skozniki, ki so postavljeni na priključno površino za MOSFET-e, direktno pod MOSFET. Na zgornji plasti smo prav tako dodali nekoliko večjo povezavo pri BAT120C schottky diodah za hlajenje (komponenta D12). Linearnima regulatorjema smo poleg površine na zgornji plasti dodali še površino na spodnji plasti. Za ostale komponente pri logiki za izbiralnik in tipko smo uporabili navadne povezave (ukaz Place Track). Komponente smo razporedili tako, da zasedejo čim manj prostora na vezju.
54 Slika 38: Široke povezave glavnih napajalni liniji na zgornji plasti za hlajenje. MOSFET-i se
nahajajo levo od Q5 in Q7 ter nad Q6 in Q8.
Slika 39: Široke površine povezav glavnih napajalnih linij na spodnji plasti za hlajenje.
Pri stikalnem pretvorniku za napajanje GUI smo pozornost posebej posvečali zankam za povratne tokove, da so čim manjše, tako da smo vse komponente za pretvorbo postavili zelo blizu eno drugi. Povezavo na glavno napajalno linijo smo tako kot pri izbiralniku naredili s poligonom, da je dovolj široka. Da so vse elektrostatične motnje čim prej na liniji odpravljene, smo ESD zaščiti na linijah UART postavili čim bližje priključku za GUI. To smo upoštevali tudi pri ostalih ESD zaščitah, ampak smo to opuščali, če je bilo premalo prostora.
Pri mikrokrmilniku je največji izziv predstavljalo povezovanje vseh linij tako, da se linije med seboj po zgornji in spodnji plasti čim manj križajo. Zlasti smo to upoštevali pri povezovanju diferencialnih parov. Za diferencialno povezavo USB smo uporabili funkcijo Interactive Differential Pair Routing, ki naredi liniji zelo simetrični ter s čim bolj konstantnim nastavljenim
55 razmakom med linijama. Pri tem nismo uporabili impedančnega profila. Za napajanje mikrokrmilnika je bilo pomembno, da smo keramične kondenzatorje pravilno postavili. 10 µF kondenzator smo postavili nekoliko stran od mikrokrmilnika zaradi pomankanja prostora, vse 100 nF blokirne kondenzatorje pa smo postavili kolikor se da blizu napajalnih priključkov ter priključkov za GND, saj smo s tem naredili čim manjše zanke, ki sicer povzročajo elektromagnetne motnje. Za analogno napajanje smo 100 nF blokirni kondenzator prav tako postavil čim bližje priključkoma za analogno napajanje in GND na mikrokrmilniku, smo pa poleg njega dodali še 10 µF kondenzator s feritnim jedrom za napajanje ter feritno jedro s 100 nF kondenzatorjem za referenčno napetost. Razlog za to je, da vsi ti uporabljajo analogni GND. Tega smo peljali stran od mikrokrmilnika ob robu vezja do priključka za napajanje in komunikacijo z GUI, kjer smo ga združili z navadnim GND, da je analogni GND tem bolj stabilen. Poleg do sedaj naštetih kritičnih točk smo morali pravilno narisati povezave pri kristalnem oscilatorju. Tu smo kristalnemu oscilatorju in kondenzatorjema, ki sta vezana nanj, izolirali GND ter ga povezali samo v eni točki z ostalim GND vozliščem, ki je poleg priključka GND na mikrokrmilnik ter tako zmanjšali elektromagnetne motnje, ki bi jih sicer povzročal oscilator. Na enem vezju hkrati nista potrebna tako modul ST-LINK V3MODS kot tudi 6x1 Nucleo ST-LINK/V2 priključek s serijskimi upori, zato smo 6x1 priključek in upore postavili znotraj podnožja za ST-LINK V3MODS. S tem smo pridobili kar nekaj prostora na vezju.
Slika 40: Postavitev kristala z izoliranim GND (desno pri X1), blokirnih kondenzatorjev za napajanje (C45-C48) ter komponent za analogno napajanje in referenco (FB1, FB2,
C42-C43).
Pri senzorjih za tlak in pretok smo blokirna kondenzatorja postavili čim bližje priključku za napajanje. Razen tega in postavitve ESD zaščite pri senzorjih ni bilo druge funkcionalne posebnosti, prav tako jih tudi pri priključkih za senzor pozicije ni bilo.
56 Za povezavo med priključkom za vodilo CAN ter sprejemnikom/oddajnikom TCAN1051 smo uporabili diferencialni par kot pri povezavi USB. Da sta si liniji med seboj kolikor se da simetrični, smo simetrično postavili tudi komponente, ki so dodane na ta diferencialni par.
Namensko ESD zaščito smo postavili čim bližje priključku. Ker vodilo CAN lahko povzroča elektromagnetne motnje (povezan je z motorjem, ki normalno povzroča veliko motenj), smo naredili diferencialni par čim krajši. Tu prav tako nismo uporabili impedančnega profila, saj se podatki ne prenašajo s tako visokimi hitrostmi. Pri TCAN1051 smo blokirna kondenzatorja postavili čim bližje priključkoma za napajanje in GND.
Slika 41: Diferencialni par za vodilo CAN z ESD zaščito (D7), filtriranjem (C37, C39, L1) zaključitvijo (R33, R35, C38) in TCAN1051 sprejemnikom/oddajnikom (U5).
Krmilno vezje za piezoelektrični piskač ni predstavljalo posebnih tehničnih zahtev pri postavljanju. Ker za piskača nismo izdelali primernega podnožja, smo morali okoli njegovega podnožja za 4x1 priključek pustiti nekoliko več prostora.
Ko smo vse komponente postavili in povezal, smo dodali na zgornjo in spodnjo plast še poligon za GND vozlišče. Na spodnji plasti je poligon odsoten samo pri močnostnih P-kanalnih MOSFET-ih za izbiralnik napajanja ter čez njihove poligone za povezavo. Na zgornji plasti tega poligona nismo dodali čez celotno območje izbiralnika napajanja, saj tam ni potreben.
Tema poligonoma smo dodali najnižjo prioriteto in se na lokacijah, kjer se prekrivata z drugimi poligoni, prilagodita tistim poligonom. Nato smo dodali še polje skoznikov na GND vozlišče s funkcijo Via Stitching. Kjer je bilo potrebno, smo dodali skoznike ročno. Napise smo postavili ob komponentah ter smo po večini vse obrnili enako z izjemo napajalnih priključkov, priključka za GUI ter vhodnih kondenzatorjev za vezje. Pri priključkih za vhodno in izhodno napajanje bi bilo smiselno, da bi dodal + in – oznake.
57
6 Prenos programske kode ter programske prilagoditve na verzijo 3
Programsko kodo so profesorji in sodelavci pri projektu že v celoti spisali za verzijo 2, zato smo jo le nekoliko predelali. Kodo za verzijo 2 so napisali v treh nivojih. Najnižji nivo so inicializacija ter nizkonivojske funkcije, vezane na periferne enote; srednji nivo so funkcije, ki združujejo nizkonivojske funkcije ter najvišji nivo oziroma aplikacija, ki uporablja funkcije srednjega nivoja za željeno delovanje. Ta pristop k pisanju programske kode omogoči, da je pri menjavi mikrokrmilnika potrebno prilagoditi le funkcije v najnižjem nivoju ter inicializacijo.
Staro kodo smo najprej prenesli v programsko kodo za nov mikrokrmilnik (iz G474RE na G483CE). Tu smo v programskem okolju STM32CubeIDE uporabili orodje CubeMX za inicializacijo perifernih enot. CubeMX je generiral kodo, v katero se napiše še uporabnikovo programsko kodo za delovanje. Pri tem je potrebno biti pazljiv, da se jo piše med vrsticami, namenjenimi uporabnikovi kodi, sicer jo bo CubeMX ob naslednjem generiranju kode povozil.
Tu smo preprosto kopirali celotno staro kodo ter dodali vse dodatne knjižnice iz verzije 2 za aplikacijske funkcije ter srednje-nivojske funkcije. V CubeMX smo prav tako inicializirali vodili I2C ter SPI, ki ju sicer nismo implementirali v ostalo kodo.
Ko smo celotno kodo za delovanje verzije 2 prenesli, smo spremenili funkcije za krmiljenje motorja ter dodal logiko za prižiganje in ugašanje sistema s tipko oziroma samodržno logiko napajanja. Tu smo uporabljali HAL knjižnice, ki jih ponuja STM32CubeIDE okolje. Prav tako smo spremenili funkciji za krmiljenje piskača, kjer smo namesto nastavitve izhoda na '1' ali '0' v verziji 3 omogočili ali onemogočili PWM signal.
V verziji 2 se glavni del programa (branje vrednosti senzorjev in potrebno ukrepanje glede na način delovanja) izvaja na 1 milisekundo. V verziji 3 smo čas med izvajanji podaljšali na 25 milisekund zaradi zakasnitve pri komunikaciji z motorjem. Ta čas smo nastavili v orodju CubeMX pri nastavitvi časovnika TIM3. TIM3 ob vsakem prelivu proži pretvorbo analognih signalov iz senzorjev in ob končani pretvorbi se prične izvajati prilagajanje parametrov za krmiljenje motorja glede na vhodne parametre (izmerjene veličine in način delovanja) ter pošiljanje navodil motorju. Čas med proženji smo nastavili z dolžino periode časovnika TIM3.
V programu se vse časovno odvisne veličine (volumen dovedenega zraka, ki se ga izračuna s pretokom ter časom) računajo z makrojem TIME_SLICE_MS, v katerem je definiran čas med proženji v milisekundah, ki smo ga zato morali spremeniti za doseganje pravilnega delovanja.
58 6.1 Inicializacija z orodjem CubeMX
Orodje CubeMX omogoča generiranje dela kode (predvsem inicializacije perifernih enot). V tem orodju smo grafično nastavili vse vhode in izhode na mikrokrmilniku ter inicializira enote, kot so povezave UART, vodilo I2C, povezava CAN, pretvorniki ADC in časovniki. Vse vhode in izhode mikrokrmilnika smo nastavili tako, kot so opisani v opisu sheme mikrokrmilnika. Za vsako enoto smo nastavili še parametre za inicializacijo. Te smo uporabili enake kot v verziji 2. CubeMX prav tako omogoča inicializacijo ure mikrokrmilnika. Tu smo izbrali kot osnovni signal za uro zunanji kristalni oscilator s frekvenco 24 MHz. Ker STM32G4 omogočajo frekvenco delovanja do 170 MHz, smo s pravilnim množenjem signala oscilatorja uro nastavili na 170 MHz.
Za krmiljenje motorja so v verziji 2 uporabljali signal PWM, ki so ga generirali s časovnikom.
Za verzijo 3 smo to opustili ter dodali povezavo CAN z enoto FDCAN2 (STM32G4 podpirajo CAN FD, ki omogoča uporabo klasične povezave CAN). Pri FDCAN2 smo v CubeMX - nominalni časovni segment 1 na 10, - nominalni časovni segment 2 na 9,
- število filtrov za standardne identifikatorje na 1 in - oddajni način s FIFO.
Ostale dodatne parametre in možnosti smo nastavili ali na 0 ali onemogočili. V nastavitvah za prekinitve smo prav tako omogočili FDCAN2 prekinitev 0.
Frekvenca, na kateri deluje FDCAN2, je 170 MHz. Z nominalnim delilnikom to frekvenco delimo na 107, kar predstavlja število časovnih koščkov v eni sekundi. S časovnimi koščki se nato sestavi nominalne segmente. Vsi trije nominalni segmenti skupaj predstavljajo dolžino enega bita. Seštevek vseh treh segmentov oziroma dolžina bita je 20 časovnih koščkov, kar pomeni, da se bo v času ene sekunde preneslo 500.000 bitov. Z drugimi besedami, dosežemo hitrost prenosa 500 kbps.
Poleg FDCAN2 smo morali na novo inicializirati še krmilni signal za piskača, poimenovan BUZZ. Za krmiljenje piskača so v verziji 2 uporabljali navaden izhodni signal. V verziji 3 smo ga spremenili na signal PWM, s katerim je mogoče nastavljati jakost zvoka. Za generacijo PWM smo uporabili časovnik TIM4, kanal 4. Periodo enega cikla smo nastavili na 1 milisekundo ter osnovni obratovalni cikel (ang. duty cycle) na 50 %.
59 6.2 Prilagoditev funkcij za motor na povezavo CAN
V CubeMX smo inicializirali nastavitve za povezavo CAN, ampak te niso dovolj za polno delovanje povezave. Ročno smo morali dodati še inicializacijo za filter sporočil in strukturo oddajanih sporočil ter aktivirati povezavo CAN. Z izvedeno popolno inicializacijo in aktivacijo smo dodali še funkcije za pošiljanje sporočil motorju. Komunikacija z motorjem preko povezave CAN poteka s protokolom XCP, pri katerem motorju najprej pošljemo zahtevo za pošiljanje določenega ukaza in po njegovem odgovoru se mu pošljemo še dejansko vrednost ukaza. Funkcije za pošiljanje ukazov po protokolu XCP je napisal študent Aljaž Kontestabile pri testiranju motorja, tako da smo jih zgolj prilagodili programski kodi ter mikrokrmilniku. Te funkcije smo napisali v izvorni datoteki fdcan.c in jih uporabili v izvorni datoteki motor.c, kjer se nahajajo funkcije za nadzor motorja. Te so nato uporabljene v funkcijah srednjega nivoja.
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
- sporočila s pravilnim identifikatorjem se zapiše v sprejemni FIFO 0, - identifikator za filter je 63D (šestnajstiški zapis) in