Innehållsförteckning:

Oscilloskop med två spår: 11 steg (med bilder)
Oscilloskop med två spår: 11 steg (med bilder)

Video: Oscilloskop med två spår: 11 steg (med bilder)

Video: Oscilloskop med två spår: 11 steg (med bilder)
Video: ЛЮБОВЬ С ДОСТАВКОЙ НА ДОМ (2020). Романтическая комедия. Хит 2024, Juli
Anonim
Oscilloskop med två spår
Oscilloskop med två spår

När jag byggde mitt tidigare mini -oscilloskop ville jag se hur bra jag kunde få min minsta ARM -mikrokontroller till en STM32F030 (F030) att fungera, och det gjorde ett bra jobb.

I en av kommentarerna föreslogs att en "Blue Pill" med en STM32F103 (F103) kan vara bättre, mindre än utvecklingsbrädan med F030 och möjligen ännu billigare. Men för mini-oscilloskopet använde jag inte utvecklingskortet utan F030 på ett ännu mindre SMD-DIP-kort, så där skulle en Blue Pill verkligen inte vara mindre och jag tvivlar på att det också skulle bli billigare.

Koden är nu tillgänglig på Gitlab:

gitlab.com/WilkoL/dual-trace-oscilloscope

Tillbehör

Deltagarlista: - plastlåda - perfboard (dubbelsidig prototypkort 8x12cm) - Blue Pill - ST7735s TFT -skärm - litiumjonbatteri - HT7333 3,3V lågt frånfallsregulator - MCP6L92 dubbel opamp - TSSOP8 till DIP8 -kort - 12 MHz kristall (behövs inte) - roterande givare plus vred (2x) - powerwitch - banankontakter (4x) - litiumjonladdarkort - flera motstånd och kondensatorer - nylon distanser, muttrar och skruvar

Verktyg:

- lödstation - löd 0,7 mm - lite tråd - sidoskär - glasögon och lupp - borr - multimeter - oscilloskop - STLink -V2

Programvara:

- STM32IDE - STM32CubeMX - STLink Utility - LowLayer -bibliotek - anpassat bibliotek för ST7735s - Anteckningar ++ - Kicad

Steg 1: Interleave eller SImultaneous Mode

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

Blå piller

Men tanken var där, och jag visste att F103 har två ADC: er! Vad händer om jag använde dessa två ADC tillsammans i "interleave" -läge, något jag har gjort tidigare med STM32F407 (F407). Provtagningshastigheten skulle fördubblas. Det, kombinera det med en snabbare mikrokontroller och det skulle göra en stor efterträdare till minioscilloskopet.

Interleave -läge Det är märkligt att ADC: erna i F103 är mindre avancerade än de i F030 (och F407), du kan inte välja upplösning. Viktigare är att du inte heller kan ändra tidpunkten mellan de två ADC: erna. Nu, när du använder interleave -läget vanligtvis vill du ha samplingen så snabbt som möjligt med den kortaste tiden mellan alla prover, men med ett oscilloskop är det nödvändigt att ändra tidpunkten. Kanske kan det fortfarande göras, jag är ingen professionell oscilloskopdesigner, men jag släppte planen att använda interleave-mode.

Samtidigt läge

Men att ha två ADC ger många fler alternativ, de två ADC: erna kan också ställas in på "vanligt-samtidigt" -läge. Vad sägs om ett dubbelt spåroscilloskop?

Efter att ha bestämt mig för att försöka göra ett oscilloskop med två spår ville jag också ha variabel ingångskänslighet, ett alternativ som jag inte hade på mini -oscilloskopet. Det betyder en dämpare (och förstärkare) på ingångarna. Och jag ville kanske ha ännu mer? Så jag gjorde en liten lista över "trevliga att ha".

ÖNSKELISTA

två kanaler

variabel känslighet på båda kanalerna

utlöses på båda kanalerna

variabel utlösningsnivå på båda kanalerna

variabel förskjutning

enda batteriström

passar i samma låda som mini-oscilloskopet

Steg 2: Prototypning

Prototyper
Prototyper
Prototyper
Prototyper

Som vanligt startade jag dessa projekt på en brödbräda. (Se bild) Och innan jag lödde allt på perfektbrädan försöker jag ta reda på om och hur det kommer att passa i den valda projektlådan. Det passar, men bara. Vissa delar är gömda under skärmen, andra under Blue Pill. Och återigen, precis som för de flesta av mina projekt, är detta ett enda projekt och jag kommer inte att utforma ett kretskort för det.

Steg 3: Dämpare

Dämpare
Dämpare

I vanliga oscilloskop är ingångsdämparna kretsar som ändrar dämpning och förstärkning genom att koppla in och ut motstånd med små signalreläer. Medan jag har några av dessa reläer, vet jag att de inte kommer att växla med mindre än 4 Volt, det betyder att de bara kommer att fungera med ett fulladdat litiumjonbatteri (4,2V). Så jag behövde ett annat sätt att byta motstånd. Självklart kunde jag bara installera mekaniska omkopplare, men det skulle verkligen inte längre passa i projektboxen med tanke på, kanske jag skulle kunna prova en bättre digital potentiometer igen (den jag har är alldeles för bullrig).

Sedan tänkte jag på "analoga switchar", med dem kan jag själv göra en digital potentiometer. I min reservkollektion hittade jag CD4066 med fyra analoga switchar. Tanken är att göra återkopplingsmotståndet för en opamp -variabel genom att koppla in och ut motstånd parallellt med återkopplingsmotståndet.

Det fungerar mycket bra, men med bara 4 switchar i 4066 och med 2 kanaler var det inte möjligt att göra mer än tre känslighetsnivåer. Jag valde 500mV, 1V och 2V per division eftersom det är de spänningsnivåer som jag använder mest. Skärmen är uppdelad i 6 divisioner, så det ger intervallerna -1,5V till +1,5V, -3V till +3V och -6V till 6V.

Med "virtual-ground" kan du flytta dessa intervall upp och ner så att även 0v till +12V är möjligt.

Steg 4: Virtuell mark

Virtuell mark
Virtuell mark
Virtuell mark
Virtuell mark

Eftersom oscilloskopet använder en enda kraftskena (3,3V) behöver opamparna en virtuell marknivå, annars fungerar de inte. Denna virtuella marknivå är gjord med PWM på en utgångskanal för TIM4, arbetscykeln för den ändras från bara några procent till nästan hundra procent. Ett lågpassfilter med ett 1k -motstånd och en 10uF kondensator omvandlar det till en spänning på (nästan) 0V till (nästan) 3,3V. Kvadratvågens frekvens är strax under 100 kHz, så det enkla lågpassfiltret är tillräckligt bra.

Ganska sent i byggandet av detta oscilloskop insåg jag att du inte kan ha två separata förskjutningar för kanalerna. Detta beror på det faktum att med en enda strömförsörjning måste ingången på marknivå vara separat från opamparnas verkliga marknivå. Så båda kanalerna rör sig på samma sätt som du ändrar GND-inställningen.

Steg 5: Rotary Encoders och Debugging

Rotary Encoders och Debugging
Rotary Encoders och Debugging
Rotary Encoders och Debugging
Rotary Encoders och Debugging

På minioscilloskopet använde jag bara en roterande kodare för alla funktioner. Det skulle göra ett dubbeloscilloskop väldigt svårt att använda, så här behöver jag två. En kodare för dämpare och virtuell marknivå och den andra kodaren för tidsbasen och utlösningen. Tyvärr, precis som i mitt andra projekt, är dessa roterande kodare väldigt "bullriga". De är så dåliga att de helt enkelt inte skulle arbeta med timers i "encoder-mode", det vanliga sättet att läsa dem. Jag var tvungen att göra en avstängningsmekanism med timer TIM2, kontrollera kodarna var 100: eUS. Denna timer startas i sin tur (endast) när det finns viss aktivitet på kodarna, detta kontrolleras med EXTI -funktionen på ingångsportarna. Nu fungerar kodarna bra.

Och som du kan se kan det vara mycket praktiskt att visa en felsökningsinformation med en bildskärm.

Steg 6: Display och tidsbas

Display och tidsbas
Display och tidsbas

Displayen har en upplösning på 160 x 128 pixlar så det behövs 160 prover för en skärm, jag lyckades påskynda ADC: erna för att göra 1,6 miljoner prover per sekund och det, med den mycket överklockade mikrokontrollern (mer om det senare), ger en minsta tidsbas på 20us per division (100us per skärm). Således kommer en vågform på 10 kHz att fylla hela skärmen.

Det är bara dubbelt så snabbt som minioscilloskopet jag gjorde tidigare. Nåväl, nu är det med två kanaler:-).

Som sagt är skärmen 160 pixlar bred så det behövs bara 160 värden per skärm. Men alla buffertar innehåller faktiskt 320 prover. Så DMA lagrar 320 värden innan det utlöser ett överföringsavbrott (TC). Detta beror på att utlösningen sker i programvara. Samplingen börjar vid ett slumpmässigt ögonblick, så det är mycket osannolikt att det första värdet i bufferten är platsen där triggerpunkten ska vara.

Därför hittas triggerpunkten genom att läsa igenom trace_x_buffer, om värdet är på det önskade triggervärdet och om det tidigare värdet ligger strax under det, hittar trigger_pointen. Detta fungerar ganska bra, men du behöver en större buffert än den faktiska skärmstorleken är.

Även detta är anledningen till att uppdateringsfrekvensen på de lägre tidsbasinställningarna är långsammare än du kan förvänta dig. När du använder inställningen 200 ms/div är en skärm full med data 1 sekund, men eftersom dubbelt så många konverteringar görs tar det 2 sekunder. På de snabbare tidsbasinställningarna kommer du inte att märka det så mycket.

TIM3 används för att generera tidsbasen. Det utlöser ADC: erna med den hastighet som krävs av den valda tidsbasinställningen. Dess klocka på TIM3 är 120 MHz (se OVERCLOCKING), det maximala antalet som den räknar (ARR) avgör hur andra den flödar över eller i ST -språk uppdateras den. Via TRGO utlöser dessa uppdateringspulser ADC: erna. Den lägsta frekvensen den genererar är 160 Hz, den högsta är 1,6 MHz.

Steg 7: ADC och DMA

ADC och DMA
ADC och DMA

De två ADC: erna konverterar spänningen på sina ingångar samtidigt, de lagrar de två 12 bitars värdena i en enda 32bit variabel. Så DMA har bara en variabel per (dubbel) konvertering för överföring.

För att använda dessa värden är det därför nödvändigt att dela upp dem i de två värdena så att de kan användas för att visa de två spåren. Som sagt kan ADC: er i F103 inte ställas in på andra upplösningar än 12 bitar. De är alltid i 12 bitars läge och så tar omvandlingar alltid samma antal klockpulser. Med överklockning av ADC: erna kan dock 1,6 MSamples per sekund göras (se Extra: Överklockning).

ADC: s referens är Vdd, 3.3V -skenan. För att konvertera det till mer praktiska värden (per division) har jag beräknat värdena på dämparna, eftersom jag inte har de exakta motståndsvärdena som kommer ut från dessa beräkningar, vissa korrigeringar görs i programvara.

I detta projekt använder jag DMA i "normal-mode". I detta läge slutar DMA överföra data (från de ADC: erna till minnet) när alla ord (eller halvord eller byte) överförs. I det andra möjliga läget "cirkulärt läge" återställer DMA sig själv och fortsätter att överföra data utan avbrott. Det fungerade inte med F103, det är så snabbt att det skriver över data i adc_buffer innan resten av programmet kunde läsa det. Så nu är processen följande:

- konfigurera DMA till antalet data som ska överföras och aktivera DMA

- starta utlösningen av ADC: erna, dessa kommer att begära DMA -överföringar efter varje (dubbel) konvertering

- efter att det inställda antalet konverteringar har överförts stannar DMA

- omedelbart också sluta utlösa ADC: erna

- utföra all manipulation som behövs på data i minnet

- visa spår på skärmen

- starta processen igen

Steg 8: Användargränssnitt

Användargränssnitt
Användargränssnitt

En skärm på 160 x 128 pixlar är inte särskilt stor och jag vill använda så mycket som möjligt. Så det finns ingen del av det reserverat för ströminställningarna. På de sista raderna visas den vertikala känsligheten, tidsbasen, utlösningsnivån och utlösningskanalen, men när signalerna är tillräckligt stora kommer de att visas i samma område. Alternativet som är aktivt visas med gult, resten visas i vitt.

Steg 9: Bygga och möjliga förbättringar

Byggnad och möjliga förbättringar
Byggnad och möjliga förbättringar
Byggnad och möjliga förbättringar
Byggnad och möjliga förbättringar
Byggnad och möjliga förbättringar
Byggnad och möjliga förbättringar
Byggnad och möjliga förbättringar
Byggnad och möjliga förbättringar

Jag är ganska glad över det här projektet. Det fungerar bra och gör jobbet, men det kan vara bättre.

Projektlådan är för liten för att rymma allt bekvämt, vilket resulterar i att man måste lägga komponenter under den blå pillren. För att göra det möjligt kunde den blå pillren inte lödas direkt till "huvudkortet". Och eftersom detta gjorde det för högt var jag tvungen att ta bort många delar från Blue Pill, till exempel hopparna för att välja BOOT0 och BOOT1 (saker jag aldrig använder ändå) och jag var tvungen att flytta kristallen från toppen till botten av kretskortet.

Jag gjorde livet svårare genom att använda banankontakter istället för BNC- eller SMA-kontakter, det innebar att en stor del av perfboard var ett "no-go-area", för att göra det klart för mig själv lade jag kaptontejp över det för att förhindra mig själv från att lägga delar på den.

Ett annat problem med att lägga allt i en så liten projektlåda är att de analoga och digitala kretsarna ligger väldigt nära varandra. Du kan se att det är ganska mycket ljud på båda spåren. Detta hade jag inte ens på brödbrädan! Genom att flytta kraftledningarna för analoga och digitala kretsar så långt ifrån varandra som möjligt gjordes en liten förbättring, men inte tillräckligt för min smak. Att minska alla motståndsvärden i de analoga kretsarna ännu mer än jag gjorde (ingångsmotståndet är 100kOhm istället för 1MOhm) hjälpte inte. Jag misstänker att triggning på den snabbaste tidsbasinställningen (20us/div), vilket inte är bra, också kommer att förbättras med mindre brus på signalerna.

Om du gör denna design på en "riktig" kretskort, med alla smd -delar och separata lager för analog, digital och power (det är 4 lager!) Kommer det förmodligen att fungera mycket bra. Det blir mycket mindre, det kommer inte att använda en komplett blå piller utan bara F103 och det kommer att göra det möjligt att förse den med en separat (ren) analog Vdda för ADC: erna.

Som en sista touch bestämde jag mig för att spruta lådan svart, den gör en förändring från alla beige lådor den har.

Steg 10: Koden och en kort video

Steg 11: EXTRA: Överklockning

EXTRA: Överklockning
EXTRA: Överklockning

Precis som jag gjorde med F03 ville jag se hur bra en F103 kan överklockas. Specifikationerna för denna mikrokontroller hävdar att den maximala klockhastigheten inte ska överstiga 72MHz (vilket naturligtvis redan är snabbare än F030) men jag hade läst i flera bloggar att överklockning var enkelt, så varför inte?

Blue Pill har en 8 MHz kristall, PLL multiplicerar den med en faktor 9 till 72 MHz. PLL kan ökas upp till 16 vilket ger en klocka på 128 MHz. Det var inga problem alls för min Blue Pill, faktiskt fungerar alla mina Blue Pills utan problem på 128MHz.

Men nu ville jag ta reda på vad den verkliga gränsen är. Så jag tog bort 8MHz -kristallen och ersatte den med en på 12MHz. Återigen ökade jag PLL -multiplikatorn tills mikrokontrollern äntligen gav upp. Det var vid 168MHz! På 156MHz fungerade det fortfarande bra. Jag lät den gå i den hastigheten i timmar och såg aldrig att den kraschade. I detta oscilloskop nådde jag 120 MHz, en hastighet som kan väljas med en 12 MHz kristall och PLL på 10, samt med en 8 MHz kristall och PLL på 15. (se SystemClock_Config i main.c)

ADC: erna fungerar nu också snabbare, jag har dem som körs på 30MHz (istället för 14), de fungerade fortfarande bra på 60MHz, STMicroelectronics gör en bra maskinvara!

STMicroelectronics sätter dessa gränser i databladet av goda skäl, de garanterar att mikrokontrollern fungerar vid den angivna 72MHz under alla förhållanden.

Men eftersom jag inte använder mikrokontrollern vid -40 Celsius, +85 Celsius, på bara 2,0 Volt eller 3,6 Volt tror jag att det är säkert att överklocka det. Gör INTE detta när du tänker sälja en enhet med sina mikrokontroller, du vet aldrig var de kommer att användas.

Rekommenderad: