- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 36

Thema: Servo:Stellung-Richtung-Geschwindigkeit?

  1. #21
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    Anzeige

    Powerstation Test
    Warum keine Antwort? z.B. auf die Frage "Wieso steuern alle ihre Servos mit 100-200 an und ich mit 5-35?" oder "Wieso macht der Servo nur 15 Steps pro 90°?" Kann der nicht mehr? Weil das ist mir viel zu wenig. Und wenn ich den Servo von 30 auf 15 fahren lasse, wieso ruckelt er dabei so stark? Bin frustriert...

  2. #22
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    71
    Beiträge
    277
    Hallo,

    Zitat Zitat von Goblin
    Warum keine Antwort? z.B. auf die Frage "Wieso steuern alle ihre Servos mit 100-200 an und ich mit 5-35?" oder "Wieso macht der Servo nur 15 Steps pro 90°?" Kann der nicht mehr? Weil das ist mir viel zu wenig. Und wenn ich den Servo von 30 auf 15 fahren lasse, wieso ruckelt er dabei so stark? Bin frustriert...
    nun, die allgemeine Verwirrung beruht vermutlich auf mehreren Tastsachen:

    1) Im allgemeinen ist es so, daß Bascom verlässlich mit unterschiedlichen Taktfrequenzen zurechtkommt und die vorgefertigten Funktionen aus der Angabe "Crystal" die jeweils passenden Parameter selbst errechnet. Das ist bei der Funktion Servos nicht so!

    2) Das von MCS gelieferte Programmbeispiel enthält in seinen Erklärungen zu Timing etc. fast nur Schrott.

    3) MCS geht mit keinem Wort auf die Einzelheiten der PWM-Erzeugung in diesem Fall ein.

    Ich selbst habe für Servos nur selten Verwendung, habe mir den Quatsch aber nun mal genauer angesehen. Dabei kommt als Zwischenstand folgender Text heraus, der die Beispielbeschreibung ersetzen sollte:
    Code:
    'Servos need a positive pulse in order to operate. In general the pulse has to
    'have a width of 1 mS (left) to 2 mS (right). This pulse has to be repeated
    'approximately every 20 mS.
    'With the config statement CONFIG Servos we can specify how many servo's we
    'will use and which port pins are used.
    'A maximum of 14 Servos might be used
    'The SERVO statements use one byte for an interrupt counter and the TIMER0.
    'This means that you can not use TIMER0 anymore.
    'The reload value specifies the repetition interval of the pulse.
    '
    'To gain the requierd  intervall of 20 mS, a reload value of 10 will work with
    'a crystall of 16 Mhz, a reload value of 5 with a crystal of 8 Mhz. 4 Mhz and
    'lower changes the prescaler internally, you have to find the right value your-
    'self (as long as I don't find time to mesure this :-)).
    
    'The pulsewidth depends on the value we write to the corresponding  servo array
    '-Servo(n)-. In praxis this means for 8 MHz 84 to 168 (1 mS to 2 mS), for 16
    'MHz 78 to 156.
    Hier 2 Messergebnisse, die das Gesagte verbildlichen:

    Bild hier  

    Bild hier  


    Viele Grüße
    Henrik

  3. #23
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    ahaaa, sehr aufschlussreich, danke!

    was glaubst du in welchem bereich die richtige reload-zeit bei dem internen 1mhz-takt ist? zwischen 1 und 5?

  4. #24
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    71
    Beiträge
    277
    Hallo,

    Zitat Zitat von Goblin
    ahaaa, sehr aufschlussreich, danke!

    was glaubst du in welchem bereich die richtige reload-zeit bei dem internen 1mhz-takt ist? zwischen 1 und 5?
    bitte gib mir Zeit bis morgen. Dann kann ich es Dir genau sagen. Glaube ich mache mal eine Tabelle mit den gängigen Frequenzen, wenn etwas mehr Zeit ist.

    BTW: Meine "Erkenntnisse" sind mittlerweile nicht nur theorethischer Natur, sondern mit den allseits beliebten 5,-- EUR Conrad Servos praktisch erprobt. Da zappelt nix, da rappelt nix, alles lauft sanft und zuverlässig.

    Viele Grüße
    Henrik

  5. #25
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    das wäre supi. dann bewegt sich meine kamera auch endlich vernünftig....

  6. #26
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    71
    Beiträge
    277
    Hallo,

    Zitat Zitat von Goblin
    das wäre supi. dann bewegt sich meine kamera auch endlich vernünftig....
    da habe ich leider schlechte Nachrichten für Dich, wenn Du bei 1 MHz bleiben willst - es geht nicht, nie und nimmer.. Kann auch nicht, wenn ich mir die angelegte Interruptroutine ansehe.

    Mit 4 MHz geht es dann mit Ach und Krach, die Wiederholrate von 31 mS verträgt z.B. der Servo von Conrad netterweise gerade noch.

    Die Werte für 4 MHz im Einzelnen:

    Reload = 1
    Servo Mitte: 80
    Servo Rechts: 125
    Servo Links: 40

    Zu viel anderem ist der Prozessor dann nicht mehr zu gebrauchen, weil er vollauf mit der Servosteuerung beschäftigt ist.
    Bei dem Thema Servo dürfte mir im Augenblick kein MCS-Verantwortlicher persönlich begegnen. Nicht weil es nicht funktioniert, das tut es ja innerhalb der gegebenen Grenzen., sondern weil die Beschreibung so grottenfalsch ist, daß man erst mal das Oszilloskop hernehmen muss, um der Sache auf die Schliche zu kommen.
    Das war ja nun schon öfter Thema und ist Mark auch bekannt, scheint aber nicht zu interessieren.

    Das benutzte Testprogramm hier (englisch, weil ich es mit Rüffel demnächst ins englische Forum stellen will - aber erst wenn ich mich abgekühlt habe):

    Code:
    '--------------------------- Servotest -----------------------------------------
    
    $regfile = "m8def.dat"
    $crystal = 4000000                           'internal choosen
    '$crystal = 7372800
    '$crystal = 14745600
    '$crystal = 16000000
    
    $hwstack = 64
    $swstack = 64
    $framesize = 64
    
    $lib "mcsbyteint.lbx"
    
    '-------------------------------------------------------------------------------
    'The following remarks are valid and tested with Bascom V.1.11.5.2
    
    'Servos need a positive pulse in order to operate. In general the pulse has to
    'have a width of 1 mS (left) to 2 mS (right). This pulse has to be repeated
    'approximately every 20 mS.
    'With the config statement CONFIG Servos we can specify how many servo's we
    'will use and which port pins are used.
    'A maximum of 14 Servos can be used.
    'The SERVO statements use one byte for an interrupt counter and the TIMER0.
    'This means that you can not use TIMER0 anymore.
    'The reload value specifies the repetition interval of the pulse.
    '
    'To gain the requierd  intervall of 20 mS, a reload value of 10 will work with
    'a crystall of 16 Mhz, a reload value of 5 with a crystal of 8 Mhz.
    '
    '4 Mhz works with a reload of 1 but we never ever will get the standard repe-
    'titon rate of 20 mS. The best to be reached is 31 mS. This still will work
    'with most servos, but side effects may occur.
    '
    'Lower clockfrequencies simply don't work!
    '
    'The pulsewidth depends on the value we write to the corresponding  servo array
    '-Servo(n)-. In praxis and as a rule of thumb this means for 8 MHz 84 to 168
    '-(1 mS to 2 mS), for 16 MHz 78 to 156 and for 4 Mhz 35 to 130.
    
    
    Const S_middle = 80
    Const S_right = 125
    Const S_left = 40
    
    Config Servos = 1 , Servo1 = Portd.3 , Reload = 1
    
    Config Portd.3 = Output
    
    Enable Interrupts
    
    
    Servo(1) = S_middle
    
    Do
    
    Waitms 20
    
        Servo(1) = S_middle
        Waitms 100
        Servo(1) = S_right
        Waitms 100
        Servo(1) = S_middle
        Waitms 100
        Servo(1) = S_left
        Waitms 100
    
    Loop
    
    End
    
    
    'The relevant ISR:
    '+0000002F:   930F        PUSH    R16              Push register on stack
    '+00000030:   938F        PUSH    R24              Push register on stack
    '+00000031:   B78F        IN      R24,0x3F         In from I/O location
    '+00000032:   938F        PUSH    R24              Push register on stack
    '+00000033:   93AF        PUSH    R26              Push register on stack
    '+00000034:   93BF        PUSH    R27              Push register on stack
    '+00000035:   939F        PUSH    R25              Push register on stack
    '+00000036:   E6A0        LDI     R26,0x60         Load immediate
    '+00000037:   E0B0        LDI     R27,0x00         Load immediate
    '+00000038:   918D        LD      R24,X+           Load indirect and postincrement
    '+00000039:   919C        LD      R25,X            Load indirect
    '+0000003A:   9601        ADIW    R24,0x01         Add immediate to word
    '+0000003B:   939C        ST      X,R25            Store indirect
    '+0000003C:   938E        ST      -X,R24           Store indirect and predecrement
    '+0000003D:   2700        CLR     R16              Clear Register
    '+0000003E:   3081        CPI     R24,0x01         Compare with immediate
    '+0000003F:   0790        CPC     R25,R16          Compare with carry
    '+00000040:   F411        BRNE    PC+0x03          Branch if not equal
    '+00000041:   9A93        SBI     0x12,3           Set bit in I/O register
    '+00000042:   C00F        RJMP    PC+0x0010        Relative jump
    '+00000043:   3090        CPI     R25,0x00         Compare with immediate
    '+00000044:   F041        BREQ    PC+0x09          Branch if equal
    '+00000045:   3D80        CPI     R24,0xD0         Compare with immediate
    '+00000046:   E007        LDI     R16,0x07         Load immediate
    '+00000047:   0790        CPC     R25,R16          Compare with carry
    '+00000048:   F048        BRCS    PC+0x0A          Branch if carry set
    '+00000049:   2700        CLR     R16              Clear Register
    '+0000004A:   930D        ST      X+,R16           Store indirect and postincrement
    '+0000004B:   930C        ST      X,R16            Store indirect
    '+0000004C:   C005        RJMP    PC+0x0006        Relative jump
    '+0000004D:   9612        ADIW    R26,0x02         Add immediate to word
    '+0000004E:   919D        LD      R25,X+           Load indirect and postincrement
    '+0000004F:   1789        CP      R24,R25          Compare
    '+00000050:   F008        BRCS    PC+0x02          Branch if carry set
    '+00000051:   9893        CBI     0x12,3           Clear bit in I/O register
    '+00000052:   EF8D        LDI     R24,0xFD         Load immediate
    '+00000053:   BF82        OUT     0x32,R24         Out to I/O location
    '+00000054:   919F        POP     R25              Pop register from stack
    '+00000055:   91BF        POP     R27              Pop register from stack
    '+00000056:   91AF        POP     R26              Pop register from stack
    '+00000057:   918F        POP     R24              Pop register from stack
    '+00000058:   BF8F        OUT     0x3F,R24         Out to I/O location
    '+00000059:   918F        POP     R24              Pop register from stack
    '+0000005A:   910F        POP     R16              Pop register from stack
    '+0000005B:   9518        RETI                     Interrupt return
    BTW: Das alles gilt für die aktuelle Version V1.11.8.2

    Grüße
    Henrik

  7. #27
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Hmm .. sieht sehr ineffektiv aus das ganze ...

    Zumal ich persönlich ein Problem damit habe, nen Mikrocontroller nur für einen Servo zu verwenden ...

    Diese ISR die dort anhängt und wohl vom Compiler erstellt wurde ist wirklich nicht das gelbe vom Ei .... den Rest vom betreffendem Code möchte ich in dem Fall lieber nicht sehen ....

    Wie wäre es diese Routinen selbst und effizient zu schreiben (vorzugsweise direkt in assembler) ?

    Ach ja, das ist übrigens einer der Punkte wieso ich Bascom nicht wirklich mag ....

  8. #28
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    71
    Beiträge
    277
    Zitat Zitat von Hanni
    Hmm .. sieht sehr ineffektiv aus das ganze ...

    Zumal ich persönlich ein Problem damit habe, nen Mikrocontroller nur für einen Servo zu verwenden ...

    Diese ISR die dort anhängt und wohl vom Compiler erstellt wurde ist wirklich nicht das gelbe vom Ei .... den Rest vom betreffendem Code möchte ich in dem Fall lieber nicht sehen ....

    Wie wäre es diese Routinen selbst und effizient zu schreiben (vorzugsweise direkt in assembler) ?

    Ach ja, das ist übrigens einer der Punkte wieso ich Bascom nicht wirklich mag ....
    Warum schreibst Du dann hier und nutzt Bascom? Du wirst lachen, für mich selbst schreibe ich solche Scherze auch selbst und anders. Nur wird das so oder so eng mit 1 MHz. wenn man die Spezifikationen einhalten will.

    Da das Problem aber hier öfter auftaucht, wollte ich wissen, woran es liegt. Im Gegensatzt zu Dir mag ich Bascom nämlich. Daran ändern auch solche Kunstfehler in der Beschreibung/ im Manual nichts.
    Von "nur für einen Servo nutzen" kann auch nicht die Rede sein, bis zu 14 Servos können angesprochen werden. Wenn Du gelesen hättest was ich geschrieben habe, sollte Dir das auch klar sein. Da es aber eine gute Idee[tm] ist, sowas erst mal mit der schlichtesten Möglichkeit anzutesten, habe ich das auch getan.

    Henrik

  9. #29
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von hrei
    Warum schreibst Du dann hier und nutzt Bascom? Du wirst lachen, für mich selbst schreibe ich solche Scherze auch selbst und anders.
    Wer sagt das ich Basecom nutze ... ich schrieb nicht umsonst dieses eingeklammerte Assembler
    Ich sehe nur gelegentlich hier im Board, WIE Bascom scheinbar einfache Dinge in derartig ineffiziente Routinen packt ...

    BTW: Der Controller könnte durchaus mehr wie die paar Servos steuern vor allem dann, wenn man vom "waitms" System weg geht ... und sich gewisse Routinen evtl doch lieber selber coded.

    Zumal die Aufgabenstellung ansich ja recht einfach ist ... eine bestimmte Anzahl von Impulsen einer gewissen Impulsbreite und mit einer gewissen Pulsfolgefrequenz zu generieren ...

    Ich wage zu behaupten, das mit dem richtigem Code das Ganze auch mit 1 MHz bestens läuft.

    Mal grob übern Daumen gepeilt:

    1 MHz entspricht einer Taktzeit von 1 µs
    1 ms = 1000 Takte
    20 ms = 20000 Takte ...

    und das ganze soll nicht funktionieren .. das glaube ich nicht.

    Grüße,

    da Hanni.


    €dit: Wie gesagt, nix gegen Bascom, nur ist es in dem Fall doch recht ineffizient ...

  10. #30
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    71
    Beiträge
    277
    Zitat Zitat von Hanni
    Wer sagt das ich Basecom nutze ... ich schrieb nicht umsonst dieses eingeklammerte Assembler
    Ach so... einer von denen... Muss Spaß machen sich selbst zu lesen, wenn man von Dingen schreibt, die man selbst in der Praxis nicht oder nur unzureichend ausprobiert hat. Mir gehen die Assemblerfreaks auf den Keks, die den Bascom Neulingen nix besseres zu bieten haben als: "Ist doch ganz einfach in Assembler".
    Zumal die Aufgabenstellung ansich ja recht einfach ist ... eine bestimmte Anzahl von Impulsen einer gewissen Impulsbreite und mit einer gewissen Pulsfolgefrequenz zu generieren ...

    Ich wage zu behaupten, das mit dem richtigem Code das Ganze auch mit 1 MHz bestens läuft.
    Laber nicht... mach! Alles andere ist doch Geschwätz.

    Edit: Genauer lesen und das Programm verstehen wär' auch nicht schlecht. Die WAITMS sind doch nur dazu da um den Servo in der Demo kurz anzuhalten. Mit der eigentlichen Problemstellung hat das nix, aber auch garnix zu tun.
    Henrik

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress