www.mikrocontroller.net

Forum: Compiler & IDEs PWM - allgemein


Autor: Gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ist es möglich eine veränderbare PWM, parallel zur Main, aufzubauen? 
Wenn ja wie?
In der Main sollen andere Aufgaben erledigt werden.

Folgender Problemfall.
Es soll eine Temperatur, in einem gewissen Bereich 10°C +/-1°C, konstant 
gehalten werden. Durch einen Sensor wird die akt Temp aufgenommen und 
durch einen Lüfter, bei dem die Drehzahl mit ner PWM geregelt werden 
soll, die Temp konstant gehalten werden. Die Zuluft wird von einer 
Kühlung bereitgestellt.

Im WWW gibt es mehrere Ansetze wie man das Problem anpacken kann.
Ich würde es gerne so gestallten dass während in der Main Aufgaben 
erledigt werden, wie z.B. Ausgabe auf nem LCD, Tempmessung, Parameter 
setzen ....,
der Lüfter eigenständig und parallel über die PWM gehalten werden soll. 
Aus der Main soll lediglich der Vergleichswert für die Modulation 
übermittelt werden.

Ich verwende dafür einen Atmega48.
In der Zwischenzeit mache ich einen Beispielcode und stelle es hier 
rein.

Vielen Dank für die Hilfe

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR-GCC-Tutorial, speziell mal die Abschnitte zum Thema Interrupts 
lesen...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Multitasking

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich habe mal das ganze auf ein Steckbrett aufgebaut. Statt dem 
Lüfter habe ich grad ne LED angeschlossen.

Durch 4 Taster an PC0-PC3, soll in 25% Schritten die Leuchtstärke an der 
LED (PB1) gewählt werden.
Nach einem Tastendruck, soll die gewählte Leuchtstärke z.B. 25% gesetzt 
werden, mit dem Wert aus der entsprechenden "IF-Schleife" in die 
PWM_init(), Vergleichswert setzten und wieder zurück zur Main.
Währenddessen, soll die PWM-LED (PB1) mit dem übermittelten Wert 
dauerleuchten.
Ist keine Taste gedrückt worden oder nach jedem Tastendruck, soll eine 
Kontroll-LED (PB5) ob man sich wieder in der MAIN befindet, blinken.
Soviel zu meiner Überlegung.
Nun zur Problembeschreibung:
Nach dem entsprechenden Tastendruck b.B. PC1, wird zwar die LED an PB2 
gesetzt aber der komischerweise der 100% PWM-Wertübermittelt
Kurz gesagt die PWM-LED leuchtet mit voller Leuchtstärke.
Was mache ich falsch???

Hier ist mein Code dafür.
#define F_CPU 8000000UL // 8 MHz

#include <stdio.h> 
#include <avr/io.h>           
#include <util/delay.h>
#include <avr/interrupt.h>

void PWM_init(int uewert);
int wert;

int main()
{
  
    PORTC |= (1<<PC0) | (1<<PC1) | (1<<PC2) | (1<<PC3);         // PORTC = PULL-UP

  while(1) 
  {
    DDRB |= (1<<PB5) | (1<<PB4) | (1<<PB3);
    DDRC &= ~(1<<PC0) | (1<<PC1) | (1<<PC2) | (1<<PC3);        // PORTC = Eingang

    if (!(PINC & (1<<PC0)))      // 0% Modulation
    {
      wert=0;
      PWM_init(wert);
    }
    if (!(PINC & (1<<PC1)))      // 25%
    {
      wert=341;
      PWM_init(wert);
      PORTB |=(1<<PB3);          // LED setzen
    }
    if (!(PINC & (1<<PC2)))      // 50%
    {
      wert=512;
      PWM_init(wert);
      PORTB |=(1<<PB4);          // LED setzen
    }
    if (!(PINC & (1<<PC3)))      // 100%
    {
      wert=1023;
      PWM_init(wert);
    }
    
        
// --------------  falls keinen Taster gedrückt ---------------------------

    PORTB |=(1<<PB5);          // LED setzen
    _delay_ms(25);          // Warte
    PORTB &= ~(1<<PB5);       // LED löschen
    _delay_ms(25);          // Warte    
  }
  return 0;
}

und der Code der PWM_init().
#define F_CPU 8000000UL // 8 MHz

#include <stdio.h> 
#include <avr/io.h>           
#include <util/delay.h>
#include <avr/interrupt.h>


void PWM_init(int vergleichswert)
{
  DDRB = (1 << PB1);          // PORTB als Ausgang   
  ICR1 =(uint16_t)250;
  OCR1A = vergleichswert;          // Vergleichswert aus Main

  //sei();
  TCCR1A = (1<<COM1A1) | (1 << WGM11) | (1 << WGM10); // non-inverting mode fuer Pin OC1A und Fast PWM Mode 10Bit
  TCCR1B = (1 << WGM13) | (1 << WGM12) | (1<<CS11);  // Fast PWM Mode und Prescaler: 1/8    
  
    
//return vergleichswert;
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du benutzt Timer-Mode 15, dabei legt OCR1A den Top-Wert fest, nicht den 
Vergleichswert. Aber du setzt auch ICR1, wolltest du also eigentlich 
Mode 14 haben? Aber wenn ja, welchen Sinn macht es dann, den 
Vergleichswert größer zu machen, als den Top-Wert?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...jetzt mal vorerst eine Verständnisfrage.

In welchem Register ( TCCR1A oder TCCR1B ) wird der Modus eingestellt 
und wie verwendet man genau die verschiedenen Modi. Ausserdem gibt es 
Für beide Register WGM-Einstellungen?
Aus dem Datenblatt (Seite 127) kann ich zwar den Top-Wert lesen, aber 
ich bin mir nicht immer sicher welchen man für was verwendet.
Z.B. Fast PWM ist auf 10 Modi aufgeteilt!!

Vielen Dank

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>In welchem Register ( TCCR1A oder TCCR1B ) wird der Modus eingestellt
>Ausserdem gibt es Für beide Register WGM-Einstellungen?

Eben. Der Modus wird mit daher in beiden Register eingestellt, durch 
setzten aller WGM-Bits auf den gewünschten Wert.

>Aus dem Datenblatt (Seite 127) kann ich zwar den Top-Wert lesen, aber
>ich bin mir nicht immer sicher welchen man für was verwendet.

Das steht in der Beschreibung zu den einzelnen Modi. Wenn es zu einem 
Mosdus mehrere Variante gibt, unterschieden die sich dann entweder durch 
die verwendeten Register (z.B. enthält mal OCRx den Wert für TOP, mal 
ICRx), oder durch verschieden, fest vorgegeben TOP-Werte. Bei Fast-PWM 
z.B. 0x00FF, 0x01FF, usw.

Oliver

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:
>Aus dem Datenblatt (Seite 127)
>...
>Z.B. Fast PWM ist auf 10 Modi aufgeteilt!!

Eigentlich hat der Timer nur vier Betriebsarten: Normal, CTC, Fast PWM 
und Phase Correct PWM. Welche dieser Varianten jetzt für deine 
Aufgabenstellung die richtige ist, musst du selbst entscheiden.

Das Datenblatt, welches ich vom Mega48 habe, zeigt auf Seite 131 in 
Tabelle 13-4 genau fünf Fast-PWM-Varianten. FAST-PWM-8bit, -9-bit, und 
-10-bit, mit festen TOP Werten, sowie jeweils eine mit einstellbarem 
TOP-Wert in ICR1 bzw. OCR1A.

Dazu kommen dann noch die COM1Ax und COM1Bx-Bits in TCCR1A, über die du 
einstellen kannst, wann und wie die Pins OCR1A und OCR1B jeweils ihren 
Zustand ändern.

Ähnlich ist es bei den anderen Timer-Betriebsarten.


Oliver

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.