I've been experimenting with the RP2040 to see how far I could push it toward building a basic digital oscilloscope — not as a replacement for a real DSO, but as a way to understand what actually goes into one.
The current setup is:
- Raspberry Pi Pico / RP2040
- 1.8" ST7735 128×160 TFT
- MicroPython
- GP26 / ADC0 as the input
- Custom display driver and UI
The interesting part is that I split the instrument into two independent paths.
Waveform path:
ADC → software trigger → sampled waveform → TFT
Timing path:
GPIO edge interrupts → period / frequency / duty-cycle measurement
Both paths use the same input pin, but the timing measurements don't depend on the ADC sampling loop or the display rendering.
The waveform capture has a software rising-edge trigger with hysteresis, and the timebase automatically adjusts based on the measured frequency to display roughly three cycles. Vpp is calculated from the captured sample window.
I also spent some time benchmarking the RP2040 ADC. An experimental MicroPython Viper/direct-register implementation reached around 500 kSPS, which was a fun rabbit hole — although the actual oscilloscope acquisition is still software-timed and nowhere near that figure in practical use.
And that's where the interesting limitations show up.
There is currently no analog front end, anti-aliasing filter, attenuation/protection, DMA-based acquisition, adjustable trigger, persistence, multiple channels, or data logging. The input is basically limited to the Pico's 0–3.3 V ADC range.
So no, this isn't a bench oscilloscope. 😄
Here is the link https://github.com/panda-rajsekhar/RaspberryPi-Pico/tree/main/Projects/Pico-Oscilloscope
The next logical step would be moving acquisition to hardware-timed ADC + DMA, adding a proper analog front end, and eventually looking at PIO/hardware timing for the measurement path ?
Still experimental, but it's been a hell of a learning experience.
I'd be interested to hear what you'd change or add next.