PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADIS16262 abfragen via SPI



Ritchie
04.05.2013, 10:46
Hallo Zusammen,

irgendwie bekomme ich von meinem ADIS16265 nur Blödsinn :confused: gemeldet.

So frage ich derzeit zu Testzwecken der Kommunikation die Temperatur und die Spannung mit ab.

Die Auswertung der Daten erfolgt wie folgt:


switch ( m_Active_Command )
{
case ADIS16265_GYRO_OUT:
if((SPIReceiveBuffer[0] & 0x20) > 0 ) // Do we have a negative value
{
iValue=((SPIReceiveBuffer[0] & 0x3F) * 256) + SPIReceiveBuffer[1];
iValue*=-1; // we have a negative value of angle speed
}
else
{
iValue=((SPIReceiveBuffer[0] & 0x3F) * 256) + SPIReceiveBuffer[1];
}
m_DigitalGyroRawValue = (double) (iValue * 0.7326) * (M_PI / 180.0);
break;

case ADIS16265_TEMP_OUT:
if((SPIReceiveBuffer[0] & 0xF) > 3 ) // Do we have a negative value
{
iValue=((SPIReceiveBuffer[0] & 0x3F) * 256) + SPIReceiveBuffer[1];
iValue= 4095 - iValue + 1;
}
else
{
iValue=((SPIReceiveBuffer[0] & 0x3F) * 256) + SPIReceiveBuffer[1];
}
m_ADIS16265_Temperature = 25.0 + (iValue * 0.1453);
break;

case ADIS16265_ANGL_OUT:
iValue=(SPIReceiveBuffer[0] & 0x3F ) * 256 + SPIReceiveBuffer[1];
m_DigitalOrientationAngle= (double)(iValue * 0.03663) * (M_PI / 180.0);
break;

case ADIS16265_GYRO_OFF:
break;
case ADIS16265_ALM_CTRL:
m_ADIS16265_AlarmControl=SPIReceiveBuffer[0] * 256 + SPIReceiveBuffer[1];
break;
case ADIS16265_GLOB_CMD:
break;

case ADIS16265_SUPPLY_OUT:
iValue= (int) ((SPIReceiveBuffer[0] & 0x0F) * 256 + SPIReceiveBuffer[1] );
m_ADIS16265_Voltage = ((double)(iValue * 0.00183));
break;

}


Folgende Anzeigen habe ich für die Wert


Spannung: 1.87392 Volt statt ca. 4.96 Volt
Temperatur: -1314.084 Grad Celsius statt irgendwas um die 20-25 Grad.
Winkelangabe: 8.51055 Grad statt 0, da noch nicht bewegt und keine Vorgaben
Alarm Status: 0111010000000000 diese macht jedoch Sinn entsprechend der Dok.


Hat jemand das Teil am Rennen und kann mir einen Tip geben.


Gruss R.

Ritchie
04.05.2013, 14:10
So,

ich habe den Quellcode nochmals verändert



switch ( m_Active_Command )
{
case ADIS16265_GYRO_OUT:
if((SPIReceiveBuffer[0] & 0x20) > 0 ) // Do we have a negative value
{
iValue=((SPIReceiveBuffer[0] & 0x3) * 256) + SPIReceiveBuffer[1];
iValue*=-1; // we have a negative value of angle speed
}
else
{
iValue=((SPIReceiveBuffer[0] & 0x3) * 256) + SPIReceiveBuffer[1];
}
m_DigitalGyroRawValue = (double) (iValue * 0.7326) * (M_PI / 180.0);
break;

case ADIS16265_TEMP_OUT:
if((SPIReceiveBuffer[0] & 0xF) >= 0xE ) // Do we have a negative value
{
iValue=((SPIReceiveBuffer[0] & 0xF) * 256) + SPIReceiveBuffer[1];
iValue= 4095 - (iValue + 1);
}
else
{
iValue=((SPIReceiveBuffer[0] & 0x3) * 256) + SPIReceiveBuffer[1];
}

m_ADIS16265_Temperature = (double) 25.0 + (double) (iValue * 0.1453);
break;

case ADIS16265_ANGL_OUT:
iValue=(SPIReceiveBuffer[0] & 0x3 ) * 256 + SPIReceiveBuffer[1];
m_DigitalOrientationAngle= (double)(iValue * 0.03663) * (M_PI / 180.0);
break;

case ADIS16265_GYRO_OFF:
break;
case ADIS16265_ALM_CTRL:
m_ADIS16265_AlarmControl=SPIReceiveBuffer[0] * 256 + SPIReceiveBuffer[1];
break;
case ADIS16265_GLOB_CMD:
break;

case ADIS16265_SUPPLY_OUT:
iValue= (int) ((SPIReceiveBuffer[0] & 0xF) * 256 + SPIReceiveBuffer[1] );
m_ADIS16265_Voltage = ((double)(iValue * 0.00183));
break;



Jetzt zeigen die Werte deutlich bessere Werte.

Temperatur -> 28.051 Grad
Spannung: 4,92636 Volt
Winkelwert: 0.2908 Grad in rad


Jetzt besteht nur noch das Problem, das zeitweise die Werte von normalen Werten auf seltsame Werte springen.

Hat jemand eine Idee, was hier noch passieren kann.

Gruss R.