-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: PWM funktioniert nicht

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.03.2005
    Ort
    Lübeck
    Beiträge
    315

    PWM funktioniert nicht

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hi,

    ich habe eben schon bei der Hardware-Ecke gepostet, aber möchte hier noch einmal mein Problem vorstellen, falls es doch ein Software-Problem ist. und zwar probiere ich PWM auf dem AtMega128 hinzubekommen.

    Hier erst einmal mein Code (Ausschnitt):
    Code:
    void pwm_init( void ) {
    	DDRB=0xff;
    	PORTB=0x00;
    	TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);
    	TCCR1A = (1<<WGM11)|(1<<WGM11)|(1<<COM1A1)|(1<<COM1A0);
    }
    
    void pwm_setpwmvalue( uint16_t value ) {
    	OCR1A = value;
    }
    In der main() rufe ich dann erst
    Code:
    pwm_init();
    und dann
    Code:
    pwm_setpwmvalue( 100 );
    auf. Doch an PB5 ist nichts zu sehen. Habt Ihr eine Idee, woran das liegen könnte???

    MfG, und vielen Dank, Ozzy

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hi,

    evtl. kannst du noch in dem anderen Thread scheiben, dass es hier um das gleiche Thema geht !

    Du setzt den Timer in Modus 14, dazu muss doch auch bei ICR ein Wert stehen, mit Defaultwert 0 zählt er nicht weit.

    Evtl. auch interessant: Wie schnell wird der AVR getaktet ?


    Edit:
    Und immer daran denken:
    Der AVR macht es so wie man es ihm sagt, und nicht wie man es meint !!

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.03.2005
    Ort
    Lübeck
    Beiträge
    315
    Hi @linux_80; habe ich soeben gemacht.

    An sich soll es so etwas ähnliches wie ein Frequenzmodulator werden, das einmal im Voraus. Die Taktung des Atmega beträgt 14,7456Mhz.
    Ich kenne mich mit diesen Timer-Geschichten nicht gut aus, das mit dem ICR sagt mir auch nicht viel, aber ich werde mal danach suchen.

    Aber warum das jetzt so gar nicht funktioniert...

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.03.2005
    Ort
    Lübeck
    Beiträge
    315
    Habe gerade gesehen, dass es nicht Mode 14, sondern Mode 15 ist, und TOP = OCR1A ist...

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von H.A.R.R.Y.
    Registriert seit
    15.09.2005
    Beiträge
    306
    Hi,

    Dein Code enthält 2xReferenz auf WGM11
    "TCCR1A = (1<<WGM11)|(1<<WGM11)|(1<<COM1A1)|(1<<COM1A0);"

    Das sieht nach Tipfehler aus. Im Datenbaltt steht eigentlich alles, was man dazu wissen muß und richtig eingegeben läuft der Timer auch an.
    Die Ports sind ja auch alle schön auf output gestellt.
    a) Es gibt keine dummen Fragen, nur dumme Antworten
    b) Fehler macht man um aus ihnen zu lernen
    c) Jeder IO-Port kennt drei mögliche Zustände: Input, Output, Kaputt

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.03.2005
    Ort
    Lübeck
    Beiträge
    315
    @H.A.R.R.Y: danke, das hatte ich (trotz mehrfachen Lesens) nicht gesehen! Muss natürlich richtig:

    Code:
       TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);
       TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1)|(1<<COM1A0);
    heißen. Werde morgen mal ausprobieren, ob es das war. Denn ansonsten sieht doch alles richtig aus, oder? Oder habe ich etwas vergessen zu initiallisieren?

    MfG, Ozzy

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    da gibt es ein schönes datenblatt über den atmeg128.

    sind auch schöne c-beispiele drin, die du suchst.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    26.12.2005
    Ort
    Nürnberg
    Beiträge
    57
    Hallo Ozzy,

    ich quäle mich auch gerade mit dem Thema herum. Bin ein Stückchen weiter, bei mir funktioniert der eine PWM-Pin nämlich schon (PB1/OC1A):

    Code:
    TCCR1A = (1<<WGM10)|(1<<COM1A1); // PWM, phase correct, 8 bit.
    TCCR1B =  (1<<CS11) |(1<<CS10); // set clock/prescaler 1/64 -> enable counter
    
    DDRB  =  1<<PB1;    // Port B1 als Ausgang
    OCR1A=127; // 50%
    Muss zugeben, dass ich das Größtenteils aus dem Netz gefischt habe, auch wenn ich es mittlerweile halbwegs durchblicke. Mir ist es aber noch nicht gelungen OC1B zu aktivieren...

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.03.2005
    Ort
    Lübeck
    Beiträge
    315
    Danke, die hatte ich gesehen; hatte aber eben meine Fehler nicht gesehen. Werde dann morgen früh mal probieren, ob jetzt alles funktioniert. Hoffentlich war das auch der einzige Fehler. Falls Euch nichts mehr auf die schnelle einfällt...

    MfG, und vielen Dank noch einmal, Ozzy

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.03.2005
    Ort
    Lübeck
    Beiträge
    315
    So, neuer Tag, neuer Versuch! Mit dem Code von IRQ (danke noch einmal), habe ich geschafft, das Ding zum Laufen zu bringen (mit ein paar Änderungen).
    Aber leider läuft es noch nicht so, wie ich es gerne hätte, denn das Problem lag wohl beim "Fast PWM"
    Ich verwende jetzt diese Konfiguration:
    Code:
    TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1)|(1<<COM1A0);
    TCCR1B = (1<<CS10);
    Die mir eben nur eine zu geringe Frequenz liefert. Probiere ich dann
    Code:
    TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);
    Dann geht nichts mehr.

    Habt Ihr eine Idee, woran das liegt? Bin echt am Verzweifeln...


    Vielen Dank im Voraus, Ozzy

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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