Nothing here is high speed, except the 1kHz sampling rate. The sine that I see them talking about is “amplitude of 2mm and a period of 1.5 s”, or 0.666 Hz. I think the Arduino might be fast enough to handle that.
I found a DAC shield for the Arduino capable of +/- 10 V (see https://www.tindie.com/products/visgence/power-dac-shield/), It only has three DAC outputs, but that may be sufficient. Looking at their setup they only use two of their four outputs for time-varying analog stuff (and even then, only one at a time). The other two they use to (a) control a relay to switch modes, and (b) run the photodiode for the position detection circuit. (a) is purely digital, and (b) seems likely to be a constant voltage.
Similarly, while they have six differential DAC inputs, they only use two at a time as well. They can measure both the current and voltage in either coil, but in one phase they measure the voltage across one coil, and in the other phase they measure the current through the coil, but never both at the same time. And the system is designed symmetrically so they can use either coil as the measuring coil. They also use one for measuring position, and one for measuring a potentiometer for “manual” mode.
Also, I’m not sure the +10/-10 V is strictly necessary, but it’s what they used. The voltages they are measuring are +/- 200 mV, and the currents they are measuring are +/- 3 mA (dropped across a 330 Ohm resistor, so +/- 1 V). It might be possible to redesign that so it’s using lower voltages, and use instrumentation amps to make it single-ended for DAC purposes.
The measurement process consists of two phases:
- “Velocity Mode”
In this phase, you don’t even need the measurement mass. This phase is more about calibrating the device, and is not mass dependent.
Force the coil on the measurement pan across the magnetic field. This will induce a voltage across the coil proportional to the velocity of the coil. By measuring the velocity (numeric differentiation of the position), and measuring the voltage, we can get this constant of proportionality, BL.
So we drive one end of the balance (using the other coil and magnet setup) slowly (0.666 Hz) and record the positions and voltages over a long period of time to get a lot of data points to compute BL. They recorded 1000 measurements/second, or 1500/period of oscillation, and used 80 oscillations to validate their procedure. that’s 2 minutes of recording at 1000Hz.
That gives us BL.
- “Force Mode”
In this mode, we put a weight on the balance, and measure the current through the coil necessary to hold the balance balanced. The force caused by a current through a coil in a magnetic field is proportional to the current, with a constant of proportionality BL, the same BL measured in phase 1.
So the procedure is to put the unknown mass on the balance, and then adjust the current through the coil (by adjusting the driving voltage through the coil, and measuring the current) until the balance is balanced and steady.
“Manual mode” uses a potentiometer that the user can tweak to get the balance balanced. “Automatic mode” uses a PID controller.
They specify a complex procedure for increasing precision by removing and taking off masses in a controlled manner to eliminate biases. But the end goal is to measure the current I necessary to balance the force of gravity mg.
Since the force F = mg = I*BL, and we know BL from the velocity phase, and we know I from the force phase, and we know g (from looking it up online, or using a gravimeter like your cell phone), we can compute m.