- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Verständnisfragen bezüglich PWM

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.07.2005
    Ort
    Oberwil
    Alter
    42
    Beiträge
    131

    Verständnisfragen bezüglich PWM

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Leute

    Ich habe einfach noch immer ein Problem mit dem PWM-Modus. Ich kann mir noch immer nicht ganz genau vorstellen wie ich ihn konfigurieren muss. Irgendwie ist mir der Groschen noch nicht gefallen.

    Also, mein Ziel wäre ein PWM Signal zu erzeugen mit 50Hz und einer Pulsbreite von 1.5ms bei einem Atmega32 mit 1MHz getaktet.

    Nun, zu meinen Überlegungen:

    Auf der RN-Wissen Seite habe ich mittels dem Java-Applet den Prescalar und den Vorlader ausrechnen lassen.

    Prescalar: 256; Vorlader: 78

    Das ist alles soweit noch in Ordnung. Aber ich verstehe trotzdem nicht ganz wie das abläuft mit dem PWM.

    Wenn ich nun eine Pulsbreite von 1.5ms haben möchte, wie muss ich das OCR1A laden?

    Vielen Dank für eure Hilfe

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.07.2005
    Ort
    Oberwil
    Alter
    42
    Beiträge
    131
    Nachtrag:

    void init_Motor(void)
    {

    //PWM einstellen: 10-Bit; invertiert
    TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1A0) | (1<<COM1B0) | (1<<WGM10);

    //PWM Prescalar: 256
    TCCR1B = (1<<CS12);

    //Vorladen
    TCNT1 = 78;

    //Interupt dektivieren
    TIMSK &= ~0x3c;

    //Ausgänge für PWM
    PORTD &= ~(1<<PD5);

    //Mindeszeit für PWM
    OCR1A = 1;

    //einschalten
    PORTD |= (1<<PD5);

    }

    Soweit wäre ich mal gekommen.

    Ist dies ok oder eher falsch??????

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    So, hier mal ein paar Denkansätze von meiner Seite zu diesem Thema:

    Vergiss den "Vorlader" !
    Vergiss den Prescaler wenn du eine größere Genauigkeit willst, denn du hast nur 20000 Takte je Periode zur Verfügung (=20 ms).
    Ohne Prescaller braucht man also 1500 Takte um die 1,5 ms abzudecken.

    Mein Vorschlag dazu: Der Timermode: 14 (siehe Datenblatt Seite 109).

    in das ICR1 Register gehört dazu der maximale Zählerwert. (in dem Fall 20000).
    In die OCR1A & OCR1B Register der Wert 1500

    Anschlißed noch die COM1A & COM1B Bits richtig setzen und der µC mach dir 2 Fast PWM's mit einer Periodendauer von 20 ms und einem High Anteil von 1,5 ms.

    Damit ließen sich z.B. 2 Servos ohne Rechenzeit ansteuern.

    Grüße,

    da Hanni.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.07.2005
    Ort
    Oberwil
    Alter
    42
    Beiträge
    131
    Vielen Dank für deine tolle Hilfe. Werde ich mal ausprobieren. Jetzt nur reine Neugier. Weshalb keinen Vorlader und Prescaler? Hat dies ein besonderer Nachteil oder weshalb schreibst du, dass ich ihn vergessen sollte?

    Denn in sämtlichen Foren ist immer die Rede von Prescaler und Vorlader.

    Noch eine Frage: Was hat es mit dem ICR1 Register auf sich? Habe ich noch in keinem Beitrag gelesen?

    In den meisten Beispielcodes ist nie die Rede davon. Ist das etwas spezielles oder besseres?

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    1. der Prescaaler:
    Also es bringt in diesem speziellen Anwendungsfall (µC mit 1 MHz und einer "Periodendauer" von 20 ms) meiner Meinung nach relativ wenig einen Prescaler einzusetzen.

    Wieso auch, ich brauche für 20 ms ziemlich genau 20000 Zählschritte. Der Timer 1 kann das auch locker (der schaft über 65000).
    Da diese Werte ausserdem den Schluss zulassen das du dieses für eine Servoansteuerung benötigst und damit eine Impulsbreite von 1 ms - 2 ms ins Spiel kommen kann bietet sich dieses in diesem Fall erst recht an (keine wilden Rechnereien - 1 ms = 1000, 2 ms = 2000).

    2. der "Vorlader":
    Ist in diesem Fall unnötig (siehe oben).

    3. ICR1 Register:
    In diesem Timermode wird im ICR1 Register der höchste mögliche Zählerstand definiert. Ansonsten dient es eher dazu mit jedem Zählertakt den H Zustand des ICP1 Pins zu zählen.

    genauere Details findest du im Datenblatt


    Grüße,

    da Hanni.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.07.2005
    Ort
    Oberwil
    Alter
    42
    Beiträge
    131
    Hey vielen Dank für deine tolle Erklärung. Ich denke mal, dass ich jetzt weiss um was es geht. Ansonsten werde ich mich wieder melden.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.07.2005
    Ort
    Oberwil
    Alter
    42
    Beiträge
    131
    Vielleicht doch noch eine Frage bezüglich dem Anschluss des Servos. Kann ich ihn direkt an den Port D5 anschiessen oder sollte ich noch eine Diode oder so drein schalten, damit kein Strom in den Controller fliessen kann?

    Hättest du vielleicht noch eine Idee wie der Anschluss aussehen sollte?

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    hmm, ich hab keine Ahnung, was so ein Servo an Saft zieht (also die Steuerleitung).
    Ich würde es vielleicht über einen Power MosFET lösen ... aber das sind Detailfragen, die sich nur mir dem Wissen über die vorhandene Hardware lösen lassen.

    Eine Diode dürfte jedenfalls nicht den gewünschten Effekt bringen.

    Grüße,

    da Hanni.

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.07.2005
    Ort
    Oberwil
    Alter
    42
    Beiträge
    131
    Hallo ich habe jetzt nun meine initialisierungs Funktion nach deiner Anleitung erstellt.

    oid init_Motor(void)
    {

    //PWM Mode 14
    TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM12) | (1<<WGM11);
    TCCR1B = (1<<WGM13);

    //Maximalwert für Periode laden
    ICR1 = 20000;

    //Interupt dektivieren
    TIMSK &= ~0x3c;

    //Ausgänge für PWM
    PORTD &= ~(1<<PD5);

    //Mindeszeit für PWM (1.5ms)
    OCR1A = 1500;

    //einschalten
    PORTD |= (1<<PD5);

    }

    wäre das so in etwas in Ordnung?

    Ich bin mir noch nicht ganz sicher ob ich alles richtig eingestellt habe.

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Der einfachste Weg das herauszufinden wäre:

    Das Programm in den µC flashen und den Ausgang mit nem Oszi anguggn.
    Mich würde es auch mal interessieren, da der Ansatz meinerseits bisher auf reiner Theorie beruht.

    Im Übrigen ist das was in OCR1A steht nicht die Mindestzeit für die PWM sondern die Impulsbreite des Impulses.

    Grüße,

    da Hanni.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen