Servus Nils,
Danke für deine Bemühungen,
Du hattest mir deiner Vermutung Recht!
Meine Eingangsfrequenz war nicht richtig!
mein Fehler :-(
Gruß,
Kaiser
Druckbare Version
Servus Nils,
Danke für deine Bemühungen,
Du hattest mir deiner Vermutung Recht!
Meine Eingangsfrequenz war nicht richtig!
mein Fehler :-(
Gruß,
Kaiser
HalloZitat:
Zitat von Kaiser-F
Bitte um Hilfe, irgendwo habe ich einen Denkfehler.
Ich würde gerne die Hardware PWM vom Mega8 verwenden um 2 Servos anzusteuern.
Leider habe ich aber keinen 8Mhz Quarz verwendet, sondern einen mit 16Mhz.
Mit dem obrigen Code funktioniert es zwar, aber das Servo läßt sich nicht in der Geschwindikeit ändern, es dreht sich mMn immer gleich schnell, egal welchen Wert ich in OCR1A verwende.
Außerdem bräuchte ich einen Prescaler von 16, anstelle von 8 dies ist aber auch nicht möglich, weil nach 8 der nächste Wert 64 ist.
Bitte um Hilfe.
LG
Rubi
Hallo Rubi.
Um ein Modellbauservo Anzusteuern müssen sich deine Impulse min. alle 20ms (soweit ich mich erinnere) erfolgen.
Zunächst musst du dich auf eine PWM "Betriebsart" einigen.
Soweit ich mich aus dem Datenblatt schla gemacht habe gibt es über vier Stück:
1: Normale Mode
2: Clear Timer on Compare Match (CTC) Mode
3: Fast PWM Mode
4: Phase Correct PWM Mod
und noch ein paar wenige.
Erklärung: ATMEGA8535 Datenblatt Seite 99 - 104
Übersicht: ATMEGA8535 Datenblatt Seite 133
Für uns Interessant ist aber nur der FAST PWM MODE!
Dies erklärt dir schonmal, warum "WGM10" und "WGM11" in "TCCR1A" auf "1" gesetzt werden müssen.
Beim Fast PWM Mode zählt der Counter von 0 bis zur Obergrenze.
( beim 8 Bit timer ist die Obergrenze "volle 8 Bit", also 256.
beim 16 Bit kannst du zwischen 8, 9 und 10 Bit wählen.
Der Counter zählt also ständig von 0 bis Obergrenze und fängt dann wieder von neu an.
Erreicht er in dieser Zeit den wert von OCR1A bzw. OCR1B oder auch OCR1C ( beim Mega128 ), dann schaltet er auf High, bzw auf Low, je nach Invertierung des PWM signals.
Kurze Rede Langer Sinn:
Deine Kompunenten berechnen Sich bei FAST PWM wie Folgt:
f.PWM = f.CPU/(N*(1+TOP))
N ist der prescaler, den kannst du in TCCR1B mit den "CS"-Bits Festlegen. ( 1, 8, 64, 256, oder 1024 )
ATMEGA8535 Datenblatt Seite 111.
TOP die Obergrenze.
Die Obergrenze wird je nach gewählten PWM 8,9 oder 10 Bit festgelegt.
Nachsehen kannst du das im
ATMEGA8535 Datenblatt auf seite 133.
Hier sieht man auch dass man auch andere Werte für TOP selbst definieren kann.
zB kann man in ICRn den gewünschten Wert schreiben,
Aber so genau geht es ja bei den Servos nicht.
Ach ich fang schonwieder an so viel zu labern, dabei wolltest du ja nur den Code :-)
Also:
folgende Gleichung:
f.PWM = f.CPU/(N*(1+TOP))
alle 20ms muss eine neue Flanke kommen.
20ms = 0,020s, und i Hz ist ja 1/secunde.
Also bruachen wie 1/0,020s, macht 50Hz.
mit 10 Bit PWM und 265er Prescaler komm ich auf ca. 61Hz.
also sieht das so aus:
Code:
#include <io.h>
{
TCCR1A = (1<<WGM12)|(1<<WGM11)|(1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);
//"(1<<WGM12)|(1<<WGM11)|(1<<WGM10)" bedeutet 10Bit FAST PWM Mode
//"(1<<COM1A1)|(1<<COM1B1)"Ausgang A und B sind nicht invertiert.
// Es wird also so lange High gehalten, bis der Counter den wert OCR1A bzw. OCR1B überschreitet.
TCCR1B = (1<<CS12);
//Prescaler = 256
for (;;) {
OCR1A = "Wert"; //
OCR1B = "Wert"; //
}}
Ich hoffe ich konnte helfen.
Du kannst eigentlich alles in den Datenblättern erfahren.
---Ich weiss, dass sagt dir jeder, und ich weiss auch dass man da nur was rauslesen kann, wenn man eine gewisse Grundahnung hat, und ich hoffe die hast du jetzt. zumindest über PWM.
Und ich hoffe auch dass ich keinen MIST erzählt habe ;-)
Gruß
Franz
PS: wenn du nen anderen Mode nimmst, wie schon an gesprochen wo du TOP festlegen kannst, dann kommst du eventuell genau auf 20ms!
Und dadurch kannst du mit OCR1A / B auch viel exakter deine 1-2ms halten,
Achja, das Servo reagiert übrigens zwischen 1 und 2 ms ( positive Flanke )
Hallo
Danke für die Hilfe habe es mit deiner Formel jetzt auch rechnersich nachvollziehen können. ;-)
Der "ideale" prescaler wäre nach meiner Rechnung 312.
256 ist ja nicht so weit davon entfernt.
Meine Servos wechseln die Drehrichtung wenn ich die PWM invertiere.
Ist das bei Dir auch so? Oder steuerst Du auch die Drehrichtung über OCR1A / B ?1
Vielen Dank auf jeden Fall, werde es gleich am Abend ausprobieren.
P.S.: Ad Datasheet
Natürlich steht das im Datenblatt, wäre schlimm wenn es nicht so wäre,...
Aber, ich habe mir den Timer Teil gestern ausgedruckt und war erschlagen von den Details (und den kryptischen Namen).
Ansonsten arbeite ich sehr gerne mit den AVRs und die Dantenblätter sind auch erste Sahne, aber halt sehr umfangreich.
LG
Rubi
Ich muss gestehen, der Code der ganz oben steht, also der uralte von damals... da hab ich mich nochnicht ausgekannt... und der is eigendlich nur aus Zufall gegangen.... da hab ich zwar ein 8MHz Quarz angeschlossen, aber vergessen es in den securitybits zu aktivierren :-)
tja... DAMALS... :-)
zwecks drehrichtung,
Das servo hat in dem sinne keine Drehrichtung. Es ist ein geschlossener Regelkreis. Es hat also Stellungen, welche du mit der Pulslänge ( 1- 2 ms ) bestimmst. Diese Pulse aktualisierst du alle 20ms ( 30ms is auch OK ).
Das Servo versucht also ständig seinen Hebel auf die vorgegebene Stellung zu bringen.
Drehrichtung oder Positiv/negativ - Stellungen werden uns durch die "Computerfernsteuerungen" aus dem Modellbau vorgegaukelt...
so mit + - 100% und so... haben die nur gemacht um es schönder Darzustellen.
Mittelstellung sollte also eigentlich bei einer Pulslänge von 1,5ms sein.
-100% ist dann 1ms und +100% sind 2ms.
Wenn dein Programm das so immer umwandelt, dann kannst du wunderbar mit servos arbeiten!
Gruß
Franz
Hallo Franz
Ich verwende modifizierte, "gehackte" Servos.
Da bekommt der Regelkreis kein Feedback mehr vom Seuerpotenziometer.
Die einzige Möglichkeit, die ich gestern beim herumspielen gefunden habe,
um die Drehrichtung zu ändern, war die PWM zu invertieren.
LG
Rubi
achso,
Du willst sie als Getriebemotor mit Geschwindigkeitsregelung verwenden.
Mein tipp dabei wäre, du misst das Poti wenn es in Mittelstellung ist, und ersetzt es durch Feste Widerstände.
Wenn du dann eine Pulslänge von 1,5ms hast, steht es.
Verlängerst du die Pulslänge, so dreht es sich immer schneller in die eine Richtung
Verringerst du die Pulslänge, so geschieht das Selbe in die andere Drehrichtung.
Das Servo ist nämlich so "programmiert", dass es seine Drehzahl bei annäherung des sollwertes verringert. Ansonsten würde es ständig zittern und nicht zur Ruhe kommen.
Hallo Franz
Vielen Dank, ich werde das Heute probieren.
Alles in allem, bin ich mir ziemlich sicher, das mein nächster
Bot keine Servos als Motor bekommen wird.
Eine H-Brücke und die Hardware PWM, wäre um einiges einfacher zu realisieren gewesen.
Zum Datenblatt noch etwas:
Ich hätte mir viel leichter getan das ganze zu verstehen, wenn ich irgendwo explizit lesen hätte können, dass TOP gleich 2 hoch der eingestellten PWM Bitbreite ist.
Im Datenblatt steht aber z.B.:
The figure shows fast PWM mode when OCR1A or ICR1 is used to
define TOP.
Das würde praktisch bedeuten das man mit OCR1A die Frequenz bestimmt anstelle der Pulsbreite.
Eigentlich finde ich die Atmel Datenblätter sehr gut, die PWM ist aber imho verwirrend beschrieben.
DANKE FÜR DIE HILFE
LG
Rubi