Ich schreibe ein Programm, um mit einem TSL1401R-LF Linescan-Modul zu arbeiten. Es funktioniert, indem es ein 1 x 128-Pixel-Array einliest. Ich habe die Kamera zum Laufen gebracht und meine readPixels()
Methode kann die Pixel genau einlesen.
timming()
Ich bin jedoch gezwungen, eine Methode vor meiner Methode auszuführen, readPixels()
sonst schlägt das Programm fehl. Das timming()
macht ziemlich genau dasselbe wie die readPixels()
Methode, außer dass es die ausgegebenen Werte nicht speichert. Wenn ich es auskommentiere und nur benutze, readPixels()
wird mein Bild gesättigt und ich bekomme nur Werte von 1023, selbst wenn ein dunkles Objekt den Kameras im Weg ist.
Dies könnte sinnvoller sein, wenn Sie sich den tatsächlichen Code ansehen:
void timming()
{
digitalWriteFast(SI, HIGH);
delayMicroseconds(10);
digitalWriteFast(CLK, HIGH);
delayMicroseconds(10);
digitalWriteFast(SI, LOW);
delayMicroseconds(10);
digitalWriteFast(CLK, LOW);
delayMicroseconds(10);
for(int i = 0; i < 129; i++)
{
digitalWriteFast(CLK, HIGH);
delayMicroseconds(delayTime);
digitalWriteFast(CLK, LOW);
delayMicroseconds(delayTime);
}
}
void readPixels()
{
digitalWriteFast(SI, HIGH);
delayMicroseconds(10);
digitalWriteFast(CLK, HIGH);
delayMicroseconds(10);
digitalWriteFast(SI, LOW);
delayMicroseconds(10);
digitalWriteFast(CLK, LOW);
delayMicroseconds(10);
for(int i = 0; i < 128; i++)
{
digitalWriteFast(CLK, HIGH);
pixelsArray1[i]=analogRead(Cam1Aout);
pixelsArray2[i]=analogRead(Cam2Aout);
pixelsArray3[i]=analogRead(Cam3Aout);
delayMicroseconds(delayTime);
digitalWriteFast(CLK, LOW);
delayMicroseconds(delayTime);
}
digitalWriteFast(CLK, HIGH);
delayMicroseconds(delayTime);
digitalWriteFast(CLK, LOW);
delayMicroseconds(delayTime);
delayMicroseconds(20);
}
TL;DR
Grundsätzlich frage ich, ob es eine Möglichkeit gibt, mein Programm zum Laufen zu bringen, ohne die timming()
Methode verwenden zu müssen.
Datenblatt: http://datasheet.elcodis.com/pdf/58/61/586128/tsl1401r-lf.pdf
Ich vermute, dass die Antwort ganz einfach ist: Führen Sie readPixels() zweimal schnell hintereinander aus. Wie es aussieht, wenn Sie timing() nicht ausführen, wenn Sie readPixels() ausführen, hat der 1401 dort für eine unbekannte (aber sehr lange) Zeit integriert, sodass Ihre Pixelwerte natürlich gesättigt sind. timing() setzt also die Pixelintegratoren auf Null zurück, und readPixels() kann dann ordnungsgemäß Daten erfassen. Das erste Ausführen von readPixels() hat jedoch denselben Effekt.
Wenn Sie dies tun, müssen Sie natürlich den ersten Satz von Werten ignorieren, der von readPixels() erzeugt wird, da sie einheitlich 1023 sind.
Die Antwort auf Ihre Titelfrage lautet also - natürlich.
readPixels()
damit die Werte nicht gesättigt werden? Wissen Sie auch, wovon das Datenblatt spricht, wenn es sagt, dass die Integrationszeit am positiven HOLD-Impuls endet.readPixels()
Methode nicht einfach einen Impuls an den SI senden?
user_1818839
sgmm
user_1818839
sgmm
delayTime
Verkleinern immer niedrigere Werte bekam. Wenn dietimming()
Methode also nur darin besteht, die Integrationszeit zu erhöhen, sollte ich keinen gesättigten Wert erhalten. Rechts? Tut mir leid, wenn ich es nicht verstehe, dies ist mein erster Timer, der mit einer Kamera arbeitet.Richard Crowley
user_1818839
timming()
) vermutlich viel schneller und ergibt eine viel kürzere Integrationszeit (keine Sättigung) als die vorherigereadPixels()
Funktion.sgmm
sgmm
Richard Crowley
sgmm
Richard Crowley
sgmm