Forum: Mikrocontroller und Digitale Elektronik µC - PWM Lüfter-Ansteuerung zu gering?


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


Angehängte Dateien:

Lesenswert?

Hi Leute,

Ich hoffe Ihr könnt mir helfen zu folgendem Problem. Ich beschreibe mal 
kurz worum es geht. Ich habe einen Lüfter (12V) der Über eine PWM (vom 
Atmega8 kommend) gesteuert werden soll. Dahinter liegt ein Vergleich 
zweier Werte (später Temperaturen) die bei Abweichung entsprechend den 
Lüfter über die PWM ansteuern. Anschluss siehe angefügtem Bild. Eine der 
Termperaturwerte wird über einen der Analog Regler auf dem myAVR Board 
eingestellt. Somit ist die Abweichung regelbar und somit auch die PWM 
beeinflussbar. Problem ist, dass bei voller Ausregelung die Spannung UCE 
noch immer 9,5V beträgt und somit nur 2,5V am Lüfter anliegen. Wenn ich 
ich die PWM runter regele ist natürlich UCE = 12V. ICh hatte mir vor 
kurzem mal das PWM Signal auf dem Osci angeschaut und mir ist 
aufgefallen dass das Puls-Pause-Verhältnis sehr gross zugunsten der 
Pause ausfällt. Kann mir jemand sagen wie ich dieses Verhältnis im 
Programmcode verändern kann? ICh denke dass die PWM Spannung zu gering 
ist für die Basis des Transistors und dieser nicht voll auf macht. Aber 
wir bekomme ich den Anteil des Pulses höher?

Der Programmcode lautet:


------------------------------------
1
void pi_regler(float temp_sensor_value,float temperature)                
2
{
3
DDRB |= (1 << PB1 );  
4
DDRB |= (1 << PB3 );
5
TCCR1A = 0b10100001;
6
TCCR1B = 0b00001011;
7
TCCR2  = 0b01100100;
8
9
float iwert=0,pwert=0,e=0,y=0;        
10
float ki= 1.5; 
11
float kp = 0.5;                                  
12
float ta = 0.01;                                 
13
float esum=0;
14
15
e = temperature - temp_sensor_value;             
16
if (e>50)
17
{              
18
e=50;                
19
}  
20
if (e<-50)
21
{
22
e=-50;  
23
}                  
24
pwert=(kp*e);
25
iwert=(ki*ta*esum);
26
y=pwert+iwert;
27
if ((y<50)&&(y>0))
28
{  
29
30
esum=esum+e;
31
}
32
if ((y>-50)&&(y<0))
33
{
34
esum=esum-e;
35
}
36
if (y==0)
37
{
38
esum=0;
39
}
40
if (e>0)
41
{
42
OCR1AL = y;
43
OCR2 = 0;    
44
OCR1BL=0;  
45
}  
46
if (e<0)
47
{  
48
OCR2 = -y ;
49
OCR1BL=-y;
50
OCR1AL = 0;  
51
}
------------------------------------

Das Programm läuft beim Kompilieren durch. Ich hoffe ich habe hier 
nichts vergessen. Vielen Dank vorab schonmal für eure Hilfe.

von Jasch (Gast)


Lesenswert?

dennis go schrieb:
> Hi Leute,
>
> Ich hoffe Ihr könnt mir helfen zu folgendem Problem. Ich beschreibe mal
> kurz worum es geht. Ich habe einen Lüfter (12V) der Über eine PWM (vom
> Atmega8 kommend) gesteuert werden soll.

OK.

> Dahinter liegt ein Vergleich
> zweier Werte (später Temperaturen) die bei Abweichung entsprechend den
> Lüfter über die PWM ansteuern. Anschluss siehe angefügtem Bild. Eine der
> Termperaturwerte wird über einen der Analog Regler auf dem myAVR Board
> eingestellt. Somit ist die Abweichung regelbar und somit auch die PWM
> beeinflussbar. Problem ist, dass bei voller Ausregelung die Spannung UCE
> noch immer 9,5V beträgt und somit nur 2,5V am Lüfter anliegen. Wenn ich

Wie hast Du denn das festgestellt?

Der Witz bei PWM ist ja gerade dass der Transistor schnell geschaltet 
wird und die Steuerung des Verbrauchers über das *P*uls*W*eite des 
Signals erfolgt.

Also sollten über C-E abwechselnd 12 V und so 1 V liegen. Kann man mit 
dem Multimeter nicht richtig messen. ;-)

> ich die PWM runter regele ist natürlich UCE = 12V. ICh hatte mir vor

Hehehe...

> kurzem mal das PWM Signal auf dem Osci angeschaut und mir ist
> aufgefallen dass das Puls-Pause-Verhältnis sehr gross zugunsten der
> Pause ausfällt. Kann mir jemand sagen wie ich dieses Verhältnis im
> Programmcode verändern kann?

Wenn Du wirklich PWM machst sollte das im Code schon drin sein?

> ICh denke dass die PWM Spannung zu gering
> ist für die Basis des Transistors und dieser nicht voll auf macht. Aber

Hmm, er bekommt so 10 mA Basisstrom, mit einer Verstärkung ab so 30 
sollte das auch für größere PC-Lüfter reichen. Wenn Dein Lüfter 
allerdings Dutzende Watts braucht...

> wir bekomme ich den Anteil des Pulses höher?

Indem Du die Doku liest und dann den entsprechenden Wert ins richtige 
Register schreibst, ich denke mal es wird OCRnX heissen.

Du schreibst da ja schon was rein, das sieht aber zweifelhaft aus. Man 
schreibt da keine Floats rein, man beschreibt niemals nur die Low-Bytes 
von 16-Bit-Registern (jedenfalls nicht ohne Kommentar warum das OK ist) 
- und überhaupt, ein paar Kommentare wären nützlich.

Bist Du denn sicher dass "y" überhaupt im richtigen Wertebereich (0 - 
TOP für die verwendeten Zähler) herauskommt?

> Der Programmcode lautet:
>
>
> ------------------------------------
>
1
> void pi_regler(float temp_sensor_value,float temperature)
2
> {
3
> DDRB |= (1 << PB1 );
4
> DDRB |= (1 << PB3 );
5
> TCCR1A = 0b10100001;
6
> TCCR1B = 0b00001011;
7
> TCCR2  = 0b01100100;
8
> 
9
> float iwert=0,pwert=0,e=0,y=0;
10
> float ki= 1.5;
11
> float kp = 0.5;
12
> float ta = 0.01;
13
> float esum=0;
14
> 
15
> e = temperature - temp_sensor_value;
16
> if (e>50)
17
> {
18
> e=50;
19
> }
20
> if (e<-50)
21
> {
22
> e=-50;
23
> }
24
> pwert=(kp*e);
25
> iwert=(ki*ta*esum);
26
> y=pwert+iwert;
27
> if ((y<50)&&(y>0))
28
> {
29
> 
30
> esum=esum+e;
31
> }
32
> if ((y>-50)&&(y<0))
33
> {
34
> esum=esum-e;
35
> }
36
> if (y==0)
37
> {
38
> esum=0;
39
> }
40
> if (e>0)
41
> {
42
> OCR1AL = y;
43
> OCR2 = 0;
44
> OCR1BL=0;
45
> }
46
> if (e<0)
47
> {
48
> OCR2 = -y ;
49
> OCR1BL=-y;
50
> OCR1AL = 0;
51
> }
52
>
> ------------------------------------
>
> Das Programm läuft beim Kompilieren durch. Ich hoffe ich habe hier
> nichts vergessen. Vielen Dank vorab schonmal für eure Hilfe.

Das bezweifele ich, dieser Code ist nicht vollständig.

von MaWin (Gast)


Lesenswert?

Für mich sieht's so aus als ob du als maximalen Wert in die 
Timer-Register nur 50 reinschreibst, aber der Timer bis 255 läuft, also 
maximal 20% Einschaltdauer hast.

von heinzhorst (Gast)


Lesenswert?

Warum rechnest du eigentlich mit float-Werten? So gut ist die Auflösung 
deiner PWM und deiner Drehzahlmessung nicht.

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.