Forum: Mikrocontroller und Digitale Elektronik 1te PWM funktioniert nicht


von dennis g. (Firma: schule) (dnns)


Lesenswert?

Nabend zusammen.
Arbeite z.z. an einer Temperatur Reglung.
PI Regler
2 PWM gesteuerte Ausgänge für Heizung und Lüftung.
Die Zweite PWM funktioniert.
Doch bei der Ersten PWM kommt nichts am Ausgang an.
Könntet ihr mir vielleicht helfen?
1
float pi_regler(float temp_sensor_value,float temperature)
2
{
3
4
DDRB = (1 << PB1 );        // PB1 als Ausgang für PWM
5
DDRB = (1 << PB2 );        // PB3 als Ausgang für PWM
6
7
//Einstellungen für WGM-Mode 5 (Fast PWM 8-Bit)
8
//Output Compare mode ist nicht invertierender Modus
9
TCCR1A = 0b10100001;                  //COM1A1|B1=1 - COM1A0|B0=0 - WGM11=0,WGM10=1
10
TCCR1B = 0b00001011;                 //WGM13=0 - WGM12=1 - Vorteiler=64
11
12
//TCCR2 = 0b01001000;
13
14
//TCCR1A = (1<<WGM10)|(1<<COM1A1);       //1<<WGM10 --> 8 Bit PWM //1<<COM1A1 Nicht invertierende PWM 
15
//TCCR1B = (1<<CS12) | (1<<CS10);       // Takt von CK / 1024
16
17
18
float iwert=0,pwert=0,e=0,y=0;                       //I-Anteil                       //P-anteil
19
float ki= 1.5;                             //integrations beiwert(verstärkung der itegration)                                //Regeldifferenz                                    //Stellgröße
20
float kp = 0.5;                            //Proportionalanteil 
21
float ta = 0.01;                           //Abtastzeit 10ms
22
float esum=0;
23
24
//temp_sensor_value = Adwandlung();
25
e = temperature - temp_sensor_value;       //aktuelle Regelabweichung bestimmen
26
if (e>50)                           //e Begrenzen auf +50°
27
{
28
e=50;
29
}
30
if (e<-50)                                  //e begrenzen auf -50°
31
{
32
e=-50;
33
}
34
pwert=(kp*e);                        //P-Anteil ausrechnen
35
iwert=(ki*ta*esum);                      //I-Anteil ausrechen
36
y=pwert+iwert;                        //Stellgröße ausrechnen
37
if ((y<50)&&(y>0))                      //Integration nur in diesen bereich ausrechen
38
{                                  //Wenn kein abweichnung da ist Inegration Einfrieren
39
esum=esum+e;                                //Integration I anteil
40
}
41
if ((y>-50)&&(y<0))                         //Wenn stellgröße negativ ist PRÜFEEENNNN!!!!!!!!!!!!!!
42
{
43
esum=esum-e;
44
}
45
if (y==0)                                   //wenn die stellgröße gleich 0 ist           
46
{
47
esum=0;                              //Setz Integration zurück 
48
}
49
if (e>0)                                    //wenn e größer 0 ist muss die heizung angehen
50
{
51
OCR1AL = y;                                  //vergleichwert für compare match y
52
//OCR2 = 0;                                 //wenn heizung an soll der lütfter aus sein
53
OCR1BL=0;
54
}
55
if (e<0)                                    //wenn e kleiner 0 ist muss die lüftung angehen
56
{
57
//OCR2 = -y ;                         //vergleichwert für compare match y
58
OCR1BL=-y;
59
OCR1AL = 0;                                 //wenn lüfter an soll die heizung aus sein
60
}
61
62
//
63
return (esum);
64
}

von Hartmut G. (Gast)


Lesenswert?

dennis go schrieb:
> DDRB = (1 << PB1 );        // PB1 als Ausgang für PWM
> DDRB = (1 << PB2 );        // PB3 als Ausgang für PWM

Ich weiß zwar nicht, welchen AVR du verwendest, aber hier widerspricht 
sich Code und Kommentar. Richtiger Pin wirklich als Ausgang 
konfiguriert?

von dennis g. (Firma: schule) (dnns)


Lesenswert?

Hartmut G. schrieb:
> dennis go schrieb:
>> DDRB = (1 << PB1 );        // PB1 als Ausgang für PWM
>> DDRB = (1 << PB2 );        // PB3 als Ausgang für PWM
>
> Ich weiß zwar nicht, welchen AVR du verwendest, aber hier widerspricht
> sich Code und Kommentar. Richtiger Pin wirklich als Ausgang
> konfiguriert?

Oha habe heute soviel hin und her probiert
PB2 ist konfiguriert

ATmega 8
avr gcc

von spess53 (Gast)


Lesenswert?

Hi

>DDRB = (1 << PB1 );        // PB1 als Ausgang für PWM
>DDRB = (1 << PB2 );        // PB3 als Ausgang für PWM

Dir ist bewusst, das die zweite Zeile die Wirkung der ersten zunichte 
macht?

MfG Spess

von dennis g. (Firma: schule) (dnns)


Lesenswert?

hmm nein ist es nicht.
also sollte ich PB3 nehmen ?

von Hartmut G. (Gast)


Lesenswert?

dennis go schrieb:
> hmm nein ist es nicht.
> also sollte ich PB3 nehmen ?

Schau ins Datenblatt, welchem Pin der jeweilige Compare Match des Timers 
zugeordnet ist und setze den dann als Ausgang, und zwar wie spess53 
richtig erkannt hat:

Nicht so:
>DDRB = (1 << PB1 );        // PB1 als Ausgang für PWM
>DDRB = (1 << PB3 );        // PB3 als Ausgang für PWM

Sondern so:
>DDRB |= (1 << PB1 );        // PB1 als Ausgang für PWM
>DDRB |= (1 << PB3 );        // PB3 als Ausgang für PWM

Das | ist wichtig...

von Micha K. (Gast)


Lesenswert?

Hier ist auch erklärt warum das so ist und wie es funktioniert:
http://www.mikrocontroller.net/articles/Bitmanipulation

von dennis g. (Firma: schule) (dnns)


Lesenswert?

das wars vielen dank für die antwort

von Loonix (Gast)


Lesenswert?

Hartmut G. schrieb:
> Nicht so:
>>DDRB = (1 << PB1 );        // PB1 als Ausgang für PWM
>>DDRB = (1 << PB3 );        // PB3 als Ausgang für PWM
>
> Sondern so:
>>DDRB |= (1 << PB1 );        // PB1 als Ausgang für PWM
>>DDRB |= (1 << PB3 );        // PB3 als Ausgang für PWM

...oder gleich so:
1
DDRB |= (1<<PB1)|(1<<PB3);

von Helfer (Gast)


Lesenswert?

dennis go schrieb:
> das wars vielen dank für die antwort

Im Simulator sieht man sofort, dass die Datenrichtung für den ersten PWM 
nicht richtig gesetzt ist.

von dennis g. (Firma: schule) (dnns)


Lesenswert?

Habe noch eine kleine frage.
Ich muss die Reglung auch Präsentieren.
Könntet ihr mir einen Programm empfehlen womit man die Regelkurve 
anzeigen kann!?

Danke

von Markus O. (pipimaxi)


Lesenswert?

Matlab, Excel, OpenOffice, such dir was aus ;)

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.