Turinys:

Dviejų pėdsakų osciloskopas: 11 žingsnių (su nuotraukomis)
Dviejų pėdsakų osciloskopas: 11 žingsnių (su nuotraukomis)

Video: Dviejų pėdsakų osciloskopas: 11 žingsnių (su nuotraukomis)

Video: Dviejų pėdsakų osciloskopas: 11 žingsnių (su nuotraukomis)
Video: HC-SR04 Ultrasonic Sensor Signals on Oscilloscope 2024, Liepa
Anonim
Dviejų pėdsakų osciloskopas
Dviejų pėdsakų osciloskopas

Kurdamas savo ankstesnį mini osciloskopą norėjau pamatyti, kaip gerai galiu padaryti savo mažiausią ARM mikrovaldiklį STM32F030 (F030), ir tai padarė gerą darbą.

Viename iš komentarų buvo pasiūlyta, kad „mėlyna tabletė“su STM32F103 (F103) gali būti geresnė, mažesnė nei kūrimo plokštė su F030 ir galbūt net pigesnė. Tačiau mini osciloskopui naudojau ne kūrimo plokštę, o F030 dar mažesnėje SMD-DIP plokštėje, todėl ten mėlynos tabletės tikrai nebūtų mažesnės ir abejoju, kad ir pigiau.

Kodą dabar galima rasti „Gitlab“:

gitlab.com/WilkoL/dual-trace-oscilloscope

Prekės

Dalių sąrašas: - plastikinė dėžutė - perforatorius (dvipusė prototipo plokštė 8x12 cm) - mėlyna tabletė - ST7735s TFT ekranas - ličio jonų baterija - HT7333 3,3 V žemo iškritimo reguliatorius - MCP6L92 dvigubas opampas - nuo TSSOP8 iki DIP8 plokštės - 12 MHz kristalas (nebūtina)) - rotacinis kodavimo įrenginys ir rankenėlė (2x) - maitinimo jungiklis - bananų gnybtai (4x) - ličio jonų įkroviklio plokštė - keli rezistoriai ir kondensatoriai - nailoniniai tarpikliai, veržlės ir varžtai

Įrankiai:

- litavimo stotis - 0,7 mm lydmetalis - tam tikra viela - šoninis pjoviklis - akiniai ir lupa - gręžtuvas - multimetras - osciloskopas - STLink -V2

Programinė įranga:

- STM32IDE - STM32CubeMX - STLink Utility - LowLayer biblioteka - pritaikyta biblioteka, skirta ST7735s - Notepad ++ - Kicad

1 veiksmas: interleave arba SI sinchroninis režimas

Interleave arba SI sinchroninis režimas
Interleave arba SI sinchroninis režimas
Interleave arba SI sinchroninis režimas
Interleave arba SI sinchroninis režimas

Mėlyna tabletė

Bet idėja buvo, ir aš žinojau, kad F103 turi du ADC! Ką daryti, jei tuos du ADC naudoju kartu „interleave“režimu, ką jau padariau su STM32F407 (F407). Mėginių ėmimo greitis padvigubėtų. Sujunkite tai su greitesniu mikrovaldikliu ir tai būtų puikus mini osciloskopo įpėdinis.

Interleave režimas Keista, kad F103 ADC yra mažiau pažengę nei F030 (ir F407), jūs negalite pasirinkti skiriamosios gebos. Dar svarbiau yra tai, kad jūs taip pat negalite pakeisti laiko tarp dviejų ADC. Dabar, kai naudojate interleave režimą, paprastai norite, kad mėginiai būtų imami kuo greičiau ir per trumpiausią laiką tarp visų mėginių, tačiau naudojant osciloskopą būtina pakeisti laiką. Galbūt tai dar galima padaryti, nesu profesionalus osciloskopų dizaineris, bet atsisakiau plano naudoti interleave režimą.

Sinchroninis režimas

Tačiau turint du ADC yra daug daugiau galimybių, abu ADC taip pat galima nustatyti į „įprastą vienu metu“režimą. Kaip apie dvigubą osciloskopą?

Nusprendęs pabandyti pagaminti dvigubo pjūvio osciloskopą, aš taip pat norėjau turėti kintamą įvesties jautrumą, kurio neturėjau mini osciloskopu. Tai reiškia, kad įėjimuose yra slopintuvas (ir stiprintuvas). O gal norėjau dar daugiau? Taigi aš sudariau nedidelį sąrašą „malonių“.

PALAIKYMŲ SĄRAŠAS

du kanalai

kintamas abiejų kanalų jautrumas

suaktyvinamas abiem kanalais

kintamas trigerio lygis abiejuose kanaluose

kintamasis poslinkis

vienos baterijos maitinimas

telpa toje pačioje dėžutėje kaip ir mini osciloskopas

2 žingsnis: prototipų kūrimas

Prototipų kūrimas
Prototipų kūrimas
Prototipų kūrimas
Prototipų kūrimas

Kaip įprasta, pradėjau šiuos projektus ant duonos lentos. (Žiūrėkite paveikslėlį) Ir prieš lituojant viską ant lentos, aš stengiuosi išsiaiškinti, ar ir kaip jis tilps į pasirinktą projekto dėžutę. Tinka, bet tik. Kai kurios dalys yra paslėptos po ekranu, kitos - po mėlynąja tablete. Ir vėl, kaip ir daugumos mano projektų atveju, tai yra vienintelis projektas ir aš jam nesukursiu PCB.

3 žingsnis: slopintuvai

Slopintuvai
Slopintuvai

Įprastuose osciloskopuose įvesties slopintuvai yra grandinės, kurios keičia slopinimą ir stiprinimą, įjungdamos ir išjungdamos rezistorius su mažomis signalinėmis relėmis. Nors turiu kai kurias iš tų relių, žinau, kad jos nesijungs esant mažesnei kaip 4 voltų įtampai, tai reiškia, kad jos veiks tik su visiškai pakrauta ličio jonų baterija (4,2 V). Taigi man reikėjo kito būdo, kaip tuos rezistorius perjungti. Žinoma, galėčiau tiesiog sumontuoti mechaninius jungiklius, bet tai tikrai netilps į projekto dėžutę, turint omenyje, galbūt galėčiau dar kartą išbandyti geresnį skaitmeninį potenciometrą (tas, kurį turiu, yra per daug triukšmingas).

Tada pagalvojau apie „analoginius jungiklius“, su jais galiu pats pasidaryti skaitmeninį potenciometrą. Savo dalių kolekcijoje radau CD4066 su keturiais analoginiais jungikliais. Idėja yra padaryti opamp kintamą grįžtamojo ryšio rezistorių, įjungiant ir išjungiant rezistorius lygiagrečiai grįžtamojo ryšio rezistoriui.

Tai veikia labai gerai, tačiau turint tik 4 jungiklius 4066 ir turint 2 kanalus, nebuvo įmanoma nustatyti daugiau nei trijų jautrumo lygių. Aš pasirinkau 500 mV, 1 V ir 2 V viename skyriuje, nes tai yra dažniausiai naudojamas įtampos lygis. Ekranas yra padalintas į 6 skyrius, todėl diapazonas yra nuo -1,5 V iki +1,5 V, nuo -3 V iki +3 V ir nuo -6 V iki 6 V.

Naudodami „virtualią žemę“, galite perkelti šiuos diapazonus aukštyn ir žemyn, kad būtų galima net nuo 0 iki +12 V.

4 žingsnis: virtuali žemė

Virtuali aikštelė
Virtuali aikštelė
Virtuali aikštelė
Virtuali aikštelė

Kadangi osciloskopas naudoja vieną maitinimo bėgelį (3,3 V), opampos turi turėti virtualų žemės lygį arba jie neveiks. Šis virtualus žemės lygis yra sukurtas naudojant PWM viename TIM4 išvesties kanale, jo veikimo ciklas keičiasi nuo kelių procentų iki beveik šimto procentų. Žemo dažnio filtras su 1k rezistoriumi ir 10uF kondensatoriumi paverčia jį (beveik) 0V į (beveik) 3,3V įtampą. Kvadratinės bangos dažnis yra šiek tiek mažesnis nei 100 kHz, todėl paprastas žemo dažnio filtras yra pakankamai geras.

Gana vėlai kurdamas šį osciloskopą supratau, kad negali turėti dviejų atskirų kanalų poslinkių. Taip yra dėl to, kad naudojant vieną maitinimo šaltinį, įėjimo į žemę lygis turi būti atskirtas nuo tikrojo stiprintuvų žemės lygio. Taigi abu kanalai juda taip pat, kaip keičiate GND nustatymą.

5 žingsnis: rotaciniai kodavimo įrenginiai ir derinimas

Rotaciniai kodavimo įrenginiai ir derinimas
Rotaciniai kodavimo įrenginiai ir derinimas
Rotaciniai kodavimo įrenginiai ir derinimas
Rotaciniai kodavimo įrenginiai ir derinimas

Naudodamas mini osciloskopą visoms funkcijoms naudojau tik vieną sukamąjį kodavimo įrenginį. Dėl to dvigubą osciloskopą būtų labai sunku naudoti, todėl čia man reikia dviejų. Vienas slopintuvų ir virtualaus žemės lygio kodavimo įrenginys, kitas - laiko bazės ir paleidimo aktyviklis. Deja, kaip ir mano kitame projekte, šie sukamieji kodavimo įrenginiai yra labai „triukšmingi“. Jie yra tokie blogi, kad paprasčiausiai neveiks su laikmačiais „kodavimo režimu“-standartiniu jų skaitymo būdu. Turėjau padaryti išjungimo mechanizmą su laikmačiu TIM2, tikrindamas koduotojus kas 100 us. Šis laikmatis savo ruožtu paleidžiamas (tik), kai kodavimo įrenginiuose yra tam tikros veiklos, tai tikrinama naudojant EXTI funkciją įvesties prievaduose. Dabar kodavimo įrenginiai veikia gerai.

Ir kaip matote, turėti ekraną taip pat gali būti labai patogu norint parodyti derinimo informaciją.

6 veiksmas: ekranas ir laiko bazė

Ekranas ir laiko bazė
Ekranas ir laiko bazė

Ekrano skiriamoji geba yra 160 x 128 pikselių, todėl vienam ekranui reikia 160 pavyzdžių, man pavyko pagreitinti ADC, kad būtų galima padaryti 1,6 milijono mėginių per sekundę, ir tai, naudojant daug perkrautą mikrovaldiklį (daugiau apie tai vėliau), suteikia minimali laiko bazė 20 USD viename skyriuje (100 USD ekrane). Taigi 10 kHz bangos forma užpildys visą ekraną.

Tai tik du kartus greičiau nei anksčiau pagamintas mini osciloskopas. Na, dabar jis yra su dviem kanalais:-).

Kaip minėta, ekranas yra 160 pikselių pločio, todėl vienam ekranui reikia tik 160 reikšmių. Tačiau visuose buferiuose iš tikrųjų yra 320 mėginių. Taigi DMA išsaugo 320 reikšmių prieš sukeldama visišką perdavimo pertraukimą (TC). Taip yra todėl, kad paleidimas atliekamas programinėje įrangoje. Mėginių ėmimas pradedamas atsitiktiniu momentu, todėl labai mažai tikėtina, kad pirmoji buferio vertė yra ta vieta, kur turėtų būti trigeris.

Todėl trigerio taškas randamas skaitant „trace_x_buffer“, jei vertė yra norimoje trigerio vertėje en, jei ankstesnė vertė yra šiek tiek žemiau jos, randamas trigerinis taškas. Tai veikia gana gerai, tačiau jums reikia didesnio buferio, nei yra tikrasis ekrano dydis.

Tai taip pat yra priežastis, kodėl žemesnių laiko bazės nustatymų atnaujinimo dažnis yra lėtesnis, nei galite tikėtis. Kai naudojate 200 ms/div nustatymą, vienas ekranas, kuriame yra daug duomenų, yra 1 sekundė, tačiau kadangi konversijų suma padvigubinta dvigubai, tai užtrunka 2 sekundes. Greitesni laiko bazės nustatymai to nepastebės.

Laiko bazei generuoti naudojamas TIM3. Jis suaktyvina ADC tokiu greičiu, kokio reikalauja pasirinktas laiko bazės nustatymas. Jo TIM3 laikrodis yra 120 MHz (žr. OVERCLOCKING), didžiausias skaičius, į kurį jis skaičiuojamas (ARR), nustato, kaip jis perpildomas arba, ST kalba, atnaujinamas. Per TRGO šie atnaujinimo impulsai suaktyvina ADC. Žemiausias jo generuojamas dažnis yra 160 Hz, didžiausias - 1,6 MHz.

7 žingsnis: ADC ir DMA

ADC ir DMA
ADC ir DMA

Du ADC tuo pačiu metu konvertuoja įvesties įtampą ir saugo šias dvi 12 bitų reikšmes viename 32 bitų kintamajame. Taigi DMA turi tik vieną kintamąjį per vieną (dvigubą) konversiją.

Norint naudoti šias reikšmes, būtina jas padalyti į dvi reikšmes, kad jas būtų galima naudoti dviem pėdsakams parodyti. Kaip minėta, F103 ADC negalima nustatyti kitokios skiriamosios gebos nei 12 bitų. Jie visada veikia 12 bitų režimu, todėl konversijos visada užtrunka tą patį laikrodžio impulsų skaičių. Vis dėlto, naudojant ADC spartinimą, galima padaryti 1,6 MS pavyzdžių per sekundę (žr. Papildoma: Overclocking).

ADC nuoroda yra Vdd, 3.3V bėgis. Norėdami tai konvertuoti į patogesnes vertes (kiekvienam padaliniui), aš apskaičiavau slopintuvų vertes, nes neturiu tikslių rezistorių verčių, gautų atlikus šiuos skaičiavimus, kai kurie pataisymai atliekami programinėje įrangoje.

Šiame projekte aš naudoju DMA „įprastu režimu“. Šiuo režimu DMA nustoja perduoti duomenis (iš ADC į atmintį), kai perduodamas žodžių (arba pusės žodžių ar baitų) skaičius. Kitu galimu režimu, „apskrito režimu“, DMA atsistato iš naujo ir toliau nepertraukiamai perduoda duomenis. Tai nepadėjo su „F103“, jis yra toks greitas, kad perrašo „adc_buffer“ duomenis, kol likusi programa gali jį perskaityti. Taigi dabar procesas yra toks:

- nustatykite DMA pagal perduodamų duomenų skaičių ir įgalinkite DMA

- pradėti aktyvinti ADC, jie paprašys DMA pervedimų po kiekvienos (dvigubos) konversijos

- perkėlus nustatytą konversijų skaičių, DMA sustoja

- nedelsiant taip pat sustabdyti ADC suveikimą

- atlikite visas manipuliacijas, reikalingas atminties duomenims

- rodyti pėdsakus ekrane

- pradėti procesą iš naujo

8 veiksmas: vartotojo sąsaja

Vartotojo sąsaja
Vartotojo sąsaja

160 x 128 pikselių ekranas nėra labai didelis ir aš noriu išnaudoti kuo daugiau jo. Taigi nėra jokios jo dalies, skirtos srovių nustatymams. Paskutinėse keliose eilutėse rodomas vertikalus jautrumas, laiko bazė, trigerio lygis ir trigerio kanalas, tačiau kai signalai yra pakankamai dideli, jie bus rodomi toje pačioje srityje. Aktyvi parinktis rodoma geltonai, o kita - balta.

9 žingsnis: kūrimas ir galimi patobulinimai

Pastatas ir galimi patobulinimai
Pastatas ir galimi patobulinimai
Pastatas ir galimi patobulinimai
Pastatas ir galimi patobulinimai
Pastatas ir galimi patobulinimai
Pastatas ir galimi patobulinimai
Pastatas ir galimi patobulinimai
Pastatas ir galimi patobulinimai

Labai džiaugiuosi šiuo projektu. Puikiai veikia ir atlieka darbą, bet gali būti ir geriau.

Projekto dėžutė yra per maža, kad patogiai tilptų viskas, todėl komponentai turi būti dedami po „Blue Pill“. Kad tai būtų įmanoma, „Blue Pill“negalima tiesiogiai lituoti prie „pagrindinės plokštės“. Kadangi dėl to viskas tapo per aukšta, turėjau pašalinti daugybę „Blue Pill“dalių, pvz., Džemperius, skirtus pasirinkti BOOT0 ir BOOT1 (daiktai, kurių aš niekada nenaudoju), ir netgi turėjau perkelti kristalą iš viršaus į apačią. PCB.

Aš apsunkinau gyvenimą, naudodamas bananų jungtis, o ne BNC ar SMA jungtis, o tai reiškia, kad didelė dalis plokštės buvo „neleidžiama zona“, kad tai būtų aišku, aš uždėjau ant jo kaptono juostą, kad išvengčiau savęs nuo dalių uždėjimo ant jo.

Kita problema, kai visa tai dedama į tokią mažą projekto dėžutę, yra ta, kad analoginės ir skaitmeninės grandinės yra labai arti viena kitos. Matote, kad abiejuose pėdsakuose matomas gana didelis triukšmas. To aš net neturėjau ant duonos lentos! Perkėlus analoginių ir skaitmeninių grandinių elektros linijas kuo toliau vienas nuo kito, buvo šiek tiek patobulinta, bet to nepakako mano skoniui. Sumažinti visas rezistorių reikšmes analoginėse grandinėse dar labiau nei aš (įėjimo varža yra 100 kOhm vietoj 1MOhm) nepadėjo. Įtariu, kad paleidimas greičiausiu laiko bazės nustatymu (20us/div), kuris nėra puikus, taip pat pagerės, nes signalai bus mažiau triukšmingi.

Jei padarysite šį dizainą „tikroje“PCB, su visomis smd dalimis ir atskirais sluoksniais, skirtais analoginiams, skaitmeniniams ir maitinimo šaltiniams (tai yra 4 sluoksniai!), Tai tikriausiai veiks labai gerai. Jis bus daug mažesnis, jame nebus naudojamos visos mėlynos tabletės, o tik F103, ir tai suteiks galimybę tiekti atskirą (švarų) analoginį Vdda ADC.

Galiausiai nusprendžiau purkšti dėžutę juodai, tai pakeičia visas turimas smėlio spalvos dėžutes.

10 veiksmas: kodas ir trumpas vaizdo įrašas

11 veiksmas: PAPILDOMAS: įsijungimas

PAPILDOMAS: įsijungimas
PAPILDOMAS: įsijungimas

Kaip ir aš su F03, norėjau pamatyti, kaip gerai F103 gali būti įsibėgėjęs. Šio mikrovaldiklio specifikacijos teigia, kad maksimalus laikrodžio greitis neturi viršyti 72MHz (kuris, žinoma, jau yra greitesnis už F030), tačiau keliuose tinklaraščiuose skaičiau, kad jį įsibėgėti buvo lengva, tad kodėl gi ne?

„Blue Pill“yra 8MHz kristalas, o PLL padaugina jį su koeficientu nuo 9 iki 72MHz. PLL gali būti padidintas iki 16, o dažnis - 128 MHz. Tai nebuvo problema mano „Blue Pill“, iš tikrųjų visos mano „Blue Pills“veikia be jokių problemų 128 MHz dažniu.

Bet dabar norėjau sužinoti, kokia yra tikroji riba. Taigi aš pašalinau 8MHz kristalą ir pakeičiau jį vienu iš 12MHz. Vėl padidinau PLL daugiklį, kol mikrovaldiklis pagaliau pasidavė. Tai buvo 168MHz dažniu! 156 MHz dažniu jis vis tiek veikė gerai. Aš palikau jį važiuoti tokiu greičiu kelias valandas ir niekada nemačiau, kad jis sudužtų. Šiuo osciloskopu aš nusistovėjau 120MHz greičiui, kurį galima pasirinkti naudojant 12MHz kristalą ir PLL 10, taip pat naudojant 8 MHz kristalą ir PLL 15. (žr. SystemClock_Config in main.c)

ADC dabar taip pat veikia greičiau, turiu 30MHz (o ne 14), jie vis tiek gerai veikė 60MHz dažniu, STMicroelectronics sukuria gražią aparatinę įrangą!

„STMicroelectronics“šias ribas įtraukia į duomenų lapą dėl geros priežasties, jos garantuoja, kad mikrovaldiklis visomis sąlygomis veikia nurodytu 72 MHz dažniu.

Bet kadangi aš nenaudoju mikrovaldiklio esant -40 Celsijaus temperatūrai, +85 Celsijaus temperatūrai, esant tik 2,0 arba 3,6 V įtampai, manau, kad saugu jį viršyti. Nedarykite to, kai ketinate parduoti įrenginį su jų mikrovaldikliais, niekada nežinote, kur jie bus naudojami.

Rekomenduojamas: