Detailed logs of experiments

2016-09-10-Feather_ADC

Playing with the STM32F205 (Feather WICED ADC)

First tests

Code can be found here.

Testing it with a 10kHz (0-1V) sine gives the following

and with a 10kHz (0-1V) sine:

Not satisfactory.

Digging into the low-level code

Code can be found here.

Sources
Question

Question is found on github:

I'm trying to see how fast the Feather WICED ADC can go. I've been trying with analogRead(), and at first sight, I'm getting data at around 50ksps. Will be posting the raw data later on to support this.

Now, I've begun digging into the maple ADC and corresponding code, and I've put together a piece of code to test acquisition speed. This code compiles nicely, but doesn't work (nothing on serial). I'm unsure of the reason behind this, and I guess some registers need to be finetuned.

For example, the enumeration for STM32F1 differs from STM32F2, as said by leaflab. However, using ADC_SMPR_1_5 during compilation works, but not the actual ADC_SMPR_3.

Working on this at the moment, but would appreciate if you had some ideas on what I could do next, I'll be updating/documenting the issue in the same time.

Playing with the same code (D+1)

But removing all references to the second ADC (and so .. to the third as well), the code works.

Interfacing the feather to a i2c 128x64 oled display, I can see that it takes around 990 us to get 1000 samples. That's a bit more than 1Msps - and it should be enough to get a signal coming from the emulator.

Moreover, with this working, we can see that the input signal coming from 0 to 3.3V gives 0 to 4095.. as expected. Since the output of Goblin is up to 3.3V, it means I can connect goblin's output to this one, and try to trig on the same trigger as the emulator as well. Will need a level shifter.

Playing with the same code (D+2)

Been putting the trig on the 5V trigger from the pulser. Works better.

Also doing some averaging.. need to check if it really works.

Anyhow, the code works.

It seems like for 2048 points buffer, only 4 full periods of the pulser are present. This pulser working at 300us intervals, this would put the acquisition at 1.7Msps. Need to check what is really the speed of this acquisition.

Seeing echoes as well from a real transducer =)

Being a bit more serious

The code is here ADC2UDP-Cleaning.ino.

Testing the speed of acquisition

I got 24x128 points (data is here, decimated 128 times: and I see 22.2 decimated points for a period of 300us.

Thats 533 points per period. Since it's a 300us period, the overall acquisition speed is close to 1.776Msps at 12 bits, using only one ADC.

Getting an image with Silent and Goblin
Background

Silent is the emulating module, which emulates a ultrasound piezo. It's output before Goblin, the analog processing module, is as follows:

and after

Acquisition

The data was acquired with Croaker through the UDP streaming option. Lines are 128 points long (hence 72us long), and the value is coded over 12 bits, from 0-4095, corresponding to 0-3.3V. Data is here

Comparing with the source signal, it seems that we are late on acquisition: the trigger took some time.

Peaks on the 3 smaller peaks afterwards are on points 82, 88 and 95. That's 6.5 points on average between each, or 3.66 us between each peak. In the config of Silent, we see that each is separated by roughly 7 us. That would mean the ADC speed varies. Needs to be explored.

Next steps: getting more juice from the ADCs

New acquisition is as follows:

The peaks get better resolved. Data is here -and Arduino code is here. Roughly doubling the sampling rate.

2016-08-22-Fantom

Acquiring a fantom image

The following acquisition was done with an old mechanical ultrasound probe, along with the pulser module, the analog processing module. The acquisition was done with a beaglebone PRUDAQ at 10Msps. I'm not mentionning the power supply module.

You can download the raw data at using this link.

The raw image

The animated image

Comparing with the fantom

I guess the points we see are the points on the left hand of the fantom. The top of the fantom is not seen as the near field artifact is at goes till around 2cm (according to the probe specs).

Some comments

As seen in the list of probes, the probe we've been using has the following characteristics:

  • near field artifact till 2cm
  • focal point at 7cm
  • Lateral resolution of 4.2mm at 7cm depth
  • Axial resolution of 1.3mm at focal depth

This matches with what we're seeing.

Annex

Probe details

Setup

2016-08-14-HackingAUltrasoundProbe

Hacking an old ultrasound probe with a module dev-kit

Brief

The aim of this experiment is double, namely to:

  • check the behavior of the analog modules, and
  • to check the behavior of an old ATL probe.

The modules have already been tested, but not the PRUDAQ. The advantage of the PRUDAQ versus the other DAQ is that the data is exposed as /dev/beaglebone within the beaglebone black, and that it can store 320M worth of data in a single shot.

Results

Imaging a small 1cm side cubic dice: acquisition during 1s.

Results

Materials requirements / BOM

Some stuff, unexpensive to buy, to build a ultrasound testing kit -- 500$

  • A power supply giving 3.3V and 5V (mogaba) -- 5$
  • An analog processing (goblin) -- 130$
  • A high voltage pulser (tobo) -- 110$
  • A motherboard (doj) made out of stripboard -- 10$
  • A pulser (oneeye) from a trinket pro -- 20$
  • An old ATL probe (retroATL3) -- 75$
  • A beaglebone and PRUDAQ (toadkiller) -- 150$

Need one of the custom boards? Message me at kelu124@gmail.com !

Setup of the modules

Connecting the modules

Connecting the probe

Hacking process

Analog processing

The analog processing is managed by a HV+pulser module as well as an amplifier + enveloppe detector module. Tests were done in the respective module folders.

Testing the ATL probe

The PRUDAQ was setup to capture 32M of files at 10MHz (Jumper 1 on the external position). The signal (the enveloppe) was clipped at 1.4V since the PRUDAQ only accepts a [0-2V] input.

One can export the data, exposed from /dev/beaglelogic with:

debian@beaglebone:~$ sudo dd if=/dev/beaglelogic of=sonde3V_1.bin bs=1M count=32
32+0 records in
32+0 records out
33554432 bytes (34 MB) copied, 0.939505 s, 35.7 MB/s

Analyzing the binary dump provides the following image. We can see 10 full images, shot in 1s -- hence a rotation speed of the probe at 3.3V of around 10 rotation per seconds.

Scan conversion

Once the images segmented, we can isolate the images and scan-convert those. For the sake of experiment, I've been using a single simple nearest-neihghbour conversion:

Functional blocks and modules

Next steps

  • Debug the position control
  • Add a feedback control to the motor

2016-08-09

Testing the full setup

The pulser module, Tobo, was received.

Here are the results on the different tracks on the motherboard

Amplified signal after TGC

After enveloppe detection

With the final enveloppe

2016-07-15

Second hands-on with Goblin : an overview

What does it do?

This Goblin board aims at getting a signal, and giving access to key points within the signal processing chain for ultrasound imaging, namely:

  • Getting access to a TGC
  • Getting the enveloppe of the signal
  • Cleaning the signal before feeding in the on-board SPI ADC

All key signals are accessible, and jumpers, as well as pots, enable on-board fine-tuning of the signals. See more details on the testing session, to see the behavior of the board on a oscillo. __Beware, this session had a poor energy supply quality, so the 5V got quite low. The new log, covers it better.

Testing the board using 0.2V in gain input (max can be 1V, that's ~20% gain used)

Just after the TGC : A 60mV signal becomes a 300mV signal.

Which becomes, after enveloppe detection, a 400mV enveloppe.

Likewise, a 120mVpp signal becomes a 750mV enveloppe, clean.

View

Detailed view

Principles

Block schema

2016-07-08

First hands-on with Goblin : an overview

What does it do?

This Goblin board aims at getting a signal, and giving access to key points within the signal processing chain for ultrasound imaging, namely:

  • Getting access to a TGC
  • Getting the enveloppe of the signal
  • Cleaning the signal before feeding in the on-board SPI ADC

All key signals are accessible, and jumpers, as well as pots, enable on-board fine-tuning of the signals. See more details on the testing session, to see the behavior of the board on a oscillo.

View

Detailed view

Principles

Block schema

Testing the board

Signal in vs Signal out of the TGC

Trying with different frequencies
At 3 MHz

At 5MHz

At 7.5MHz

At 10MHz

Difference between enveloppe and ADC input?

-> the offset is removed, there's also a small gain (x2).

See below: there's an offset at the enveloppe detection (~RMS), which is removed. Enveloppe is 500mV before, comes at 1V+ afterwards.

Before the AOP

After the AOP

TODO: Table

To know more

Components that have been used
  • TGC:
  • Enveloppe detection:
  • ADC:

TODO =)

2016-08-09-SilentPlusTobo

Progress from 2016-08-09 being processed (by goblin) )

  • Managed to get the proper code to emit the lines only when PULSE_OFF starts (beginning of the image normally)
  • It emits a decreasing signal (enveloppe down) and a couple of pulses
  • This was sent through track #18 to Tobo for enveloppe detection.

Results

2016-08-02

Getting more infos for the code

Already doing some signal preparing:

with the following code

Bibliography

TODO

https://learn.adafruit.com/multi-tasking-the-arduino-part-2/external-interrupts

Remaining

results matching ""

    No results matching ""