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.
Zum Thema "genauer Puls" lies mal das hier: http://hackaday.com/2015/03/24/avr-hardware-timer-tricked-into-one-shot/
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.
:
Bearbeitet durch User
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.
c-hater schrieb: > weiter spezifizieren Verzeihung, das hatte ich weiter oben. LPC11U68, die 100 Pin Variante.
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.
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.