Mein AZ rotor dreht von der stateliten position 179 grad bis zur position 181 grad eine ganze 358 grad runde in die andere richtung. Weil 181 grad zu -179 grad umgerechnet wird. Weil eben atan2 so funktioniert. Natürlich macht er es meist genau dann wenn der sat daten sendet. Diese verliert man dann. Ich kann die ansteuerung so machen dass anstatt -180 bis +180 einfach -270 bis +270 verwendet wird. Dann brauch ich aber eine vernünftige strategie, weil das berechnungsmodul liefert nur -180 bis +180. Wie machen?
:
Bearbeitet durch User
Sebastion B. schrieb: > Wie machen? Verhindere, dass während des Satellitendurchgangs 181 zu -179 umgerechnet wird.
Nur aus Interesse und zum Verständnis: Welcher Sat überstreicht 360° über dem Horizont? Das schafft ja selbst die Sonne nur für ein paar Tage im Jahr an wenigen Orten. Leg den 360°-Punkt nach Norden.
Sebastion B. schrieb: > Wie machen? Ist doch nicht schwer: - Merke Dir die alte Rotor-Ist-Position. - Berechne die neue Soll-Position. - Berechne für die neue Position einmal +360° und -360° - Nun hast Du drei neue Kandidaten: Original, Original plus 360, Original minus 360 - Lösche von den Kandidaten alle, die der Rotor nicht anfahren kann oder darf. - Wähle die Position aus der verbliebenen Liste mit dem kürzestem Weg. [ Weg = Absolutwert(Soll - Ist) ] - Fahr den Rotor dort hin. Das kann man natürlich kompakter Umsetzen; aber das ist das Prinzip.
1 | void writeServo(float azangle) |
2 | { |
3 | if (azangle > 180.0) azangle -= 360.0; //make -180 to 180 |
4 | if (azangle < -180.0) azangle += 360.0; //make -180 to 180 |
5 | |
6 | float azplus = azangle + 360.0; |
7 | float azminus = azangle - 360.0; |
8 | |
9 | float diff = azangle - oldazangle; |
10 | float diffplus = azplus - oldazangle; |
11 | float diffminus = azminus - oldazangle; |
12 | |
13 | float smallest = abs(diff); |
14 | float newaz = azangle; |
15 | if (abs(azplus) < maxangle) |
16 | if (abs(diffplus) < smallest) |
17 | { |
18 | smallest = diffplus; |
19 | newaz = azplus; |
20 | } |
21 | if (abs(azminus) < maxangle) |
22 | if (abs(diffminus) < smallest) |
23 | { |
24 | smallest = diffminus; |
25 | newaz = azminus; |
26 | } |
27 | |
28 | Log::console(PSTR("az: %.0f, az+: %.0f, az-: %.0f, oaz %.0f, diff %.0f, smallest %.0f, newaz %.0f"), azangle, azplus, azminus, oldazangle, diff, smallest, newaz); |
29 | |
30 | oldazangle = newaz; |
31 | |
32 | // 1.8deg/step, 200 steps/rev |
33 | sollpos = newaz*0.5555; |
34 | } |
:
Bearbeitet durch User
HAM schrieb: > Nur aus Interesse und zum Verständnis: Welcher Sat überstreicht 360° > über dem Horizont? Nee, das denkst du falsch. Bei LEO Satelliten hat man es immer, daß sie irgendwo am Horizont auftauchen, die Elevation immer größer wird bis sie einem mehr oder weniger über den Kopf fliegen, um dann am entgegengesetzten Azimut mit immer kleinerer Elevation weiter zu fliegen, bis sie wieder unter den Horizont tauchen. Im Prinzip hat man es immer mit einer Drehung im Azimut von 180° zu tun, die aber nicht gleichmäßig verläuft, sondern z.B. bei direktem Überflug mitten im Kulminationspunkt von Azimut zu -Azimut wechselt. So schnell dreht kein Antennenrotor die Antenne herum. Es ist dabei bloß so, daß so eine Antenne auch Kabel hat zwischen der eigentlichen Antenne und den unbeweglichen Teilen. Und diese Kabel verhindern, daß man die Antenne beliebig herumdrehen kann. Rein theoretisch wäre das zu lösen, wenn die Drehmechanik neben dem Azimut die Elevation größer als 90° machen könnte und obendrein noch ein Rollwinkel quer zur Elevation eingestellt werden könnte. Dann könnte man allein mit Elevation und Rollwinkel die Satellitenbahn abfahren. Aber so eine Mechanik hab ich noch nicht gesehen. Ganz generell: es kommt auf die mechanische Konstruktion an, ob das Problem lösbar ist. Ansonsten wäre ggf. eine zweite Antenne billiger, die während des Drehens den Empfang übernimmt. W.S.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.