Hallo
Je nach Servotyp liegt die Mitte des Drehbereichs bei Impulslängen von ca. 1ms bis 1,5ms Dauer (ms bedeutet Millisekunden oder 1/1000 Sekunde). Der Impuls sollte alle 20ms wiederholt werden.
In der orginalen asuro-Library von der CD dauert ein Sleep(1) genau 1/72000 Sekunde, Sleep(72) dauert entsprechend eine 1ms. (Bei den neueren Libs wird ein 36kHz-Timer verwendet, deshalb dauert hier Sleep(36) eine Millisekunde.) Für 20ms Impulswiederholung müßte man Sleep(20*72-Impulslänge) warten. Da Sleep() aber einen 8bit-Parameter benötigt, muss man die Impulspause auf mehrere Aufrufe von Sleep verteilen. 20*72 wären 1440 Sleep(1)-Aufrufe, davon muss man noch die Impulsdauer abziehen und den Rest auf 255er Sleep()-Aufrufe verteilen:
Code:
#include "asuro.h"
#define libversion 72 // 72kHz oder 36kHz Library
int Impulspause;
char Servoimpuls = libversion; // 72 (oder 36) für eine Millisekunde (Servomitte?)
int main(void)
{
Init();
while(1)
{
BackLED(OFF,ON); // Impulsstart
Sleep(Servoimpuls);
BackLED(OFF,OFF); // Impulsende
Impulspause=libversion*20-Servoimpuls; // Anfang Pause; Dauer berechnen
while(Impulspause > 255) // 255er-Schritte
{
Sleep(255);
Impulspause -= 255;
}
Sleep(Impulspause); // Restpause
}
return(0);
}
(ungetestet)
Gruß
mic
Lesezeichen