Forum: Mikrocontroller und Digitale Elektronik Wege um asynchrone Impulse zu erzeugen


von Georg (Gast)


Lesenswert?

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?

von Axel S. (a-za-z0-9)


Lesenswert?

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.

von Max D. (max_d)


Lesenswert?


von Ulrich F. (Gast)


Lesenswert?

Wie Genau muss es?
Wie lang sind die Pulse?

von Georg (Gast)


Lesenswert?

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?

von Pulser (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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?

von Axel S. (a-za-z0-9)


Lesenswert?

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
von c-hater (Gast)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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?

von c-hater (Gast)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

c-hater schrieb:
> weiter spezifizieren

Verzeihung, das hatte ich weiter oben. LPC11U68, die 100 Pin Variante.

von Axel S. (a-za-z0-9)


Lesenswert?

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
Noch kein Account? Hier anmelden.