www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzzählen mit Bascom


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte das Tachosignal meines Lüfters in meinem 4433 zählen.
Das klappt aber nur bedingt.
Zunächst habe ich es für ein Hardwareproblem gehalten, aber mittlerweile 
denke ich das es ein Softwareproblem ist.

Denn selbst wenn ich die Leitung des Tachos gegen Masse halte,
zählt er nur jede 3. odder 4. Berührung!!

Mein programm sieht so aus.

$regfile = "4433def.dat"
$crystal = 4000000
Dim Tacho As Integer
Dim A As Byte
Dim Fan As Integer
Dim Ausgabe As Integer
Dim New_time As Byte
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , 
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcd = 24 * 2                                         'configure 
lcd screen
Config Portd = Output                                       'configure 
portd as output
Config Portb = Input
Config 1wire = Portb.4
Reset Portd.1                                               'write mode 
for display
Initlcd                                                     'init 
display again
Cursor On
Const Ticks = 10
Dim Count As Integer
Config Timer0 = Counter , Edge = Rising
Load Timer0 , Ticks

On Timer0 Timer0_isr                                        ' Jump to 
Timer1 ISR

Enable Timer0                                               ' Enable the 
timer interrupt
Enable Interrupts                                           ' Enable 
Global Interrupt
Do
If Pinb.2 = 0 Then A = 1                                    'Zustand 1 
zwischenspeichern
If Pinb.2 = 1 Then
   If A = 1 Then
      Reset A
      Cls
      Lcd Count
   End If
End If
Loop

End

Timer0_isr:
    Load Timer0 , Ticks
    Count = Count + 1
Return

Ich hoffe jemand kann mir da weiterhelfen.

Vielen Dank!

Gruß

Matthias

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe das obige Programm noch mal überarbeitet, aber ich bin immer 
noch nicht weitergekommen,
ich bekomme die Drehzahl nicht gezählt.

Ich habe es diesmal über einen externen Interrupt versucht,
aber bei 26  bleibt das Display stehen!
Manchmal etwas eher oder später.
Und dafür zählt er auch noch viel zu langsam.

Bin für jede Hilfe Dankbar.

$regfile = "4433def.dat"
$crystal = 4000000
Dim A As Byte
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , 
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Config Lcd = 24 * 2                                         'configure 
lcd screen
Config Portc = Output                                       'configure 
portd as output
Config Portb = Input
Config 1wire = Portb.4
Reset Portb.1
Dim Count As Integer                                        'write mode 
for display
Initlcd                                                     'init 
display again
Cursor On
'Ddrd.4 = 0                                                  'Pin PD4/T0 
auf Eingang setzen
Config Portd = Input
'Portd.4 = 0                                                 'PullUp von 
PD4/T0 aktivieren

On TIMER0 OnTimer0       'Interrupt-Routine für Timer0-Overflow
Config Timer0 = Counter , Edge = Rising
Enable TIMER0            'Timer0-Overflow-Interrupt einschalten
Enable Interrupts                                           'Interrupts 
global zulassen
Cls
'---------------------------------------------------------
Timer0 = 246                                                'Counter 
initial voreinstellen
Cls
Do               'Hauptschleife
Lcd Count
Lowerline
Loop
'---------------------------------------------------------
OnTimer0:                  'Interrupt-Routine
  Timer0 = 246                                              'Counter 
(wieder) voreinstellen
   Count = Count + 1
   'Cls
  ' Lcd Count
Return

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat den keiner einen Rat?

Autor: Matthias Topel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, Matthias

Wie schnell dreht sich denn der lüfter laut Hersteller Maximal?

Ist er eventuell zu schnell um mit Deinem Timer gezählt zu werden?
wenn ja, könnte da eventuell ein Frequenzteiler helfen?


MfG
Matthias Topel

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, Danke für die Antwort!

Der Lüfter ist von Enermax, und ist einstellbar von
1000 - 3000 R.P.M.

In einem anderen Thread hat mir schon jemand gesagt, das das kein 
Problem für den Atmel seien sollte.

In einem anderem Forum (Modding), wo sie auch mit Lüfterdrehzahlen 
experimentieren, meinten sie es läge an meinem Programm, da sie ohne AVR 
keine Probleme hatten.
Zumindest nicht so wie ich.

Dort habe ich erfahren das der Lüfter 2 Impulse pro Umdrehung macht, und 
das Problem das die hatten war, das sie viel zu viele Impulse hatten!
Das haben sie mit einem Widerstand kompensiert.

Bei mir sieht das aber so aus,
wenn ich in meinem Programm die Zeile stehen habe

tacho = tacho + 1

dann zähle ich gerade mal maximal 400 Impulse in 2 Sekunden!!
Bei so ca. 7 - 8 V.
Bei 12 V bekomme ich weniger Impulse!! Also nur so 350 oder noch 
weniger!

Wie würdest du das Tachosignal denn Zählen?

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Also Ich würde den Timer1 benutzen dafür, Prescaler nicht vergessen 
einzustellen, und auch die Flanke, also Rising oder Falling.
Also irgendwie so:

Dim Drehzahl as integer

Config Timer1 = Counter , Prescale = 1 , Edge = Rising
counter1 = 0

Do
Drehzahl = Counter1
LCD Drehzahl
Counter1 = 0
wait 1
loop

End

oder dieses nochmal mit timer0 probieren.

Sven

Autor: Matthias Topel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, hier ist nicht wichtig "Ob" ein Impuls kommt, sondern "wie 
oft" ein Impuls kommt als eher einen normalen Timer, mit dem dann auch 
ein Bezug zur Zeitlichen Taktrate getroffen werden kann.

Am Ende soll ja wieder "Umdrehungen in der Minute" rauskommen.

MfG
Matthias Topel

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, sicher Matthias hast ja Recht, aber nen bischen soll er ja auch 
lernen.
Also,Für Umdrehungen pro Minute das Wait 1 durch
Wait 60 ersetzen ;-))


Sven

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

für eine anständige Auflösung zählt man nicht 60s lang sondern mißt die 
Länge eines Pulses. Wie das in Hardware geht (ICP) kann man auf meiner 
HP nachsehen (www.matwei.de)

Matthias

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Antworten!
Aber irgendwie komm ich nicht weiter!
Ich habe mich für den Timer 0 entschieden, und scheinbar
funktioniert das auch.
Aber die Anzeige flackert bei 7V zwischen 50 und 250,
also pro Sekunde!
Bei 12V bleibt der letzte Wert stehen der vorher im Display stand bevor 
ich den Regler hoch gedreht habe!!

Liegt dann scheinbar doch an den Signalen der Lüfter.

Hat jemand von euch noch ein paar Infos zu den Tachosignalen?
Also was die genau für eine Spannung ausgeben, und ob die abhängig von 
der Betriebsspannung ist.
Also ob ich bei 6V UBB auch 6V Tachosignale bekomme.

Ich habe auch schon einen CPU Lüfter ausprobiert, in der Hoffnung das 
die Signale nur bei meinem Enermax schlecht sind!
Aber auch da die dleichen Symtome.

Hat einer von euch noch eine andere Idee??

Gruß

Matthias

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Etwas habe ich noch vergessen, gelegendlcih hängt sich der Zähler auf!!
Trotz Drehzahlveränderung von 5 - 12V bleibt die Anzeige immer gleich!
Ich denke mal der Atmel ist abgestürzt.

Gruß Matthias

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Mathias,
Wie hast du den das Tachosignal abgenommen ???
Steckt das noch im Mainboard ???
Wenn nicht, Einfach das Tachosignal mal mit 10KOhm Pullup Widerstand an 
+5V hängen.
Es muß schon gewährleistet sein, das das Signal maximal +5V erreicht, 
wenn das Tachosignal noch im Mainboard steckt, weiß ich nicht wie es 
dort weiterverarbeitet wird, eventuell beeinflusst sich dies dan 
gegenseitig.


Sven

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Ne Ne, das ist ein extra Gehäuse Lüfter und den hab ich direkt auf 
meiner Platine angeschlossen wo auch der 4433 ist.

Genauso wie du das beschrieben hast habe ich ihn auch angeschlossen.
Habe auch schon den 7414 dazwischen geschaltet (invertierender 
Schwellwertschalter).
Den Ne555 als Monflop habe ich auch schon aufgebaut, so wie auf 
Matwei.de beschrieben ist.
Aber alles hat keinen nennenswerten Einfluß gehabt.
Ich bin da echt am verzweifeln.

Matthias

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Matthias,

schalte doch mal von den Tachoimpulsen 10 nF nach masse.
Vielleicht entsthen zu viele störungen auf deiner Tacho Leitung.

Sven

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, habe 47pF 22nF und 100nF ausprobiert, aber keine Verbesserung.
Allerdings, wenn ich den mehrere Sekunden laufen lasse geht der 
Zählstand auf 0 zurück!!
Auch ohne Kondensator.
Manchmal reicht eine Veränderung der Drehzahl, aber meistens muß ich die 
Versorgungsspannung kappen, und dann gehts wieder!

Trotzdem Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.