Lo he hecho con éxito, pero con un solo sensor de efecto de hall lineal. Utilicé un esquema de detección de posición en el que la intensidad de campo del imán que estaba siendo levitado se muestreaba sincrónicamente con el electroimán PWM, de tal manera que las mediciones se tomaron solo cuando la corriente del electroimán había descendido a cero.
Esto puede ser difícil de programar con el entorno arduino, pero usar el compilador AVR-GCC simple es trivial para activar una interrupción para el muestreo de ADC un poco antes del final de cada ciclo de PWM.
El sensor se montó directamente en la parte inferior del electroimán. La alimentación de las muestras de intensidad de campo directamente a un controlador PID no es óptima, ya que las lecturas no se correlacionan linealmente con la distancia. Así calculé una estimación de distancia con una curva de linealización de 10 puntos.
Actualización:
1-¿Cómo podemos detectar el flanco descendente de PWM utilizando una interrupción interna?
Utiliza el temporizador / contador 1 en el modo PWM rápido, configure la unidad de comparación de salida A para generar la forma de onda de PWM y establezca la unidad de comparación de salida B para generar una interrupción unos pocos ciclos antes de que el temporizador se desborde (y comienza el siguiente pulso de PWM ). Usted escribe un controlador de interrupción que responde a esa interrupción al iniciar una conversión de ADC.
2-Qué tipo de estrategia de control usaste, es decir, PID u otra cosa.
Un solo bucle de control PID.
3-¿Cómo podemos estimar la distancia con la curva de linealización?
3) Mueve el imán a una distancia conocida, escribe la salida del ADC, acerca el imán 1 mm más cerca, escribe la salida y repite hasta que hayas cubierto todo el rango de levitación. Luego, en su programa, encontrará los dos valores conocidos más cercanos a la lectura de ADC, e interpola linealmente entre los dos para estimar la distancia en ese rango.