Meine Scheibe hatte 500 Impulse pro Umdrehung, das kann mann natürlich SEHR gut steuern.
Ich habe das mit einem LPC1768 gesteuert.
Das kannst Du aber mit einem kleinen 8-Bitter auch steuern.
Die haben meistens ja Timer und den lässt Du einfach auf einer recht hohen Frequenz laufen.
Wenn dein Impuls von der Scheibe kommt liesst Du den Zählerstand aus uns kannst darauf rückschliessen wie schnell der Motor dreht.
Entsprechend regelst Du dann die Pulsbreite nach.
- - - Aktualisiert - - -
Code:
#define MAX_PWM 1000
#deinfe MIN_PWM 0
#define REGULATION_TIME 10 /* 10 ms */
/* ----- wird kontinuierlich von Hauptprogramm aufgerufen */
void RPM_Regulation(S32 set_rpm)
{ static U32 time;
static S32 pwm_regel;
S32 Delta_RPM;
S32 Delta_PWM;
if (SystemTickCount < time) return;
time = SystemTickCount + REGULATION_TIME;
Delta_RPM = set_rpm - rpm; /* Sollwert - Istwert */
/* umrechnen in PWM ohne Floating Point, der Wert 20000 muss dem Motor entsprechend angepasst werden */
Delta_PWM = (Delta_RPM * 20000) / 65536; /* vereinfachte, schnelle Berechnugn >> 16 */
pwm_regel = pwm_regel + Delta_PWM; /* die Differenz aufaddieren */
/* PWM range check */
if (pwm_regel > MAX_PWM) pwm_regel = MAX_PWM; /* max value fuer PWM */
if (pwm_regel < MIN_PWM) pwm_regel = MIN_PWM; /* min value fuer PWM */
SetPWM(pwm_regel);
}
der Wert rpm wird im Interrupt berechnet
Lesezeichen