- LiFePO4 Speicher Test         
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
    16.03.2011
    Ort
    Dresden
    Alter
    37
    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

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    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

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

  4. #4
    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

  5. #5
    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!

  6. #6
    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

  7. #7
    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 19: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!

  8. #8
    Neuer Benutzer Öfters hier Avatar von Strawhat
    Registriert seit
    20.02.2015
    Beiträge
    14
    Vielen Dank für die ausführliche Erklärung, damit kann ich mal was Anfangen. Hier wäre wohl ein Oszi nicht schlecht ... leider sind die ja so teuer =/

    Hab mal einen gesehen, der es über einen PC laufen ließ, gibts da Oszi Hardware für PC? Was haltet ihr davon?
    Facebook Gruppe für Robotik, Elektronik und Modellbau Enthusiasten. https://www.facebook.com/groups/1396674970640627

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von Strawhat Beitrag anzeigen
    Hab mal einen gesehen, der es über einen PC laufen ließ, gibts da Oszi Hardware für PC? Was haltet ihr davon?
    Google mal nach: Logic Analyzer
    Die Teile gibts zum Teil erstaunlich günstig zu haben.

Ähnliche Themen

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

Stichworte

Berechtigungen

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

12V Akku bauen