Forum: Mikrocontroller und Digitale Elektronik 32 Imp/U, 0-720Hz durch 3,xx und 4,xx teilen


von Martin M. (bdb)


Lesenswert?

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

von asdfasd (Gast)


Lesenswert?

(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.

von asdfasd (Gast)


Lesenswert?

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, ..."

von Martin M. (bdb)


Lesenswert?

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
von Falk B. (falk)


Lesenswert?

@ 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 ;-)

von lrep (Gast)


Lesenswert?

3349 = 197 * 17

von Irgendwer (Gast)


Lesenswert?

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.

von asdfasd (Gast)


Lesenswert?

> 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 ;-)

von m.n. (Gast)


Lesenswert?

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

von Martin M. (bdb)


Lesenswert?

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

von m.n. (Gast)


Lesenswert?

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