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.