Descripción
Esta nota de aplicación explica los requisitos mínimos de hardware y software para obtener una medida de posición angular a partir de un sensor de inclinación electrolítico Fredericks.
Diseño Básico y Excitación del Sensor
La figura 1 muestra los principales componentes necesarios para crear una unidad de medición de la inclinación que funcione utilizando un sensor de inclinación electrolítico.
Como verán más adelante, es importante evitar la corriente directa al sensor. Por lo tanto, sugerimos el uso de un amplificador operacional con alta impedancia de entrada como el LMC6482 de Texas Instruments. Esto limitará la fuga de corriente a tierra y, a su vez, la corriente directa al sensor. La figura 2 muestra el circuito equivalente a un sensor electrolítico de inclinación de un solo eje.
Continuemos con la señal de excitación para el sensor. La señal de excitación es proporcionada por el microprocesador, siendo el caso más simple un sensor de un solo eje. Un sensor de un solo eje requiere dos puertos de salida del microprocesador que están conectados a los pines exteriores del sensor. Los puertos se conmutan con un ciclo de trabajo del 50% y un período de entre 200 y 1000 hertzios. Véase la figura 3.
Se requiere una sincronización precisa en el software para mantener un ciclo de trabajo del 50% para evitar la asimetría en la señal de excitación del sensor. Véase la figura 4. La asimetría se define como la corriente directa al sensor que causa la deriva y, en última instancia, el daño permanente e irreversible del sensor. Esto puede explicarse químicamente; la corriente directa hace que se produzca la electrólisis, lo que finalmente hace que el sensor se vuelva inerte.
Examinemos el proceso de creación de una señal de excitación en el software para un microprocesador PIC18F usando el Compilador CCS PCW C. Estas instrucciones diferirán significativamente dependiendo de su microprocesador y compilador específicos. Empezaremos definiendo qué pines se usarán para la salida. Usaremos PORTB para la salida, así que tendremos que definirlo como tal. Esto se logra estableciendo el registro de dirección de datos de 8 bits, llamado TRISB. Los bits en TRISB puestos a 0 definirán el pin PORTB correspondiente como salida, así que usaremos la siguiente línea de código para usar todos los pines PORTB para la salida:
set_tris_b(0b00000000); |
Para poder cambiar rápidamente los valores de las clavijas del PORTB, necesitaremos acceder a la memoria. En este microprocesador en particular, PORTB es un registro de función especial (SFR) que se encuentra en la dirección de memoria 0xf81. Por lo tanto, almacenaremos la ubicación de PORTB en una variable para permitir un fácil acceso. Esto se logra con la siguiente línea de código:
#byte port_b = 0xf81; |
Cada bit en port_b corresponde ahora a un pin en el chip. El bit más significativo es el pin B8 y el menos significativo es el pin B0. Supongamos que un sensor de un solo eje está conectado a los pines B0 y B1. Ver la figura 3. Si estás usando un sensor de doble eje, asumamos que está conectado a las clavijas B0, B1, B2 y B3.
Para un sensor de un solo eje, hay dos estados para la señal de excitación. Véase la figura 4. Para imitar este diagrama de temporización, los dos estados pueden almacenarse en una matriz de números de 8 bits. Esto se logra con la siguiente línea de código:
int8 output_arr[2] = { 0b00000010, 0b00000001 }; |
Para un sensor de doble eje, hay cuatro estados para la señal de excitación. Véase la figura 5. Para imitar este diagrama de tiempo, los cuatro estados pueden ser almacenados en un arreglo de números de 8 bits. Esto se logra con la siguiente línea de código:
int8 output_arr[4] = { 0b00000011, 0b00001100, 0b00001010, 0b00000101 }; |
Los temporizadores son una herramienta comúnmente utilizada para generar interrupciones a intervalos precisos en el software y pueden utilizarse para generar fácilmente una señal de excitación. Es importante que utilicemos una interrupción de alta prioridad para que la señal de excitación mantenga un ciclo de trabajo del 50%. El siguiente código crea una interrupción de alta prioridad que conmuta los puertos para generar una señal de excitación para un sensor de doble eje:
int isr_counter = 0; #int_timer1 HIGH void timer1_isr(void) { set_timer1(64535); port_b = output_arr[ (isr_counter++) % 4]; // this is for a dual axis sensor } |
En este ejemplo, el temporizador1 es un contador de 16 bits (0 a 65535). Esto significa que contará a partir del valor establecido por set_timer() y cuando se desborde (llegue a 65535), se generará una interrupción y se ejecutará el código dentro de la función timer1_isr(). La cantidad de tiempo que tarda en desbordarse está definida por diversos factores, como la velocidad de reloj del microprocesador y los parámetros de configuración del timer1, entre otros. Es importante mantener un tiempo de interrupción de entre 1 y 5 milisegundos para asegurar la correcta excitación del sensor. Consulte el manual de su microprocesador individual para obtener esta información.
La conmutación de puertos funciona usando la función de módulo. Cada vez que se genera una interrupción, se incrementa isr_contador y se realiza el módulo 4 sobre él. Esto hace esencialmente un contador que cuenta de 0 a 3, incrementándose con cada interrupción. Esto accede a cada uno de los cuatro estados almacenados en output_arr que componen la señal de excitación.
Salida del sensor
Ahora que hemos creado una señal de excitación, examinemos la salida del sensor. La salida es un voltaje analógico referido al voltaje de excitación. La salida debe ser leída en fase con la señal de excitación. Se sugiere tomar múltiples muestras durante cada uno de los cuatro estados (dos estados para un sensor de un solo eje).
La forma de onda de la figura 6 muestra un ejemplo de salida del convertidor analógico a digital conectado a la salida de un sensor de doble eje. Esta salida en particular indica un ángulo de inclinación positivo tanto para el eje x como para el eje y. Consulte la Figura 7 para ver una salida que indica un ángulo de inclinación negativo.
Para leer la salida tendremos que usar el convertidor analógico a digital (ADC) del microprocesador. Mirando la figura 3, necesitaremos configurar el pin A0 como una entrada ADC y luego configurar el puerto ADC actual al pin A0. Podemos entonces ejecutar el siguiente código para leer la salida de un sensor de doble eje en fase con la señal de excitación:
int samples = 0; int index = 0; int xpos[8], xneg[8], ypos[8], yneg[8] = {0,0,0,0,0,0,0,0}; while(true) { while( (isr_counter % 4) != 0 ); while( (isr_counter % 4) == 0 ) { // loop to read x positive state delay_us(100); if(index <= 7) xpos[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 1 ); while( (isr_counter % 4) == 1 ) { // loop to read x negative state delay_us(100); if(index <= 7) xneg[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 2 ); while( (isr_counter % 4) == 2 ) { // loop to read y positive state delay_us(100); if(index <= 7) ypos[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 3 ); while( (isr_counter % 4) == 3 ) { // loop to read y negative state delay_us(100); if(index <= 7) yneg[index] = Read_ADC(); index++; } index = 0; // data processing and analysis would then be done here } |
Como pueden ver, dentro de cada estado de la señal de excitación estamos recogiendo 8 muestras con un retraso de 0,1 ms entre ellas. Estas muestras pueden ser promediadas en el código de análisis de datos para proporcionar un resultado más estable y preciso. Haciendo referencia al isr_contador podemos asegurarnos de que las lecturas se toman en fase con la señal de excitación.
Derivación del ángulo de inclinación
El ángulo de inclinación del sensor se puede deducir comparando la diferencia entre los voltajes para cada estado de excitación:
Inclinación del eje X = (X+) - (X-)
Inclinación del eje Y = (Y+) - (Y-)
Digamos que tenemos un convertidor analógico a digital de 16 bits (0 a 65535 cuentas) leyendo la salida de un sensor de doble eje de ±20°. Esto significa que nuestro rango de salida es de ±65535 cuentas usando las definiciones de inclinación de los ejes X e Y de arriba. Examinemos la siguiente salida durante un ciclo:
X+ = 45535
X- = 20000
Y+ = 30000
Y- = 35535
Podemos entonces concluir lo siguiente:
Inclinación del eje X = +25535
Inclinación del eje Y = -5535
Ahora para convertir esto en una medición de ángulo:
±65535 cuentas = 131070 rango de cuentas
±20° = rango de 40°.
131070 cuentas / 40° = ~3277 cuentas/°.
25535 cuentas / (3277 cuentas/°) = ~+7.79° x inclinación del eje
-5535 cuentas / (3277 cuentas/°) = ~-1.69° y inclinación del eje
Consideraciones mecánicas al derivar el ángulo de inclinación
Todos los sensores tienen tolerancias mecánicas y sus especificaciones de funcionamiento a menudo sólo indican una parte de su alcance total. Además, el cálculo anterior supone una salida lineal, simétrica y centrada del sensor, lo que no suele ser el caso. Por lo tanto, es importante caracterizar el tipo específico de sensor que se utiliza en su aplicación para derivar la verdadera posición de inclinación.
Por ejemplo, consideremos un sensor electrolítico de un solo eje de ±25°. La figura 8 muestra la funcionalidad mecánica de este sensor de inclinación:
Digamos que esta vez tenemos un convertidor analógico a digital de 12 bits (0 a 4095 cuentas) leyendo la salida del sensor. Esto significa que nuestro rango de salida es de ±4095 cuentas usando la definición de la inclinación del eje X en la sección anterior. Para caracterizar individualmente el sensor, primero lo inclinaríamos a -25° y tomaríamos una lectura. Examinemos la siguiente salida para un ciclo a una inclinación de -25°:
X+ = 400
X- = 3700
Inclinación del eje X a -25° = 400 - 3700 = -3300
Luego inclinaríamos el sensor a +25° y volveríamos a tomar una lectura. Examinemos la siguiente salida para un ciclo a +25° de inclinación:
X+ = 3700
X- = 400
Inclinación del eje X a +25° = 3700-400 = 3300
Entonces podemos hacer los siguientes cálculos:
3300 - (-3300) = 6600 rango de cuentas
±25° = rango de 50°.
6600 cuentas / 50° = 132 cuentas/°.
Conocer el número de cuentas por grado permite convertir fácilmente una lectura del convertidor analógico al digital en una posición angular. Una mayor compensación de la linealidad, simetría y posición cero aumentará significativamente la precisión de los cálculos angulares.
Consideraciones sobre el software
Como con todo el software, hay muchas maneras diferentes de lograr el mismo objetivo. Este documento simplemente presenta un ejemplo de cómo el acondicionamiento de la señal del sensor de inclinación electrolítica puede lograrse mediante el uso de un microprocesador y un compilador específicos.