Das sind DIGITALE Servos. Wahrscheinlich hattest du vorher "normale" analoge Servos.
Das sind DIGITALE Servos. Wahrscheinlich hattest du vorher "normale" analoge Servos.
Gruß
Dirk
das voher waren auch digitale Servos wie diese. sie müssen doch digital sein um sie per I/O (zb. PC6) anzusteuern?
also eingebaut sind sie richtig wenn ich mit dem finger auf den kontakten rumstreiche reagieren diese auch. weis einfach nicht woran es liegen kann.
Die normalen Servos werden alle 20ms mit einem Impuls von 1..2ms angesteuert.
Die "digitalen" Servos müßten eigentlich so auch funktionieren, arbeiten aber auch mit Impulsen alle 3..4ms (bis sogar 0,4ms).
Meist verbrauchen die digitalen Servos mehr Strom als die normalen.
Bist du sicher, dass du die Signalleitung richtig an den µC-Pin gelegt hast (mögliche andere Steckerbelegung als bei deinen alten Servos)?
Gruß
Dirk
Ja das wusste ich soweit muss mal einen anderen Ausgang probieren. Also du meinst denn ich sie mit einer höheren Frequenz ansteuer dann müsste es gehen? Mal seh'n aber die Servos sind doch richtig oder?
Ich steuere sie halt über das m32 modul und programmers notepad:
void servo1(int pos)//rechter Servo
{
PORTC |= IO_PC4;
sleep(pos);
PORTC &= ~IO_PC4;
sleep(200-pos);
}
void servo2(int pos)//linker Servo
{
PORTC |= IO_PC6;
sleep(pos);
PORTC &= ~IO_PC6;
sleep(200-pos);
}
und aufrufen in main:
for(x=3;x<25;x++)
{
servo1(x);
servo2(x);
setCursorPosLCD(1,5);
writeIntegerLCD(x, DEC);
mSleep(350);
clearLCD();
}
so hat es vorher ja auch immer funktioniert.
Für die normalen Servos war ja sleep(200-pos) für die ~20ms Pause (18..19ms) zwischen den Impulsen gedacht.
Deine digitalen Servos schaffen auch (100-pos), (50-pos) und (10-pos) und sollten keine längeren Pausen haben.
Das ist also vielleicht das erste Hauptproblem (wenn der elektrische Anschluss stimmt!):
Deine Pause zwischen den Servo-Impulse wird durch ...
setCursorPosLCD(1,5);
writeIntegerLCD(x, DEC);
mSleep(350);
clearLCD();
... extrem verlängert,- möglicherweise kommen die digitalen Servos damit nicht klar.
Vorschläge:
1. Ich würde mal den ganzen Anzeigekram probeweise rausnehmen.
2. Auch dann werden noch die 2 Servofunktionen nacheinander abgearbeitet, so dass sich der Impuls + Pause des einen Servos zu der Pause des jeweils anderen Servos dazu addiert (2. Hauptproblem). Also haben deine Servos jetzt (ohne Anzeigezeugs) noch eine Pause nach jedem Impuls von [18-19ms eigene Pause + Impuls des anderen Servos + dessen Pause (18-19ms)]. Das müßtest du so umschreiben, dass JEDES Servo MINDESTENS alle 20ms (besser alle 5-10ms) einen eigenen Impuls bekommt.
3. In der x-Schleife gibt es viel zu wenig Zeit für die Positionsänderung: Gib den Servos pro Position mindestens 5-10 Impulse in der jeweiligen Stellung.
Gruß
Dirk
So habe deine aussagen umgesetzt.
habe die zeiten ausprobiert mit niedrigeren sleep zeiten aber eine frage wenn ich 10-pos mache soll ich dann trotzdem pos mit zb. 20 anfahren?
zu 1: kein unterschied.
zu 2 und 3: wenn ich in der schleife servo1(x); aufrufe habe ich die funktion so abgeändert:
void servo1(int pos)//rechter Servo
{
PORTC |= IO_PC4;
sleep(pos);
PORTC &= ~IO_PC4;
sleep(50-pos);
PORTC |= IO_PC4;
sleep(pos);
PORTC &= ~IO_PC4;
sleep(50-pos);
PORTC |= IO_PC4;
sleep(pos);
PORTC &= ~IO_PC4;
sleep(50-pos);
PORTC |= IO_PC4;
sleep(pos);
PORTC &= ~IO_PC4;
sleep(50-pos);
PORTC |= IO_PC4;
sleep(pos);
PORTC &= ~IO_PC4;
sleep(50-pos);
}
so werden mehrere signale ausgeführt und ohne unterbrechung hintereinander abgerufen.
wenn ich mit dem finger auf der unterseite an den kontakten herstreiche (an den I/O ports) erreiche ich ab und zu ein drehn der servos. also muss die verbindung bis auf die m32 platine gut sein.
- - - Aktualisiert - - -
ist es vllt möglich ob die I/O ports kaputt gegangen sind? muss mal einen anderen probieren. ist das denn möglich?
copcom-weber:Ja, es gibt auf der M32 die freien Portpins PC2..PC7. Sie heissen IO_PC2..IO_PC7. Da kannst du einen nehmen für den IO_PC4.... muss mal einen anderen probieren. ist das denn möglich?
Alle Pins findest du ja am IO-Stecker.
Gruß
Dirk
Lesezeichen