Hallo. Hat sich von euch schon mal jemand mit einem Zeilensensor der Fa Taos beschäftigt? Ich hab hier aktuell den Sensor TSL3301−LF, das ist ein Zeilensensor mit 102 Pixeln und integriertem A/D Wandler und serieller Datenschnittstelle. Ich betreibe den Sensor an einen PIC18F14K50 und sende die Daten via serieller Schnittstelle an den PC. Das funktioniert soweit auch ganz gut. Mein Problem ist folgendes: Beleuchte ich den Sensor sehr stark, geht er wie zu erwarten in Sättingung. Klebe ich den Sensor jedoch ab, so dass kein Licht auf den Sensor fällt, bekomme ich zufälliges wildes Gezappel zwischen 0 und 255. Sieht aus wie sehr sehr starkes Rauschen. Das gleiche auch bei einer abdunklung, also wenn der Sensor nicht übersteuert wird. Die Beleichtungszeit hat auch einen erkennbaren Einfluss, das "Rauschen" bleibt jedoch. Der Sensor ist relativ einfach aufgebaut, so dass ich nicht viele Einstellungsmöglichkeiten hab, daher bin ich ziemlich ratlos. Hat von euch jemand eine Idee? Gruß Markus MAIN: Reset_TWI(); //Reset Photosensor Start_Int(); //Start Integration Delay_Integration_Time(23); // 100µs Belichtungszeit abwarten Stopp_Int(); //Stopp Integration and start sample results Read_Pixels(); *************************** void Reset_TWI(void) { SDO = 0; // Clear SDO Pulse_SCK(30); // Pulse SCLK 30 times // Interface Reset SDO = 1; // Set SDO Pulse_SCK(10); // Pulse SCLK 10 times Send_Byte(0x1B); // Send RESET Command Pulse_SCK(5); // Pulse SCLK 5 times // Register Initialisation Send_Byte(0x5F); // Write to Mode Register Send_Byte(0x00); // Clear Mode Register Send_Byte(0x40); // Offset 34 left pixels Send_Byte(0x00); // Offset = 0 Send_Byte(0x41); // Gain 34 left pixels Send_Byte(0x00); // Gain = 1 Send_Byte(0x42); // Offset middle 34 pixels Send_Byte(0x00); // Offset = 0 Send_Byte(0x43); // Gain middle 34 pixels Send_Byte(0x00); // Gain = 1 Send_Byte(0x44); // Offset right 34 pixels Send_Byte(0x00); // Offset = 0 Send_Byte(0x45); // Gain right 34 pixels Send_Byte(0x00); // Gain = 1 }//end Reset_TWI void Start_Int(void) { Send_Byte(0x08); // Start Integration Pulse_SCK(22); // Pulse SCK 22x }//end Start_Int void Stopp_Int(void) { Send_Byte(0x10); // stopp Integration Pulse_SCK(5); // Pulse SCK 5x }//end Stopp_Int void Read_Pixels(void) { unsigned int Pixels; unsigned char Buffer = 0; Send_Byte(0x02); // Start reading pixels do // wait until AD conversion is finished { Pulse_SCK(1); }while(SDI == 1); for(Pixels = 0; Pixels <102; Pixels++) { // reading value and send to PC Buffer = 0; Buffer = ReceiveValue(); // get value of pixel while(!TXSTAbits.TRMT); // wait until Transmitter is ready TXREG = Buffer; // send value } }//end void Read_Pixels unsigned char ReceiveValue(void) { unsigned int BitCount; unsigned char PixelValue; PixelValue = 0x00; for(BitCount = 8; BitCount > 0; BitCount--) { Pulse_SCK(1); // get next bit of sensor PixelValue = PixelValue << 1; // shift pixel value left // store pixel value in variable if(SDI == 1) { PixelValue |= 0x01; } else { PixelValue &= 0xFE; } } Pulse_SCK(2); // wait for Stopp and start bit return(PixelValue); }//end ReceiveValue
Hat der Sensor eine AGC, die vom Mittelwert der letzten Messung gesteuert wird? mfg mf
Nein, hat er nicht. Den Gain kann man ausschließlich manuell, vor der Messung, einstellen.
Hallo Markus, wollte mal hören ob du ein Lösung gefunden hast. Ich starte nun auch mit einem Projekt wo dieser Chip zum Einatz kommt, eventuell können wir uns da ja austauschen. Bin gerade dran die optik zu testen. Gruß Holger
Hallo Holger. Ja ich hab die Lösung gefunden: Der Sensor sendet mir für jeden Pixel ein Byte an Daten. Die Daten werden Bit für Bit seriell übertragen. Das LSB (niederwertigste Bit) zuerst und so weiter. Ich hab das erste Bit vom Sensor empfangen und nach links geshiftet, do dass nach auslesen des Sensors das LSB ganz links stand: LSB MSB Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 Nun habe ich das ganze geändert, beim Empfangen wird nun ganz links gespeichert und dann nach rechts geschoben. Dann Stehen die Messwerte richtig herum im Ergebnis. Ich hab aber noch ein weiteres Problem, der Sensor ist unheimlich empfindlich. Der Messbereich endet bei 18Lux. Das ist für mich viel zu wenig. Meines Erachtens kann das nur von einer zu langen Belichtungszeit her kommen. Die Pause nach dem Start der Integration (0x08) hab ich schon auf 9,3µs gekürzt. Bist duch auf die gleichen Probleme gestoßen, oder liegt es an meiner Implementierung? Vielleicht fällt dir an meinem Code von oben noch was auf warum ich so einen kleinen Messbereich habe. Meiner Meinung nach kann es eigentlich nur an einer zu langen Belichtungszeit liegen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.