Sommario:
- Forniture
- Passaggio 1: modalità interlacciata o simultanea
- Passaggio 2: prototipazione
- Passaggio 3: attenuatori
- Passaggio 4: terreno virtuale
- Passaggio 5: encoder rotativi e debug
- Passaggio 6: visualizzazione e base dei tempi
- Passaggio 7: ADC e DMA
- Passaggio 8: interfaccia utente
- Passaggio 9: costruzione e possibili miglioramenti
- Passaggio 10: il codice e un breve video
- Passaggio 11: EXTRA: Overclocking
Video: Oscilloscopio a doppia traccia: 11 passaggi (con immagini)
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 09:59
Quando ho costruito il mio precedente mini oscilloscopio volevo vedere come potevo far funzionare il mio microcontrollore ARM più piccolo, un STM32F030 (F030), e ha fatto un buon lavoro.
In uno dei commenti è stato suggerito che una "Pillola blu" con un STM32F103 (F103) potrebbe essere migliore, più piccola della scheda di sviluppo con l'F030 e forse anche più economica. Ma per il mini oscilloscopio non ho usato la scheda di sviluppo ma la F030 su una scheda SMD-DIP ancora più piccola, quindi una Blue Pill non sarebbe certamente più piccola e dubito che sarebbe anche più economica.
Il codice è ora disponibile su Gitlab:
gitlab.com/WilkoL/dual-trace-oscilloscope
Forniture
Elenco delle parti: - scatola di plastica - perfboard (scheda prototipo a doppia faccia 8x12cm) - Blue Pill - display TFT ST7735s - batteria agli ioni di litio - regolatore a bassa caduta di tensione HT7333 3,3 V - doppio operazionale MCP6L92 - scheda da TSSOP8 a DIP8 - cristallo 12 MHz (non necessario) - encoder rotativo più manopola (2x) - interruttore di alimentazione - terminali a banana (4x) - scheda caricabatterie agli ioni di litio - diverse resistenze e condensatori - distanziali, dadi e viti in nylon
Utensili:
- stazione di saldatura - saldatura 0,7 mm - alcuni fili - taglierina laterale - occhiali e lente - trapano - multimetro - oscilloscopio - STLink-V2
Software:
- STM32IDE - STM32CubeMX - Utility STLink - Libreria LowLayer - Libreria adattata per ST7735s - Notepad++ - Kicad
Passaggio 1: modalità interlacciata o simultanea
Pillola Blu
Ma l'idea c'era, e sapevo che l'F103 ha due ADC! Cosa succede se ho usato quei due ADC insieme in modalità "interleave", qualcosa che ho fatto prima con l'STM32F407 (F407). La velocità di campionamento raddoppierebbe. Questo, combinato con un microcontrollore più veloce e sarebbe un ottimo successore del mini oscilloscopio.
Modalità Interleave Stranamente gli ADC dell'F103 sono meno avanzati di quelli dell'F030 (e dell'F407), non è possibile scegliere la risoluzione. Ancora più importante è che non è possibile modificare i tempi tra i due ADC. Ora, quando si utilizza la modalità interleave di solito si desidera che il campionamento sia il più veloce possibile con il tempo più breve tra i campioni, ma con un oscilloscopio è necessario modificare il tempo. Forse è ancora possibile farlo, non sono un progettista professionista di oscilloscopi, ma ho abbandonato il piano per utilizzare la modalità interleave.
Modalità simultanea
Ma, avendo due ADC offre molte più opzioni, anche i due ADC possono essere impostati sulla modalità "normale-simultanea". Che ne dici di un doppio oscilloscopio a traccia?
Avendo deciso di provare a realizzare un oscilloscopio a doppia traccia volevo anche avere una sensibilità di ingresso variabile, opzione che non avevo sul mini oscilloscopio. Ciò significa un attenuatore (e amplificatore) sugli ingressi. E forse volevo ancora di più? Così ho fatto una piccola lista di "belle da avere".
LISTA DEI DESIDERI
due canali
sensibilità variabile su entrambi i canali
attivazione su entrambi i canali
livello di trigger variabile su entrambi i canali
offset variabile
alimentazione a batteria singola
si inserisce nella stessa scatola del mini-oscilloscopio
Passaggio 2: prototipazione
Come al solito ho iniziato questo progetto su una breadboard. (Vedi foto) E prima di saldare tutto sulla perfboard cerco di scoprire se e come si adatterà alla scatola del progetto scelta. Si adatta, ma solo. Alcune parti sono nascoste sotto lo schermo, altre sotto la Pillola Blu. E ancora, proprio come per la maggior parte dei miei progetti, questo è un progetto unico e non progetterò un PCB per questo.
Passaggio 3: attenuatori
Negli oscilloscopi normali, gli attenuatori di ingresso sono circuiti che modificano l'attenuazione e l'amplificazione attivando e disattivando resistori con piccoli relè di segnale. Anche se ho alcuni di quei relè, so che non passeranno a meno di 4 Volt, il che significa che funzioneranno solo con una batteria agli ioni di litio completamente carica (4,2 V). Quindi avevo bisogno di un altro modo per cambiare quei resistori. Ovviamente potrei semplicemente installare interruttori meccanici, ma sicuramente non si adatterebbero più alla scatola del progetto che avevo in mente, forse potrei provare di nuovo un potenziometro digitale migliore (quello che ho è troppo rumoroso).
Poi ho pensato agli "interruttori analogici", con quelli posso realizzare da solo un potenziometro digitale. Nella mia collezione di parti ho trovato il CD4066 con quattro interruttori analogici. L'idea è di rendere variabile il resistore di feedback di un opamp inserendo e disattivando i resistori paralleli al resistore di feedback.
Funziona molto bene, ma avendo solo 4 interruttori nel 4066 e avendo 2 canali non è stato possibile fare più di tre livelli di sensibilità. Ho scelto 500 mV, 1 V e 2 V per divisione poiché questi sono i livelli di tensione che utilizzo di più. Lo schermo è diviso in 6 divisioni, in modo da avere le gamme da -1.5V a +1.5V, da -3V a +3V e da -6V a 6V.
Con la "terra virtuale" puoi spostare questi intervalli su e giù in modo che sia possibile anche da 0 V a +12 V.
Passaggio 4: terreno virtuale
Poiché l'oscilloscopio utilizza una singola linea di alimentazione (3,3 V), gli operazionali necessitano di un livello di terra virtuale o non funzioneranno. Questo livello di terra virtuale è realizzato con PWM su un canale di uscita di TIM4, il suo ciclo di lavoro cambia da poche percento a quasi il cento percento. Un filtro passa basso con un resistore da 1k e un condensatore da 10uF lo trasforma in una tensione da (quasi) 0V a (quasi) 3,3V. La frequenza dell'onda quadra è appena sotto i 100kHz, quindi il semplice filtro passa basso è abbastanza buono.
Piuttosto tardi nella costruzione di questo oscilloscopio mi sono reso conto che non è possibile avere due offset separati per i canali. Ciò è dovuto al fatto che con un singolo alimentatore il livello di massa in ingresso deve essere separato dal livello di massa reale degli operazionali. Quindi entrambi i canali si muovono nello stesso modo in cui si modifica l'impostazione GND.
Passaggio 5: encoder rotativi e debug
Sul mini oscilloscopio ho utilizzato un solo encoder rotativo per tutte le funzioni. Ciò renderebbe molto difficile l'uso di un doppio oscilloscopio, quindi qui ne ho bisogno di due. Un encoder per gli attenuatori e il livello del suolo virtuale e l'altro encoder per la base dei tempi e l'attivazione. Purtroppo, proprio come nell'altro mio progetto, questi encoder rotativi sono molto "rumorosi". Sono così brutti che semplicemente non funzionerebbero con i timer in "modalità encoder", il modo standard di leggerli. Ho dovuto realizzare un meccanismo antirimbalzo con timer TIM2, controllando gli encoder ogni 100us. Questo timer a sua volta viene avviato (solo) quando c'è qualche attività sugli encoder, questo viene verificato con la funzionalità EXTI sulle porte di ingresso. Ora gli encoder funzionano bene.
E come puoi vedere, avere un display può anche essere molto utile per visualizzare le informazioni di debug.
Passaggio 6: visualizzazione e base dei tempi
Il display ha una risoluzione di 160 x 128 pixel quindi ci sono 160 campioni necessari per uno schermo pieno, sono riuscito ad accelerare gli ADC per fare 1,6 milioni di campioni al secondo e questo, con il microcontrollore molto overcloccato (ne parleremo più avanti), dà una base temporale minima di 20 us per divisione (100 us per schermo). Quindi una forma d'onda di 10kHz riempirà l'intero schermo.
È solo due volte più veloce del mini oscilloscopio che ho realizzato prima. Vabbè, ora è con due canali:-).
Come detto, il display è largo 160 pixel, quindi sono necessari solo 160 valori per schermo. Ma tutti i buffer contengono effettivamente 320 campioni. Quindi il DMA memorizza 320 valori prima di attivare un interrupt completo di trasmissione (TC). Questo perché l'attivazione viene eseguita nel software. Il campionamento inizia in un momento casuale, quindi è molto improbabile che il primo valore nel buffer sia il punto in cui dovrebbe essere il punto di trigger.
Pertanto il punto di trigger viene trovato leggendo il trace_x_buffer, se il valore è al valore di trigger desiderato e se il valore precedente è appena al di sotto di esso, viene trovato il punto di trigger. Funziona abbastanza bene, ma è necessario un buffer più grande della dimensione effettiva del display.
Anche questo è il motivo per cui la frequenza di aggiornamento sulle impostazioni della base dei tempi inferiori è più lenta di quanto ci si potrebbe aspettare. Quando si utilizza l'impostazione di 200 ms/div, uno schermo pieno di dati è di 1 secondo, ma poiché viene eseguita una quantità doppia di conversioni, ci vogliono 2 secondi. Nelle impostazioni della base dei tempi più veloci non lo noterai più di tanto.
TIM3 viene utilizzato per generare la base dei tempi. Attiva gli ADC con la velocità richiesta dall'impostazione della base dei tempi selezionata. Il suo clock di TIM3 è 120MHz (vedi OVERCLOCKING), il numero massimo a cui conta (ARR) determina quanto altro va in overflow o, in linguaggio ST si aggiorna. Tramite TRGO questi impulsi di aggiornamento attivano gli ADC. La frequenza più bassa che genera è 160 Hz, la più alta è 1,6 MHz.
Passaggio 7: ADC e DMA
I due ADC convertono contemporaneamente la tensione sui loro ingressi, memorizzano quei due valori a 12 bit in un'unica variabile a 32 bit. Quindi il DMA ha solo una variabile per (doppia) conversione da trasferire.
Per utilizzare questi valori è quindi necessario suddividerli nei due valori in modo che possano essere utilizzati per visualizzare le due tracce. Come detto, gli ADC nell'F103 non possono essere impostati su risoluzioni diverse da 12 bit. Sono sempre in modalità a 12 bit e quindi le conversioni richiedono sempre lo stesso numero di impulsi di clock. Tuttavia, con l'overclocking degli ADC, è possibile eseguire 1,6 MSamples al secondo (vedi Extra: Overclocking).
Il riferimento degli ADC è Vdd, il rail da 3,3V. Per convertirlo in valori più convenienti (per divisione) ho calcolato i valori degli attenuatori, perché non ho i valori esatti dei resistori che escono da quei calcoli alcune correzioni sono fatte nel software.
In questo progetto utilizzo DMA in "modalità regolare". In questa modalità il DMA interrompe il trasferimento dei dati (dagli ADC alla memoria) quando viene trasferito il numero di parole (o mezze parole o byte). Nell'altra modalità possibile, "modalità circolare", il DMA si ripristina e continua a trasferire i dati senza interruzioni. Questo non ha funzionato con l'F103, è così veloce che sovrascrive i dati in adc_buffer prima che il resto del programma possa leggerli. Quindi ora il processo è il seguente:
- impostare DMA sul numero di dati da trasferire e abilitare DMA
- avviare l'attivazione degli ADC, questi richiederanno i trasferimenti DMA dopo ogni (doppia) conversione
- dopo il trasferimento del numero di conversioni impostato, DMA si ferma
- interrompere immediatamente anche l'attivazione degli ADC
- eseguire tutte le manipolazioni necessarie sui dati in memoria
- mostra le tracce sullo schermo
- ricominciare il processo
Passaggio 8: interfaccia utente
Uno schermo da 160 per 128 pixel non è molto grande e voglio usarlo il più possibile. Quindi non c'è una parte riservata alle impostazioni correnti. Nelle ultime righe vengono visualizzati la sensibilità verticale, la base dei tempi, il livello di trigger e il canale di trigger, ma quando i segnali sono sufficientemente grandi appariranno nella stessa area. L'opzione attiva è mostrata in giallo, il resto è mostrato in bianco.
Passaggio 9: costruzione e possibili miglioramenti
Sono abbastanza contento di questo progetto. Funziona bene e fa il suo lavoro, ma potrebbe essere migliore.
La scatola del progetto è troppo piccola per contenere tutto comodamente, questo si traduce nel dover mettere i componenti sotto la pillola blu. Per renderlo possibile, la Blue Pill non può essere saldata direttamente alla "scheda madre". E poiché questo ha reso tutto troppo alto ho dovuto rimuovere molte parti dalla pillola blu, come i ponticelli per selezionare BOOT0 e BOOT1 (cose che comunque non uso mai) e ho persino dovuto spostare il cristallo dall'alto verso il basso il pcb.
Ho reso la vita più difficile usando connettori a banana invece di connettori BNC o SMA, significava che gran parte della perfboard era una "zona vietata", per chiarire a me stesso ho messo sopra del nastro kapton per impedirmi dal mettere parti su di esso.
Un altro problema nel mettere tutto in una scatola di progetto così piccola è che i circuiti analogico e digitale sono molto vicini tra loro. Puoi vedere che c'è molto rumore visibile su entrambe le tracce. Questo non l'avevo nemmeno sulla breadboard! Spostando il più possibile le linee di alimentazione per i circuiti analogici e digitali è stato fatto un piccolo miglioramento, ma non abbastanza per i miei gusti. Ridurre tutti i valori dei resistori nei circuiti analogici anche più di quanto non abbia fatto io (la resistenza di ingresso è 100kOhm invece di 1MOhm) non ha aiutato. Sospetto che l'attivazione sull'impostazione della base dei tempi più veloce (20us/div), che non è eccezionale, migliorerà anche con meno rumore sui segnali.
Se realizzi questo progetto su un pcb "reale", con tutte le parti smd e livelli separati per analogico, digitale e alimentazione (sono 4 livelli!) probabilmente funzionerà molto bene. Sarà molto più piccolo, non utilizzerà una Blue Pill completa ma solo l'F103 e ciò consentirà di dotarlo di un Vdda analogico separato (pulito) per gli ADC.
Come tocco finale ho deciso di spruzzare la scatola nera, cambia rispetto a tutte le scatole beige che ha.
Passaggio 10: il codice e un breve video
Passaggio 11: EXTRA: Overclocking
Proprio come ho fatto con l'F03, volevo vedere quanto bene un F103 può essere overcloccato. Le specifiche di questo microcontrollore affermano che la velocità di clock massima non dovrebbe superare i 72MHz (che ovviamente è già più veloce dell'F030) ma avevo letto in diversi blog che l'overclocking era facile, quindi perché no?
Il Blue Pill è dotato di un cristallo da 8 MHz, il PLL lo moltiplica con un fattore da 9 a 72 MHz. Il PLL può essere aumentato fino a 16 dando un clock di 128MHz. Non è stato affatto un problema per la mia Blue Pill, infatti, tutte le mie Blue Pills funzionano senza problemi a 128MHz.
Ma ora volevo scoprire qual è il vero limite. Quindi ho rimosso il cristallo da 8 MHz e l'ho sostituito con uno da 12 MHz. Ancora una volta ho aumentato il moltiplicatore PLL fino a quando il microcontrollore non si è arreso. Era a 168 MHz! Su 156MHz ha funzionato ancora bene. L'ho lasciato funzionare a quella velocità per ore e non l'ho mai visto schiantarsi. In questo oscilloscopio ho optato per 120MHz, velocità selezionabile con un cristallo da 12MHz e PLL su 10, oltre che con un cristallo da 8 MHz e PLL su 15. (vedi SystemClock_Config in main.c)
Gli ADC ora funzionano anche più velocemente, li ho eseguiti a 30 MHz (invece di 14), stavano ancora funzionando bene a 60 MHz, STMicroelectronics fa un buon hardware!
STMicroelectronics inserisce questi limiti nella scheda tecnica per una buona ragione, garantiscono che il microcontrollore funzioni ai 72MHz specificati in tutte le condizioni.
Ma poiché non uso il microcontrollore a -40 Celsius, +85 Celsius, a soli 2.0 Volt o 3.6 Volt, penso che sia sicuro overcloccarlo. NON farlo quando hai intenzione di vendere un dispositivo con i relativi microcontrollori, non sai mai dove verranno utilizzati.
Consigliato:
Crea una traccia sensoriale a basso costo in pochi minuti!: 10 passaggi (con immagini)
Crea un binario con sensori a basso costo in pochi minuti!: Nel mio precedente Instructable, ti ho mostrato come creare un layout di treno modello con binario di raccordo automatizzato. Utilizzava un segmento di traccia, chiamato "traccia sensoriale". È una cosa molto utile da avere in un plastico ferroviario. Posso essere utilizzato per quanto segue: Blocco
Traccia l'epidemia di COVID-19 di ESP8266: 11 passaggi (con immagini)
Tieni traccia dell'epidemia di COVID-19 di ESP8266: questo piccolo gadget ti aiuterà ad essere aggiornato sull'epidemia di coronavirus e sulla situazione nel tuo paese. Questo è un progetto basato su IoT che mostra i dati in tempo reale di casi, decessi e persone guarite dal coronavirus (COVID-19)
Crea facilmente il tuo oscilloscopio (mini DSO) con STC MCU: 9 passaggi (con immagini)
Crea facilmente il tuo oscilloscopio (Mini DSO) con STC MCU: questo è un semplice oscilloscopio realizzato con STC MCU. È possibile utilizzare questo Mini DSO per osservare la forma d'onda. Intervallo di tempo: 100us-500ms Intervallo di tensione: 0-30V Modalità Draw: Vector o Dots
Aggiorna il Mini DSO fai-da-te a un vero oscilloscopio con caratteristiche fantastiche: 10 passaggi (con immagini)
Aggiorna il Mini DSO fai-da-te a un vero oscilloscopio con caratteristiche fantastiche: L'ultima volta ho condiviso come creare un Mini DSO con MCU. Per sapere come costruirlo passo dopo passo, fai riferimento al mio precedente tutorial: https://www.instructables. com/id/Make-Your-Own-Osc…Dato che molte persone sono interessate a questo progetto, ho speso un po' di tempo
Crea una traccia MP3 "Metronomo" con Chi: 6 passaggi (con immagini)
Crea un brano MP3 "Metronomo" di Chi Running: Proprio prima di iniziare a correre in Vibram Five Fingers l'anno scorso, ho anche letto il metodo di Chi Running sviluppato da Danny Dreyer in modo da poter regolare il mio stile di corsa. Mi sono subito reso conto che un altro strumento, un metronomo, sarebbe stato utile, ma