Witam,
pracuję nad oprogramowaniem do sterowania serwomechanizmem pozycyjnym za pomocą PWM. Według teorii w celu ustawienia servo na danej pozycji należy wygenerować impuls prostokątny o łącznym czasie trwania jednego impulsu 20ms i w zależności od kąta obrotu poziom wysoki powinien trwać odpowiednio:
- dla 0[stopni] - 1ms,
- dla 90[stopni] - 1,5ms,
- dla 180[stopni] - 2ms.
Problem pojawia się, że dla wyżej wyznaczonych czasów servo ustawia się na innych pozycjach odpowiednio:
- dla 1ms - 45[stopni],
- dla 1,5ms - 90[stopni],
- dla 2ms - 125[stopni].
Oczywiście metodą prób i błędów jestem w stanie tak dobrać czas trwania impulsu aby servo pracowało w pełnym zakresie 0-180[stopni] ale chciałbym usłyszeć opinię bardziej doświadczonych osób co o tym sądzą.
Poniżej fragment kodu:
pracuję nad oprogramowaniem do sterowania serwomechanizmem pozycyjnym za pomocą PWM. Według teorii w celu ustawienia servo na danej pozycji należy wygenerować impuls prostokątny o łącznym czasie trwania jednego impulsu 20ms i w zależności od kąta obrotu poziom wysoki powinien trwać odpowiednio:
- dla 0[stopni] - 1ms,
- dla 90[stopni] - 1,5ms,
- dla 180[stopni] - 2ms.
Problem pojawia się, że dla wyżej wyznaczonych czasów servo ustawia się na innych pozycjach odpowiednio:
- dla 1ms - 45[stopni],
- dla 1,5ms - 90[stopni],
- dla 2ms - 125[stopni].
Oczywiście metodą prób i błędów jestem w stanie tak dobrać czas trwania impulsu aby servo pracowało w pełnym zakresie 0-180[stopni] ale chciałbym usłyszeć opinię bardziej doświadczonych osób co o tym sądzą.
Poniżej fragment kodu:
Kod:
void setup()
{
pinMode(3, OUTPUT);
}
void loop()
{
for(int i = 0; i <= 100; i++){ //pętla umożliwiająca ustawienie odpowiedniej pozycji
digitalWrite(3, HIGH); //stan wysoki
delayMicroseconds(1000); //czas trwania stanu wysokiego
digitalWrite(3, LOW); //stan niski
delayMicroseconds(19000); //czas trwania stanu niskiego
delay(10); //opóźnienie w celu spowolnienia ruchu
}
delay(1000); //opóźnienie przed ruchem do kolejnej pozycji
for(int i = 0; i <= 100; i++){
digitalWrite(3, HIGH);
delayMicroseconds(2000);
digitalWrite(3, LOW);
delayMicroseconds(18000);
delay(10);
}
delay(1000);
for(int i = 0; i <= 100; i++){
digitalWrite(3, HIGH);
delayMicroseconds(1500);
digitalWrite(3, LOW);
delayMicroseconds(18500);
delay(10);
}
delay(1000);
}