Bascom, AVR Lüftersteuerung, Falsche Drehzahl mit High-Side-PWM

#2867436
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
#2867458
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?
#2867472
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----------------------+
#2867481
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.
#2867511
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!
#2868372
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?
#2868376
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.
#2868834
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!!!
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren