- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: Ansteuerung eines SparkFun AS7265x Triad Sensors

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    887
    Anzeige

    E-Bike
    Aber da werd Ich auch noch drauf kommen.
    Dieser Sensor scheint auch so ein Exemplar mit Code statt Doku zu sein. Das wird jetzt immer häufiger.
    Im Git (https://github.com/sparkfun/SparkFun...rary/tree/main) bekommst Du dafür recht einfache Beispiele.

    Das ist zwar alles Arduino, aber den eigentlichen Knoten (das TWI-Handling) hast Du ja jetzt mit dem Lesen/Schreiben der virtuellen Register zumindest grob gelöst.

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.213
    Die Lösung fand sich in der Datenblattsammlung von AMS ( OSRAM ).
    Dort sind auch die einzelnen Sequenzen zum Lesen und Schreiben beschrieben.
    Sparkfun hat da anscheinend abgekupfert, aber nicht wirklich gut.
    Was noch zu sagen wäre: Nach der Auswahl des Chips und der Sequenz zum Sampeln aller 6 Werte eines Chips ist eine Delay Zeit von ( Samplezyklen * 2,8 * 1,5ms ) einzufügen, sonst werden nur 0x00 oder falsche Werte ausgelesen.
    Bei mir funktioniert es nun so einigermassen!


  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    887
    Hmmm?!?

    Das ist aber nicht die ominöse Delay-Konstante aus dem Quellcode?
    Code:
    #define AS7265X_POLLING_DELAY 5 //Amount of ms to wait between checking for virtual register changes
    Haben die so ziemlich in jede Registerzugriffsroutine mit einem Delay() reingeknallt.

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.213
    Das ist aber nicht die ominöse Delay-Konstante aus dem Quellcode?
    Nein, diese Polling Konstante wird in der while(1) schleife beim Auslesen des Status Registers benutzt um den Prozess zu verlangsamen.
    Ich hab da "_delay_ms(AS7265X_POLLING_DELAY);" draus gemacht.
    Beim Auslesen der Sensorwerte müssen die Anzahl der gewünschten Samples * 2,8 und dann noch mal 1,5 ( also *4,2 ) in ms genommen werden.
    Ich hab's der Einfachheit halber gleich mal 5 genommen.
    Die Sequenz zum Auslesen der 3 Sensoren sieht dann so aus:
    Code:
    void getchanneltop(void)
    {
        uint8_t pointer = 0;
        uint8_t buffer = 0;
        //Readout Data
        selectDevice(AS72651_NIR);
        setMeasurementMode(AS7265X_MEASUREMENT_MODE_6CHAN_ONE_SHOT); //One-shot reading of VBGYOR
        _delay_ms(AS7265X_INTERGRATION_TIME*5);
        for(uint8_t i=0x08;i<0x14;i+=2)  //Für i hab Ich dann gleich die richtigen Register Adressen benutzt.
        {
            //selectDevice(AS72651_NIR);
            buffer=i2m_AS72xx_topread(i);
            Top_read[pointer]=buffer;
            Top_read[pointer]=(Top_read[pointer]<<8);
            buffer=i2m_AS72xx_topread(i+1);
            Top_read[pointer]|=buffer;
            pointer++;
        }
        //Readout Data
        selectDevice(AS72652_VISIBLE);
        setMeasurementMode(AS7265X_MEASUREMENT_MODE_6CHAN_ONE_SHOT); //One-shot reading
        _delay_ms(AS7265X_INTERGRATION_TIME*5);
        for(uint8_t i=0x08;i<0x14;i+=2)
        {
            //selectDevice(AS72652_VISIBLE);
            buffer=i2m_AS72xx_topread(i);
            Top_read[pointer]=buffer;
            Top_read[pointer]=(Top_read[pointer]<<8);
            buffer=i2m_AS72xx_topread(i+1);
            Top_read[pointer]|=buffer;
            pointer++;
        }
        //Readout Data
        selectDevice(AS72653_UV);
        setMeasurementMode(AS7265X_MEASUREMENT_MODE_6CHAN_ONE_SHOT); //One-shot reading
        _delay_ms(AS7265X_INTERGRATION_TIME*5);
        for(uint8_t i=0x08;i<0x14;i+=2)
        {
            //selectDevice(AS72653_UV);
            buffer=i2m_AS72xx_topread(i);
            Top_read[pointer]=buffer;
            Top_read[pointer]=(Top_read[pointer]<<8);
            buffer=i2m_AS72xx_topread(i+1);
            Top_read[pointer]|=buffer;
            pointer++;
        }
    
    }
    Das Ganze war schon ein längerer Kampf.
    Was immer noch passiert ist, das der Sensor ab und zu kein ACK auf dem I2C bus sendet, aber da hab Ich dann Zeitschleifen rein gemacht, damit der Controller nicht blockiert wird.
    Watchdog wäre auch ein Alternative gewesen, allerdings würde der Controller die komplette Initialisierung durchlaufen und das wollte Ich vermeiden.

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Normalisierung von Daten eines Beschl.sensors
    Von Snaper im Forum Sensoren / Sensorik
    Antworten: 8
    Letzter Beitrag: 05.08.2011, 18:22
  2. Genauigkeit eines Sensors
    Von Student123 im Forum Sensoren / Sensorik
    Antworten: 8
    Letzter Beitrag: 04.08.2011, 14:03
  3. Wie berechne ich die Temperatur eines NTC Sensors ?
    Von Shadow992 im Forum Sensoren / Sensorik
    Antworten: 7
    Letzter Beitrag: 27.05.2010, 14:41
  4. Antworten: 13
    Letzter Beitrag: 18.02.2006, 16:19
  5. Anschluss eines Sensors an einen PCF8574
    Von batti112 im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 16.03.2005, 01:01

Berechtigungen

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

Labornetzteil AliExpress