I'm trying to find a robust solution to linearize four hall effect sensors outout to obtain a signal that I can use in a PID control scheme.

The output data is collect via 4 ADC channels on an ATmega328p chip (Arduino) by sliding a magnet with the south pole first, perpendicular across the sensors with a fixed velocity and distance enter image description here

I then remove the offset, my idea is to look at the phase shift between the "sine waves" with the atan2(x,y) function

avgADC0 = ADC0-mean(ADC0);
avgADC1 = ADC1-mean(ADC1);
avgADC2 = ADC2-mean(ADC2);
avgADC3 = ADC3-mean(ADC3);

phase = atan2(avgADC0,avgADC1)
phaserad = phase * pi/180;

The idea came from this application note Application note

The result is, very very poor :) Mostly because the sensors aren't spaced exactly 90 deg. but I would expect to see something that doesn't look like this and more in the style of what's refered to in the application note.

Atan2 output

I'd love to end up with a nice curve, I can curve fit and feed into my control system? But how would you go about linearizing this signal, am I missing something?

The sensor data sheet is linked here

I realize the application note isn't targeted for my sensors, and usually I don't mix and match. But surely the method would still work regardless.

  • Thank you
  • \$\begingroup\$ you can start off by moving the magnet further away so they don't clip at max field, if it is indeed the Halls clipping. If they're still linear, then attenuating the signal into the ADCs. It won't solve the problem, but throwing away data at the start of the process is a good way to make it even worse. \$\endgroup\$ – Neil_UK Aug 27 '19 at 12:57
  • \$\begingroup\$ But the sensor outputs not nearly have sine wave like outputs, to use then atan2(), they are saturated also. You have to move the magnets away, as stated in the app note. \$\endgroup\$ – Marko Buršič Aug 27 '19 at 12:57
  • 1
    \$\begingroup\$ You could also use a Halbach array or to shape the magnet flux so that it have sine waveform. \$\endgroup\$ – Marko Buršič Aug 27 '19 at 13:12
  • \$\begingroup\$ Yeah i need to cut the legs of my testbench @Neil_UK :) \$\endgroup\$ – Sorenp Aug 28 '19 at 5:37
  • \$\begingroup\$ Have you considered trying to fit it to a second degree 4 dimensional polynomial? Such as f(x,y,z,w) = (ax²+bx+c)(dy²+ey+1)(fz²+gz+1)(hw²+iw+1) where a to i are the coefficients and x,y,z,w are the 4 inputs? \$\endgroup\$ – Harry Svensson Sep 2 '19 at 20:26

Please check again application note! in this way the output overlap is very important! i thinks you must install the sensor closer than now ! please see this picture from application note.

Sensor output

I make simple result in excel File

please pay attention to this result it is output formula out = (4 * avgADC0 + 6 * avgADC1 + 6 * avgADC2 + 4 * avgADC3)/6

it is 75% overlap

75% overlap

it is 20% overlap

20% overlap


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.