Modelled more of the as-built of the current STM setup in mechanical CAD so we have a reference model:
Took the video capture from yesterday, of the beam bouncing from the STM off a mirror 2.35m away and back to the camera on the STM and ran some analysis on the data.
Analysis works like this: For each frame, we find the beam center. Then we look at the spectral content of the displacement in X and Y directions. Check the full notebook for details: Laser-Wobble.ipynb
from Calculations/ (Rendered Notebook).
Here is the final figure:
The most interesting result is the peak highlighted by the red line. The red line marks the theoretical resonance frequency of the vibration isolation system that we had calculated in the past. Seeing a peak right at this frequency sparks a lot of confidence!
The results are limited up the 15 Hz because of the 30 fps video capture. But towards the right of the figure, the data becomes pretty meaningless anyway as the displacements are too small for the camera to pick up already.
Rebuilt the entire experiment to clean up the space and install some shelving. All connections are remade but the setup has not been reverified to tunneling.
Set up the laser again to make some more measurements of the beam. The following pictures show the beam at different distances. Left to right: 50mm, 100mm, 200mm, 400mm. The 400mm measurement includes a mirror which is why the orientation is flipped.
The size change derived from the FWHM in these pictures would be about 0.6mrad, but this is most likely not at all a dependable result.
Set up the laser to bounce off a mirror 2.35m away and back onto the STM vibration isolated mount. Installed a ø2mm aperture in front of the beam to slightly tighten the profile. This way we can watch the beam jump around on the camera. Recorded 8 minutes of footage in hopes that we can recover the low-frequency content of the vibration isolation transmittance from this.
Turned on the STM again and managed to get (very very unstable) tunneling. So everything was set up correctly again! The tip is still the broken one from the failed runs last time. Adjusted the sample holding to avoid the collision that happened back then. The STM is currently not covered in aluminum.
We noticed that the vibration isolation is bouncing around a lot more after the rebuild. It seems this is caused by it now standing on a different part of the table that is not rigidly fastened to the table frame. We should put some effort into stiffening the table structure here.
Here is an overview of the current status of the experiment after it was rebuilt:
Sollstrom
) in 1V/nA (so 0.100V is 100pA)serial-monitor-rust
as detailed on 2025-08-23IN1
)OUT1
)Set up the beam camera for a test whether this whole plan of using the camera for interferometry will work. Pointed the bare cheapo laser diode at it.
Configuring the camera is very odd — it seems you cannot directly set the exposure. It seems that triggering the auto white balance once auto-fixes an adequate exposure. Got to take a somewhat decent shot after then resetting all three white balance color channels to 50.
Analyzing this image for beam quality, using Laserbeam.ipynb
from https://git.fa-fo.de/fafo/k8ik-stm/src/branch/main/Calculations.
Please keep in mind that the sensor size is not precisely known as of right now so the absolute measurements in the image above are probably off by up to 20%.
Performed a study of the dimensions involved in our system based on some yet-to-be-confirmed assumptions. This gives us some nice potential explanations for the behavior and lots of leads for probing the correctness of this model. Keep in mind that all the results detailed below hinge on the assumptions detailed here.
Combining these assumptions with previous measurements lets us make some claims:
2025-08-27
with a peak-to-peak amplitude of 2.2V corresponds to a distance variation of 90±22nm. During these variations, the control system is able to keep the tip in range regardless.Tried setting everything up again. The temperature sensor seems “stuck” at always reporting 25°C. After a bit of investigation, it turns out that today it's too cold for the setup to work! We accidentally designed the setup such that we can measure only down to exactly 25°C:
To fix this, we replaced the 10k resistor with a 15k resistor. Now we can measure down to 16.2°C!
During debugging, we uncovered the STM from its aluminum foil cover. Recovered it after the sensor was fixed.
Tried to achieve tunneling again, but it's very sensitive today and only extremely short runs without stable control are possible. Assuming the tip has gone bad from the earlier interference with the system.
Opened up the STM again and replaced the tip with a new one. After installation of the tip, when doing the coarse-coarse approach with the front two micrometer screws, we noticed a lot of spontaneous noise on the tunneling current signal. We found that the noise can be increased by touching the insulation of the short coax run to the preamplifier. Assuming this is to be expected and nothing new.
Reinstalled the aluminum foil. Touching the aluminum foil also produces visible noise in the tunneling current. Maybe it is static charge from the floor today?
Very very sensitive tunneling after the first approach.
Heated up the STM again (peak change was 0.7°C) and then let the temperature settle to a very stable value. After lots of fiddling, achieved another tunneling run for ~3 minutes where we could vary the current setpoint again (0-800nA).
After this one, achieved another tunneling run of ~5:20 minutes with the ability to vary setpoint. Left setpoint at 546pA. Control response for the Z axis has a peak-to-peak deviation of about 3V but does not change abruptly.
Heated up the STM until it changed by a whole 1°C. Let it cool until it stablilized to a constant decrease of -0.006°C/min. We then achieved a tunneling session of over 20 minutes. Took some pictures of the oscilloscope screen during the time and noticed some interesting facts:
At some point it stopped again. We were not able to reproduce another stable tunneling sequence again.
During the attempts, we noticed a very high hysteresis in the micrometer screw movements which makes adjustment extremely difficult.
Noticed a very strange and worrying phenomenon: When driving the tip down further and further using the back micrometer screw, first we get contact, then contact is lost again, then we get contact again, it stops again. etc. Thhis happens over many rotations of the screw (many 10 µm) but not always in the same angular positions of the screw (sometimes it happens aready after half or e.g. 1/8th of a screw rotation).
Opened the alu foil again to check what's up. Well… turns out the terminal where the tip is mounted is now sitting on the small copper piece clamping down the sample. Ugh, that explains a lot!
We did not have time to fix it today. Next time, need to a) adjust sample mounting to avoid this collision b) check for a large hole in the sample c) replace the tip once again.
Re-setup the temperature monitoring. Today we are seeing a constant increase in temperature with a drift rate of approx. +0.001895 °C/min. The lid is on and had not been removed since yesterday. The temperature probe is still stuck to the lever arm of the STM.
Encountered some more glitches in the temperature readout, leading to the monitor firmware crashing. Added workarounds.
Running a long temperature measurement to understand influences.
(There were two ADC readout glitches that we haven't yet investigated further…)
It is interesting to see how slow the temperature inside the STM was to respond after the window was closed again.
Started rebuilding the STM experimental setup. Everything should now be as it last was.
The multimeter for the setpoint current Sollstrom
is always showing 0.0V right now. Ah, the alligator clip was clipped to the wrong lead of the poti for some unknown reason. It needs to be on the black wire. Now we can visualize the setpoint again.
Played a bit with the open-to-air STM, managed to achieve somewhat stable tunneling (a few 10 seconds to a minute) a few times. The tip is still the old one. Played with the Sollstrom
from 200pA to 60pA. Drift is generally still observable.
Quite a bit of experimentation followed (explanation of the graph details below):
Then started wrapping the STM head in aluminum foil to stabilize temperature. The effect is quite well visible in the graph below.
Because we could not achieve much tunneling anymore after the first installation of the aluminum foil, removed it again and replaced the tip. Then reinstalled the foil after installig the new tip. Retried tunneling with mixed results.
The PI controller is still correcting the tip down towards the sample which means the sample is drifting “away” from the tip. In parallel, the temperature graph above shows a constant increase at roughly 0.010 °C/min.
During the flat period on the temperature graph, a long time stable tunneling streak was possible. But it is unclear whether it is has anything to do with the temperature behavior…
Heated up the STM with its aluminum foil isolation from the outside. Temperature response is quickly visible.
After the temperature settled again, there was another longer period of tunneling possible. During this period, we also changed the current setpoint from 80pA to 210pA. After some time it drifted out of range again.
Heated up the STM again, a bit more this time. Unexpectedly, during heating, the STM started tunneling on its own for a while. Then it fell into sample contact. Does this suggest that the expansion of the STM makes the tip move closer to the sample rather than away? At least this observation sort of puts the temperature response into perspective: It is very unlikely that the smaller temperature drifts from earlier have any direct effect.
During the cooldown of the STM, a very interesting “tunneling” situation was achieved: The control signal is very noisy, but at the same time the PI controller found its operating point on its own again and again. The current signal looks very noisy as well, though. This might also be a very weird noise situation instead of real tunneling? At some point it stopped and the current signals also stopped being noisy.
Let the temperature settle again (no longer visible in the graph above).
—
One effect that is still worrying and unexplained is the sudden sharp jumps that are often seen in the control signal (e.g. see this older capture: 2025-06-15_20-50.png). They always correspond to noise spikes in the current signal, but most likely are not actually signal. Why does the current signal spike like this? Should this be filtered before going into the PI controller? I also assume the fast piezo movements resulting from this are having a very negative impact on stability.
Achieved one more very long tunneling session with some interesting observations:
In summary:
As a next step we should attempt to recreate the stable tunneling situations that were achieved today. Then we can retry running some X-axis scans with the Red Pitaya.
Started building a temperature monitor for the STM, based on a very cheap CS1237
ADC breakout board and a 10k NTC thermistor (MF52B 3950K
). Found a blog post documenting the ADC and a MicroPython driver for it.
Wrote a small script for readout, which can be found here: https://git.fa-fo.de/fafo/k8ik-stm/src/branch/main/Misc/Temp-Monitor
The script outputs roughly correctly scaled temperature values. The absolute values are probably completely bogus but relative changes are a reliable signal.
Using the very nice serial-monitor-rust tool to plot the values coming in live. Unfortunately, there are some glitches in the serial data, making this display somewhat less useful. The glitches seem to appear in the serial data stream, they look like repeated characters. Odd, because this is a USB-serial directly from the rp pico to the host…
For the moment, it's easiest to use my fork of theserial-monitor-rust
. Install it using this command:
cargo install --git https://github.com/rahix/serial-monitor-rust
And then run it using this command to automatically set everything up correctly for display (you may have to select a different serial device, of course):
serial-monitor-rust --column 'Raw' --color '808080' --column 'Temperature' --color '0080ff' /dev/ttyACM0
Put the sensor inside one of the aluminum extrusions of the STM frame (the inner circular channel) to thermally connect it to the frame somewhat. Ran a measurement over ~10min to see what we can measure (the following data was cleaned from the serial glitches):
We are seeing the frame cool down by 0.446°C over the 11 minute measurement. This equates to a temperature drift of -0.0394°C/min (uncertainty not considered here…).
Doing a ballpark calculation of thermal expansion: Assuming 20mm of aluminum (⍺ = 23 µm/m°C), this is a drift of 18nm/min. Don't trust this value too much at this point.
Slowed down the serial reports to once every 200ms to hopefully stop the serial glitches from occuring. Seems to have worked well! Here is another run of ~16 minutes:
This time, got a drift of -0.01756°C/min. Assuming it slowed down as it is getting closer to ambient or so. To note, the window in the storage room was open during these measurements, leading to some air exchange with the colder outside air of the night. Windows in the main room were closed and only one person was present.
So far, it is unclear whether this drift actually relates to the drift of the STM. This should be investigated in a next step. For this, we need to find a way to couple the temperature sensor to the STM, as close to the probe as possible.
Mounted the thermistor onto the STM, on the lever arm that's holding the XYZ piezo stage. For now, it is just held down by a piece of tape with no further efforts to thermally couple it to the aluminum part it is sitting on. This might mean the response curve is not quite following the temperature of the aluminum as fast as it could. Let's see.
A note on the general performance of the temperature monitor: We are easily resolving changes below 0.01°C, very good.
In the new location on the STM, the temperature measurement is quite a bit more noisy. Unsure how much of this needs to be attributed to bad thermal coupling. Here's a graph anyway:
Tried imaging the DVD surface under the SEM for reference. Had a bit of trouble getting an image to become visible → turns out that the surface is only visible at low acceleration voltages and becomes very invisible the higher it gets. Finally worked well at 5kV and using SE imaging mode.
The samples were prepared by lifting the bottom plastic off the DVD such that the aluminum foil sticks to the remaining plastic which also has the label printed on its back. So we are looking at the sample from the same side as the DVD drive laser.
(The dimensions are off, because of our SEM not being calibrated properly)
Track to track pitch on a DVD is 740nm.
We now know that our samples are good and we should be able to image them on the STM! Also found some prior art of imaging DVD surfaces with an STM, further corroborating that this approach will work:
Rebuilt the experiment to the last state (oscillscope for live viewing, red pitaya for acquisition and x/y control, lab power supply).
Made a new tip to reproduce tunneling. Experimented a bit with different tip cutting strategies to see whether we can improve our results with better tips:
Also started to put more effort into making sure the tips are inserted straight into the STM.
Made the C7 capacitor hack more permanent by soldering the capacitor to the respective terminals rather than wiring it in with alligator cables.
New address for the Red Pitaya Notebook: http://redpitaya.lab.fa-fo.de/jlab/lab/tree/RedPitaya/Fafo/STM_Control.ipynb
Wrote a new script for sweeping one of the red pitaya: http://redpitaya.lab.fa-fo.de/jlab/lab/tree/RedPitaya/Fafo/STM_Sweep.ipynb
Connected the output of the Red Pitaya (CH1) to the X input of the control box.
Added a 1k resistor parallel to R17
to increase the X-axis gain from 1 to 11. This means the input voltage is now -1V to 1V rather than -10V to 10V.
Managed to take some sweep recordings while the STM was tunneling:
We definitely can't see any surface here, but we could reliably observe that the X movement slowly moved a stable tunneling out of range.
Had troubles to get stable tunneling current, went to
Probenvorspannung
: MaximumSollstrom
: 0.144V (= 152pA)I
: 5 (instead of 9 turns up (out of 10))P
: 9 1/8 turns up (out of 10)And now we get stable tunneling current for several minutes. We will for now continue with those settings.
Started integrating the Red Pitaya for X-Y scanning. As a first step, connected the Z-output of the control box to IN1
. Added a BNC splitter so we can still see the control signal on the real oscilloscope. Once tuning the STM to tunneling range, we can now acquire the control-loop output from a Jupyter Notebook. Needed to update the firmware.
Access to the live notebook (only works from the lab): http://10.250.240.129/jlab/lab/tree/RedPitaya/Fafo/STM_Control.ipynb
A copy of the notebook is synchronized to git (please update!): https://git.fa-fo.de/fafo/k8ik-stm/src/branch/main/Control
New image of tunneling current after firmware update of the Red Pitaya and new script with the new Red Pitaya python API:
Right now the script is still very unusable, even for pure acquisition. We assume a problem is that the decimation factor is way too high at the moment. We should also look into what RP calls “Deep Memory Acquisition” to not be limited to the 16k sample buffer size.
Started making a bunch of new tips to see whether there is significant difference between them. There is, some tips are way easier to get to tunnel. ⇒ We need to work more on tip making skills to get reliable results here.
Rebooted the experiment, electronics still work. The old tip doesn't work anymore, we are unable to achieve reliable tunneling.
Installed a new tip. Got controlled tunneling again from time to time, but not for long periods.
Made yet another tip. Now hysteresis of the micrometer screw is gone, but we still only tunnel for short periods before drifting away. Assuming temperature drift.
Installed a PT100 RTD on the sample holder of the STM to monitor temperature. The PT100 is connected to a 3.3V power supply and a resistor divider with 100R. Unfortunately, the RTD responds way too slow for any useful results. Aborted the experiment. We should get a different RTD to build a useful temperature monitor.
Tried reproducing the results from yesterday → achieving tunneling was quickly done. The goal today is to tune the control loop better.
Achieved control for short periods of time, but the control behavior looks way too slow:
Assuming that the proportional control is not doing its job right now.
Added back an R8
of 100k to shut up the I-controller, to just look at the P-controller. It shows its familiar ringing when giving a factor using the potentiometer. This even couples back into the probe current, as can be seen below (at this time, the tip is very far away):
Frequency of the ringing is 1.47kHz.
Added another 1µF capacitor across C7. This gets rid of the ringing across the whole range of the P
potentiometer.
With this, we are now able to see actual stable control over long periods of time with fast response from the control loop:
You can also see the piezo sweep using the I-controller until it finds the tunneling point.
What's still a bit unclear is how there can be situations like in the image above where tunneling stops again as the Z piezo moves even closer?
Part of a very stable tunneling over a very long period today:
During mechanical adjustment, the controller now sweeps until it finds something (left side of the picture below). On the right, it has gone into control.
Settings during the experiments above:
Probenvorspannung
: MaximumSollstrom
: 0.322V (= 322pA)I
: MinimumP
: MaximumNow changing the settings somewhat in hopes of getting the control loop more tight:
Probenvorspannung
: MaximumSollstrom
: 0.144V (= 144pA)I
: 9 turns up (out of 10)P
: 9 1/8 turns up (out of 10)You can see the faster I-response at least:
It seems the noise has increased since yesterday. We don't have values from before, but right now, seeing ~80mV of noise overlayed over the tunneling current signal.
After some time, the control loop settled down quite a bit, assumingly because process disturbances decreased for some unknown reason:
Managed to increase the setpoint current to 456pA:
Finally tried putting the lid onto the STM for noise shielding, but I think I crashed the tip way too hard during the process as I couldn't achieve stable tunneling again afterwards…
Should create a new tip next time and then retry more gently. Also X/Y control is probably a good next step.
Changed power supply from lab power supply to batteries to check source of 50Hz noise. Took four 9V block batteries to generate +18V/-18V and connected to power input on control unit. 50Hz noise on exact same level as with lab power supply. Current explanation: STM is still on ground of building which seems to be the source of the noise. STM is here grounded via the scope we use which is connected to ground. Currently checking whether it's possible to have it in floating ground mode.
When
Taking other scope makes no difference.
Adjusting the amplification steps with the rotary switch on the amplification board gives further questions:
We now soldered in a very professional, Rahix-approved way, a 1 nF capacitor parallel to the second amplification stage into the amplifier board:
We got rid of the 12kHz!!
Without ground we measure ~250mV rms (completely isolated), with ground over control box ~400mV rms and with ground on STM ~600mV rms.
We now checked again with the lab power supply to see the difference to the batteries: Without ground we measure ~680mV rms (completely isolated), with ground approximately the same.
We now found a way to reduce the amplitude of the 50Hz noise from ~1V to 15mV by grounding the table!
Checking the table grounding effect with the power supply. Result: Grounding table leads to 15mV. Final explanation of main source of 50Hz noise: Cables in table induced 50Hz noise on metal parts of table. We do not understand however, why rahix observed the opposite effect last time he checked.
So far, the piezo cable has been left floating. We noticed that connecting it to the control box or otherwise grounding the shield of the cable gets rid of the last 15mV of 50Hz noise. So the cable was acting as an antenna…
After we replaced the IC 5/6, we achieved a first, short, tunneling current. I-part in control unit close to zero, high “Probenvorspannung”, low “Sollstrom”. We now replaced also IC 2/4 and the undocumented magic IC “Eleven”.
Tried measuring the travel of the piezos
Reconnected the control loop now, managed to again achieve controlled tunneling for a while:
Probenvorspannung
: 4.65VSollstrom
: 0.359V (this means 359.0 pA of tunneling current)I
: 0.041VP
: 0.249V[Pink: Amplified sample current; Yellow: Z-axis Piezo control voltage]
Preamplifier voltage to tunneling current mapping:
Got a DVD sample! Prepared a small section to put under the STM.
Looking at STM tips under the SEM:
1
: Tip created today that was used for the piezeo approach tests and successfull tunneling later today2
: Tip created just now that has not been touched or used in any wayAchieved tunneling once again with the new tip and DVD sample installed. Very unstable though, quickly drops out every time. SEM was running at the same time, possibly partly related?
[Current measurement setup]
BNC_Z
output via BNC cableR3
(X1:3
)R7
(IC1B:7
)R36:2
Looking into the behavior of the PI controller in more detail again:
Sollstrom
is positive 0.4VSollstrom
) by disconnecting R36 from C1/R1 and instead connecting it to -15V through a separate 10k resistor.After playing with the parameters a bit more, we got stable control for the first time!!!!!!!!
[magenta: tunneling current; cyan: control loop error input; yellow: piezo voltage]
You can see the piezo voltage adjusting over time to track the setpoint tunneling current (about 40pA in this case).
Control Values for this experiment:
Probenvorspannung
: 4.65VSollstrom
: 0.039V (this means 39 pA of tunneling current)I
: 4.89VP
: 9.44VPlayed a bit more with it, but it was very hard to get it to become stable again. Assuming environmental factors now.
Cleaned up the setup from yesterday. Noticed a shift in the noise level after moving the equipment a bit…
Accidental discovery: Additional spikes show up in the waveform when touching bare screws of the table that the STM is sitting on.
Played a bit more with the calculations for the mass-spring-damper system to see where we are at, comparing to commercially available systems:
Finished builing the vibration isolation frame + EMI box.
Measuring the damping time of the STM block (without magnet damping). STM block is deflected by 4cm, we measure the time until the amplitude is half. Target is to measure the increase in damping by our eddy current brake. Time is 4,5 seconds.
Did not retry the experiment with the eddy current brake installed: The damping effect is so little that it would not be worth it…
Lesson learned: Our eddy current brake was not worth the effort. We'd need a lot more magnets to have any notable damping effect. It is probably better to solve the problem through more mass.
Calculated the damping behavior of our setup:
EMI Box:
Electric bringup of the amplifier and control board:
Signal out
)Probenvorspannung
knob: CCW smaller, CW biggerZ
is the controlled height value generated by the PI controller, so it is an output signal, not an inputCurrent setup:
X
and Y
inputs are shorted to ground to prevent piezo movement.Z
is connected to scope, Z piezo will be controlled by the PI controllerProbenvorspannung
is set to maximum (TODO: What was the actual voltage?)Sollstrom
is minimal (probably, we are not sure!)I
controller factor is half way (5 turns)P
controller factor is half way (5 turns)Experiment:
Z
stays consistently at ~12VZ
voltage from any changes to P or I valuesSollstrom
changesTrying to understand the PI controller:
Probenvorspannung
to max and measured probe to ground: -4.63VProbenvorspannung
such that a voltage of -0.5V is measured at the probeX1:3
): 4.96VSollstrom
pot tops out at 4.7VIC1:7 ↔ R7
:Sollstrom
minimal: -4.96VSollstrom
maximal: -9.66VSollstrom
it oscillates between:Sollstrom
minimal: -6.0V - 3.8VSollstrom
maximal: -9.8V - 0.1VX1:3
(R3
): Same 50 Hz rect, oscillating around 0V with an amplitude of 9.9VProbenvorspannung
to minimal leads to an amplifier output of -5.1V (minimum). Even the slightest notch upwards on Probenvorspannung
raises the amplifier to its maximum (4.8V).TLC2202A
preamplifier stages:In conclusion:
Removed the formwork from the conrete block we poured on friday. The block is so nice!
Continued bringup of the original control electronics.
Continued building the vibration isolation frame, up to the point where we are missing the remaining components. The concrete weight is still drying, did not want to touch it yet.
Prepared a lab setup for bringing the original electronics back to life. Turned on power again for the first time, with the power LED on the board lighting up! Got a spark in the enclosure, couldn't find a reason or fault from it. Did not yet verify any functionality of the board.
Poured a concrete weight for the vibration isolation system:
Started building the frame for the STM vibration isolation.