- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 2 von 2

Thema: ADIS16262 abfragen via SPI

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332

    ADIS16262 abfragen via SPI

    Anzeige

    Praxistest und DIY Projekte
    Hallo Zusammen,

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

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

    Die Auswertung der Daten erfolgt wie folgt:
    Code:
                    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.
    Kaum macht man es richtig, schon funktioniert's ...

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    So,

    ich habe den Quellcode nochmals verändert

    Code:
                    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.
    Kaum macht man es richtig, schon funktioniert's ...

Ähnliche Themen

  1. Drehsensor abfragen
    Von Fleix im Forum Asuro
    Antworten: 4
    Letzter Beitrag: 25.11.2010, 15:53
  2. SRF08 abfragen
    Von ACU im Forum Robby RP6
    Antworten: 6
    Letzter Beitrag: 25.12.2007, 22:48
  3. LDR´s abfragen?
    Von Oliver Preußger im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 29.03.2006, 22:23
  4. Bit's abfragen
    Von Looser im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 22.10.2005, 21:05
  5. Eingänge Abfragen
    Von Panzer im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 10.08.2005, 13:11

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress