mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lüfterdrehzahl auf LCD


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Möchte Zwei Papst Lüfter 12V 5,3 Watt / Multifan 4212 / 2GH über ein 
Atmel ein und ausschalten, dafür nutze ich ein BC und lass diesen dann 
die 12V Durchschalten, wenn der Atmel 0V oder +5V liefert das klappt.

Aber wie kann ich nun vom Gelben Kabel (Schwarz Masse, Rot Plus, Gelb 
Tacho) die Drehzahl messen und auf meinem LCD anzeigen lassen?

Kann mir jemand vielleicht paar Beispiele nennen? Hab zwar schon 
gesucht, aber ich will ja nicht den Lüfter Steuern sondern lediglich die 
Drehzahl herausfindren.

Wäre super Nett
Danke!
Daniel

Autor: Steven () (ovular) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin mir da zwar nicht ganz sicher, aber ich glaube pro Umdrehung 
bekommst du ein 12V Puls auf die Tacholeitung.
Dann musst du das ganze nur noch über ein 20k-Widerstand auf ein Pin 
deines µC-legen.
Und die Anzahl der Pulse innerhalb einer Zeit auswerten und danach das 
ganze auf einem LCD-Ausgeben.

Gruß Steven

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prima, danke..

Hab ich ne Chance mit nem Multimeter das auf der Leitung ohne Oszi zu 
messen?

Die Pulsabstände lassen sich ja bestimmt mit nem Timer lösen oder hat 
mir da jemand ein Vorschlag?

Autor: Steven () (ovular) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hab ich ne Chance mit nem Multimeter das auf der Leitung ohne Oszi zu
>messen?
Mit einer Frequenzmessung und einer kleinen Umrechnung ist das wohl 
möglich.

Ja Timer ist wohl das beste.
Also ich würde Vorschlagen eine Sek. lang die Pulse zählen und danach 
mal kurz ausgeben (LCD).

MfG Steven

Autor: Rudolph R. (rudolph)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Tacho-Pin bei PC-Lueftern ist Open-Collector, für die Papst Teile 
sollte ein Blick in das Datenblatt helfen.

Es wird also immer gegen GND geschaltet und Pegel mit einem 
Pullup-Widerstand "erzeugt", ein paar kilo-Ohm gegen 5V zum Beispiel.

Ein Standard PC-Lüfter macht zwei Impulse pro Umdrehung.
Und wenn man zählt, wie viele Impulse pro 0,3 Sekunden kommen,
hat man direkt die Umdrehungen pro Minute.

22 Impulse pro 0,3 Sekunden bei 2 Impulsen pro Umdrehung = 2200 
Umdrehungen pro Minute

Nochmal filtern durch Mittelwert-Bildung und die Anzeige wird stabil.

Autor: Klaus (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
schaue dir einmal den Anhang Seite 90 an, dort ist alle beschrieben was 
du suchst.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,

Also ich Hänge an mein Tachosignal Kabel (Gelb) 1x 20k Widerstand dran, 
klemme diesen dann ein einen bebliebig freien Port eines Atmega, ich 
nehme wohl an das der Ground vom Lüfter ebenfalls mit dem GND des Atmels 
beschaltet werden muss.. richtig?

Autor: mäxchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, und den Pullup im uc noch aktivieren.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prima Danke ;-)

So Nun klappt die Ausgabe bereits per UART, nur stellt sich mir die 
Frage wie ich die Funktion Realisiere, gibts irgendwo einen 
Verwendbarencode oder ansätze für avr-gcc?

Danke

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir denn niemand einen Anstoss geben oder Infos wo Ich diesbezügl. 
was finde?

Brauch ich den ADC um die Impulse zu messen oder wie mess ich denn das 
generell?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Lüfter hängt nun an einem ATMega 16,

Meine Tacholeitung an einem 20K Widerstand an PA6 mit aktiviertem Pull 
Up Widerstand.

Wie kann ich nun weiter machen oder PA6 auslesen??

Autor: Rudolph R. (rudolph)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel wrote:
> Mein Lüfter hängt nun an einem ATMega 16,

Schön, da habe ich auch zwei Stück dran.

> Meine Tacholeitung an einem 20K Widerstand an PA6 mit aktiviertem Pull
> Up Widerstand.

Was meinst Du damit? 20k in Reihe?
Das wäre dann nicht so geschickt.

> Wie kann ich nun weiter machen oder PA6 auslesen??

An PAx gibt es nicht viele Möglichkeiten.
Analog macht keinen Sinn, also bleibt nur, den Port zu pollen.

Das habe ich vor Jahren mal so gemacht:

[code]
 while(1)
 {
  data_new = PIND; // read data from PORTD

  // count pulses per 0.3s to determine the RPM of fan0
  if(data_new & (1<<PIND5)) // check if PD5 is high
  {
   if((data_old & (1<<PIND5)) == 0) // if it was low before ...
   {
    data_old |= (1<<PIND5);
    fan0_counter++; // ...we detected a new pulse
   }
  }
  else
  {
   data_old &= ~(1<<PIND5);
  }
 ...
[code]

Dazu gehört noch ein Timer-Interrupt der alle 300 ms den Wert von 
fan0_counter in einen 8-Byte Ringpuffer kopiert und fan0_counter wieder 
auf Null setzt.

Aus diesem Ringpuffer wird dann im weiteren Verlauf ein Mittelwert 
gebildet und ausgegeben, sowie für eine einfache Regelung benutzt.

Naja, das habe ich gemacht, weil ich zwei Lüfter und einen 
Drehimpulsgeber mit Taster habe, zusammen fünf digital I/O's die ich in 
der Hauptschleife so schnell sie eben durchläuft immer wieder einlese.

Mit nur einem Lüfter kannst Du auch die Input-Capture Einheit von Timer 
1 benutzen.

Alternativ könnte man auch INT0...INT2 benutzen um Ereignisse zu zählen, 
dann bräuchte man aber wiederrum einen Timer um diesen Ereignissen eine 
Zeitbasis zu geben.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Danke für deine antwort ;-)

An welchen Port wäre es den am besten das Tacho Signal anzuschließen?
Der atmega bietet ja schon viel ;-) leider kenn ich mich in dem Thema 
mit Tachosignal und so nich wirklich so gut aus :(

Ja sind 2x 10K Widerstände hintereinander gelötet.

Daniel

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>An welchen Port wäre es den am besten das Tacho Signal anzuschließen?

Kommt darauf an, wie Du das Problem lösen möchtest.

>Der atmega bietet ja schon viel ;-) leider kenn ich mich in dem Thema
>mit Tachosignal und so nich wirklich so gut aus :(

Naja, ist ein Rechteck, 2 Impulse pro Umdrehung meistens.

>Ja sind 2x 10K Widerstände hintereinander gelötet.

Macht mal ein Bild wie Du das angeschlossen hast.

Autor: Daniel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So,

Hab nun mal flüchtig in Eagle gezeichnet wie ich aktuell den Lüfter und 
das Signal an den ATmega16 angeschlossen habe.

Oder muss ich mein Signal mittels 1x 10k auf GND setzen und dann mit 
1x10K an den PA7 ?

Autor: Daniel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab aktuell folgenden Code gebastelt:
#include <stdlib.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd_lib.h"
#include "debounce_keys.h"

volatile uint8_t time = 0; //time = Zeit zwischen 2 impulsen
volatile uint8_t i = 0; //zähler
char buffer[20]; //buffer

int main(void)
{
  TCCR0 |= (1<<CS00) | (1<<CS02); // Timer CPU-Takt / 1024

    /* initialize display, cursor off */
    lcd_init(LCD_DISP_ON);

  KEY_DDR &= ~ALL_KEYS;                // konfigure key port for input
    KEY_PORT |= ALL_KEYS;                // and turn on pull up resistors
 
    TCCR0 = (1<<CS02)|(1<<CS00);      // divide by 1024
    TIMSK = 1<<TOIE0;        // enable timer interrupt
 
  LED_PORT = 0xFF;
    LED_DDR = 0xFF;
 
  sei();

  lcd_clrscr();
  lcd_puts("Willkommmen!\n");

  lcd_puts("Drehzahl: ");
  

  DDRA  &= ~ (1 << DDA6);
  PORTA  |= (1 << PA6);   

    for (;;) {                           /* loop forever */
    loop_until_bit_is_set(PINA, PA6);
      TCNT0 = 0;
    loop_until_bit_is_clear(PINA, PA6);
      loop_until_bit_is_set(PINA, PA6);
      time = TCNT0;
      i++; //zähler + 1
    
    if(i > 50)
    {
      i = 0;

      itoa(time, buffer, 10);
      lcd_gotoxy(5,3);
      lcd_puts(buffer);
    }

    

    }
}


Nun erhalte ich die Ausgabe auf dem LCD von: 74 oder 75, halte ich den 
Lüfter per Hand an schnellt die Zahl auf 248... was gibt er mir da aus?

Autor: Rudolph R. (rudolph)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal, im Lüfter ist ein Transistor der gegen GND geschaltet wird.

Eventuell kommt man ohne nur mit den internen Pullup's hin.


Edit: die verwendeten LCD Funktionen sind mit ziemlicher Sicherheit für 
die Anwendung ungeeignet, da diese ordentlich Zeit verbrennen durch den 
Aufruf von _delay_ms() - Zeit in der Du keinen Impuls messen kannst.

Autor: Daniel Steiner (sany)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss der Ventilator so angeschlossen wie in deinem Schaltplan?

Sorry, sagte ja hab bisher nicht mit sowas gearbeitet, dafür mit ADC 
etc..

Wie schauts den mit dem Capturing (ICP1) vom Atmega aus könnte man da 
was basteln?

Autor: Rudolph R. (rudolph)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel Steiner wrote:
> Muss der Ventilator so angeschlossen wie in deinem Schaltplan?

Ja, der mittlere Pin ist noch der Versorgungs-Anschluss des Lüfters.
Und die 33nF sind so aus "Gefühl" mit drin um das Signal ein wenig 
runder zu machen.

> Sorry, sagte ja hab bisher nicht mit sowas gearbeitet, dafür mit ADC
> etc..
>
> Wie schauts den mit dem Capturing (ICP1) vom Atmega aus könnte man da
> was basteln?

Sicher, davon hat der Mega16 aber - und auch wohl sonst jeder Mega - nur 
einen.
Das habe ich aber auch bereits geschrieben...

Du kannst ja auch mal nach einem Frequenz->Spannungs Umsetzer IC suchen, 
wenn Du da was passendes findest, kannst Du den ADC benutzen.

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi daniel,

dein programm ist ja schon mal gar nicht so schlecht. ich wuerde das 
ganye mal so versuchen:

* Timer initalisieren auf Overflow nach 0,3s und den Overflow interrupt 
aktivieren
* globale volatile variable in der du dir die ticks per Interval und 
eine fuer ein flag 'data ready'
* in der main schleife pins pollen und mit jeder high->low flanke 
variable incrementieren. Wenn data ready interrupts disablen und count 
variable * 100 anzeigen. data ready flag loeschen und count variable 0. 
interrupts aktivieren. falls noch andere interrupts im spiel sind 
natuerlich nur den timer overflow interrupt disablen
* im timer overflow data ready setzen und eventuell timer count register 
initialisieren

wenn du willst kannst du das intervall auch nach oben oder nach unten 
aendern musst dann halt den multiplikator anpassen. zum stabilisieren 
des wertes koenntest du auch noch eine mittelwertsbildung ueber mehrere 
intervalle machen.

in c sieht das dann ungefaehr so aus:
/* includes etc hier */

#define CNT_OFFSET      (timer offset)

volatile uint8_t rpm1;
volatile uint8_t dataready;

ISR (TIMER0_OVF_vect) {
   dataready = 1;
   TCNT0 = CNT_OFFSET;
}

int
main (void) {
   uint8_t tmp;

   /* set counter prescaler und enable timer interrupt
   ....
   */

   /* init PORT pullup enable, input
   ....
   */

   TCNT0 = CNT_OFFSET;

   sei();

   while (1) {
      if (((PINX & (1 << PX0)) ^ tmp)) && (!(PINX & (1 << PX0)))) {
         /* sollte ein high->low transit sein */
         rpm1++;
      }
      if (dataready) {
         cli();

         /* lcd ausgabe hier */

         dataready = 0;
         rpm1 = 0;
         sei();
      }
      tmp = PINX & (1 << PX0);
   }
}

koennte funktionieren, habs nicht ausprobiert.

gruss
marc

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.