This project started out as a way to see how much useful work I could get out of a MSP430G2553. Since the closest thing I have to a personal electronics lab is a National Instruments myDAQ from college, I decided to try and replicate some of its functionality (namely the ability to act as a SMU) as well as integrating with a circuit simulator. The project goals were the following (in no particular order):
- Low cost (< $100)
- Through hole components when possible/feasible
- At least 200ksps ADC
- Sample window of at least 0.15 seconds (enough for 3 cycles of a 20Hz wave)
- Sweepable sine wave output (20Hz – 20kHz)
- Source and measure current (specific specs TBD)
- Integration with Intel Galileo board running ngSpice
- GUI on desktop and Android
- Support both wired (USB) and wireless (WiFi) connections from Galileo
Currently I have a desktop GUI (written in Java with the libGDX framework) connected over USB to the Galileo. Based on what commands the GUI sends, the Galileo will either run a ngSpice simulation file or request new data from the MSP430 ADC. The results will be written to a file and sent back to the GUI. After some file parsing to determine how many signals were in the file and the number of samples, the GUI updates the plot as shown below.
Here the simulated circuit was a resistor divider (factor of 2) with a 7.1kHz sine wave input. When new ADC data is requested, the MSP430 starts stepping through a look-up table and outputs the value it reads to the DAC (TLV5618). The internal ADC is then configured to start a block of conversions and to use the DMA channel. This way results are directly copied to memory with low jitter (1-3 MCLK, or 0.0625us – 0.1875us for the 16MHz clock) and without interrupting the CPU.
In the above picture, the DAC was outputting a sine wave with 16 steps per period at about 7.1kHz. The green data points are from the ADC which was running at 62.5ksps.
Currently, the fastest sine wave the MSP430 can synthesize is 7.5kHz with 16 steps per period. I might be able to double this by using a DAC that only requires a single byte to update its output instead of two bytes like the TLV5618. I included a picture of the myDAQ’s oscilloscope reading below. It doesn’t quite agree with 7.1kHz but I’ve seen it jump a few hundred hertz based on what the timescale is.
Since there’s 512 bytes of RAM, only 30 10-bit ADC results can be stored at a time before I start to see stack overflows. Even though 8-bits would provide acceptable data, the ADC and its DMA channel always copy both bytes for each conversion.
My next steps for the project are the following:
- Add an external SPI RAM chip to buffer more samples. The Galileo and MSP430 will trade off reading and writing to it.
- Determine the specs required for current measurement and order the appropriate parts.
- Provide more signal conditioning so voltages aren’t limited to 0-3.3V.
- Add an interface to the GUI for editing ngSpice files. Currently I have a telnet window open to make changes.
- Test GUI on Android which will mean sending the data over WiFi.
- Test out a clock-tunable RC low-pass filter + VCO IC for lower distortion sine waves over the entire 20Hz-20kHz range.