I wanted to see if I could make a useful scope using just a microcontroller and a television. The result works, but is a bit slow with a maximum sampling rate of 15,750 Hz. This is fast enough for most electrophysiology, but not for audio. The sampling rate is determined by the maximum rate of the internal A/D converter.
The entire scope consists of a Mega32 microcontroller, 8 push buttons (connected to one port), and a TV. Optionally, you can add an RS232 interface to dump waveforms to a computer. The DAC to connect the microcontroller to the TV is shown below.
The analog input to the scope consists of a 0.47 microfarad capacitor and two 1.0 megaohm resistors as shown below. The highpass cutoff is around 1 Hz. The two resistors bias the A/D input to Vref/2. The capacitor blocks DC from the input. Input must be limited to +/-2.5 volts.
The full schematic:
The external trigger input is just a logic level directly into the INT0 input which is PORTD.2. The system runs on a 16 MHz crystal at 5 volts.The curcuit board is shown below (version 1 without RS232). The ExpressPCB (do a save as... on the following link and use ExpressPCB software) design file is for the version with RS232 output.
Parts list (Digikey part numbers):
MEGA32-16PC Atmel microcontroller
MAX233ACPP dual RS232 interface.
A2100 RS232 connector socket
901K snap-fit phone jack, 90-degree
CP-3502N mono 3.5 mm audio connector socket
401-1103-1 rubber surface-mount push puttons
CTX077 16 MHz crystal
All resistors and capacitors are 1206 surface-mount packages
Displays one voltage channel.
Full scale voltage range of 5, 2.5, 1.25 and 0.75 volts.
Full scale time range of 8, 16, 33, 65, 130, 261, 521, 1042 mSec.
Samples at 15.75 kHz maximum (NTSC video line rate).
Cursor measurement of time and voltage on the trace.
Calculation of RMS voltage of the trace.
Trigger on edge/level, with settable value. External logic-level trigger.
RUN/STOP modes with single trace capture.
Waveform dump to the UART.
The CodeVision C program is loaded on the Atmel Mega32. The above image shows two pulses. The dot just below the trace is the cursor. Below that there is a RUN/STP/ARM indicator, cursor readout of time and voltage on the trace, a LEVL/EDGE/EXTN/FREE trigger indicator, and the trigger level. The current time and voltage scales are shown in the upper right corner.
Button 0 toggles RUN/ STOP mode.
Button 1 arms a capture in STOP mode. The capture actually occurs when the trigger condition is met.
Button 2 cycles the trigger mode to LEVEL/EDGE/EXTERNAL/FREERUN.
Button 3 changes the time scale in RUN mode. The time scale cycles through eight values.
Button 4 changes the voltage scale in RUN mode. The voltage scale cycles through four values.
Button 5 dumps the waveform to the serial port in STOP mode. The video is stopped during the dump. See example below. Button 5 computes the RMS voltage value of the trace in RUN mode.
Button 6 decrements the trigger level in RUN mode. It increments the cursor position in STOP mode.
Button 7 increments the trigger level in RUN mode. It decrements the cursor position in STOP mode.
Internally, the program is divided into two parts:
The timer1 compare-match ISR runs at video line rate. The ISR:
generates the horizontal and vertical synch pulses
blasts bits from RAM to the video output
checks for a trigger condition, and acquires a voltage sample, if the time is right.
An external trigger pulse is latched by the INT0 interrrupt flag, but there is no associated ISR, rather the timer1 ISR poles and clears the flag.
The main program:
Sets up the environment, draws some strings, and drops into the usual endless loop
the loop sleeps until the whole video screen is drawn by the ISR, then during the vertical sync time:
draws a new trace, if it ready
runs the button debounce state machine
performs the button actions (move cursor, draw strings, etc) and sets flags for the ISR
The serial port dump allows analysis of individual traces. A trace dump to a PC and then plotted by Excel is shown below. The actual data shown is simulated AP data fed into the scope from the sound port of a PC.
The Matlab commands
load 'a:\dump1.txt' -ascii