Pages: 1 [2]   Go Down
Author Topic: Servo.h Frequenz ändern  (Read 1813 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

REFRESH_INTERVAL ist der entsprechende Wert, der das Intervall zwischen den Impulsen angibt. Ich vermute hier hast du einen Fehler an anderer Stelle gemacht. Dein Beispiel arbeitet auch eher bei 80Hz als bei den von dir angegebenen 100Hz - das sollte dein Oszi dir aufgezeigt haben. Versuch doch mal, die Wiederholrate in der Servo.h geringer einzustellen und das Ergebnis auf dem Oszi zu messen.

Und in deinem Beispiel hast du & mit && verwechselt - was bei deinem Code glücklicher Weise trotzdem zum richtigen Ergebnis führt.

Vielen Dank für deine Antwort.
Du hast recht, das Oszi sagt ca. 87Hz.
Den Fehler && stimmt auch, hab das gar nicht bemerkt.

Zu dem REFRESH_INTERVAL in der Datei Servo.h, diesen Parameter hab ich geändert, von 20000 (ca.50Hz) auf z.B. 10000 (ca.100Hz), das Signal am Pin hat sich jedoch nicht verändert.

Weisst du was ich da falsch mache?
Logged

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Walking on Nails
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hast du mal versucht, die Frequenz auf 40Hz oder 30Hz zu senken? Es geht erstmal darum festzustellen, ob der Parameter seinen Zweck erfüllt. Langsamer sollte kein Problem sein, schneller könnte an die Grenzen der gewählten Timereinstellungen stoßen.
Logged

loved the 68000 assembler back then and now I have to deal with THIS 8 bit thingy

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hab ich nun versucht (30000, 40000 und 60000), der Spuckt immer 100Hz aus.
Dabei dachte ich Standard sind es 50Hz.

Aber wieso ändert sich nichts am Signal?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es geht :-)

Ich bin sehr Dumm.
Ich hatte den Arduino Ordner 2X, und ich hatte die Servo.h Datei im falschen Ordner bearbeitet.
Das ist sehr Peinlich.

Vielen Dank für eure Hilfe und Geduld.

Gruss Kay
Logged

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Walking on Nails
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Noch ein Hinweis, was hier passiert. Folgendes macht die Servo-Lib: für jeden Servo wird der Ausgangspin auf HIGH gesetzt, dann das Auslösen des Interrupts neu gesetzt, so daß er nach der Länge des HIGH-Signals wieder zuschlägt, um dann LOW zu setzen. Danach wird das gleiche mit dem nächsten Servo durchgeführt bis alle abgearbeitet sind. Jetzt wird das Auslösen des Interrupts auf REFRESH_INTERVAL gesetzt und beim nächsten Interrupt neu gestartet.

Daraus ergibt sich folgendes: hat man vier Servos und alle sind bei 1500µs, dann vergehen von den 20000µs REFRESH_INTERVAL schon 6000µs für das Erzeugen der Signale (+ die Verabeitungszeit). Sind alle vier bei den maximal erlaubten 2400µs, dann braucht man bereits den halben REFRESH_INTERVAL. Daraus ergibt sich ein Limit für die maximale Wiederholrate in Abhängigkeit der Anzahl der Servos. Andersum gibt der 16-Bit-Counter ein oberes Limit für REFRESH_INTERVAL vor. Beim 16MHz ATmega wird der Wert von REFRESH_INTERVAL mit 2 multipliziert in das Counter-Register geschrieben, welches meiner Meinung nach ja nur 16 Bit groß ist und damit nur Werte bis 65535 aufnehmen kann. Also wird bei etwas mehr als 32000 der REFRESH_INTERVAL nicht mehr das tun, was man erwarten würde.
Logged

loved the 68000 assembler back then and now I have to deal with THIS 8 bit thingy

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Marek080

Also ich muss das jetzt erst mal verdauen, was du da geschrieben hast. :-)

Werde Morgen 4 Signale Proggen, und dann messen wo da die Grenzen liegen um deine Ausführung zu verstehen.

Gruss Kay
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Hab nun mal ein paar Messungen gemacht, und gleich an dich gedacht, Marek080.

Um Logischer Messen zu können habe ich die Parameter so verändert:

Code:
#define MIN_PULSE_WIDTH       1000     // the shortest pulse sent to a servo 
#define MAX_PULSE_WIDTH      2000     // the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH  1500     // default pulse width when servo is attached
#define REFRESH_INTERVAL    3000     // minumim time to refresh servos in microseconds

Sehr Interessant wahren dann auch die Messungen:

Bei 1 Servo alleine:

Servo Winkel  0°  = Impuls 1,0ms, Frequenz 333Hz
Servo Winkel 90°  =Impuls 1,5ms, Frequenz 333Hz
Servo Winkel 180°=Impuls 2,0ms, Frequenz 333Hz

Bei 4 Servosignalen gleichzeitig:

Alle Servo Winkel 0°   =Impuls 1,0ms, Frequenz 250Hz
Alle Servo Winkel 90° =Impuls 1,5ms, Frequenz 166Hz
Alle Servowinkel 180°=Impuls 2,0ms, Frequenz 125Hz

Je nach der menge Servos und definierten Winkel variiert die Periodendauer, der Impuls dagegen stimmt immer genau.

Deine Erklärung habe ich noch nicht ganz verstanden, aber ich bleibe dran. :-)

Gruss Kay
Logged

Pages: 1 [2]   Go Up
Jump to: