Frage

Ich arbeite an der Firmware für ein Gerät, das einen 8-Bit-MCU (8051 Architektur) verwendet. Ich bin mit SDCC (Small Device C Compiler). Ich habe eine Funktion, die ich verwende, um die Geschwindigkeit eines Schrittmotors einzustellen, dass meine Schaltung fährt. Die Geschwindigkeit wird eingestellt, indem ein Sollwert in das Register Reload für einen Zeitgeber zu laden. Ich habe eine Variable, die Motorgeschwindigkeit im Bereich von 0 bis 1200 ist, den Impuls pro Sekunde an den Motor darstellt. Meine Funktion convert Motorgeschwindigkeit auf den richtigen 16-Bit-Reload-Wert ist unten dargestellt. Ich weiß, dass float-Point-Operationen ziemlich langsam sind, und ich frage mich, ob es ein schnellerer Weg ist, dies zu tun ...

void SetSpeed()
{
    float t = MotorSpeed;
    unsigned int j = 0;
    t = 1/t ;
    t = t / 0.000001;
    j = MaxInt - t;
    TMR3RL = j;      // Set reload register for desired freq
    return;
}
War es hilfreich?

Lösung

Wenn ich das richtig verstanden, was los ist Sie wollen den Ausdruck

berechnen
MaxInt - 1000000/MotorSpeed

wo Motordreh eine Zahl von 0 bis 1200 und stellt Anzahl der Impulse pro Sekunde.

Wenn Ihr Compiler unterstützt Gleitpunktarithmetik muss Integer-Division unterstützen. Warum versuchen Sie nicht. Wenn die Geschwindigkeit> 15 Es gibt kein Problem, aber für Geschwindigkeiten im Bereich von 0 bis 15 ist das Ergebnis negativ. Es bedeutet, dass es einfach unmöglich ist, Impuls mit niedrigerer Frequenz als 16 Hz zu erzeugen, wenn der Zähler 16 Bit breit ist, und es wird mit einer Rate von 1 MHz erhöht. Haben Sie einen zusätzlichen Vorteiler haben, die die Häufigkeit von Schritten zu reduzieren erlaubt? (Ich weiß es 8051 nicht).

Andere Tipps

Der klassische Weg ist festen Punkt zu verwenden, durch die Aufstockung vor der Teilung, und sie alle als ganze Zahl zu tun.

j = (MotorSpeed * 65536) / 1200;

Dies erfordert noch tatsächliche Division (1200), aber zumindest ist es all-integer. Die Skalierung sollte sehr schnell sein, da es möglich ist, eine Verschiebung zu implementieren verwendet wird.

Abroller ist recht fester Punkt.

Ich schrieb eine feste Bibliothek für SDCC auf den 8051 die 32-Bit-Zahlen verwendet. Einfach bestimmen, welche Präzision, die Sie in Ihren Fraktionen wollen und die entsprechende Verschiebung der Werte gelten.

Zum Beispiel meiner feste Punkt-Bibliothek verwendet 2 Bytes für Spitzen Raum.

So jede Zahl x als x * 65535 vertreten. Sie können normale unterzeichnet lange hinaus und subraction verwenden.

Für die Multiplikation und Division müssen Sie für den Offset einzustellen. Einfache Multiplikation würde (x * 65535) * (y * 65535). Nur brechen und Faktor aus dem für jeden Teil der Zahlen versetzt und sie alle hinzufügen.

Just brechen Ihre Festpunktzahl in Bytes oder 16 Bit ints und Arbeit auf sie in Stücke.

Hier finden Sie aktuelle diesem Artikel auf embedded.com .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top