Lichtquelle mit LEDs blitzen lassen, Timer-Event? C++
-
Hello!
Für meine Abschlussarbeit habe ich eine Lichtquelle mit LEDs, die in 20 ansteuerbare Kanäle unterteilt ist.
Die Ansteuerungssoftware ist in C++ geschrieben. Ich kann die Lichtquelle über den Befehl ansteuern:led-> setChannelIntensity(channelID, intensity)Das funktioniert. Der entsprechende Kanal wird mit einer bestimmten Intensität dauerhaft angesteuert und der LED-Kanal leuchtet.
Für meinen Versuch muss die Lichtquelle jedoch nicht dauerhaft leuchten, sondern sie darf nur für eine vorgegebene Zeit aufblitzen.
Der Befehl dazu soll heißen:led-> setChannelIntensity(channelID, intensity, time)Für die Dauer von 'time' (mindestens 40 Millisekunden), soll der entsprechende Kanal mit der Intensität aufblitzen.
Bis jetzt hatte ich es folgendermaßen mit der Sleep-Funktion gelöst:channelID = 5; intens = 1000; time = 50 //milliseconds led->setChannelIntensity(channelID, intens); Sleep(time); led->setChannelIntensity(channelID, 0);Das funktioniert, ist jedoch leider zu ungenau. Es entsteh immer einer Abweichung von ca. +/- 5 Prozent. Wie kann ich das Blitzen der Lichtquelle implementieren, so dass die Blitzzeit nahezu immer gleich ist? Mir wurde gesagt, dass ich es mit Event-Timer in C++ machen kann. Nur leider kapiere ich das nicht. Ich habe mir im Internet Beispiele angesehen, aber das sieht schon sehr kompliziert aus.
Ich bin leider kein guter Programmierer und kenne mich nicht gut damit aus.
Kann mir irgendwer helfen und hat vielleicht ein Code Beispiel für mich?Das wäre total super. Danke.
-
Hallo baronsocke,
C++ kennt weder Events noch Timer. Welches Betriebssystem benutzt Du?
Vielleicht hilft boost.asio; ich melde mich ggf. heute Abend noch mal.Gruß
Werner
-
Ich weiß nicht ob dir das genau genug ist:
#include <iostream> #include <chrono> #include <thread> void wait() { led->setChannelIntensity(channelID, intens); std::chrono::milliseconds seconds( 2000 ); std::this_thread::sleep_for( seconds ); led->setChannelIntensity(channelID, 0); }
-
Oh Dankeschön! Funktionieren tut es. Ich werde gleich mal mit dem Oszilloskop messen, wie genau die Funktion arbeitet...
-
cppvoid schrieb:
Ich weiß nicht ob dir das genau genug ist:
#include <iostream> #include <chrono> #include <thread> void wait() { led->setChannelIntensity(channelID, intens); std::chrono::milliseconds seconds( 2000 ); std::this_thread::sleep_for( seconds ); led->setChannelIntensity(channelID, 0); }Hey vielen Dank! Die ersten Messungen haben bei 10maligem Blitzen eine Abweichung von ca. 0,5 %!!!
Damit kann ich schon mal arbeiten.Vielen vielen Dank!!!
-
Lol.
Wieso misst du den Fehler im Prozent? Windows macht hier keinen nennenswerten prozentuellen Fehler, sondern einen absoluten.
Schreib Sleep(10000) hin und der prozentuelle Fehler wird gleich nochmal besser.std::this_thread::sleep_for verwendet intern ziemlich sicher auch nur Sleep.
-
Als ich es mit Sleep gemacht habe, zeigte der Trigger Ausschlag auf dem Oszilloskop immer veränderte Belichtungszeiten...
Jetzt nicht mehr.
-
-
@Swordfish
Danke.
Mal sehen wie oft ich noch Unsinn schreibe bis ich in meinen Schädel reinbekomme dass es Wait-Funktionen unter Windows gibt die genauer als Sleep sind...
-
Seit NT kann man unter Windows den Takt ändern mit dem der Scheduler arbeitet. Standard ist 16,5 ms. Kann man problemlos auf 1ms runter stellen.
#include <stdio.h> #include <Windows.h> #pragma comment(lib, "winmm.lib") ... timeBeginPeriod(1);Dann ist Sleep recht genau 1ms lang.
Unter Linux kannst du nanosleep verwenden.