Hallo,
ich stell mir das kleine high-speed-Schleifchen zum Beispiel so vor:
Code:
wrk_a = pwm_a + 1;
wrk_b = pwm_b + 1;
zyklen = 0;
gpio |= _BV(OUT_A) | _BV(OUT_B);
do {
if(!--wrk_a) gpio.OUT_A = FALSE; /* high->low wechsel */
if(!--wrk_b) gpio.OUT_B = FALSE;
} while(--zyklen);
Man müsste nachrechnen, ob die Schleife in 50 us durchgelaufen ist. Ggfls. den vom Compiler verzapften Assembler-Code von Hand optimieren. Oder sich eben mit 128 oder gar nur 64 Durchläufen begnügen und sich statt "20 kHz" PWM-Frequenz auch mit "15 kHz" (~ 65 us) anfreunden.
pwm_a und pwm_b kommen aus einer dda-schleife mit sinus/cosinus-lookup. Dazu finde ich bestimmt auch noch Software-Schnipsel. Man kann die Schleife aus einer ISR heraus mit neuen pmw_a/pwm_b-Werten füttern.
Wers lautlos will, muss halt gefühlvoller kommutieren.
DC-Motoren sind keine Alternative. Denn auch bei denen wird Spulenstromfluss schlagartig umgeschaltet, was zu allerlei Motor-Tönchen führt.
Für lautlosen Betrieb geeignet wären mit 50Hz betriebene Wechselspannungsmotoren. Bei denen kann aber die Drehrichtungsumkehr problematisch sein. Und im Anfahrmoment tönen die auch.
Und natürlich können die internen Windungen und Bleche mit 100Hz schwingen. Aber das ist immer so. Wenn die Drähte schwabbeln, wird jeder Motor Geräusche machen.
Der leiseste Motor ist in meinen Augen ein mit Sinus/Cosinus betriebener Schrittmotor.
Viele Grüße
Wolfgang
Lesezeichen