PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Algorithmus für Frequenzberechnung



Muecke
05.06.2007, 22:07
Hallo Leute,
ich habe folgendes Problem:
Ich schreibe gerade am Programm für mein uC in C. Ich habe in einer Variable einen Wert von 0-255 stehen. Aus diesem Wert soll nun eine Frequenz berechnet werden, die zwischen ca 1Hz und dem maximalen Sinnvollen Wert eines Schrittmotors liegen soll.
Die Frequenz erzeuge ich mit einem 16bit Timer meines uC, der mit 4MHz getaktet ist und verschiedene Vorteiler (1, 8, 64, 256, 1024) einschaltbar sind.
Wie schaffe ich das? Ich hoffe einer von euch hat da mal ne Idee...

MfG
Muecke

guidob
05.06.2007, 22:45
Hallo Muecke,

im Grunde ganz einfach: den Timer am besten im Auto-Reload-Modus laufen
lassen. Der Vorteiler bleibt fest auf einem vernünftigen Wert, deinen
Sollwert skalierst du auf die maximale Frequenz und berechnest damit den
aktuellen Reloadwert.

Das wars schon,

guidob

elmar
01.11.2007, 12:05
Hi,

Ergänzend sei noch gesagt, dass der Timer sozusagen die Halbwellen zählt und bei jedem Überlauf (Rücksprung auf 0) ein Interupt ausgelöst wird. Jedes mal wenn der Interupt angesprungen wird, mußt Du Umschalten. Entweder zwei IF Bedingungen (Wenn AN, mach AUS andernfalls mach AN, also IF-ELSE) oder noch simpler mit XOR 1. Also Zustand holen und mit XOR 1 verknüpfen. XOR mit 1 ist eine sogenannte "Togglefunktion", das Ergebnis ist immer das Gegenteil vom Eingang.
Die Frequenz ist somit halb so groß, da die Periodendauer zwei Timerdurchläufe benötigt.
Ist der Vorteiler zu klein, so kann man bei jedem Überlauf eine Variable runterzählen und wenn die 0 ist das toggeln auslösen. Abhängig von der Variable erhält man so einen "Nachteiler" um tiefere Frequenzen herstellen zu können.

Gruß
Elmar

Winne
01.11.2007, 14:49
Willst du auch noch das tastverhältnis beinflussen, so must du die Periodendauer in einen timerreload-high und einen timerreload-low wertaufteilen un dies abwechselnd laden.

alternativ kannst du 2 ISR schreiben und in jeder von beiden den vektor auf die
jeweils andere biegen, den reloadwert setzen und den timer neu starten das spart auch den zustand zu erfragen, da der vektor den zustand anzeigt.
Auf diese Weise ließen sich auch mehrphasige Sequenzen programmieren.

elmar
01.11.2007, 15:29
Hi,

für den Anfang ist es einfacher, den Timer mit der gesamtperiodendauer laufen zu lassen und einfach eine Warteschleife für den Abschaltpunkt des Pulses zu verwenden. Die Warteschliefe bestimmt so die Pulsweite. Problem ist hier nur, dass der µC wärend des Pulses nichts anderes mahr machen kann, auf diese Weise kann man also keine 100% Pulslänge erreichen. Reichen 50..100%, so nimmt man geschickerweise die Pause für die Warteschleife. Man kann das auch umschalten, also 0..50% den Puls abwarten und 50..100% die Pause abwarten. Macht man das umschaltbar, so hat man 0..100% wobai nur maximal 50% an Rechenkapazität verloren gehen.

Ist zwar nicht die geeignetste Methode, aber die Simpelste. Einfach zu programmieren und am einfachsten Nachzuvollziehen.

Gruß
Elmar