TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: alSources en 10 de Marzo de 2013, 09:53:29
-
Hola amigos!
Decir que soy novato en el mundo de la electrónica y que gracias a éste foro he aprendido mucho sobre los PIC. En mi proyecto he decidido usar el 18f4550, pues era de los pocos que poseen puerto USB, imprescindible para programar desde ordenador portátil sin RS232.
El objetivo del proyecto es comparar la inclinación de dos placas de metal (no es necesaria mucha precisión, y como máximo serán 30º); por esto, pensé en comparar las lecturas obtenidas de dos acelerómetros. Pero aquí es donde empezaron mis dudas de novato. A grandes rasgos, os las explico:
1. Utilizo acelerómetros digitales o analógicos?
2. Modelo de acelerómetro (podeís recomendarme?)
He visto los tutoriales del foro de acelerómetros, como soldarlos, como interpretar los datos, etc...pero no encontré ningún caso en el que utilizara dos.
En el caso de utilizar analógicos...pensé que podía utilizar interrupciones para interpretar las lecturas, pero tampoco tengo muy claro a que se refiere los canales del ADC de mi PIC.
Saludos
-
Analógicos o digitales, es a gusto del consumidor, si los eliges analógicos, tu PIC tendrá que disponer de ADC y al menos 6 entradas analógicas (x, y, z para cada acelerómetro), los digitales se suelen controlar por I2C o SPI.
Yo los utilizo digitales, en concreto el ADXL345 controlado por SPI (también se pueden controlar por I2C), tienen 2 patitas para interrupciones.
Como analógico, podrías usar el MMA7361.
No veo inconveniente para que gestiones varios acelerómetros con un PIC, yo tengo un diseño con 3 acelerómetros ADXL345, controlados por SPI.
Hay muchos más modelos de acelerómetros, puedes mirar en Amidata, busca por ADXL* o MMA7* y te saldrán un puñado.
-
Hola!
Muchas gracias por tu ayuda! Mi PIC tiene cuatro entradas analógicas....pero creo q es suficiente pues en el proyecto usaré acelerómetros de dos ejes. Gracias por aconsejarme los modelos!
Por cierto, me podrías pasar la parte de tu diseño donde lees los datos de los acelerómetros? :oops:
Gracias de antemano!
-
Si te interesa utilizar el MMA7455 que es digital, puedes probar este codigo :
#define MMA7455_ADR_WRITE 0x3A //Adreça de escritura
#define MMA7455_ADR_READ 0x3B // " de lectura
#define MMA7455_REG_CTL 0x16 //Registre de control
#define MMA7455_MODE 0x05 //0b00000101 2G >> 0bxxxx01xx Mode >> 0bxxxxxx01
#define MMA7455_X_REG 0x06 //Eix X Registre 8bit
#define RADIANS_GRAUS 57.295781 //57.2958
void WriteReg(Byte Adr, Byte Reg, Byte Val) ;
Byte ReadReg(Byte Adr, Byte Reg);
struct MMA7455_Struct
{
signed int16 X;
signed int16 Y;
signed int16 Z;
signed int16 X_0;
signed int16 Y_0;
signed int16 Z_0;
float32 Ang_X;
float32 Ang_Y;
} Acc;
void MMA7455_Inici(void)
{
i2c_start();
i2c_write(MMA7455_ADR_WRITE);
i2c_write(MMA7455_REG_CTL);
i2c_write(MMA7455_MODE);
i2c_stop();
}
void MMA7455_Llegir(void)
{
signed int8 X,Y,Z;
i2c_start();
i2c_write(MMA7455_ADR_WRITE);
i2c_write(MMA7455_X_REG);
i2c_start();
i2c_write(MMA7455_ADR_READ);
X=i2c_read();
Y=i2c_read();
Z=i2c_read(0);
i2c_stop();
Acc.X=Y;
Acc.Y=X;
Acc.Z=Z;
}
void MMA7455_Zero(void)
{
signed int16 J,N;
signed int16 ACu_X=0;
signed int16 Acu_Y=0;
signed int16 Acu_Z=0;
N=100;
for (J=0; J < N; J++)
{
MMA7455_Llegir();
Acu_X+=Acc.X;
Acu_Y+=Acc.Y;
Acu_Z+=Acc.Z;
delay_us(1000);
}
Acu_X/=N;
Acu_Y/=N;
Acu_Z/=N;
Acc.X_0=-Acu_X;
Acc.Y_0=-Acu_Y;
Acc.Z_0=63 - Acu_Z;
Acc.X=0;
Acc.Y=0;
Acc.Z=0;
}
void MMA7455_Angle(void)
{
float Xg,Yg,Zg,R;
MMA7455_Llegir();
Acc.X+=Acc.X_0;
Acc.Y+=Acc.Y_0;
Acc.Z+=Acc.Z_0;
Xg=Acc.X;
Yg=Acc.Y;
Zg=Acc.Z;
R=sqrt((Xg * Xg) + (Yg * Yg) +(Zg * Zg));
Xg/=R;
Yg/=R;
Zg/=R;
Acc.Ang_X=atan2(Xg,Zg) * RADIANS_GRAUS;
Acc.Ang_Y=atan2(Yg,Zg) * RADIANS_GRAUS;
}
Para iniciar el acelerometro utiliza la funcion MMA7455_Inici(void) y despues con MMA7455_Angle(void) tienes los angulos en
float32 Ang_X y float32 Ang_Y
Saludos,
Miquel