Autor Tema: Acelerómetros - UAV's  (Leído 18754 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Acelerómetros - UAV's
« Respuesta #15 en: 24 de Enero de 2014, 23:38:29 »
Bueno, finalmente hice el programa para calibrar el acelerómetro con "mi técnica".
La idea era registrar los datos RAW de cada eje del acelerómetro buscando la mínima excursión y la máxima excursión, puntos en los cuales tomamos como medidas de 1g. Luego, haciendo 2g/(Xmax - Xmin) obtengo la sensibilidad en g/LSB.

Mi main.c es el siguiente:

Código: [Seleccionar]
#ifdef __USE_CMSIS
#include "LPC17xx.h"
#endif

signed short accel_X, accel_Y, accel_Z;

volatile uint32_t msTicks; /* counts 1ms timeTicks */

__INLINE static void delay_ms (uint32_t delayTicks) {
  uint32_t currentTicks;
  currentTicks = msTicks; // read current tick counter
  while ((msTicks - currentTicks) < delayTicks);
}

#include <cr_section_macros.h>
#include <NXP/crp.h>
#include <math.h>
#include "i2c.h"
#include "ADXL345.h"
#include "uart2.h"

void SysTick_Handler(void) {
msTicks++; /* increment counter necessary in Delay() */
}

/*******************************************************************************
**   Main Function  main()
*******************************************************************************/
int main (void){
signed short MinZ=0, MaxZ=0;

//Configuro el SysTick para que interrumpa cada 1mseg
if (SysTick_Config(SystemCoreClock / 1000)) {
while (1);
}

I2C1Init(); // Inicializamos el bus I2C
ADXL345_init(); // Inicializamos el Gyróscopo
UART2_Init(115200); // Inicializamos el UART a 115200

UART2_PrintString ("\rAcelerómetro ADXL345\r\n");
UART2_PrintString ("======== elgarbe ==========\r\n");

ADXL345_read_data();
MinZ = accel_Z;
MaxZ = accel_Z;

while ( 1 ){
ADXL345_read_data();

if(accel_Z < MinZ){
MinZ = accel_Z;
UART2_PrintString ("\r\nNuevo Mínimo: ");
uart2_printInt32(MinZ, 10);
UART2_PrintString ("\r\n");
}
if(accel_Z > MaxZ){
MaxZ = accel_Z;
UART2_PrintString ("\r\nNuevo Máximo: ");
uart2_printInt32(MaxZ, 10);
UART2_PrintString ("\r\n");
}

delay_ms(20);
}
}

Entonces en el hiperterminal a medida que voy moviendo lentamente el sensor tratando de colocarlo con el eje Z lo más paralelo posible a la vertical voy viendo como van cambiando las lecturas. Cuando pasa un tiempo en que muevo y roto el sensor buscando un nuevo mínimo/máximo y veo que no lo consigo, giro 180° el sensor y busco el otro punto.
Para el eje Z esto es lo que he obtenido:
Código: [Seleccionar]

Acelerómetro ADXL345
======== elgarbe ==========

Nuevo Máximo: 1636
Nuevo Máximo: 1637
Nuevo Máximo: 1638
Nuevo Máximo: 1639
Nuevo Máximo: 1641
Nuevo Máximo: 1646
Nuevo Máximo: 1647
Nuevo Máximo: 1649
Nuevo Mínimo: 1550
Nuevo Mínimo: 1545
Nuevo Mínimo: 1543
Nuevo Mínimo: 1542
Nuevo Mínimo: 1534
...
Nuevo Mínimo: 1101
Nuevo Mínimo: 1099
Nuevo Mínimo: 1098
Nuevo Mínimo: 1091
Nuevo Mínimo: 1090
Nuevo Mínimo: 1089
Nuevo Mínimo: 1086
Nuevo Mínimo: 1085
Nuevo Mínimo: 1084
Nuevo Mínimo: 1083

Por lo que la sensibilidad sería: 2g / (1649-1083) = 0,003533- Por hoja de datos la sensibilidad debería ser 0,0039

Así puedo repetir con cada eje para calcular cada sensivilidad. Incluso lo ideal sería calibrar 10 veces y hacer un promedio de las sensivilidades obtenidas.

También estoy notando que debería trabajar en alguna GUI para ver los datos que manda el uC. El hyperterminal queda chico para esto. Para la calibracion lo ideal sería ver los datos RAW y el mínimo encontrado así podemos ver si estamos moviendo el sensor más cerca o más lejos del mínimo...

Bien, el tema es que cuando cargué los datos de calibracion del acelerómetro en el programa que mide el ángulo con el acelerómetro y con el gyróscopo tengo unos 5 grados de diferencia. Por lo que supongo el gyro debe tener una pequeña variacion en su sensivilidad también.
El tema que calibrar el giro es un poco más complicado, ya que hay que ponerlo a girar a velocidad constante y encima hay que alinear bien el eje del motor con el eje del gyro que quiero medir, tienen que ser perfectamente paralelos (los ejes).... en fin, lo que puedo hacer es suponer que el acelerómetro está bien calibrado y corregir el giro para que las mediciones sean iguales.....

Haceindo esto tengo que las sensivilidades en los ejes del Gyro pasan de 0.07 teóricos a 0.077.

Con esos valores obtengo el siguiente resultado:



Como se puede observar las gráficas tienen casi el mismo punto máximo y coinciden bastante bien...

Bueno, con estoy creo que doy por cerrado el tema de los acelerómetro, a no ser que alguien quiera ver algo más.
Quedaría por ver el tema de la fusión de los datos con el gyro que lo pondré en otro post.

Saludos!
-
Leonardo Garberoglio

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 326
Re: Acelerómetros - UAV's
« Respuesta #16 en: 27 de Enero de 2014, 19:15:38 »
Una consulta que tengo, como haces para visualizar los datos en EXCEL...tenés por ahí el macro que estás usando ?

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Acelerómetros - UAV's
« Respuesta #17 en: 27 de Enero de 2014, 19:30:17 »
Una consulta que tengo, como haces para visualizar los datos en EXCEL...tenés por ahí el macro que estás usando ?

Es otro tema pendiente... reniego un monton a la hora de hacer un gráfico. Lo que hago es loguear con el hyperterminal en un archivo de texto plano separado por tabulacion. Abro ese archivo en excel y hago el gráfico a mano....
Te puedo pasar un excel con el gráfico y los datos, pero no sé si te servirá.

Estoy trabajando con c# y un control zedgraphic para graficar en tiempo real, pero el tema de los delegados en C# me está matando...

Saludos!
-
Leonardo Garberoglio

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Acelerómetros - UAV's
« Respuesta #18 en: 27 de Enero de 2014, 19:37:42 »


Estoy trabajando con c# y un control zedgraphic para graficar en tiempo real, pero el tema de los delegados en C# me está matando...



dentro de c# podrías usar los objetos del tipo "chart", yo asi realicé las graficas en tiempo real
"Nada es imposible, no si puedes imaginarlo"

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 326
Re: Acelerómetros - UAV's
« Respuesta #19 en: 27 de Enero de 2014, 20:33:24 »
Citar
Es otro tema pendiente... reniego un monton a la hora de hacer un gráfico. Lo que hago es loguear con el hyperterminal en un archivo de texto plano separado por tabulacion. Abro ese archivo en excel y hago el gráfico a mano....

Gracias por la info !

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Acelerómetros - UAV's
« Respuesta #20 en: 27 de Enero de 2014, 21:51:14 »


Estoy trabajando con c# y un control zedgraphic para graficar en tiempo real, pero el tema de los delegados en C# me está matando...



dentro de c# podrías usar los objetos del tipo "chart", yo asi realicé las graficas en tiempo real

Si, es cierto. Pero use el control que use está el tema de los delegados, no? digo al leer datos con el puerto y querer modificar controles...

Saludos!
-
Leonardo Garberoglio