Forum: Mikrocontroller und Digitale Elektronik PWM Programm ATMEGA32 in C


von Steve U. (giftzwerg)


Angehängte Dateien:

Lesenswert?

Guten Tag,

habe da ein Problem beschäftige mich noch nicht allzu lang mit der
Programmierung.
Nun habe ich meine PWM bisher mit diesem Programm gelöst was auch gut
Funktioniert (Steuerung über 2 Taster.
1
 * PWM_Programm.c
2
 *
3
 * Created: 15.01.2014 19:55:46
4
 *  Author: Steve Uffelmann
5
 */
6
7
8
#include <avr/io.h>
9
#include <avr/interrupt.h>
10
#define F_CPU 8000000UL
11
#include <util/delay.h>
12
13
14
int main(void)
15
{
16
  // Ein/Ausgänge konfigurieren
17
  DDRD |= (1<<PD5);        //Ausgänge
18
  PORTD|= (1<<PD2) | (1<<PD3);  //Pull-UPs
19
20
  //PWM konfigurieren
21
  TCCR1B |= (1<<WGM12);      //
22
  TCCR1A |= (1<<WGM10);      // Timer Einstellung Fast PWM, 8-bit
23
  TCCR1B |= (1<<CS12);      // Vorteiler 256
24
  TCCR1A |= (1<<COM1A1);      // Nicht invertierender PWM-Modus
25
  OCR1A = 0;            // Startwert Ausgang
26
27
28
    while(1)
29
    {
30
       //Taster Frequenz höher
31
     if (!(PIND & (1<<PD2)))    // wenn Taster getrückt, dann Frequenz 
32
steigern
33
     {
34
     if (OCR1A < 255)      // abfrage nach maximal Wert
35
       OCR1A++;        // Impulsbreite verbreitern um 1
36
37
       _delay_ms(20);      // 20ms Pause
38
39
     }
40
41
     //Taster Frequenz sinken
42
     if (!(PIND & (1<<PD3)))    // wenn Taster getrückt, dann Frequenz 
43
sinkt
44
     {
45
      if (OCR1A > 0)      // abfrage nach minimal Wert
46
      OCR1A--;          // Impulsbreite verringern um 1
47
48
      _delay_ms(20);        // 20ms Pause
49
50
     }
51
52
53
    }
54
}
So nun ist ja das Problem wenn Wir alles in ein Gehäuse einbauen,
brauchen Wir ja eine Kühlung mit einem Lüfter. Aber man möchte den
Lüfter ja jetzt nicht immer auf voll Last laufen lassen wegen Geräuschen
und so.
Deshalb wäre es ja gut den Lüfter mittels PWM und einen PT100 im
Verhältnis zu temperatur zu Steuern. Die Spannung die mit dem PT100
Hergestellt/Eingestellt wird müsste ja mit dem ADC Ausgewertet werden.
Aber wie verknüpfe ich das mit den Steuer Registern zur Reglung der PWM.
Hoffe mir kann einer Hellfen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Steve Uffelmann schrieb:

> Deshalb wäre es ja gut den Lüfter mittels PWM und einen PT100 im
> Verhältnis zu temperatur zu Steuern. Die Spannung die mit dem PT100
> Hergestellt/Eingestellt wird müsste ja mit dem ADC Ausgewertet werden.

richtig

> Aber wie verknüpfe ich das mit den Steuer Registern zur Reglung der PWM.

indem du dir eine Formel ausdenkst, wie du von dem Wert, den du von ADC 
erhältst auf einen Wert kommst, den du ins OCR Register deiner 
Lüfter-PWM steckst.

Das geht dann eben nicht mehr so einfach, dass du einen Wert aus einem 
Register nimmst und in ein anderes Register hineinschreibst oder das 
dieses eventuell sogar vollautomatisch passiert. Sondern da musst eben 
du als Programmierer ran, und eine entsprechende Umrechnung "erfinden".
Wie du das genau machst, das bleibt dir überlassen, aber ich schätze 
mal, dass du da ein wenig experimentieren musst.

Möglichkeiten
* du kannst zb eine lineare Umrechnung machen.
  Zuerst mal musst du wissen, wie die Wertekurve aussieht, wenn die
  Temperatur zunimmt (das kann man auch annähern, so genau ist das bei
  dir nicht. Einfach 3 oder 4 Temperaturen erzeugen, mit dem Thermometer
  messen und feststellen, welchen Wert du vom ADC jeweils bekommst.

  Dann postulierst du einfach mal, dass es einen Zusammenhang gibt

   OCR_Wert = k * Temperatur_ADC + d

  und bestimmst dir Werte für k und d, so dass der Lüfter jeweils die
  Temperatur unter Kontrolle hält

* braucht man es nicht ganz so aufwändig und genau, dann kann man auch
  hergehen und den Lüfter in Stufen betreiben. Zb 5 Stufen.
  Je wärmer es wird, desto höher wird die Stufe gestellt.
  Also zb: unter 25 Grad ist der Lüfter aus, unter 40 Grad wird der
  Lüfter auf Stufe 1 eingeschaltet, zwischen 40 und 50° auf Stufe 2
  usw. bis der Lüfter bei ca. (Hausnummer)70° volle Pulle läuft.

  Die Temperaturen sind natürlich wieder die Werte, die du vom ADC
  bekommst, die werden dann einfach mit fixen Schwellwerten verglichen
  und ja nachdem, in welchem Bereich der WErt ist, wird der Lüfter
  entsprechend über das zur PWM gehörende OCR Register eingestellt.


Aber alles in allem: Um ein wenig experimentieren wirst du nicht 
rumkommen. Denk dir was aus. Genau das ist doch der Spass an der ganzen 
Sache. Du denkst dir ein System aus, implementierst es und die Realität 
sagt dir, wie gut dein System funktioniert oder ob du irgendwo einen 
Denkfehler hattest.

: Bearbeitet durch User
von Steve U. (giftzwerg)


Lesenswert?

Danke erst mal. Ja klar ist das der spaß und so lernt man das 
Programieren auch. Aber da ich mich noch net so auskenne, sicher ich 
mich gern noch etwas ab. Net das ich in eine ganz andere Richtung 
Arbeite.

von Karl H. (kbuchegg)


Lesenswert?

Da kannst du nicht viel schief gehen.
Was brauchst du?

Du brauchst ADC Routinen. Die findest du im AVR-gcc-Tutorial.
Und du brauchst eine PWM. Die hast du ja schon. Zumindest im Prinzip.

D.h was dir noch fehlt ist die Vernüpfung der beiden. Du holst dir den 
Wert aus dem ADC, bearbeitest ihn, und setzt ihn als Wert für die PWM. 
Vom Prinzip her kann da nicht mehr viel schief gehen. Aber der Teufel 
sitzt im Detail, nämlich im Schritt "bearbeitest ihn". Und da darfst du 
dann kreativ sein und dir was ausdenken. Es sind nur Zahlen. Aus einer 
Zahl die reingeht entsteht auf irgendwelchen, von dir ausgedachten, 
Wegen eine andere Zahl.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.