- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte
Ergebnis 41 bis 50 von 51

Thema: PWM 2 kleine Probleme.... bitte um Hilfe

  1. #41
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    09.12.2004
    Beiträge
    485
    Anzeige

    Praxistest und DIY Projekte
    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

  2. #42
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    Für das sind Foren und Mitglieder ja da ,

    Gruß
    Franz

  3. #43
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    09.12.2004
    Beiträge
    485
    Zitat Zitat von Kaiser-F
    So müsste es gehen:

    TCCR1A = (1<<WGM11)|(1<<COM1A1) |(1<<COM1B1); //9BIT FAST PWM
    }[/code]
    Eine Frage hätte ich noch, denn leider so ganz zufrieden bin ich doch noch nicht mit der Pwm.
    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

  4. #44
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    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  



    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
    
    }
    Tut mir wirklich leid wenn ich dich oder andere verwirrt habe.

    So stimmt es sicher ...

    Gruß
    Franz
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken pwm-modes.jpg  

  5. #45
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    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

  6. #46
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    09.12.2004
    Beiträge
    485
    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

  7. #47
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    Hallo Rubi,

    War wohl nicht meine Zeit

    Wäre nett wenn du den Code mal posten könntest.

    Gruß
    Franz
    Gruß,
    Franz

  8. #48
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    09.12.2004
    Beiträge
    485
    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

  9. #49
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    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

  10. #50
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    09.12.2004
    Beiträge
    485
    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

Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte

Berechtigungen

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

12V Akku bauen