Indholdsfortegnelse:

Dual Trace Oscilloskop: 11 trin (med billeder)
Dual Trace Oscilloskop: 11 trin (med billeder)

Video: Dual Trace Oscilloskop: 11 trin (med billeder)

Video: Dual Trace Oscilloskop: 11 trin (med billeder)
Video: IQ TEST 2024, Juli
Anonim
Oscilloskop med dobbelt spor
Oscilloskop med dobbelt spor

Da jeg byggede mit tidligere mini -oscilloskop, ville jeg se, hvor godt jeg kunne få min mindste ARM -mikrokontroller til at udføre en STM32F030 (F030), og det gjorde et godt stykke arbejde.

I en af kommentarerne blev det foreslået, at en "blå pille" med en STM32F103 (F103) måske var bedre, mindre end udviklingsbrættet med F030 og muligvis endnu billigere. Men til mini-oscilloskopet brugte jeg ikke udviklingspladen, men F030 på et endnu mindre SMD-DIP-kort, så der ville en blå pille bestemt ikke være mindre, og jeg tvivler på, at den også ville være billigere.

Koden er nu tilgængelig på Gitlab:

gitlab.com/WilkoL/dual-trace-oscilloscope

Forbrugsvarer

Delliste: - plastikboks - perfboard (dobbeltsidet prototypekort 8x12cm) - Blå pille - ST7735s TFT -display - lithium -ion -batteri - HT7333 3,3V lavt frafaldsregulator - MCP6L92 dobbelt opamp - TSSOP8 til DIP8 -kort - 12 MHz krystal (ikke nødvendigt) - roterende encoder plus knap (2x) - powerwitch - bananterminaler (4x) - lithium -ion opladerplade - flere modstande og kondensatorer - nylonafstandsstykker, møtrikker og skruer

Værktøjer:

- loddemetal - lodning 0,7 mm - noget tråd - sideskærer - glas og lup - boremaskine - multimeter - oscilloskop - STLink -V2

Software:

- STM32IDE - STM32CubeMX - STLink Utility - LowLayer -bibliotek - tilpasset bibliotek til ST7735s - Notesblok ++ - Kicad

Trin 1: Interleave eller SImultaneous Mode

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

Blå pille

Men tanken var der, og jeg vidste, at F103 har to ADC'er! Hvad hvis jeg brugte disse to ADC'er sammen i "interleave" -tilstand, noget jeg tidligere har gjort med STM32F407 (F407). Prøveudtagningshastigheden ville fordobles. Det, kombiner det med en hurtigere mikrokontroller, og det ville være en stor efterfølger til mini -oscilloskopet.

Interleave -tilstand Mærkeligt nok er ADC'erne i F103 mindre avancerede end den i F030 (og F407), du kan ikke vælge opløsningen. Mere vigtigt er, at du heller ikke kan ændre timingen mellem de to ADC'er. Når du nu bruger interleave -tilstanden, vil du normalt have prøvetagningen så hurtig som muligt med den korteste tid mellem prøverne, men med et oscilloskop er det nødvendigt at ændre timingen. Måske kan det stadig gøres, jeg er ikke en professionel oscilloskopdesigner, men jeg droppede planen om at bruge interleave-mode.

Simultan tilstand

Men at have to ADC'er giver mange flere muligheder, de to ADC'er kan også indstilles til "regelmæssig-samtidig" -tilstand. Hvad med et dobbelt spor-oscilloskop?

Efter at have besluttet at prøve at lave et oscilloskop med to spor, ville jeg også have variabel inputfølsomhed, en mulighed, som jeg ikke havde på mini -oscilloskopet. Det betyder en dæmper (og forstærker) på indgangene. Og måske ville jeg have endnu mere? Så jeg lavede en lille liste over "nice-to-haves".

ØNSKELISTE

to kanaler

variabel følsomhed på begge kanaler

udløses på begge kanaler

variabelt triggerniveau på begge kanaler

variabel forskydning

enkelt batteristrøm

passer i samme kasse som mini-oscilloskopet

Trin 2: Prototyping

Prototyper
Prototyper
Prototyper
Prototyper

Som sædvanlig startede jeg disse projekter på et brødbræt. (Se billede) Og inden jeg lodder alt på perfboardet, forsøger jeg at finde ud af, om og hvordan det vil passe i den valgte projektboks. Det passer, men kun lige. Nogle dele er skjult under skærmen, andre under den blå pille. Og igen, ligesom for de fleste af mine projekter, er dette et engangsprojekt, og jeg vil ikke designe et printkort til det.

Trin 3: Dæmpere

Dæmpere
Dæmpere

I almindelige oscilloskoper er inputdæmpere kredsløb, der ændrer dæmpning og forstærkning ved at skifte ind- og ud -modstande med små signalrelæer. Selvom jeg har nogle af disse relæer, ved jeg, at de ikke skifter med mindre end 4 Volt, det betyder, at de kun fungerer med et fuldt ladet litiumionbatteri (4,2V). Så jeg havde brug for en anden måde at skifte disse modstande på. Selvfølgelig kunne jeg bare installere mekaniske kontakter, men det ville bestemt ikke længere passe i projektboksen, hvis jeg havde tænkt på det, måske kunne jeg prøve et bedre digitalt potentiometer igen (det jeg har er alt for støjende).

Så tænkte jeg på "analoge switches", med dem kan jeg selv lave et digitalt potentiometer. I min reservedelssamling fandt jeg CD4066 med fire analoge kontakter. Ideen er at lave feedback -modstanden for en opamp -variabel ved at skifte modstandene ind og ud parallelt med feedback -modstanden.

Det fungerer meget godt, men med kun 4 switches i 4066 og med 2 kanaler var det ikke muligt at lave mere end tre følsomhedsniveauer. Jeg valgte 500mV, 1V og 2V pr. Division, da det er de spændingsniveauer, jeg bruger mest. Skærmen er opdelt i 6 divisioner, så det giver intervallerne -1,5V til +1,5V, -3V til +3V og -6V til 6V.

Med "virtual-ground" kan du flytte disse områder op og ned, så selv 0v til +12V er mulig.

Trin 4: Virtuel grund

Virtuel grund
Virtuel grund
Virtuel grund
Virtuel grund

Fordi oscilloskopet bruger en enkelt strømskinne (3,3V) har opamps brug for et virtuelt jordoverflade, ellers fungerer de ikke. Dette virtuelle jordniveau er lavet med PWM på en udgangskanal på TIM4, dets driftscyklus ændres fra kun få procent til næsten hundrede procent. Et lavpasfilter med en 1k modstand og en 10uF kondensator omdanner det til en spænding på (næsten) 0V til (næsten) 3,3V. Frekvensen af firkantbølgen er lige under 100 kHz, så det enkle lavpasfilter er godt nok.

Ret sent i opbygningen af dette oscilloskop indså jeg, at du ikke kan have to separate forskydninger til kanalerne. Dette skyldes det faktum, at input-jordniveauet med en enkelt strømforsyning skal være adskilt fra opampernes reelle jordniveau. Så begge kanaler bevæger sig på samme måde som du ændrer GND-indstillingen.

Trin 5: Rotary Encoders og Debugging

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

På mini -oscilloskopet brugte jeg kun en roterende encoder til alle funktioner. Det ville gøre et dobbelt oscilloskop meget svært at bruge, så her har jeg brug for to. En encoder til dæmpere og virtuelt jordoverflade og den anden encoder til tidsbase og udløsning. Desværre, ligesom i mit andet projekt, er disse roterende encodere meget "støjende". De er så dårlige, at de simpelthen ikke ville arbejde med timere i "encoder-mode", som standard måde at læse dem på. Jeg var nødt til at lave en debouncing -mekanisme med timer TIM2, der kontrollerede koderne hver 100us. Denne timer startes igen (kun), når der er aktivitet på koderne, kontrolleres dette med EXTI -funktionaliteten på inputporte. Nu fungerer koderne godt.

Og som du kan se, kan det også være meget praktisk at have en skærm til at få vist fejlfindingsinformation.

Trin 6: Display og tidsbase

Display og tidsbase
Display og tidsbase

Skærmen har en opløsning på 160 x 128 pixels, så der er brug for 160 prøver til en skærmfuld, det lykkedes mig at fremskynde ADC'erne til at lave 1,6 millioner prøver pr. Sekund, og det med den meget overklokede mikrokontroller (mere om det senere) giver en minimumsbase på 20us pr. division (100us pr. skærm). Således vil en bølgeform på 10 kHz fylde hele skærmen.

Det er kun dobbelt så hurtigt et mini -oscilloskop, jeg lavede før. Nå ja, nu er det med to kanaler:-).

Som sagt er skærmen 160 pixels bred, så der er kun brug for 160 værdier pr. Skærm. Men alle buffere indeholder faktisk 320 prøver. Så DMA gemmer 320 værdier, før det udløser en transmission fuldstændig afbrydelse (TC). Dette skyldes, at udløsningen sker i software. Samplingen starter på et tilfældigt tidspunkt, så det er meget usandsynligt, at den første værdi i bufferen er det sted, hvor triggerpunktet skal være.

Derfor findes triggerpunktet ved at læse igennem trace_x_buffer, hvis værdien er ved den ønskede triggerværdi, og hvis den tidligere værdi er lige under den, findes trigger_pointet. Dette fungerer ganske godt, men du har brug for en større buffer end den faktiske skærmstørrelse er.

Dette er også grunden til, at opdateringshastigheden på de lavere tidsbaseindstillinger er langsommere, end du måske forventer. Når du bruger indstillingen 200 ms/div, er en skærm fuld af data 1 sekund, men fordi dobbelt mængde konverteringer er udført, tager det 2 sekunder. På de hurtigere tidsbaseindstillinger vil du ikke mærke det så meget.

TIM3 bruges til at generere tidsbasen. Det udløser ADC'erne med den hastighed, der kræves af den valgte tidsbaseindstilling. Dets ur på TIM3 er 120MHz (se OVERCLOCKING), det maksimale antal, det tæller (ARR), bestemmer, hvordan andet det flyder over, eller i ST -sprog opdateres det. Via TRGO udløser disse opdateringsimpulser ADC'erne. Den laveste frekvens, den genererer, er 160 Hz, den højeste er 1,6 MHz.

Trin 7: ADC'er og DMA

ADC'er og DMA
ADC'er og DMA

De to ADC'er konverterer spændingen på deres input samtidigt, de gemmer de to 12 bit værdier i en enkelt 32bit variabel. Så DMA har kun en variabel pr. (Dobbelt) konvertering til overførsel.

For at bruge disse værdier er det derfor nødvendigt at opdele dem i de to værdier, så de kan bruges til at vise de to spor. Som sagt kan ADC'er i F103 ikke indstilles til andre opløsninger end 12 bit. De er altid i 12 bit -tilstand, og derfor tager konverteringer altid det samme antal urimpulser. Stadig, med overclocking af ADC'erne kan der udføres 1,6 MSamples pr. Sekund (se Ekstra: Overclocking).

ADC'ernes reference er Vdd, 3.3V -skinnen. For at konvertere det til mere bekvemme værdier (pr. Division) har jeg beregnet værdierne til dæmpere, fordi jeg ikke har de nøjagtige modstandsværdier, der kommer ud af disse beregninger, foretages nogle korrektioner i software.

I dette projekt bruger jeg DMA i "normal-mode". I denne tilstand stopper DMA overførsel af data (fra de ADC'er til hukommelse), når antallet af ord (eller halve ord eller bytes) alle overføres. I den anden mulige tilstand, "cirkulær tilstand" nulstiller DMA'en sig selv og fortsætter med at overføre data uafbrudt. Det virkede ikke med F103, det er så hurtigt, at det overskriver dataene i adc_buffer , før resten af programmet kunne læse det. Så nu er processen som følger:

- opsæt DMA til det antal data, der skal overføres, og aktiver DMA

- start udløsningen af ADC'erne, disse vil anmode om DMA -overførsler efter hver (dobbelt) konvertering

- efter at det indstillede antal konverteringer er overført, stopper DMA

- stop også straks udløsningen af ADC'erne

- udfør al den manipulation, der er nødvendig med dataene i hukommelsen

- vis spor på skærmen

- start processen igen

Trin 8: Brugergrænseflade

Brugergrænseflade
Brugergrænseflade

En 160 x 128 pixel skærm er ikke særlig stor, og jeg vil bruge så meget af det som muligt. Så der er ingen del af det forbeholdt strømindstillingerne. I de sidste par rækker vises den lodrette følsomhed, tidsbase, triggerniveau og triggerkanal, men når signalerne er store nok, vises de i det samme område. Den indstilling, der er aktiv, vises med gult, resten vises med hvidt.

Trin 9: Bygning og mulige forbedringer

Bygning og mulige forbedringer
Bygning og mulige forbedringer
Bygning og mulige forbedringer
Bygning og mulige forbedringer
Bygning og mulige forbedringer
Bygning og mulige forbedringer
Bygning og mulige forbedringer
Bygning og mulige forbedringer

Jeg er ret glad for dette projekt. Det fungerer fint og gør jobbet, men det kunne være bedre.

Projektboksen er for lille til at passe alt komfortabelt ind, hvilket resulterer i at skulle lægge komponenter under den blå pille. For at gøre det muligt kunne den blå pille ikke loddes direkte til "hovedkortet". Og fordi dette gjorde det alt for højt, var jeg nødt til at fjerne mange dele fra den blå pille, f.eks. Springerne til at vælge BOOT0 og BOOT1 (ting, jeg alligevel aldrig bruger), og jeg måtte endda flytte krystallen fra toppen til bunden af pcb.

Jeg gjorde livet vanskeligere ved at bruge bananstik i stedet for BNC- eller SMA-stik, det betød, at en stor del af perfboardet var et "no-go-area", for at gøre det klart for mig selv lagde jeg kaptonbånd over det for at forhindre mig selv fra at lægge dele på den.

Et andet problem med at lægge det hele i sådan en lille projektboks er, at de analoge og digitale kredsløb er meget tæt på hinanden. Du kan se, at der er ganske meget støj synlig på begge spor. Dette havde jeg ikke engang på brødbrættet! Ved at flytte strømledningerne til analoge og digitale kredsløb så langt fra hinanden som muligt blev der foretaget en lille forbedring, men ikke nok efter min smag. Reduktion af alle modstandsværdier i de analoge kredsløb endnu længere end jeg gjorde (inputmodstanden er 100kOhm i stedet for 1MOhm) hjalp ikke. Jeg formoder, at udløsning ved den hurtigste tidsbaseindstilling (20us/div), hvilket ikke er godt, også vil forbedre med mindre støj på signalerne.

Hvis du laver dette design på en "rigtig" pcb, med alle smd -dele og separate lag til analog, digital og power (det er 4 lag!) Vil det sandsynligvis fungere meget godt. Det vil være meget mindre, det vil ikke bruge en komplet Blue Pill, men kun F103, og det vil gøre det muligt at levere en separat (ren) analog Vdda til ADC'erne.

Som en sidste berøring besluttede jeg at sprøjte æsken sort, den ændrer sig fra alle de beige æsker den har.

Trin 10: Koden og en kort video

Trin 11: EKSTRA: Overclocking

EKSTRA: Overclocking
EKSTRA: Overclocking

Ligesom jeg gjorde med F03, ville jeg se, hvor godt en F103 kan overklokkes. Specifikationerne for denne mikrokontroller hævder, at den maksimale clockhastighed ikke må overstige 72MHz (hvilket naturligvis allerede er hurtigere end F030), men jeg havde læst i flere blogs, at overklokning var let, så hvorfor ikke?

Den blå pille er forsynet med en 8MHz krystal, PLL multiplicerer den med en faktor 9 til 72MHz. PLL kan øges op til 16, hvilket giver et ur på 128MHz. Det var slet ikke noget problem for min blå pille, faktisk fungerer alle mine blå piller uden problemer på 128MHz.

Men nu ville jeg finde ud af, hvad den egentlige grænse er. Så jeg fjernede 8MHz krystallen og erstattede den med en på 12MHz. Igen forøgede jeg PLL -multiplikatoren, indtil mikrokontrolleren endelig gav op. Det var på 168MHz! På 156MHz fungerede det stadig godt. Jeg lod den køre med den hastighed i timevis og så aldrig den gå ned. I dette oscilloskop nøjedes jeg med 120MHz, en hastighed, der kan vælges med en 12MHz krystal og PLL på 10, samt med en 8 MHz krystal og PLL på 15. (se SystemClock_Config i main.c)

ADC'erne fungerer nu også hurtigere, jeg har dem kørende ved 30MHz (i stedet for 14), de fungerede stadig godt på 60MHz, STMicroelectronics laver noget flot hardware!

STMicroelectronics sætter disse grænser i databladet med god grund, de garanterer, at mikrokontrolleren fungerer ved den angivne 72MHz under alle forhold.

Men da jeg ikke bruger mikrokontrolleren ved -40 Celsius, +85 Celsius, på kun 2,0 Volt eller 3,6 Volt, synes jeg, det er sikkert at overklokke det. Gør IKKE dette, når du har til hensigt at sælge en enhed med deres mikrokontroller, du ved aldrig, hvor de vil blive brugt.

Anbefalede: