Moinsen,
Sorry, wenn ich hier jetzt auch einen Nachtrag technischen Ursprungs anhängen muss.
Es ist zwar deinerseits keine Aussage gemacht worden mit welchem PI und welchem ADC du das durchführen willst, dennoch gebe ich zu bedenken, dass du hier möglicher Weise gewaltigen einem logischen bzw. Ablaufproblem aufgesessen bist
Wenn du davon sprichst, dass du in 100 mSek 2.000 ADC Werterfassungen machen möchtest, bedeutet das auch, dass du entsprechend in einer Sekunde das 10-fache, also 20.000 Werterfassungen und Wertspeicherungen hinbekommen musst.
Das wiederum heißt, dass du erst einmal erfassen musst wieviel Zeit du für einen Meßvorgang benötigst.
Ich nehme jetzt hier mal eine Standard-Routine aus der GPIOZERO- Bibliothek und zeige dir mit diesem Codebeispielen auf wie du ermitteln kann was du wirklich an Einzel- / Blocksamples schaffen könntest.
from gpiozero import MCP3008
from time import time
adc = MCP3008(0)
t0 = time()
value = adc.raw_value
te = time()
print('Samplezeit Einzelmessung: %1.5f sek.' %(te - t0))
samples = []
stopp_time = time() + 1
while time() <= stopp_time:
samples.append(adc.raw_value)
print('RAW Sample / sek = %6d' %len(samples))
samples.clear()
stopp_time = time() + 1
while time() <= stopp_time:
samples.append(adc.value)
print('Sample / sek = %6d' %len(samples))
samples.clear()
stopp_time = time() + 1
while time() <= stopp_time:
samples.append(adc.voltage)
print('Voltage Sample / sek = %6d' %len(samples))
Alles anzeigen
Diesen Programmcode kannst du auch für deinen ADC nutzen um zu ermitteln was theoretisch möglich wäre.
Aber egal was ich mach oder Anstelle, egal ob SPIDEV, oder RPI.GPIO für einen SPI ADC, oder SMBus für einen I²C ADCs ich schaffe es beim besten willen nur mit Mühen !
Erstens: via time() und sleep() den Programmlauf so einzustellen, dass man immer und immer wieder in der Vorgabezeit ( hier die genannten 100 mSek ) die Sampling-Anzahl genau auf einen festen und vor allem gleichen Wert einzustellen,ist fast aussichtslos ! Einmal erreicht man die Sollvorgabe von X-Messungen pro Sekunde, dann wieder nicht.
Zweitens: Mit Ausnahme der Verwendung von SPIDEV und dem passenden CODE für den entsprechenden ADC erreicht man weder mit einem I²C ADC noch mit dieser GPIOZERO Variante auch nur Ansatzweise mit der Programmiersprache Python auf einem , hier in diesem Beispiel Testaufbau von mir benutzen PI 3B+, auch nur ansatzweise die von dir gewünschte Sampling Rate von 2000 Sample / 100 mSek.
Um eine Sampling Rate einstellen zu können, müsstest du im Vorfeld ermitteln, welche Zeit für eine Einzelmessung benötigt wird, und dann die Pausenzeit sleep() so einstellen, dass du wirklich auf diese Anzahl Einzelmessungen pro Zeiteinheit kommst.
Da das RasPi aber nicht echtzeitfähig ist, sowie wenn du dieses Testprogramm mehrfach, auch abgewandelt auf deinen ADC-Abfrage-Code mehrfach und wiederholt laufen lassen würdest, wirst du merken, dass das PI mit dieser Aufgabe eine exakte Anzahl von Einzelmessungen pro Zeiteinheit hinzubekommen, vollkommen überfordert, oder ungeeignet ist.
Hier mal das Ergebnis mit einem RasPi 3B+ einem MCP3008 via SPI und der GPIOZERO Bibliothek:
Damit rückt dein Vorhaben von 2000 Messungen / 100 mSek mit dieser Methode in weite Ferne.
Zudem noch dieser kleine Literatur-Tipp. Hier kannst du, falls du auf diese Vertreter die auch von GPIOZERO unterstützt werden anders ansprechen, SPIDEV, RPI.GPIO und kannst deine eigenen Erfahrungen machen mit der Ausführungszeit der unterschiedlichen Codes. Zudem kannst du das als Grundlage mit den Datasheets dazu nehmen, falls abweichend, für deinen ADC einen effizienteren Abfragecode zu erstellen.