Hallo,
ich möchte Werte, die mehr oder weniger zyklisch eintreffen, summieren
und nach ner bestimmten Summe einen genauen Impuls ausgeben.
Auf welche Weise/Art kann ich einen Impuls mit der genauesten Breite am
besten erzeugen? Wahrscheinlich Pin toggeln, aber mit welchen Ablauf am
besten?
Das eintreffen der Werte sollte bestimmt irgendwie durch einen Interrupt
registriert werden und die Akkumulation durchführen. Ist auch eher
nebensächlich.
Wenn ich dann eine bestimmte Summe erreicht habe. Will ich eine Funktion
starten die mir einen Impuls erzeugt.
Ich würde das in der Form machen:
-> PIN high setzen
-> Delay (also Timer starten für Impulsbreite)
-> PIN low setzen?
Oder würdet ihr das Problem anders angehen?
Wie bekomme ich es hin, das der Impuls so schnell wie möglich und so
genau wie es mein µC hergibt erzeugt wird. Ich gehe schon davon aus das
die Routine abgeschlossen ist bevor ein neuer Wert hinzukommt. Auch
sollte ja die Routine falls die Akkumulationsmenge doppelt überschritten
wurde zweimal ausgeführt werden oder zwei Pulse erzeugen. Was wäre da
schneller?
Verzeiht wenn meine Frage sehr unkonkret gestellt ist, da mich
interessiert wie ihr als Experten das Problem angehen und was ihr
beachten würdet.
Kann mein Ansatz zu einem Ziel führen oder bin ich schon vom Weg ab?
Georg schrieb:> Auf welche Weise/Art kann ich einen Impuls mit der genauesten Breite am> besten erzeugen?
Mit einem (Hardware-)Timer. Davon hat jeder ernstzunehmende µC einen
bzw. mehrere. Stichworte: output compare, waveform generator.
> Ich würde das in der Form machen:> -> PIN high setzen> -> Delay (also Timer starten für Impulsbreite)> -> PIN low setzen?
Typische Anfängerdenkweise. Verzögerungen per Software-Delay sind
niemals genau. Schon gar nicht, wenn nebenher Interrupts stattfinden
können. Ein Hardware-Timer schafft das auf einen Taktzyklus genau.
Vielen Dank für die Antworten und Denkanregungen.
Ulrich F. schrieb:> Wie Genau muss es?> Wie lang sind die Pulse?
Also mir geht es darum gerade die Grenzen der Genauigkeit
herauszufinden.
Die Werte treffen im ca. sekündlich ein. Dadurch das die Breite frei
wählbar sein soll und es ab einer gewissen Summe auch zu zwei Pulsen
kommen soll. Muss alles gehändelt werden können. Evetuell sogar dann so
langsam wie möglich um Energie zu sparen.
Das bedeutet ja schonmal das 2 Pulse, grob gesagt, nicht mehr als 500 ms
sein dürfen und so weiter.
Kann ich davon ausgehen, dass ich den Hardware Timer in meiner
Interruptroutine zur Impulserzeugung benutze und Berechnungen
nebenläufig weiter gehen? Oder muss ich das für meine Grenzbetrachtungen
mit einbeziehen?
Axel Schwenke schrieb:> Typische Anfängerdenkweise.
Dacht ich mir. Aber im Forum gab es doch auch mal eine Diskusion über
Delay-Funktionen. Gehen diese Routinen nicht auf den Systemtakt zurück?
Max D. schrieb:> Zum Thema "genauer Puls" lies mal das hier:> http://hackaday.com/2015/03/24/avr-hardware-timer-tricked-into-one-shot/
Vielen Dank ich glaube nach sowas habe ich gesucht. Ein jitter-freier
Puls hört sich gut an.
Verstehe ich das erstmal Richtig einen Timmer ständig zählen zu lassen
und ihn dann wenn ich den Impuls brauche sein Signal so umzuleiten, dass
mein Impuls gestartet wird umd dann genau nach meiner gewünschten Breite
wieder abfällt.
Es ist ja für einen AVR geschrieben. Werde ich wenn ich wenn ich es
versuche auf einem ARM zu implemetieren auf Probleme stossen, die ich
als Anfänger nicht sehen kann?
Also ich erzeuge aktuell bis zu 13ns Impulse mit einem STM32. Du kannst
PWM im single shoot verwenden. Bzw den Timer.
Je nach Anforderungen, wie der Impuls aussehen darf (Rechteck bekommt
der nur bis 50-100ns hin) würde ich einfach einen µC nehmen.
Der STM32F7 kann theoretisch bis auf 5ns den Timer auflösen. Daneben
gibts von Freescale bessere Hardware, aber die doku ist da eher das
Problem.
Georg schrieb:> Also mir geht es darum gerade die Grenzen der Genauigkeit> herauszufinden.> Die Werte treffen im ca. sekündlich ein. Dadurch das die Breite frei> wählbar sein soll und es ab einer gewissen Summe auch zu zwei Pulsen> kommen soll. Muss alles gehändelt werden können.
sehe ich kein Problem
Pulser schrieb:> Also ich erzeuge aktuell bis zu 13ns Impulse mit einem STM32.
ist hier evtl. nicht nötig
Georg schrieb:> einen genauen Impuls ausgeben
wie genau?
bitte definiere, Amplitude, Strom, Jitter, max. Verzögerung
ich filtere Störimpulse einer Laser Triggerung raus die kleiner 40µs und
gebe die Trigger Impulse nur alle 100ms (fmax = 10 Hz) an den Laser
weiter.
Grundlage ist PeDa bullet proof Tastaturentprellung, nur im
Timerintervall 10µs statt 10ms.
Georg schrieb:> Werte, die mehr oder weniger zyklisch eintreffen, summieren
aha, und wie kommen die?
rs232, SPI, ADC usw. was soll man da antworten wenn man die Bedingung
nicht kennt.
Georg schrieb:> einen Impuls mit der genauesten Breite
definiere genau
Georg schrieb:> eintreffen der Werte sollte bestimmt irgendwie durch einen Interrupt> registriert
ja wie kommen sie denn?
Georg schrieb:> Axel Schwenke schrieb:>> Typische Anfängerdenkweise.>> Dacht ich mir. Aber im Forum gab es doch auch mal eine Diskusion über> Delay-Funktionen. Gehen diese Routinen nicht auf den Systemtakt zurück?
Klar gehen sie. Aber sie haben in der Regel nicht die Auflösung von
einem Systemtakt - ein Schleifendurchlauf dauert z.B. 4 Takte und das
ist dann die beste Zeitauflösung die du kriegen kannst. Und dann können
sie meist auch keine ganz kurzen Impulse erzeugen.
Das Hauptproblem ist aber, daß ihnen von Interrupts Zeit "gestohlen"
wird. Denn die Verzögerungsschleife zählt ja nicht die Takte die
stattgefunden haben, sondern die Takte während der sie die CPU für sich
allein hatte. Wenn ein Interrupt-Handler ein paar Hundert Taktzyklen
braucht, dann läuft das Delay entsprechend länger.
Ein Timer hat dieses Problem nicht. Das ist einfach ein Hardware-Zähler
der mit dem konfigurierten Takt (maximal: Systemtakt) vor sich hin
zählt. Der funktioniert vollkommen unabhängig davon, was die CPU treibt.
Georg schrieb:> Auf welche Weise/Art kann ich einen Impuls mit der genauesten Breite am> besten erzeugen?
Kommt d'rauf an.
> Das eintreffen der Werte sollte bestimmt irgendwie durch einen Interrupt> registriert werden und die Akkumulation durchführen. Ist auch eher> nebensächlich.
Kommt ebenfalls d'rauf an.
Was die beste Lösung der beiden Teilaufgaben ist oder ob es überhaupt
eine gibt, hängt von drei Sachen ab:
1) Den Anforderungen an das Signal selber.
2) Was hat der µC außerdem noch zu tun.
3) Um welchen µC handelt es sich überhaupt.
Am einfachsten ist die Betrachtung, wenn der µC sonst garnichts tun muß,
dann stünden für deine Aufgabe alle Resourcen des µC nämlich
uneingeschränkt zur Verfügung.
Man kann dann bei gegebenem µC ziemlich schnell sagen, was bezüglich der
Exaktheit des Ausgangssignals bezüglich Dauer und Latenz (bezogen auf
das auslösende Eingangssignal) möglich ist. Oder auch umgekehrt bei
gegebenen Anforderungen an diese beiden Größen, mit welchem µC das
realisierbar ist.
Wenn der µC allerdings noch andere Sachen tun soll, wird es schnell
recht schwierig. Dann muß man nämlich erstmal herausfinden, wieviel von
den Resourcen des µC diese "anderen Sachen" eigentlich noch frei lassen
und zwar sowohl im Mittel als auch im schlimmsten Fall.
Diese Analyse kann sehr aufwendig sein, man muß dafür i.d.R. nämlich
nicht nur verstehen, was diese "anderen Sachen" tun, sondern auch wie
sie das tun, d.h.: man muß im Detail verstehen, wie sie funktionieren.
Wiedermals vielen Dank für die umfassenden Antworten.
Pulser schrieb:> Du kannst> PWM im single shoot verwenden. Bzw den Timer.
Wäre das die Variante wie sie in dem Artikel beschrieben ist, den Max D.
verlinkt hat?
Für den AVR liest es sich sehr simple. Ich möchte es gerne auf einem
LPC11U68 testen und fühle mich da von der Masse an Timer-Funktionen
erschlagen.
Joachim B. schrieb:> aha, und wie kommen die?
Also irgendwann sollen die Messwerte von einem DSP als float-Werte an
meinen µC übertragen werden. Das Protokoll kenne ich noch nicht,
was wäre denn da z.B. effektiv bzw. ineffektiv?
Das läuft doch bestimmt auf i²C oder SPI hinaus oder?
Um die Funktion zu testen würde ich mir gerne erstmal Zufallswerte im
SysTick-Timer generieren oder so.
Des Weiteren hab ich vor ihn erstmal über UART zu steuern. dh. Breite
vorgeben, aber nicht viel mehr.
Joachim B. schrieb:> wie genau?> bitte definiere, Amplitude, Strom, Jitter, max. Verzögerung
Ja wie genau ist eine Gute Frage die ich gerne Beantworten würde.
Es sollen eher nicht so "schnelle" Rechteckimpulse sein. Breite im
ms-Bereich, einfach an einem Ausgangspin ohne Leistung und nur mit der
Vcc-Amplitude 3,3V.
Was mir ja jetzt eigentlich fehlt ist euer Wissen um Jitter, Verzögerung
und Latenz, damit ich die Auswahl eines passenden µC selber treffen
kann. Bzw. die Software danach programmieren.
Kann ich eigentlich auch Probleme bei zu geringen Frequenzen bekommen?
c-hater schrieb:> Man kann dann bei gegebenem µC ziemlich schnell sagen, was bezüglich der> Exaktheit des Ausgangssignals bezüglich Dauer und Latenz (bezogen auf> das auslösende Eingangssignal) möglich ist. Oder auch umgekehrt bei> gegebenen Anforderungen an diese beiden Größen, mit welchem µC das> realisierbar ist.
Wie trefft ihr diese Aussage z.B. an meinem Testobjekt:
ARM CortexM0+ mit 16 bzw. 32 Bit Timern, 12 MHz Quarz durch PLL hat der
dann einen 48 MHz Systemtakt. Wie kann ich mit dem meine Grenzen
bestimmen und eine Genauigkeitsaussage treffen um zum einen einen
Einzelimpuls zu erzeugen oder eine Rechteckfrequenz zu erzeugen.
Vielleicht hier nochmal die Frage, stoße ich bei µC auch bei tiefen
Rechteckfrequenzen im mHz-Bereich, 0,1 Hz, o.ä. an Grenzen?
Georg schrieb:> Wie trefft ihr diese Aussage z.B. an meinem Testobjekt:> ARM CortexM0+ mit 16 bzw. 32 Bit Timern, 12 MHz Quarz durch PLL hat der> dann einen 48 MHz Systemtakt.
Dann liest man im DB des Controllers nach, was sonst. Da steht drinne,
was er an Hardware bietet und was diese kann. Das ist nämlich nicht bei
allen CortexM0 die gleiche Hardware, sondern bei jedem Hersteller eine
andere. Es soll sogar vorkommen, daß ein Hersteller mehrere
verschieden ausgestattete M0-Controller im Programm hat.
Du mußt also weiter spezifizieren: Sprich: den konkreten µC benennen.
Georg schrieb:> Für den AVR liest es sich sehr simple. Ich möchte es gerne auf einem> LPC11U68 testen und fühle mich da von der Masse an Timer-Funktionen> erschlagen.
Dann beiß dich da durch. Jetzt. Sofort. Oder wie lange willst du noch
davor davonlaufen?
Ist dir eigentlich klar, welches Glück du hast? Du hast eine konkrete
Aufgabenstellung und dazu einen µC, der mit an Sicherheit grenzender
Wahrscheinlichkeit alle notwendigen Mittel besitzt. Das ist doch die
perfekte Möglichkeit, die Fähigkeiten des µC auszuloten.