Forum: Mikrocontroller und Digitale Elektronik Atmega32U4 Drehzahl messen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Marcel M. (hurrykane)


Bewertung
-1 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte mir gerne einen Drehzahlmesser bauen um die Drehzahl von 
einem Drehstrommotor zu ermitteln.

Der Motor hat eine Maximale drehzahl von 1340 U/min, jedoch wird diese 
nie erreicht, da er an einem Frequenzumrichter betrieben wird. Als 
höchste geschwindigkeit werden ca. 800 U/min erreicht.

Jetzt möchte ich die Drehzahl ermittel und habe dafür einen Drehgeber 
besorgt der optisch misst und 2 Phasen hat. Er gibt 600 impulse pro 
umdrehung aus.

Da das bei 800 U/min jedoch 480.000 impulse sind ist das etwas hoch zum 
Rechnen.

Ich werde nur Phase A benutzen da ich die Drehrichtung manuell vorgebe.

Daher meine Idee.

Ich zähle über einen Int Eingang die Impulse in der ISR hoch. Wenn diese 
600 erreicht haben setze ich eine 2 Variable immer um 1 nach oben. Damit 
hätte ich ja dann die Umdrehungen.

Jetzt habe ich mir überlegt ich setze den Timer0 in die CTC Mode und 
Stoppe die Zeit für eine umdrehung und rechne das auf Minute hoch.

Aber da ich das bisher noch nicht gemacht habe und auch nicht direkt 
gefunden habe ist meine Frage wie stoppe ich die Zeit genau?

Könnte mir da einer einen Tipp oer ein Beispiel geben?

Danke und Gruß
Marcel

: Bearbeitet durch User
von c-hater (Gast)


Bewertung
4 lesenswert
nicht lesenswert
Marcel M. schrieb:

> ich möchte mir gerne einen Drehzahlmesser bauen um die Drehzahl von
> einem Drehstrommotor zu ermitteln.
>
> Der Motor hat eine Maximale drehzahl von 1340 U/min, jedoch wird diese
> nie erreicht, da er an einem Frequenzumrichter betrieben wird. Als
> höchste geschwindigkeit werden ca. 800 U/min erreicht.
>
> Jetzt möchte ich die Drehzahl ermittel und habe dafür einen Drehgeber
> besorgt der optisch misst und 2 Phasen hat. Er gibt 600 impulse pro
> umdrehung aus.

Der Sensor ist so eklatant viel besser als er sein müsste, dass nur ein 
absoluter Vollidiot ihn wählen würde.

DAS ist dein Problem.

von Marc V. (Firma: Vescomp) (logarithmus)


Bewertung
1 lesenswert
nicht lesenswert
Marcel M. schrieb:
> Jetzt möchte ich die Drehzahl ermittel und habe dafür einen Drehgeber
> besorgt der optisch misst und 2 Phasen hat. Er gibt 600 impulse pro
> umdrehung aus.

 Das ist etwas übertrieben, findest du nicht ?
 So etwas ist für Positionsbestimmung gedacht, nicht für Drehzahl.

von m.n. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Marcel M. schrieb:
> Da das bei 800 U/min jedoch 480.000 impulse sind ist das etwas hoch zum
> Rechnen.

800 UPM entsprechen 13,333 Hz und 480000 Impulse/min 8 kHz. Alles keine 
Frequenzen, die schwierig zu messen wären. Das Stichwort für schnelle 
und hochauflösende Ergebnisse heißt "reziproke Frequenzmessung".

Schaltungs- und Programmbeispiele findest Du u.a. hier: 
http://mino-elektronik.de/fmeter/fm_software.htm

von Marc V. (Firma: Vescomp) (logarithmus)


Bewertung
1 lesenswert
nicht lesenswert
Marcel M. schrieb:
> Da das bei 800 U/min jedoch 480.000 impulse sind ist das etwas hoch zum
> Rechnen.

 Ja, sure.
 Nur sind das 480.000 impulse pro Minute , nicht pro Sekunde.

 Deswegen, das Ganze mit 60 geteilt ergibt 8000 Impulse pro Sekunde.

 Also:
 Timer1 external clock <= Drehgeber.
 Timer3 internal clock/64 ergibt 4us bei 16MHz, CTC auf 24999 ergibt
 einen Interrupt alle 100ms

 Bei Timer3 CTC-Interrupt Timer1 Zählerstand übernehmen.
 Timer1 Zählerstand entspricht nun genau U/min +/-1.
 Timer1 auf Null setzen.

 So aus dem Kopf, aber im Prinzip sollte das in etwa stimmen.

: Bearbeitet durch User
von Marcel M. (hurrykane)


Bewertung
-1 lesenswert
nicht lesenswert
Also soweit habe ich das hoffentlich verstanden.

Habe mir jetzt mal timer1 und timer3 eingestellt. Beide werden über 
einen taster zusammen aktiviert und durch einen weiteren gestoppt.

Jetzt habe ich die impulse die ich durch 600 Teile und komme dann auf 
umdrehungen.

Die Zeit in Millis nehme ich dann immer bei 1s. und nehme sie mal 60 und 
setze beide timer wieder auf 0. So müsste ich dann doch jede sec. Eine 
neue Messung haben.

Dann müsste ich ja die Umdrehungen pro Minute haben.

Oder mache ich es mir da zu einfach?

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Bewertung
1 lesenswert
nicht lesenswert
Marcel M. schrieb:
> Dann müsste ich ja die Umdrehungen pro Minute haben.
>
> Oder mache ich es mir da zu einfach?

 Nein, zu kompliziert.

 Ist es so schwer zu verstehen ?
1
 800 U/min  *  600 Imp/U   = 480000 Impulse/min
2
 480000 Imp /   60 sec     = 8000 Imp/sec
3
 
4
 Also:
5
 800 U/min = 8000 Imp/sec = 800 Imp/100ms
6
 400 U/min = 4000 Imp/sec = 400 Imp/100ms
7
 250 U/min = 2500 Imp/sec = 250 Imp/100ms
 Also nochmal:
 Bei richtiger Einstellung kriegst du alle 100ms die
 Umdrehungen pro minute ohne weitere Umrechnungen

 Diese Umdrehungen kannst du 10 Mal pro Sekunde anzeigen
 oder nur einmal, ist vollkommen egal.

 Was verstehst du da nicht ?

: Bearbeitet durch User
von Klaus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Frequenzzähler und Taschenrechner?

Oder gleich was fertiges wie 
Ebay-Artikel Nr. 113153982205 
Ist sicher auch kaum teurer als der Drehgeber.

MfG Klaus

von my2ct (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Klaus schrieb:
> Ist sicher auch kaum teurer als der Drehgeber.

Das kommt drauf an, ob der Motor auf der Welle über ein passendes 
Geberrad/-element verfügt. Sonst kann das schnell in Bastelei ausarten.

Wenn die Dreisatzrechnung schon eine Herausforderung ist, könnte das 
allerding wirklich eine Alternative sein.

von Klaus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
my2ct schrieb:
> Sonst kann das schnell in Bastelei ausarten

Achse mit Malerkrepp umwickeln und einen dunklen Streifen anderes 
Klebeband darauf.

MfG Klaus

von m.n. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> Oder gleich was fertiges wie
> Ebay-Artikel Nr. 113153982205

Da ist ein ATmega32U4 eingebaut?

Klaus schrieb:
> Achse mit Malerkrepp umwickeln und einen dunklen Streifen anderes
> Klebeband darauf.

Hast Du dafür auch noch eine chinesische Bestellnummer?

Marcel M. schrieb:
> Habe mir jetzt mal timer1 und timer3 eingestellt. Beide werden über
> einen taster zusammen aktiviert und durch einen weiteren gestoppt.

Laß doch bitte diesen Schwachsinn, für eine einfache Drehzahlmessung 
zwei Timer zu verplempern und auf völlig unsinnige Weise auf ein 
Ergebnis zu kommen.
Ich wiederhole noch einmal den Suchbegriff: "reziproke Frequenzmessung".
Dafür reicht in Deinem Fall wahrscheinlich sogar ein einfacher 8-Bit 
Timer.

von Marc V. (Firma: Vescomp) (logarithmus)


Bewertung
0 lesenswert
nicht lesenswert
m.n. schrieb:
> Marcel M. schrieb:
>> Habe mir jetzt mal timer1 und timer3 eingestellt. Beide werden über
>> einen taster zusammen aktiviert und durch einen weiteren gestoppt.
>
> Laß doch bitte diesen Schwachsinn, für eine einfache Drehzahlmessung
> zwei Timer zu verplempern und auf völlig unsinnige Weise auf ein
> Ergebnis zu kommen.

 Einen Timer braucht man immer. ATmega32U4 hat 4 (vier) davon.
 Für unbenutzte Timer gibt es kein Geld zurück, leider.

m.n. schrieb:
> Ich wiederhole noch einmal den Suchbegriff: "reziproke Frequenzmessung".
> Dafür reicht in Deinem Fall wahrscheinlich sogar ein einfacher 8-Bit
> Timer.

 Kannst du bis in alle Ewigkeit wiederholen, dadurch wird es in diesem
 Fall weder geeigneter noch einfacher.
 Der TO hat schon einen Drehgeber mit 600 Imp/Umdrehung. Wenn sein
 Programm alle 100ms Timer1 Zählerstand einfach übernimmt, hat er die
 U/min ohne irgendetwas umzurechnen.

Was hast du da nicht verstanden ?

: Bearbeitet durch User
von Klaus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
m.n. schrieb:
> Da ist ein ATmega32U4 eingebaut?

Ich dachte, da wollte jemand eine Drehzahl messen und nicht Restbestände 
von µCs aufbrauchen.

Marcel M. schrieb:
> Jetzt möchte ich die Drehzahl ermittel und habe dafür einen Drehgeber
> besorgt der optisch misst und 2 Phasen hat. Er gibt 600 impulse pro
> umdrehung aus.

m.n. schrieb:
> Klaus schrieb:
>> Achse mit Malerkrepp umwickeln und einen dunklen Streifen anderes
>> Klebeband darauf.
>
> Hast Du dafür auch noch eine chinesische Bestellnummer?

Dazu bräuchte ich die Übersetzung von Malerkrepp nach Mandarin. Leider 
hat mein chinesischer Buttler heute seinen freien Tag.

MfG Klaus

von Äxl (geloescht) (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Datenblatt Seite 117
Seit es Arduino gibt, liest niemand mehr die Datenblätter, was?
Wofür zwei Timer?
Diese Input Capture Unit hatte mein ATMega16 schon.
1
14.5 Input Capture Unit
2
The Timer/Counter incorporates an input capture unit that can capture external events and give them a timestamp
3
indicating time of occurrence. The external signal indicating an event, or multiple events, can be applied
4
via the ICPn pin or alternatively, for the Timer/Counter1 only, via the Analog Comparator unit. The time-stamps
5
can then be used to calculate frequency, duty-cycle, and other features of the signal applied. Alternatively the
6
time-stamps can be used for creating a log of the events.

na - und so weiter

Gruß,
Äxl Real

von m.n. (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Marc V. schrieb:
> Wenn sein
>  Programm alle 100ms Timer1 Zählerstand einfach übernimmt, hat er die
>  U/min ohne irgendetwas umzurechnen.

Das wäre ja nur scheinbar von Vorteil, wenn die Zähler gleich dezimal 
zählen würden. Können sie das? Nein. So muß der µC weiterhin schwere 
Umrechnereien erledigen. Schafft der das überhaupt?
Und wenn jetzt noch eine Nachkommastelle benötigt wird, ist das Drama 
perfekt. Da hilft nur noch ein µC mit FPU!

Äxl (geloescht) schrieb:
> Diese Input Capture Unit hatte mein ATMega16 schon.

Das ging schon mit AT90S2313 los, ist aber bei einigen jungen 
Zeitgenossen offensichtlich noch nicht angekommen ;-)

von Marc V. (Firma: Vescomp) (logarithmus)


Bewertung
-1 lesenswert
nicht lesenswert
m.n. schrieb:
> Das wäre ja nur scheinbar von Vorteil, wenn die Zähler gleich dezimal
> zählen würden. Können sie das? Nein.
 Ja, sure.
 Und die "reziproke Frequenzmessung" macht das gleich in Dezimal ?

> So muß der µC weiterhin schwere Umrechnereien erledigen.
 Was für schwere Umrechnereien ?


> Schafft der das überhaupt?
 LOL.
 Wenn die "reziproke Frequenzmessung" das in float schafft...


> Und wenn jetzt noch eine Nachkommastelle benötigt wird, ist das Drama
> perfekt. Da hilft nur noch ein µC mit FPU!
 Sicher.
 Ich schrieb ja oben schon, dass es U/min +/- 1 ist, man muss es nur
 lesen wollen (können).

 Lass es am Besten sein. Du weisst ja vor Neid nicht, was du redest.

 Die Lösung ist immer einfach, man muss sie nur finden, dazu muss
 aber ein Mindest IQ vorhanden sein.

von Marcel M. (hurrykane)


Bewertung
-1 lesenswert
nicht lesenswert
Da ich mit dem Arduino nicht zurecht komme bin ich auf einen Atmega32 
umgestiegen.

Jetzt habe ich das wie folgt probiert.


ISR(TIMER0_COMP_vect)
{
  impulse++;
}

ISR(TIMER1_COMPA_vect)
{
  drehzahl =impulse*2;
  impulse =0;
}

TCCR1B = (1<<WGM12);
TCCR1B |= (1<<CS10) | (1<<CS11);
TIMSK |= (1<<OCIE1A);
OCR1A =24999;

TCCR0 |= (1<<WGM01);
TCCR0 |= (1<<CS01) | (1<<CS02);
OCR0 =1;
TIMSK |= (1<<OCIE0);

Das mit den 100ms klappt ja aber die anzahl der impulse scheint nur die 
hälfte zusein.
Erfassen tue ich die Impulse über Pin T0.

Meine Vermutung ist das ja immer ein interrupt verloren geht wenn er in 
die ISR geht. Deswegen habe ich die impulse mal 2 genommen. jetzt passt 
das ungefähr von der Drehzahl her, aber das scheint mir dennoch der 
falsche weg zu sein.

Es müsste ja so sein dann die Anzahl der Impulse gleich der Umdrehungen 
entspricht.

Da ich noch nicht viel mit timern zu tun hatte würde ich mich um 
hilfestellungen freuen.

Was mache ich falsch?

von Marc V. (Firma: Vescomp) (logarithmus)


Bewertung
1 lesenswert
nicht lesenswert
Marcel M. schrieb:
> Das mit den 100ms klappt ja aber die anzahl der impulse scheint nur die
> hälfte zusein.
> Erfassen tue ich die Impulse über Pin T0.
>
> Meine Vermutung ist das ja immer ein interrupt verloren geht wenn er in
> die ISR geht. Deswegen habe ich die impulse mal 2 genommen. jetzt passt
> das ungefähr von der Drehzahl her, aber das scheint mir dennoch der
> falsche weg zu sein.

 Wenn man nicht lesen kann (will):

 Timer0 ist 8-bit, geht also nur bis 255, deswegen habe ich Timer1
 und Timer3 genommen und du solltest es auch tun !!

 Mit Timer0 geht alles über 255 U/min verloren, d.h. Timer0 kann
 nur Modulo 256 zählen, du brauchst aber bis 800, also 10-bit.

 Wenn man etwas vorgesetzt bekommt, sollte man es auch genau so
 probieren, zumindest bis man es selber begriffen hat.

 Experimentieren, ändern und rumspielen kann man später...

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Bewertung
0 lesenswert
nicht lesenswert
Marcel M. schrieb:
> Was mache ich falsch?

 Fast alles.

 Gerade erst gesehen, könnte meinen vorherigen Beitrag nicht
 mehr bearbeiten oder löschen.

 Erstens:
 Hast du jetzt M32 oder M32U4 ?

 Zweitens:
 Wieso und warum hast du Timer0 CTC auf 1 gestellt?

 Probiere es mal so:
 ( Für M32 )
1
volatile uint16_t Drehzahl;
2
volatile uint8_t impulse=0;
3
volatile uint8_t Flag=0;
4
5
int main(void)
6
{
7
8
 TCCR1B = (1<<CS12) | (1<<CS11) | (1<<CS10);   /* External clock source on T1 pin. Clock on rising edge. */
9
10
 TCCR0 = (1<<CS02);       /* Clock / 256 = 16us bei 16MHz
11
 OCR0 = 249;              /* 16us * 250 = 4000us = 4ms
12
 TIMSK |= (1<<OCIE0);     /* Timer0 CTC ISR erlauben
13
14
 while(1)
15
 {
16
   while(Flag==0);        /* 100ms warten... */
17
   Flag = 0;
18
   /* Drehzahl anzeigen oder über RS232 senden   */
19
 //   ShowDrehzahl();
20
 }
21
}
22
23
24
ISR(TIMER0_COMP_vect)
25
{
26
  impulse++;
27
  if(impulse==25) {      /* 25 * 4ms = 100ms
28
    impulse=0;
29
    drehzahl=TCNT1;      /* Zählerstand Timer1 übernehmen */
30
    TCNT1=0;             /* Timer1 auf Null ! */
31
    Flag=1;
32
  }
33
}

 Impulse über Pin T1 erfassen !!!
 Drehzahl als 16 bit definieren !

: Bearbeitet durch User
von Marcel M. (hurrykane)


Bewertung
0 lesenswert
nicht lesenswert
Ist ja ok.

Ich wusste nicht wieso Du Timer1 und Timer3 genommen hast.

Habe jetzt wieder den Atmega32U4. Diesmal programmiere ich Ihn jedoch 
per ISP mit Atmelstudio und nicht per Arduino IDE.

Habe Timer1 jetzt ebenfalls im CTC Mode laufen.

Setze dann TCNT1 alle 100ms wieder auf 0.

Somit müsste ich ja in TCNT1 immer meine richtige drehzahl haben.

: Bearbeitet durch User
von Theor (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Jedoch kommt immernoch nur ca. die hälfte der Drehzahl raus.

Es wäre nützlich, wenn man ein paar Fakten vorliegen hätte.

Ohne das kann ich z.B. nur vermuten, dass die Angabe "600 Impulse pro 
Umdrehung" sich auf beide Phasen des Drehgebers insgesamt bezieht und Du 
nur eine Phase auswertest.

von Marcel M. (hurrykane)


Bewertung
0 lesenswert
nicht lesenswert
Theor schrieb:
>> Jedoch kommt immernoch nur ca. die hälfte der Drehzahl raus.
>
> Es wäre nützlich, wenn man ein paar Fakten vorliegen hätte.
>
> Ohne das kann ich z.B. nur vermuten, dass die Angabe "600 Impulse pro
> Umdrehung" sich auf beide Phasen des Drehgebers insgesamt bezieht und Du
> nur eine Phase auswertest.

Encoder ist der LPD3806-600BM-G5-24C

Denke habe jetzt das richtige ergebnis. Impulse kommen 600/U bei nutzung 
von nur 1 Phase.
1
Erstens:
2
Hast du jetzt M32 oder M32U4 ?

Atmega32U4
1
Zweitens:
2
Wieso und warum hast du Timer0 CTC auf 1 gestellt?

Timer0 gibt es jetzt nicht mehr. Benutze nun wie oben gefordert Timer1 
und Timer3.

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]
  • [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.