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
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.
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.
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
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
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
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
Frequenzzähler und Taschenrechner? Oder gleich was fertiges wie https://www.ebay.de/itm/Blau-Digital-LCD-Drehzahlmesser-Hour-Meter-Achometer-Gauge-RPM-Prufvorrichtung/113153982205?hash=item1a5880befd:g:rmcAAOSwmUNbTczW Ist sicher auch kaum teurer als der Drehgeber. MfG Klaus
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.
my2ct schrieb: > Sonst kann das schnell in Bastelei ausarten Achse mit Malerkrepp umwickeln und einen dunklen Streifen anderes Klebeband darauf. MfG Klaus
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.
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
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
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
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 ;-)
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.
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?
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
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
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
> 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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.