µC - PWM Lüfter-Ansteuerung zu gering?

OP (Firma: schule) #2239856
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.
Angehängte Dateien:
Gast #2240435
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.