- LiFePO4 Speicher Test         
Seite 3 von 6 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 51

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

  1. #21
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Servus Nils,

    Danke für deine Bemühungen,

    Du hattest mir deiner Vermutung Recht!

    Meine Eingangsfrequenz war nicht richtig!

    mein Fehler

    Gruß,
    Kaiser

  2. #22
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    09.12.2004
    Beiträge
    485
    Zitat Zitat von Kaiser-F
    Normal genügen folgende Zeilen um ein Servo anzusteuern:

    (mit 8MHz µC-Frequenz)
    Code:
    #include <io.h>
    
    {
    
    // den entsprechenden Pin muss man glaub ich als Ausgang definieren, nicht vergessen
    
    TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1); //10BIT PWM aktivieren
    TCCR1B = (1<<CS11); //Vorzähler 8 also CK/8
    
    for (;;) {
    
    OCR1A = "Wert";  // wert liegt zwischen 50 und 150 (Vollausschläge)
    
    }}
    Hallo

    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

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

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

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

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

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

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

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

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

Seite 3 von 6 ErsteErste 12345 ... LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress