Forum: Mikrocontroller und Digitale Elektronik Bascom, AVR Lüftersteuerung, Falsche Drehzahl mit High-Side-PWM


von Peter K. (pker)


Lesenswert?

Hallo
Habe folgendes Problem:
Wen ich einen Lüfter mit der "High-Side-PWM" auf 100% setze und die 
Drehzahl mit einem Interupt messe Stimmt die Drehzahl.

Wen ich jetzt aber den Lüfter mit ca. 50% laufen lasse (Compare1a = 127) 
Steigt die Drehzahl.

Ich kann mir vorstellen  das das an den Timern liegt.
Ist das so?
Und Wie kann ich Abhilfe schaffen?

Hier mal der Code.
Ist verbesserungsbedürftig aber funktioniert soweit erstmal bis auf die 
PWM Sache.
1
$regfile = "m16def.dat"
2
$crystal = 8000000
3
$framesize = 32
4
$swstack = 32
5
$hwstack = 32
6
7
8
'LCD Config
9
Config Lcdpin = Pin , Db4 = Portc.7 , Db5 = Portc.6 , Db6 = Portc.5 , Db7 = Portc.4 , E = Portc.1 , Rs = Portc.0
10
Config Lcd = 16 * 2
11
Cls
12
13
14
'Port Config
15
Config Portb.3 = Output                                     'fan1 PWM
16
17
Config Portd.7 = Output                                     'fan2 PWM
18
19
Config Pind.2 = Input                                       'fan1 INT
20
Portd.2 = 1
21
22
Config Pind.3 = Input                                       'fan2 INT
23
Portd.3 = 1
24
25
26
'Timer, PWM und interupts
27
Config Timer0 = Timer , Prescale = 1024
28
Enable Timer0
29
On Timer0 Isr_timer0
30
31
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
32
Compare1a = 255
33
Compare1b = 150
34
35
Config Int0 = Falling
36
Config Int1 = Falling
37
On Int0 Isr_int0
38
On Int1 Isr_int1
39
Enable Int0
40
Enable Int1
41
Enable Interrupts
42
43
44
'Variablen RPM messen
45
Dim Rpm1 As Integer
46
Dim Rpm2 As Integer
47
Dim Rpm1_temp As Integer
48
Dim Rpm2_temp As Integer
49
Dim X As Byte
50
Dim Soft_timer As Byte
51
Dim Rpm_runden As Byte
52
Dim Rpm_runden1 As Integer
53
Dim Rpm_runden2 As Integer
54
55
56
57
Do
58
59
Compare1a = 127
60
61
Compare1b = 255
62
63
64
'###############################################################################
65
'Drehzahl erfassung
66
'###############################################################################
67
If X = 1 Then
68
   X = 0
69
70
   'rpm werte runden
71
   Rpm_runden1 = Rpm_runden1 + Rpm1
72
   Rpm_runden2 = Rpm_runden2 + Rpm2
73
74
   Rpm_runden = Rpm_runden + 1
75
76
   If Rpm_runden = 5 Then
77
78
      Rpm1 = Rpm_runden1 / 5
79
      Rpm2 = Rpm_runden2 / 5
80
81
      Rpm_runden1 = 0
82
      Rpm_runden2 = 0
83
84
      Rpm_runden = 0
85
86
      'rpm werte berechnen
87
      Rpm1 = Rpm1 * 30                                      'rpm * 30sek. (weil 2 imputse pro umdrehung)
88
      Rpm2 = Rpm2 * 30                                      'rpm * 30sek. (weil 2 imputse pro umdrehung)
89
90
      'rpm werte anzeigen
91
92
93
      Locate 1 , 1
94
      Lcd "Fan1 = " ; Rpm1 ; " RPM"
95
96
      Locate 2 , 1
97
      Lcd "Fan2 = " ; Rpm2 ; " RPM"
98
99
   End If
100
101
End If
102
103
104
Loop
105
106
107
Isr_timer0:
108
  Soft_timer = Soft_timer + 1
109
110
  If Soft_timer = 30 Then
111
   Rpm1 = Rpm1_temp
112
   Rpm2 = Rpm2_temp
113
114
   Rpm1_temp = 0
115
   Rpm2_temp = 0
116
117
    'Korrigiere Drehzahl 30/30.5175 = 0.983042516
118
    Rpm1 = Rpm1 * 0.983042516
119
    Rpm2 = Rpm2 * 0.983042516
120
121
    Soft_timer = 0
122
    X = 1
123
124
  End If
125
Return
126
127
128
Isr_int0:
129
   Rpm1_temp = Rpm1_temp + 1
130
Return
131
132
133
Isr_int1:
134
   Rpm2_temp = Rpm2_temp + 1
135
Return
136
137
138
End

Gruß Peter

von Karl H. (kbuchegg)


Lesenswert?

Peter K. schrieb:
> Hallo
> Habe folgendes Problem:
> Wen ich einen Lüfter mit der "High-Side-PWM" auf 100% setze und die
> Drehzahl mit einem Interupt messe Stimmt die Drehzahl.

Wie gemessen?

>
> Wen ich jetzt aber den Lüfter mit ca. 50% laufen lasse (Compare1a = 127)
> Steigt die Drehzahl.

Die angezeigte Drehzahl oder die Drehzahl in echt?

von Peter K. (pker)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wie gemessen?
1
Isr_int0:
2
   Rpm1_temp = Rpm1_temp + 1
3
Return
4
'pro umdrehung 2 interupts
5
'aller 1 sekunde auswerten


> Die angezeigte Drehzahl oder die Drehzahl in echt?

sorry mein Fehler!
Die Drehzahl steigt nur auf dem Display!


Hier noch die Schaltung:

 12V------------------------o------o---------------o-------------
                            |      |               |
                            |      |               |
                           .-.     |               |
                           | |1k5  |               |
                           | |R2   |               |
                           '-'     |T2             |
                            |      |BC548          |
                            |    |/                |
                            o----|                 |
                            |    |>        P-FET   |
                            |      |    ___IRF9505N|
                            o---|<-o---|___|----||-+
  .---------.               |  1N4148  R3 12R   ||->
  |         |               |                   ||-+
  |         |    _      |/                       |
  |         |---|___|-----|   T1                   |
  |         |   R1 1k5    |>  BC548                |
  |   µC    |               |                     .-.
  |         |               |                     | |
  |         |               |                     | | Last
  |         |               |                     '-'
  '---------'               |                      |
                            |                      |
 GND------------------------o----------------------+

von Karl H. (kbuchegg)


Lesenswert?

Peter K. schrieb:
> Karl Heinz Buchegger schrieb:
>> Wie gemessen?
>
>
1
> Isr_int0:
2
>    Rpm1_temp = Rpm1_temp + 1
3
> Return
4
> 'pro umdrehung 2 interupts
5
> 'aller 1 sekunde auswerten
6
>
>

OK.
ALso nicht mit einem unabhängigen Messgerät festgestellt.
D.h. der Aussage "die Drehzahl stimmt" kann man nicht trauen.

> sorry mein Fehler!
> Die Drehzahl steigt nur auf dem Display!

Ich seh keinen wirklichen Grund dafür, ausser der Verwendung von 
Floating Point in der ISR, was unklug ist. Ob das soviel ausmacht?

Speck halt erst mal ab und gib nur die gemessenen Werte aus. So wie sie 
sind. Keine Umrechnerei.

von Peter K. (pker)


Lesenswert?

Karl Heinz Buchegger schrieb:
> OK.
> ALso nicht mit einem unabhängigen Messgerät festgestellt.
> D.h. der Aussage "die Drehzahl stimmt" kann man nicht trauen.

Doch in etwa  +-100 sind aber auch nicht so schlimm!
Der Lüfter soll 1200RPM machen und 1230 hab ich aufm Display

Wen ich den Lüfter via PWM drossel ca. 50% dann bekomme ich erst 
25000RPM und nach einer weile dann dauerhaft -23000RPM
Ich glaube hier ist der integer schon zu klein oder?

Karl Heinz Buchegger schrieb:
> Speck halt erst mal ab und gib nur die gemessenen Werte aus. So wie sie
> sind. Keine Umrechnerei.
1
$regfile = "m16def.dat"
2
$crystal = 8000000
3
$framesize = 32
4
$swstack = 32
5
$hwstack = 32
6
7
8
'LCD Config
9
Config Lcdpin = Pin , Db4 = Portc.7 , Db5 = Portc.6 , Db6 = Portc.5 , Db7 = Portc.4 , E = Portc.1 , Rs = Portc.0
10
Config Lcd = 16 * 2
11
Cls
12
13
14
'Port Config
15
Config Portb.3 = Output                                     'fan1 PWM
16
17
Config Portd.7 = Output                                     'fan2 PWM
18
19
Config Pind.2 = Input                                       'fan1 INT
20
Portd.2 = 1
21
22
Config Pind.3 = Input                                       'fan2 INT
23
Portd.3 = 1
24
25
26
'Timer, PWM und interupts
27
Config Timer0 = Timer , Prescale = 1024
28
Enable Timer0
29
On Timer0 Isr_timer0
30
31
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
32
Compare1a = 255
33
Compare1b = 150
34
35
Config Int0 = Falling
36
Config Int1 = Falling
37
On Int0 Isr_int0
38
On Int1 Isr_int1
39
Enable Int0
40
Enable Int1
41
Enable Interrupts
42
43
44
'Variablen RPM messen
45
Dim Rpm1 As Integer
46
Dim Rpm2 As Integer
47
Dim Rpm1_temp As Integer
48
Dim Rpm2_temp As Integer
49
Dim X As Byte
50
Dim Soft_timer As Byte
51
52
53
Do
54
55
Compare1a = 127
56
57
Compare1b = 255
58
59
60
'###############################################################################
61
'Drehzahl erfassung
62
'###############################################################################
63
If X = 1 Then
64
   X = 0
65
66
      Locate 1 , 1
67
      Lcd "Fan1 = " ; Rpm1 ; " RPM"
68
69
      Locate 2 , 1
70
      Lcd "Fan2 = " ; Rpm2 ; " RPM"
71
72
End If
73
74
75
Loop
76
77
78
Isr_timer0:
79
  Soft_timer = Soft_timer + 1
80
81
  If Soft_timer = 30 Then      '1 Sekunde
82
   Rpm1 = Rpm1_temp
83
   Rpm2 = Rpm2_temp
84
85
   Rpm1_temp = 0
86
   Rpm2_temp = 0
87
88
    Soft_timer = 0
89
    X = 1
90
91
  End If
92
Return
93
94
95
Isr_int0:
96
   Rpm1_temp = Rpm1_temp + 1
97
Return
98
99
100
Isr_int1:
101
   Rpm2_temp = Rpm2_temp + 1
102
Return
103
104
105
End

Gut ist klar jetzt gibt er mir ca. 1400 aus!
(1400 interupts pro sekunde / 2 * 60 = 42000 RPM)
Durch 2 weil der Lüfter 2 Signale pro Umdrehung ausgibt!

von Peter K. (pker)


Lesenswert?

Hat keiner ne idee woran das liegen kann?

Ach ja die Drehzahl am Display verhält sich parallel zur echten 
Drehzahl.
zb. angezeigt wird "40000" wen ich jetzt den Lüfter mit der hand ein 
bischen
bremse wird auch die Drehzahl kleiner!

Kann es sein das sich die Timer in die Quere kommen???
(Timer für Sekundentakt und Timer für PWM)

von Karl H. (kbuchegg)


Lesenswert?

Peter K. schrieb:


> Gut ist klar jetzt gibt er mir ca. 1400 aus!
> (1400 interupts pro sekunde / 2 * 60 = 42000 RPM)
> Durch 2 weil der Lüfter 2 Signale pro Umdrehung ausgibt!


Und?
Was passiert, wenn du die PWM veränderst?
Steigt oder fällt der Wert?`

Oder anders gesagt: Verhalten sich diese Werte in der Tendenz so wie du 
es erwarten würdest?

von Karl H. (kbuchegg)


Lesenswert?

Peter K. schrieb:

> Kann es sein das sich die Timer in die Quere kommen???

Die Timer nicht.
Aber die Auswertungs-ISR des Timers behindert das Erfassen der Pulse 
durch die anderen Interrupts. Die Floating Point Rechnerei da drinnen 
muss nicht sein, so dass diese ISR schnell verlassen werden kann.

Die andere Frage ist: sind eigentlich die Rückmeldepulse vom Lüfter 
prellfrei?

> (Timer für Sekundentakt und Timer für PWM)
Die kommen sich nicht ins Gehege. Der PWM-Timer läuft ja sowieso 
unabhängig von allem anderen. Der molocht einfach nur vor sich hin uns 
schaltet den PWM-Pin brav um.

von Tek (Gast)


Lesenswert?

Kann es sein das dir die PWM in deinen Zähleingang reinspuckt, bei 100% 
stimmt dann die Drehzal weil ED = 100% und sobald du mit der PWM 
runtergehst zählst Du zusätzlich zu den Umdrehungsimpulse die 
Störimpules und die Drehzahl steig.

von Peter K. (pker)


Angehängte Dateien:

Lesenswert?

Karl Heinz Buchegger schrieb:
> Und?
> Was passiert, wenn du die PWM veränderst?
> Steigt oder fällt der Wert?`

verhält sich genau umgedreht:
Wenn ich compare1a auf 200 stelle habe ich auf dem Display ca. 6000RPM!
Wenn ich compare1a auf 150 stelle habe ich 14000RPM auf dem Display!

Karl Heinz Buchegger schrieb:
> Die andere Frage ist: sind eigentlich die Rückmeldepulse vom Lüfter
> prellfrei?

Wenn ich den Lüfter (compare1a) auf 100% laufen lasse stimmen ja die 
werte.
Also denke ich mal das das damit nichts zu tun hat.

Tek schrieb:
> Kann es sein das dir die PWM in deinen Zähleingang reinspuckt, bei 100%
> stimmt dann die Drehzal weil ED = 100% und sobald du mit der PWM
> runtergehst zählst Du zusätzlich zu den Umdrehungsimpulse die
> Störimpules und die Drehzahl steig.

An das habe ich auch schon gedacht aber ich kann mir nicht vorstellen 
wie das sein kann!


Ich habe im Anhang mal das komplette Programm und den Schaltplan!!!

von asthelfer (Gast)


Lesenswert?

Benutz du 3 pin lüfter mit Tacho ausgang?
Wenn der mit 100% ED läuft kriegt auch der Tachogenerator 100% der zeit 
Strom,
bei 50% ist es eher zufall was da rauskommt..

http://www.analog.com/library/analogdialogue/archives/38-02/fan_speed.pdf

von Peter K. (pker)


Lesenswert?

asthelfer schrieb:
> Benutz du 3 pin lüfter mit Tacho ausgang?

Ja!


Ich dachte des das Tachosignal gegen GND zieht deswegen sollte das mit 
der PWM auch funktionieren.
Hier ein link schau dir mal weiter unten die 
Lüftersteuerung(Buck-Konverter) an.
http://www.sprut.de/electronic/pic/projekte/luefter/luefter.htm

gruß peter

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.