Innholdsfortegnelse:

Dual Trace Oscilloscope: 11 trinn (med bilder)
Dual Trace Oscilloscope: 11 trinn (med bilder)

Video: Dual Trace Oscilloscope: 11 trinn (med bilder)

Video: Dual Trace Oscilloscope: 11 trinn (med bilder)
Video: PS3 #2: Ressurecting the impossable! | EPIC rollercoaster repair that nearly broke me. 2024, Juli
Anonim
Dual Trace Oscilloskop
Dual Trace Oscilloskop

Da jeg bygde mitt forrige mini -oscilloskop, ønsket jeg å se hvor godt jeg kunne få min minste ARM -mikrokontroller til å utføre en STM32F030 (F030), og det gjorde en god jobb.

I en av kommentarene ble det antydet at en "blå pille" med STM32F103 (F103) kan være bedre, mindre enn utviklingsbordet med F030 og muligens enda billigere. Men for mini-oscilloskopet brukte jeg ikke utviklingsbordet, men F030 på et enda mindre SMD-DIP-kort, så det ville absolutt ikke være en blå pille, og jeg tviler på at det også ville være billigere.

Koden er nå tilgjengelig på Gitlab:

gitlab.com/WilkoL/dual-trace-oscilloscope

Rekvisita

Delliste: - plastboks - perfboard (dobbeltsidig prototypebrett 8x12cm) - Blå pille - ST7735s TFT -skjerm - litiumionbatteri - HT7333 3.3V lavt frafallsregulator - MCP6L92 dobbelt opamp - TSSOP8 til DIP8 -kort - 12 MHz krystall (ikke nødvendig) - roterende encoder pluss knott (2x) - powerwitch - banan terminaler (4x) - litium -ion lader board - flere motstander og kondensatorer - nylon distanser, muttere og skruer

Verktøy:

- loddestasjon - lodding 0,7 mm - litt tråd - sidekutter - glass og lupp - bor - multimeter - oscilloskop - STLink -V2

Programvare:

- STM32IDE - STM32CubeMX - STLink Utility - LowLayer -bibliotek - tilpasset bibliotek for ST7735s - Notisblokk ++ - Kicad

Trinn 1: Interleave eller SImultaneous Mode

Interleave eller SImultaneous Mode
Interleave eller SImultaneous Mode
Interleave eller SImultaneous Mode
Interleave eller SImultaneous Mode

Blå pille

Men ideen var der, og jeg visste at F103 har to ADCer! Hva om jeg brukte de to ADCene sammen i "interleave" -modus, noe jeg har gjort før med STM32F407 (F407). Prøvehastigheten ville doble seg. Det, kombinere det med en raskere mikrokontroller, og det ville gi en flott etterfølger til mini -oscilloskopet.

Interleave -modus Merkelig at ADC -ene i F103 er mindre avanserte enn den i F030 (og F407), du kan ikke velge oppløsning. Mer viktig er at du heller ikke kan endre timingen mellom de to ADC -ene. Når du bruker interleave -modus vanligvis vil du ha prøvetaking så raskt som mulig med kortest tid mellom noen prøver, men med et oscilloskop er det nødvendig å endre timingen. Kanskje det fortsatt kan gjøres, jeg er ikke en profesjonell oscilloskopdesigner, men jeg droppet planen om å bruke interleave-modus.

Samtidig modus

Men å ha to ADCer gir mange flere alternativer, de to ADC-ene kan også settes til "vanlig-samtidig" -modus. Hva med et dobbelt spor-oscilloskop?

Etter å ha bestemt meg for å prøve å lage et oscilloskop med to spor, ønsket jeg også å ha variabel inngangsfølsomhet, et alternativ som jeg ikke hadde på mini -oscilloskopet. Det betyr en demper (og forsterker) på inngangene. Og kanskje jeg ville ha enda mer? Så jeg lagde en liten liste over "nice-to-haves".

ØNSKELISTE

to kanaler

variabel følsomhet på begge kanaler

utløses på begge kanaler

variabelt utløsernivå på begge kanaler

variabel forskyvning

enkelt batteristrøm

passer i samme eske som mini-oscilloskopet

Trinn 2: Prototyping

Prototyping
Prototyping
Prototyping
Prototyping

Som vanlig startet jeg disse prosjektene på et brødbrett. (Se bildet) Og før jeg lodder alt på perfboardet prøver jeg å finne ut om og hvordan det vil passe i den valgte prosjektboksen. Det passer, men bare akkurat. Noen deler er skjult under skjermen, andre under den blå pillen. Og igjen, akkurat som for de fleste av prosjektene mine, er dette et engangsprosjekt, og jeg vil ikke designe en PCB for det.

Trinn 3: Dempere

Dempere
Dempere

I vanlige oscilloskoper er inngangsdempere kretser som endrer demping og forsterkning ved å slå inn og ut motstander med små signalreléer. Selv om jeg har noen av disse reléene, vet jeg at de ikke vil bytte med mindre enn 4 Volt, det betyr at de bare vil fungere med et fullastet litiumionbatteri (4,2V). Så jeg trengte en annen måte å bytte motstander på. Selvfølgelig kunne jeg bare installere mekaniske brytere, men det ville absolutt ikke lenger passe inn i prosjektboksen i tankene, kanskje jeg kunne prøve et bedre digitalt potensiometer igjen (det jeg har er altfor bråkete).

Da tenkte jeg på "analoge brytere", med dem kan jeg lage et digitalt potensiometer selv. I min reservedelssamling fant jeg CD4066 med fire analoge brytere. Tanken er å gjøre tilbakemeldingsmotstanden til en opamp -variabel ved å slå inn og ut motstander parallelt med tilbakemeldingsmotstanden.

Det fungerer veldig bra, men med bare 4 brytere i 4066 og 2 kanaler var det ikke mulig å lage mer enn tre følsomhetsnivåer. Jeg valgte 500mV, 1V og 2V per divisjon, da det er spenningsnivåene jeg bruker mest. Skjermen er delt inn i 6 divisjoner, slik at det er mellom 1,5V til +1,5V, -3V til +3V og -6V til 6V.

Med den "virtuelle bakken" kan du flytte disse områdene opp og ned, så selv 0v til +12V er mulig.

Trinn 4: Virtual Ground

Virtual Ground
Virtual Ground
Virtuell bakke
Virtuell bakke

Fordi oscilloskopet bruker en enkelt kraftskinne (3.3V) trenger opampene et virtuelt bakkenivå, ellers fungerer de ikke. Dette virtuelle bakkenivået er laget med PWM på en utgangskanal på TIM4, driftssyklusen for den endres fra bare noen få prosent til nesten hundre prosent. Et lavpasfilter med en 1k motstand og en 10uF kondensator forvandler det til en spenning på (nesten) 0V til (nesten) 3,3V. Frekvensen til firkantbølgen er i underkant av 100 kHz, så det enkle lavpassfilteret er bra nok.

Ganske sent i byggingen av dette oscilloskopet innså jeg at du ikke kan ha to separate forskyvninger for kanalene. Dette er på grunn av det faktum at med en enkelt strømforsyning må inngang-bakkenivå være atskilt fra det virkelige bakkenivået til opampene. Så begge kanalene beveger seg på samme måte som du endrer GND-innstillingen.

Trinn 5: Rotary Encoders and Debugging

Rotary Encoders og Debugging
Rotary Encoders og Debugging
Rotary Encoders og Debugging
Rotary Encoders og Debugging

På mini -oscilloskopet brukte jeg bare en roterende encoder for alle funksjoner. Det ville gjøre et dobbeltoscilloskop veldig vanskelig å bruke, så her trenger jeg to. Den ene koder for dempere og virtuelt bakkenivå og den andre koder for tidsbase og utløsning. Dessverre, akkurat som i mitt andre prosjekt, er disse roterende koderne veldig "bråkete". De er så ille at de ganske enkelt ikke ville fungere med tidtakere i "encoder-mode", standard måte å lese dem på. Jeg måtte lage en debouncing -mekanisme med timer TIM2, og sjekke koderne hver 100us. Denne timeren startes igjen (bare) når det er noe aktivitet på koderne, dette kontrolleres med EXTI -funksjonaliteten på inngangsportene. Nå fungerer koderne godt.

Og som du kan se, kan det å ha en skjerm også være veldig nyttig å vise feilsøkingsinformasjon.

Trinn 6: Display og tidsbase

Display og tidsbase
Display og tidsbase

Skjermen har en oppløsning på 160 x 128 piksler, så det er 160 prøver som trengs for en skjerm, jeg klarte å øke hastigheten på ADC -ene til å gjøre 1,6 millioner prøver per sekund, og det, med mye overklokket mikrokontroller (mer om det senere), gir en minimumsbase på 20us per divisjon (100us per skjerm). Dermed vil en bølgeform på 10 kHz fylle hele skjermen.

Det er bare dobbelt så raskt som minioscilloskopet jeg laget før. Vel, nå er det med to kanaler:-).

Som sagt er skjermen 160 piksler bred, så det er bare 160 verdier som trengs per skjerm. Men alle buffere inneholder faktisk 320 prøver. Så DMA lagrer 320 verdier før den utløser et komplett avbrudd i overføringen (TC). Dette er fordi utløsningen utføres i programvare. Samplingen starter i et tilfeldig øyeblikk, så det er svært lite sannsynlig at den første verdien i bufferen er stedet der triggerpunktet skal være.

Derfor blir triggerpunktet funnet ved å lese gjennom trace_x_buffer, hvis verdien er på ønsket triggerverdi, og hvis den forrige verdien er like under den, blir trigger_point funnet. Dette fungerer ganske bra, men du trenger en større buffer enn den faktiske skjermstørrelsen er.

Dette er også grunnen til at oppdateringsfrekvensen på de nedre tidsbaseinnstillingene er tregere enn du kanskje forventer. Når du bruker 200ms/div -innstillingen, er en skjerm full av data 1 sekund, men fordi det er dobbelt så mange konverteringer, tar det 2 sekunder. På de raskere tidsbaseinnstillingene vil du ikke legge merke til det så mye.

TIM3 brukes til å generere tidsbasen. Det utløser ADC -ene med den hastigheten som kreves av den valgte tidsbaseinnstillingen. TIM3 -klokken er 120 MHz (se OVERLOCKING), det maksimale antallet den teller (ARR) bestemmer hvordan andre overløper eller, i ST -språk oppdateres den. Via TRGO utløser disse oppdateringspulsene ADC -ene. Den laveste frekvensen den genererer er 160 Hz, den høyeste er 1,6 MHz.

Trinn 7: ADC og DMA

ADC og DMA
ADC og DMA

De to ADC -ene konverterer spenningen på inngangene sine samtidig, de lagrer de to 12 -biters verdiene i en enkelt 32 -biters variabel. Så DMA har bare én variabel per (dobbel) konvertering til overføring.

For å bruke disse verdiene er det derfor nødvendig å dele dem i de to verdiene, slik at de kan brukes til å vise de to sporene. Som sagt kan ADCer i F103 ikke settes til andre oppløsninger enn 12 bits. De er alltid i 12 -biters modus, og derfor tar konverteringer alltid det samme antallet klokkepulser. Likevel, med overklokking av ADC -ene, kan 1,6 MSamples per sekund utføres (se Ekstra: Overklokking).

Referansen til ADC -ene er Vdd, 3.3V -skinnen. For å konvertere det til mer praktiske verdier (per divisjon) har jeg beregnet verdiene til demperne, fordi jeg ikke har de eksakte motstandsverdiene som kommer ut av disse beregningene, noen korreksjoner utføres i programvare.

I dette prosjektet bruker jeg DMA i "vanlig modus". I denne modusen slutter DMA å overføre data (fra de ADC til minnet) når antall ord (eller halvord eller byte) alle overføres. I den andre mulige modusen, "sirkulær modus", tilbakestiller DMA seg selv og fortsetter å overføre data uten avbrudd. Det fungerte ikke med F103, det er så raskt at det overskriver dataene i adc_buffer før resten av programmet kunne lese det. Så nå er prosessen som følger:

- konfigurer DMA til antall data som skal overføres, og aktiver DMA

- start utløsningen av ADC -ene, disse vil be om DMA -overføringer etter hver (dobbel) konvertering

- etter at det angitte antallet konverteringer er overført, stopper DMA

- stopp også utløsningen av ADC -ene umiddelbart

- utfør all manipulasjon som er nødvendig med dataene i minnet

- Vis spor på skjermen

- start prosessen på nytt

Trinn 8: Brukergrensesnitt

Brukergrensesnitt
Brukergrensesnitt

En 160 x 128 piksler skjerm er ikke veldig stor, og jeg vil bruke så mye som mulig. Så det er ingen del av det forbeholdt strøminnstillingene. I de siste radene vises vertikal følsomhet, tidsbase, utløsernivå og utløserkanal, men når signalene er store nok vil de vises i samme område. Alternativet som er aktivt vises i gult, resten vises i hvitt.

Trinn 9: Bygging og mulige forbedringer

Bygg og mulige forbedringer
Bygg og mulige forbedringer
Bygg og mulige forbedringer
Bygg og mulige forbedringer
Bygg og mulige forbedringer
Bygg og mulige forbedringer
Bygg og mulige forbedringer
Bygg og mulige forbedringer

Jeg er ganske glad for dette prosjektet. Det fungerer bra og gjør jobben, men det kan bli bedre.

Prosjektboksen er for liten til å passe alt komfortabelt inn. Dette resulterer i at du må sette komponenter under den blå pillen. For å gjøre det mulig kunne ikke den blå pillen loddes direkte til "hovedkortet". Og fordi dette gjorde alt for høyt måtte jeg fjerne mange deler fra den blå pillen, for eksempel hopperne for å velge BOOT0 og BOOT1 (ting jeg aldri bruker uansett), og jeg måtte til og med flytte krystallet fra toppen til bunnen av PCB.

Jeg gjorde livet vanskeligere ved å bruke banankontakter i stedet for BNC- eller SMA-kontakter, det betydde at en stor del av perfboardet var et "no-go-area", for å gjøre det klart for meg selv la jeg kapton tape over det for å hindre meg selv fra å legge deler på den.

Et annet problem med å legge alt i en så liten prosjektboks er at de analoge og digitale kretsene er veldig tett sammen. Du kan se at det er ganske mye støy synlig på begge sporene. Dette hadde jeg ikke engang på brødbrettet! Ved å flytte kraftledningene for analoge og digitale kretser så langt fra hverandre som mulig ble det gjort en liten forbedring, men ikke nok for min smak. Å redusere alle motstandsverdier i de analoge kretsene enda lenger enn jeg gjorde (inngangsmotstanden er 100kOhm i stedet for 1MOhm) hjalp ikke. Jeg mistenker at utløser på den raskeste tidsbaseinnstillingen (20us/div), som ikke er bra, også vil bli bedre med mindre støy på signalene.

Hvis du lager dette designet på en "ekte" kretskort, med alle smd -deler og separate lag for analogt, digitalt og strøm (det er 4 lag!) Vil det sannsynligvis fungere veldig bra. Det vil være mye mindre, det vil ikke bruke en komplett blå pille, men bare F103, og det vil gjøre det mulig å forsyne den med en separat (ren) analog Vdda for ADC -ene.

Som en siste berøring bestemte jeg meg for å spraye esken svart, den endrer seg fra alle beige esker den har.

Trinn 10: Koden og en kort video

Trinn 11: EKSTRA: Overklokking

EKSTRA: Overklokking
EKSTRA: Overklokking

Akkurat som jeg gjorde med F03, ønsket jeg å se hvor godt en F103 kan overklokkes. Spesifikasjonene for denne mikrokontrolleren hevder at maksimal klokkehastighet ikke bør overstige 72MHz (som selvfølgelig allerede er raskere enn F030), men jeg hadde lest i flere blogger at overklokking var enkelt, så hvorfor ikke?

Den blå pillen er utstyrt med en 8MHz krystall, PLL multipliserer den med en faktor 9 til 72MHz. PLL kan økes til 16 og gir en klokke på 128 MHz. Det var ikke noe problem for min blå pille, faktisk fungerer alle mine blå piller uten problemer på 128 MHz.

Men nå ville jeg finne ut hva den virkelige grensen er. Så jeg fjernet 8MHz krystallet og erstattet det med en på 12MHz. Igjen økte jeg PLL -multiplikatoren til mikrokontrolleren endelig ga opp. Det var på 168MHz! På 156MHz fungerte det fortsatt bra. Jeg lot den kjøre med den hastigheten i flere timer og så aldri at den krasjet. I dette oscilloskopet bestemte jeg meg for 120MHz, en hastighet som kan velges med en 12MHz krystall og PLL på 10, samt med en 8 MHz krystall og PLL på 15. (se SystemClock_Config i main.c)

ADC -ene fungerer nå også raskere, jeg har dem som kjører på 30MHz (i stedet for 14), de fungerte fortsatt godt på 60MHz, STMicroelectronics lager fin maskinvare!

STMicroelectronics setter disse grensene i databladet med god grunn, de garanterer at mikrokontrolleren fungerer ved den angitte 72MHz under alle forhold.

Men siden jeg ikke bruker mikrokontrolleren ved -40 Celsius, +85 Celsius, på bare 2,0 Volt eller 3,6 Volt, tror jeg det er trygt å overklokke den. Ikke gjør dette når du har tenkt å selge en enhet med mikrokontrollerne, du vet aldri hvor de skal brukes.

Anbefalt: