Für das sind Foren und Mitglieder ja da ,
Gruß
Franz
Hallo jetzt funzt es!
Vielen Dank!
Zuerst war wieder kein Unterschied, dann habe ich in Set_Speed
folgendes auskommentiert:
if( direction == backward )
{
TCCR1A = (1<<COM1A0) | (1<<COM1B0); // inverted pwm
}
else
{
TCCR1A = ~(1<<COM1A0) & ~(1<<COM1B0); // non inverted pwm
}
Und dann hat sich der Mega8 wieder so verhalten wie es sein soll!
VIELEN DANK, besonders für deine Geduld!
LG
Rubi
Für das sind Foren und Mitglieder ja da ,
Gruß
Franz
Eine Frage hätte ich noch, denn leider so ganz zufrieden bin ich doch noch nicht mit der Pwm.Zitat von Kaiser-F
Ist das absichtlich das Du im Beispielcode 9bit Phase Correct PWM aktivierst, im Kommentar aber Fast PWM schreibst ?
Mein Problem:
Ich habe keinen wirklichen Spielraum bei der Geschwindigkeit.
die 1 bis 2,5 ms sind im OCR1A bei Werten zwischen ungefähr 5 und 25 schon überschritten. Außerdem erreiche ich keinen Wert, bei dem das Servo steht.
Setze ich z.B. 15 dreht es sich noch ganz langsam, bei 16 dreht es sich schon wieder relativ Flott in die andere Richtung.
Was mir allerdings aufgefallen ist, ist das sich nur modifizierte Servos so auffällig verhalten. Ein nicht modifiziertes (ich verwende Futaba) ist viel gutmütiger.
LG
Rubi
Rubi,
Nochmals Sorry wegen den Codes,
War an dem Tag anscheinend nicht ganz auf dieser Welt
damit ich die übersicht mal nicht wieder verliehre, hier mal ein Ausschnitt:
Bild hier
Tut mir wirklich leid wenn ich dich oder andere verwirrt habe.Code:void init_servo ( void ) { TCCR1A = (1<<WGM11)|(1<<WGM12)|(1<<COM1A1) |(1<<COM1B1); //9BIT FAST PWM aktivieren für 1A und 1B, nicht Invertiert TCCR1B = (1<<CS12) ; //Vorzähler CK/256 OCR1A = 0; // Werte für Servo A OCR1B = 0; // Werte für Servo A }
So stimmt es sicher ...
Gruß
Franz
Achja, das mit dem Modifizierten Servo.....
Anscheinend erwischt du eben gerade nicht die entsprechende Pulsweite....
L-------------+-------------R Servo vorgegaukelter Istwert = 0 Rotation:
L------------+--------------R Erster Annäherungsversuch
L--------------+------------R Erster Annäherungsversuch + 1
L-------------+-------------R uns so sollte es sein damit das servo steht
Leider gibt es keinen 128er Vorzähler, sonst könntest du mit 10Bit PWM arbeiten, dann währen die Schritte feiner.
Du könntest aber auch das Poti entsprechend verstellen, sodass er zum stehen kommt. Suchst dir einfach einen wert aus andem es fast steh, stellst das poti nach, und fixierst die stellung mit heißkleber oder so...
Demnach sind Feste widerstände halt doch nicht so gut geeignet...
Lieber das Poti dann drinnen Lassen und die Welle abschneiden....
Gruß
Franz
Hallo
Nach viel Frust (und Selbstzweifel) habe ich es nun endlcih geschafft.
Die hier verwendete PWM ist IMHO für gehackte Servos nicht zu brauchen.
z.B OCR1A auf Wert 50 Servo steht (wenn man Glück hat), auf 52 ist schon Vollgas. Da ist einfach zu wenig Spielraum.
Ich habe nun eine PWM Einstellung gefunden die
1. Genau 50 Hz hat
2. Dadurch das ein Prescaler von 8 verwendet wird sehr feinfühlig ist
3. einfach OCR1A = 1000 == 1ms Puls, OCR1A = 1500 == 1,5ms Puls
Bei interesse kann ich den Code gerne posten.
@Kaiser Franz
Da du mich darauf verwiesen hast das Datenblatt zu lesen, kann ich es mir nicht verkneifen.
In deinem Beispielcode, den Du netterweise gepostet hast, ist noch ein Fehler.
LG
Rubi
Hallo Rubi,
War wohl nicht meine Zeit
Wäre nett wenn du den Code mal posten könntest.
Gruß
Franz
Gruß,
Franz
Hallo Franz
Ist ja kein Problem und war auch nicht als Kritik gemeint. Konnte es mir halt nicht verkneifen.
Der Fehler falls es dich interessiert ist:
TCCR1A = (1<<WGM11)|(1<<WGM12)|(1<<COM1A1) |(1<<COM1B1);
WGM12 wird in TCCR1B gesetzt.
Mein (hoffentlich finaler) Code:
void init_servo ( void )
{
/*
//TCCR1A = (1<<WGM11)|(1<<COM1A1) |(1<<COM1B1); //10BIT FAST PWM aktivieren für 1A und 1B
TCCR1A = (1<<WGM11)|(1<<COM1A1) |(1<<COM1B1); //10BIT FAST PWM aktivieren für 1A und 1B
//TCCR1B = (1<<WGM13)|(1<<CS12) ; //Vorzähler CK/256
TCCR1B = (1<<WGM13)|(1<<CS12)|(1<<CS10) ; //Vorzähler CK/256
ICR1H = 1;
ICR1L = 644;*/
TCNT1 = 0xB1E0;
TCCR1A = (1<<COM1A1)| (1<<COM1B1);
TCCR1B = (1<<WGM13)|(1<<CS11); 0x13; //start Timer
OCR1A = 1500;
OCR1B = 1500;
ICR1 = 0x4E20;
DDRB |= ( 1<<PB1 ); //Servo links
DDRB |= ( 1<<PB2 ); //Servo rechts
}
Damit werden beide Servos auf Nullstellung (1,5ms) initialisiert.
Wenn Du voll Gas möchtest setzt Du
OCR1A = 2500; //(==2,5ms)
LG
Rubi
Hallo Rubi,
Da hab ich ja was gigantisches Übersehen,
WGM10 und WGM11 sind ja in TCCR1A
und WGM 12 und WGM 13 in TCCR1B
Naja, gut, dass du es gefunden hast... Ich habs wohl nicht bemerkt, da ich nur WGM10 und 11 benutzt habe, aber dake für den Hinweis, und nochmals sorry für die Verwirrung.
Du benutzt nun den "PWM Phase and Frequency correct Mode"
Der als TOP den einstellbaren ICR1 hat.
Nur, was mir noch fremd ist;
TCNT1 ist ja der Counter selbst, warum setzt du den auf HEX:B1E0 ( Dez: 45536) ?
Gruß,
Franz
Hallo Franz
Ich habe da ein Programm das heißt Application Builder.
Da gibst Du ein welche Frequenz Du möchtest und den PWM Modus
den Du haben möchtest und das Programm bildet Dir dann den Source Code.
Tja und warum jetzt TCNT1 setzen?
Ich weis es auch nicht.
Habe mich das auch gefragt und diese Zeile zuerst weggelassen, dann sind es aber nicht 50 sondern 300hz.
Dann habe ich die Zeile wieder eingefügt und alles hat gefunzt,...
LG
Rubi
Lesezeichen