mikrocontroller.net

Forum: Compiler & IDEs Servo Steuerung


Autor: samawi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An alle die schon mal servo motoren gesteuert haben oder fit was GCC 
angeht

ich habe ein Kleines Problem.( Hardwäre stk 500 mit Atmega 16)


Ich habe ein C-Code geschrieben  wird nach druck der Taster1 ( PIN0) der 
servo in der Position 1700 bringen und nach druck der Taster 2 ( 
PIN1)nach Position 1200.

Aber ich möchte eine Verzögerung hinbringen das nach dem Drücken von nur 
eine Taster das der Servo sich nach Position 1700 bewegen kann und 
danach nach Postition 1200.

Ich habe es mit der " delay " versucht aber er erkennt es irgend wie 
nicht. und nimmt nur der letzte befehl an auch wenn ich höhere Tacktfreq 
nehme.

Autor: Hansl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
servotiming ist schon eine spannende sache. hab selbst auch schon
tage mit dem debugging verbracht :)

dir ist schon klar das du dem servo permanent positionsdaten schicken
musst ... zb. 20ms_2ms_20ms_2ms. wenn dies ausbleibt wandert er,
sofern er nicht gehackt wurde(endlossservo) auf position NULL zurueck?

poste mal deinen c code schnippsel dann seh ich mirs(in ca. 8h)
gern mal an. mit welcher frequenz taktest du deinen atmega16?

mfg
 hansl

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>dir ist schon klar das du dem servo permanent positionsdaten schicken
>musst ... zb. 20ms_2ms_20ms_2ms. wenn dies ausbleibt wandert er,
>sofern er nicht gehackt wurde(endlossservo) auf position NULL zurueck?


Quatsch.
Der wandert nirgendwohin, wenn die Impulse ausbleiben und keine äussere 
Kraft auf das Ding einwirkt.

@samawi:
Wenn du dein Programm (oder zumindest relevante Teile) hier reinstellen 
würdest, könnte man auch präziser antworten.

Im Prinzip geht es ganz einfach:
Warte auf die Taste
Sobald die Taste gedrückt wurde, setze die aktuelle Impulslänge auf 1700
Solange Position 1200 noch nicht erreicht wurde,
 gib einen Impuls der akutellen Impulslänge aus
 verringere die Impulslänge um einen bestimmten Betrag.

Der Betrag, um die Impulslänge geändert wird, entscheidet über die 
Geschwindigkeit, mit der sich das Servo bewegt (bis auf dessen 
mechanische Träghheit natürlich).
Die Schleife kann auch fußgesteuert sein...

Autor: Hansl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
war wohl doch schon ein wenig spaet ;)

Autor: Samawi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mein Programm ist allerdings einbisschen komplizierter da ich 
mehrere servos gleichzeitig kontrolliere ( Hier gehts um die Steuerung 
eines sexbeinigen Roboters( Hexabot).

Also ich habe so zu sagen die Aufgabe jetzt schon gelöst und zwar statt 
eine einzige delay habe ich eine delay schleife (for)eingesetzt.

Es scheint mir allerdings immer noch einbisschen doof programmiert.
wenn jemanden eine andere idee hat ist immer willkommen.

n.B ich nutze neben den stk500 noch den servo controller SSC32

======================================================
#include <avr/interrupt.h>
#include <util/delay.h>
#include<stdio.h>
// Einbinden des Servo Treibers

void servo_cmd (char *s)
{
    while (*s)
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
        uart_putc(*s);
        s++;
    }
}


int main(void) {
int i;

// Initialisierung der RS232 Schnittstelle
  uart_init();

// IO Ports initialisieren
  DDRA=0x00;

  DDRB=0xff;
  PORTB=0xff;

// Timer1 initialisieren
  TCNT1H=0x00;
  TCNT1L=0x00;

// CTC Mode - Prescaler 256
  TCCR1A = 0x00;
  TCCR1B = 0b00001011;

// 1sec bei 3,6864 MHz
   OCR1AH = 0xe0;
  OCR1AL = 0xff;

// Timer aktivieren
  TIMSK |= 0x10;


// Globale Interrupts aktivieren
  sei();

  while(1) {

    if ( !(PINA & (1 << PA0)) ) {

        servo_cmd("#4p1200 #5p1750 #6p1750 #24p1750 #25p1200 #26p1250 
#16p1750 #17p1200 #18p1250 t2000\r");
        for (i = 0; i < 150; i++) {
          _delay_ms(30);
    } ;
          servo_cmd("#4p1500 #5p1500  #24p1500 #25p1500  #16p1500 
#17p1500 t2000 \r");

    for (i = 0; i < 200; i++) {
          _delay_ms(30);
    } ;


      servo_cmd("#0p1200 #1p1750 #2p1750 #8p1200 #9p1750 #10p1750 
#20p1750 #21p1200 #22p1250  #6p1500 #26p1500 #18p1500 t2000\r");

        for (i = 0; i < 150; i++)
    {
              _delay_ms(30);
    } ;
      servo_cmd("  #0p1500 #1p1500 #8p1500 #9p1500 #20p1500 #21p1500 
t2000\r");

       for (i = 0; i < 100; i++)
                {
                     _delay_ms(30);
    } ;
      servo_cmd("#4p1200 #5p1750 #6p1750 #24p1750 #25p1200 #26p1250 
#16p1750 #17p1200 #18p1250  #2p1500 #10p1500 #22p1500 t2000 \r");


  }
  return(0);
}

// Interrupt Routine Timer1 Compare Match
SIGNAL (SIG_OUTPUT_COMPARE1A)
{
// Toggle LED an PortB
PORTB ^= (1 << PB0);
//uart_puts(servo);
}

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Samawi (Gast)

>mehrere servos gleichzeitig kontrolliere ( Hier gehts um die Steuerung
>eines sexbeinigen Roboters( Hexabot).
       ^^^^
Bist du Entwickler für die Firma B. U. aus F.? fg

SCNR
Falk

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OT: Wundert mich, dass das durch den Spamfilter gekommen ist ;) ;)

Autor: samawi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Falk Brunner : nein es ist ein Project bei und an der FH ich bin noch 
kein richtiger Entwickler eher Anfänger.

@ Simon Küppers : OT: Wundert mich, dass das durch den Spamfilter 
gekommen ist ;) ;)

was meinst du genau damit?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ samawi (Gast)

>@ Simon Küppers : OT: Wundert mich, dass das durch den Spamfilter
>gekommen ist ;) ;)
>was meinst du genau damit?

Solche bösen Worte wie S E X erkennt die Software dieser Website und 
weist die Beiträge zurück. Probier mal das Wort oben ohne Leerzeichen in 
einem Beitrag zu verwenden. Sex

MFG
Falk

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huch,geht doch. SPAMfilter im Urlaub?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>servo_cmd("#4p1200 #5p1750 #6p1750 #24p1750 #25p1200 #26p1250
>#16p1750 #17p1200 #18p1250  #2p1500 #10p1500 #22p1500 t2000 \r");


Jetzt wäre interessant, was die einzelnen Zeichen/Phrasen in diesem 
String zu bedeuten haben.
Gibt es zu dem Servo-Controller bzw. dessen Protokoll auch eine 
Beschreibung?

>Huch,geht doch. SPAMfilter im Urlaub?
Andreas macht nebenbei noch ein Bekanntschaften-Forum hier auf...

Autor: samawi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Falk Brunner ;-)))))))))) hab gar nicht drauf geachtet. Die sollen 
dich als Spamfilter einstellen. gut aufgepasst.

@ STK500-Besitzer: die string ist nicht weiter als ein servo befehl der 
so aufgebaut ist : # Chanel ( Nr der servo) P postion wo er hin muss ( 
oder kann mann als winkel betrachten) T steht für die zeit der er für 
die bewegung braucht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.