Hallo Leute, ich habe ein Strecken/Geschwindigkeitssignal: 1Umdrehung = 32 Impulse Maximalfrequenz des Signals 720Hz Minimalfrequenz, stillstand, 0Hz unstetige Frequenz Zur korrekten Anzeige auf einem Analogen Wegstreckenzähler/Tacho und zur Regelung der Geschwindigkeit, muss ich das Ausgangssignal des Gebers durch zwei krumme Faktoren teilen A:3,349 und B:4,134. Wie kann man das Bewerkstelligen? Ich habe Probleme mir das vorzustellen und zu formulieren - ich suche im Prinzip ein elektronisches Getriebe. Also eins, indem sich das Abtriebszahnrad immer im richtigen Verhältnis zum Antriebsrad dreht, also auch wenn das Antriebsrad kurz oder lang stehen bleibt und dann (wie schnell auch immer) weiter dreht, sprich an der richtigen Stelle weiter macht. ..eine unmittelbare "Analoge" Anpassung der Ausgansfrquenz an die Eingangsfrequenz ist Digital doch nicht möglich, oder sehe ich das falsch? Ich kann digital doch nur die Zeit bis zur nächsten Flanke zählen, weshalb die Updatezeit meines Ausgangssignals mit der Frequenz des Eingangssignals singt, deshalb bei sehr kleinen Frequenzen das Ausgangssignal unter Umständen anfängt zu springen?! ..ein reines Zählen der Impulse funktioniert auch nicht, da meine Teilungsfaktoren nicht gerade sind?! Ich keinen Impuls bei Flanke 26 3/4 auslösen kann?! Wie könnte ich an die Aufgabenstellung heran gehen? Sollte der Geber für diese Anwendung vielleicht besser ein Analoger sein - Sinus? Ich wäre euch dankbar wenn ihr mir dabei ein wenig auf die Sprünge helfen könntet! Grüße, Martin
(O.B.d.A. nehme ich mal an, die Eingangs-/Ausgansimpulse sind Nadelimpulse.) Bei rein digitalem Eingangssignal wirst du immer Sprünge haben. Die einzige Information, die du hast, ist die Zeit zwischen zwei Impulsen. Eine Frequenzunterschied kleiner x zu detektieren, dauert immer mindestens 1/x Sekunden (<0.1Hz, mind. 10 Sekunden). Wenn das Signal ein wirklich analog erzeugter Sinus/Sägezahn/etc wäre, könntest du das beschleunigen, indem du direkt die Winkel-/Anstiegsgeschwindigkeit ermittelst (limitiert durch Samplerate und Bitbreite des ADC). Die einfachste Variante, das digitale Signal durch z.B. 3.349 zu Teilen, besteht darin, die Fehler bei der Ausgabe zu Summieren und gegebenenfalls dann einen Puls mehr oder weniger auszugeben. Beispiel: bei jedem Eingangspuls wird ein Zähler um 1000 erhöht. Hat der Zähler einen Stand von >=3349 erreicht, wird ein Ausgangsimpuls erzeugt und 3349 vom Zähler abgezogen. Gemittelt erzeugt dies einen Teiler von exakt 3.349, d.h. der Streckenzähler hat nach 3349 Eingangsimpulsen exakt 1000 Ausgangsimpulse bekommen, egal wie häufig und wie stark sich die Geschwindigkeit geändert hat. Die Geschwindigkeitsanzeige pendelt leicht, da meist durch 3 und ab und zu mal durch 4 geteilt wird. Wenn die Geschwindigkeitsregelung etwas mittelt, z.B. über 1 Sekunde summieren, sollte das ziemlich ruhig werden.
Ist doch zu spät :-/ Ich schrieb: > Eine Frequenzunterschied kleiner x zu detektieren, dauert immer > mindestens 1/x Sekunden ist natürlich Quatsch. Richtig: "Eine Frequenz kleiner x zu detektieren, ..."
Hallo asdfasd, ich hoffe, du liest das hier noch - bitte entschuldige, dass ich erst jetzt Antworte! Vielen dank, ich bin ein ganzes Stück weiter! :) Also, es sind keine Nadelimpule - das habe ich natürlich vergessen zu schreiben - viel wichtiger ist aber, dass mir klar geworden ist, dass ich unter 45Hz keine Geschwindigkeits-, sondern nur eine Streckeninformation benötige und dass dabei auch nur wichtig ist, dass gezählt wird, nicht unbedingt, dass der Impuls exakt nach x.xx Impulsen kommt. Somit ist es nicht mehr nur eine Aufgabe, sondern es sind eben 2 - Takten und ab 45Hz eine Frequenz mit in entsprechendem Verhältnis erzeugen. Das ist schon mal eine viel bessere Sicht auf das Ganze! :) Ich bin noch nicht mal darauf beschränkt, Strecke und Geschwindigkeit in einem Signal zu verwursten, kann es mir also relativ einfach machen. Das System, das geregelt werden soll, ist relativ träge - ich denke, 45Hz sollten wohl ausreichen, um bei Änderungen keine größeren Sprünge im Ausgangssignal zu haben - Danke für dein Feedback und den Lösungsansatz!! Grüße, Martin
:
Bearbeitet durch User
@ Martin M. (bdb) >Danke für dein Feedback und den Lösungsansatz!! Das Ganze ist ein nichtganzzahliger Teiler. Naja, irgendwie schon, wenn man lange genug mit 10 erweitert ;-). Die Grundlage ist der Bresenham-Algorithmus. Damit vermeidet man Fließkommaoperationen und kommt trotzdem auf die exakten Teilerfaktor. Jeder Eingangspuls erhöht eine Variable um 1000. Ist sie >= 3349, wird ein Ausgangsimpuls erzeugt und 3349 abgezogen. Das Gleiche parallel mit einer 2. Variable und 4134. Die hohe Kust ist es dann, wenn man es braucht, die Periodendauer bzw. Frequenz der Eingangssignale zu messen und dementsprechend angepasst die Pulse auszugeben. Das kann man mit einer DDS in Software machen. Das ist hier aber schon etwas kniffelig, vor allem bei sehr niedrigen Frequenzen bis 0 ;-)
Martin M. schrieb: > und zur > Regelung der Geschwindigkeit, muss ich das Ausgangssignal des Gebers > durch zwei krumme Faktoren teilen A:3,349 und B:4,134. Nö, musst du nicht. Du musst nur dafür sorgen das Soll- und Ist-Wert das selbe "Format" haben, und welchen der beiden du dafür umrechnest ist im Prinzip egal. Und da sich vermutlich dein Soll-Wert nicht andauernd verändert ist es einfacher diesen einmalig umzurechnen als bei jeden Durchlauf der Regelschleife den Ist-Wert umzurechnen. Somit braucht der Ist-Wert nur noch gelegentlich mal umgerechnet zu werden wenn die Anzeige aktualisiert werden soll, aber bei weitem nicht so oft wie für den Regelkreis.
> Also, es sind keine Nadelimpule Das ändert an der Theorie ja nichts. > dass ich unter 45Hz keine Geschwindigkeits-, sondern nur eine > Streckeninformation benötige Dann bietet sich der Bresenham doch an. Der vergisst keine einzige Flanke. Und die Geschwindigkeit stimmt auch, bei 45Hz Input kommen halt 11.885Hz raus. Durch den "Integeralgorithmus" hast du halt etwas Jitter auf den Flanken. Eine Implementation könnte so aussehen: Input ist PB0, Output 1 (durch 3,349) auf PB1, Output 2 (durch 4,134) auf PB2. PB0 triggert den Pin Change Interrupt, also auf jede Flanke. Dadurch wird die Frequenz praktisch verdoppelt, aber da die ISR die Output-Pins nur toggelt, findet wieder eine halbierung statt und alles passt.
1 | ISR(PCINT0_vect) |
2 | {
|
3 | static u16 cnt1, cnt2; |
4 | |
5 | cnt1 += 1000; |
6 | if (cnt1 >= 3349) { |
7 | cnt1 -= 3349; |
8 | PORTB ^= 1 << PB1; |
9 | }
|
10 | cnt2 += 1000; |
11 | if (cnt2 >= 4134) { |
12 | cnt2 -= 4134; |
13 | PORTB ^= 1 << PB2; |
14 | }
|
15 | }
|
16 | |
17 | int main(void) |
18 | {
|
19 | ... setup clocks, ports, interrupts |
20 | |
21 | sei(); |
22 | while (1) |
23 | sleep(); |
24 | }
|
Passt problemlos in einen ATtiny4 ;-) Ich denke, das ist eine typische Anwendung für diese schnuckeligen Teile. Man könnte an den letzten Pin sogar noch einen Trimmer anklemmen zum Kalibrieren ;-)
Ein Beispiel für einen f/f-Wandler mit freiem Faktor: http://www.mino-elektronik.de/Generator/takte_impulse.htm#bsp4 Vielleicht reicht Dir auch ein schneller f/U-Wandler: http://www.mino-elektronik.de/fmeter/fm_software.htm#bsp10 oder nachfolgend mit PWM-Ausgabe: http://www.mino-elektronik.de/fmeter/fm_software.htm#bsp11 Alternativ kann man die modifizierte Spannung (Poti) auch wieder in eine Frequenz wandeln: http://www.mino-elektronik.de/Generator/takte_impulse.htm#bsp6
Hallo Falk, asdfasd, Michael! Ich habe gerade keine Zeit das mal durchzuspielen - bin aber sehr begeistert, dass das so einfach zu lösen sein könnte! Michael: :) Dein Beispiel kenne ich schon seit einer ganzen Weile, ich habe mir aber bisher nicht genug Zeit genommen, es mal nachzuvollziehen - kann auch sein, dass ich das nicht hinbekomme - für mich blieb immer die Frage, was passiert, wenn die Frequenzen wirklich runter gehen. Du misst ja über einen Timer, das machte die ganze Problematik mit Sprüngen/nicht exakter Zählung in meiner Vorstellung nicht besser - hat sich natürlich schon etwas aufgeklärt.. Ich komme auf jeden Fall wieder darauf zurück - momentan ist hardwaremäßig noch viel zu tun. Danke sehr!! Grüße, Martin
Durch Deine Faktoren > 1 habe ich mich irritieren lassen. Eigentlich sind es ja Faktoren < 1 oder genau genommen Divisoren. Dafür ist das vorgeschlagene Verfahren, einen Akku mit einem Wert x (z.B. 1000) pro Eingangsimpuls zu erhöhen und bei Überlauf einen Ausgangsimpuls auszugeben ja ausreichend. Wie von mir vorgeschlagen, per Frequenzmessung, Umrechnung und Frequenzgenerator das neue Signal zu erzeugen, würde sich eher anbieten, wenn z.B. die Ausgangsfrequenz um den Faktor 3,349 höher liegen und möglichst jitterfrei sein soll. Damit könnte man u.U. die Geschwindigkeitsregelung verbessern. Probiere aus, was für Dich geeignet ist.
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.