- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 16

Thema: Servosteuerung ohne Arduino und Co

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    15.03.2011
    Ort
    Dresden
    Alter
    36
    Beiträge
    1.937
    Ne einfache klassische Useles-Machine funktioniert auch ohne Mikrocontroller, einfach mit Schaltlogik. Dazu ließe sich die Elektronik aus dem Servo entfernen und dieser wie ein Getriebemotor steuern. Wann und in welche Richtung er läuft, ist dann von diversen Schaltern abhängig, da bräuchte man dann neben dem Hauptschalter noch zwei Endschalter, an welche der Servo anschlägt. Den Rest macht dann die richtige Verdrahtung. Irgendwo hatte ich dafür schonmal einen Schaltplan, muss ich nochmal suchen, vielleicht kommst du aber auch selber drauf

    Hmm, die PWM für einen Servo würde ich in Software erzeugen, da die Harware-PWM nureine recht grobe Auflösung von bis zu 10 Bit hat. Sind zwar 1028 Schritte, allerdings kannst du dich ja nur in dem Bereich von 1-2ms von 20ms bewegen, was einem Tastverhältnis von 0,05 bis 0,1 entspräche. Kämen also nur die Schritte von 52 bis 103 in Frage, das hieße du könntest deinen Servo nur in ca. 52 Schritten bewegen, dazwischen ginge nix. Daher wäre es besser, das Servosignal dann mit einem Timer selber aufzubauen. Der Timer funktioniert ja so, dass er in einem bestimmten Takt hochzählt und bei einem Überlauf eine Unterfunktion auslöst. In dieser Unterfunktion wird dann meist der Timer auf einen gewünschten Wert gesetzt, damit dieser das nächste mal dann in der gewünschten Zeit überläuft. So lassen sich ziemlich präzise Zeiten einstellen. Da müsstest du dann einstellen, wie lange der Pin für die PWM an sein soll und beim nächsten Mal, wie lange er dann aus sein soll.
    AI - Artificial Idiocy

  2. #2
    Neuer Benutzer Öfters hier Avatar von Strawhat
    Registriert seit
    20.02.2015
    Beiträge
    14
    Ich will ne Useless Machine mit komplexeren unterschiedlichen Bewegungsabläufen machen, deshalb fällt dein Ansatz leider flach ^^

    Mit Software-PWM meinst die Erzeugung durch Unterbrechungen(delays) von Dauersignalen?
    Würde mich wundern, wenn die Hardware PWM nur so geringe Schrittzahlen unterstützen würde, aber wenn das so ist, muss ich wohl auf die Software-PWM zurückgreifen.

    Hast ja irgendwelche Tutorials oder ein Testprogramm? Ich nutze übrigens 180° Servos (nicht umgebaut) und würde diese auch gern so belassen, brauch eh keine 360° Drehungen
    Facebook Gruppe für Robotik, Elektronik und Modellbau Enthusiasten. https://www.facebook.com/groups/1396674970640627

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.653
    Zitat Zitat von Geistesblitz Beitrag anzeigen
    ... die PWM für einen Servo würde ich in Software erzeugen, da die Harware-PWM nureine recht grobe Auflösung von bis zu 10 Bit hat ...
    Das verstehe ich jetzt nicht wirklich. Ich habe meine Hardware-PWMs für Servos überwiegend mit nem 16bittigen Timer laufen, davon nutze ich aber nur 12 bis 13 Bit, genauer: Auflösungen von rund 4000 und drüber für den möglichen bzw. genutzen Schwenkbereich des Servos. Ne Auflösung mit rund 4000 bis 6000 Ticks ist etwa zehnmal so fein wie meine billigen Servos überhaupt fahren können - aber sie können das.
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    15.03.2011
    Ort
    Dresden
    Alter
    36
    Beiträge
    1.937
    Wo hat ein Atmega328 denn 16 Bit HW PWM? Ich war jetzt jedenfalls der Meinung, dass sich die Hardware-PWM nur bis 10 Bit Auflösung hochschrauben ließe und das auch nur über den gesamten Stellbereich für das Tastverhältnis. Für ein Servosignal braucht man allerdings nur einen kleinen Teil davon, daher würde sich ja eigentlich die Auflösung reduzieren, oder? So hab ich das jedenfalls bisher verstanden.
    AI - Artificial Idiocy

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.653
    Zitat Zitat von Geistesblitz Beitrag anzeigen
    Wo hat ein Atmega328 denn 16 Bit HW PWM? ...
    Aufm Chip, wo sonst - die Frage verstehe ich nicht. Es macht jedenfalls Sinn das Datenblatt zu lesen, z.B. ATmega48A-bis-328-328P_8271G-02-2013. Dort gibts ein sechzehntes Kapitel mit dem Titel

    16. ... 16-bit Timer/Counter1 with PWM

    16.1 ..... Features
    ............ • True 16-bit Design (i.e., Allows 16-bit PWM)

    Schau Dir mal die Pinbelegung von PB1 und PB2 an.

    Zitat Zitat von Geistesblitz Beitrag anzeigen
    ... Ich war jetzt jedenfalls der Meinung, dass sich die Hardware-PWM nur bis 10 Bit Auflösung hochschrauben ließe ...
    Im Umfeld "C" bzw. AVRGCC ist das nicht der Fall, wie es mit Bascom oder arduinos IDE ist weiß ich nicht.
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    15.03.2011
    Ort
    Dresden
    Alter
    36
    Beiträge
    1.937
    Gut, ok, das war mir bisher nicht so bewusst gewesen. Damit sollte das dann doch funktionieren.
    AI - Artificial Idiocy

  7. #7
    Neuer Benutzer Öfters hier Avatar von Strawhat
    Registriert seit
    20.02.2015
    Beiträge
    14
    Leider bringt mich diese Tatsache nicht weiter x)
    Kennt keiner von euch eine möglichst deutschsprachige Seite, die die Funktion von PWM in Verbindung mit Servos erklärt?
    Facebook Gruppe für Robotik, Elektronik und Modellbau Enthusiasten. https://www.facebook.com/groups/1396674970640627

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Die Funktion ist schnell erklärt. Das Servo reagiert auf die Impulslänge. Eine Impulslänge von ca. 1 Millisekunde stellt das Servo in die Mitte, 0,5ms ist Anschlag auf der einen Seite, 1,5ms auf der anderen Seite. Der Impuls wird alle 20ms wiederholt. Das wars schon.

    Die Werte variieren bei den Servos, Die Wiederholung kann bei digitalen Servos oder Brushless-Reglern deutlich häufiger sein. Der Impuls ist fast immer positiv. Da das Puls-Pause-Verhältnis verändert wird, nennt man es PWM.

    Ein Servo mit einem Timer anzusteuern ist nicht so sehr kompliziert. Man nimmt einen Mode mit einstellbarem TOP. Dieses TOP wählt man so, dass das Zählregister 20ms braucht um es beim verwendeten Kontrollertakt und gewähltem Vorteiler zu erreichen. Dann schreibt man in das Vergleichsregister den Wert, der der gewünschten Impulsdauer entspricht:

    Code:
    	// Timer1 für 16MHz-ATMega256
    	# define OC1A 				PB5
    	# define OC1B 				PB6
      	TCCR1A = 0;
      	TCCR1B = (0<<CS12)|(1<<CS11)|(0<<CS10);	// prescaler /8
    
    	TCCR1A |= (1<<WGM11)|(0<<WGM10);       	// Mode 14: FastPWM mit ICR1 als Top
    	TCCR1B |= (1<<WGM13)|(1<<WGM12);
    
    	TCCR1A |= (1<<COM1A1)|(0<<COM1A0);       	// OCR1A set on Botton, reset on Match
    	TCCR1A |= (1<<COM1B1)|(0<<COM1B0);       	// OCR1B set on Botton, reset on Match
    
    	TCNT1 = 0;                                // Timer1 zurücksetzen;
    	ICR1 = 40000;                             // 16MHz/8/20mS für 20ms-Zyklus
    	OCR1A = 3000;                             // Match und OC1A auf Low nach 1,5ms
    	OCR1B = 3000;                             // Match und OC1B auf Low nach 1,5ms
    
    	DDRB |= (1<<OC1A) | (1<<OC1B);         	// PWM-Pins sind Ausgang...
    	PORTB &= ~((1<<OC1A) | (1<<OC1B));     	// ...und low
    (Code für zwei Servos an einem Mega256 mit 16MHz)

    Natürlich gibt es noch unzählige andere Möglichkeiten ein Servo anzusteuern.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Neuer Benutzer Öfters hier Avatar von Strawhat
    Registriert seit
    20.02.2015
    Beiträge
    14
    Danke dir, sowas hatte ich gesucht kannst du mir nur erklären wie es bei nem 8MHz Atmega aussähe bzw. was es mit den Prescaler und der Zyklusberechnung ICR1 auf sich hat?

    Was müsste ich wie manipulieren um den einen oder anderen Servo anzusteuern?
    Facebook Gruppe für Robotik, Elektronik und Modellbau Enthusiasten. https://www.facebook.com/groups/1396674970640627

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Mit dem Prescaler erzeugt man den heruntergeteilten Takt für den Timer aus dem Takt des Kontrollers. Der Takt des Timers ist um der Faktor des Vorteilers geringer als der Kontrollertakt. Ein 8MHz-Mega8 zählt mit Prescaler /8 in 20ms bis 8000000/8*0,020=20000. In einer Millisekunde zählt er bis 1000.

    Weil es so einfach ist, wählt man den Mode 14 "Fast-PWM mit ICR1 als TOP" und begrenzt den Zählbereich mit dem IRC1-Register auf 20000. Das Zählregister TCNT1 zählt dann von 0 (Bottom) nach 20000 (Top) und wird beim Erreichen von Top wieder auf Bottom gesetzt. Ein Zyklus dauert nun 20ms.

    Das Vergleichsregister OCR1A (A für Kanal A) wird mit 1000 geladen und der Ausgang OC1A wird so eingestellt, dass der Ausgang (beim Mega8 ist OC1A der Pin PB1) bei TCNT1==Bottom auf High und bei TCNT1==OCR1A wieder auf Low gesetzt wird. Wenn dann noch das Datenrichtungsregister auf Ausgang konfiguriert ist, wird am Pin PB1 ein Impuls ausgegeben,der 1ms dauert. Wenn man nun den Wert in OC1A ändert, ändert sich auch die Impulsdauer.

    In den Registern TCCR1A und TCCR1B (hier bezeichen A und B die zwei Register und nicht die zwei Kanäle!) werden der Prescaler (CS), der Modus (WGM) und die Ansteuerung des Ausgang (COM1A0 und COM1A1, A ist hier wieder der Kanal) durch setzen der entsprechenden Bits ausgewählt.

    Ich habe die Datenblätter nur überflogen, aber ich denke, die Register vom Mega8 und vom Mega256 stimmen in etwa überein. Bis auf das Setup des Pins kannst du deshalb die Konfiguration von oben übernehmen.

    Was müsste ich wie manipulieren um den einen oder anderen Servo anzusteuern?
    Mit OCR1A beeinflußt man die Impulsdauer an OC1A (PB1). Mit OCR1B funktioniert das dann auch mit OC1B an PB2, wenn du COM1B0 und COM1B1 und das DDR für Pin PB2 auch konfiguriert hast. Der Prescaler, der Mode, das Zählregister und die Einstellung für Top gilt für beide Kanäle.

    Übrigends läuft das alles automatisch im Hintergrund ohne dein Programm zu beeinflussen oder gar zu bremsen.

    Gruß

    mic
    Geändert von radbruch (21.02.2015 um 18:29 Uhr) Grund: Kanal B hinzugefügt
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Ähnliche Themen

  1. [ERLEDIGT] Messen einer Entfernung mit einem Arduino OHNE Kit
    Von Unregistriert im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 5
    Letzter Beitrag: 25.01.2015, 10:58
  2. ARDUINO und C++???
    Von Dr. Bombe im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 7
    Letzter Beitrag: 03.01.2013, 12:27
  3. Antworten: 1
    Letzter Beitrag: 05.12.2012, 19:11
  4. Antworten: 1
    Letzter Beitrag: 14.10.2012, 16:12
  5. Servosteuerung und STK500
    Von raoul.m@gmx.ch im Forum Assembler-Programmierung
    Antworten: 10
    Letzter Beitrag: 16.12.2006, 02:23

Stichworte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad