Go Down

Topic: Induktive Frequenz messen (Read 308 times) previous topic - next topic

RandyTomlinson

Hallo,

Ich habe hier einen Bürstenlosen AC Motor an welchem an der rotierenden Aussenglocke 120 Schlitze eingefräst sind. Am Motor angebaut ist ein spezieller "Tonkopf" welcher die "Frequenz" misst welche diese 120 Schlitze abgeben. Der Grund ist dass dies als Tacho benutzt wird um die Drehzahl des Motors konstant zu halten.

Nun möchte ich diese Frequenz mit dem Arduino auslesen und vorerst im Terminal ausgeben.

Laut Datenblatt generiert dieser tacho bei 400RPM eine Frequenz von 800Hz, resp. bei 800RPM eine Frequenz von 1600Hz.

Gibt es ein BeispielSketch welches mir erlaubt diese Daten auszulesen?

Vielen Dank für euren Wertvollen Input

Randy

ElEspanol

#1
Jul 10, 2017, 06:31 pm Last Edit: Jul 10, 2017, 06:31 pm by ElEspanol
Hi Randy,

zuerst mal willkommen im Forum.

Willst du die vom "Tonkopf" abgreifen? Hängt da noch was anderes dran, z.B. die Original Steuerelektronik?

Dann solltest du dir das Signal zuerst mit nem Oszi anschauen.

Du kannst auch einen Magneten drankleben und mit einem Hallsensor die Umin unabhängig erfassen.

qualidat

Ich kann zwar nicht mit einem fertigen Sketch dienen - aber mit ein wenig Überlegung sollte das kein großes Problem sein.

Zuerst muss man das Signal aus dem Lesekopf "aufbereiten". Das würde ICH mittels externer Elektronik (Verstärker, Trigger) tun, so dass ein sauberes Rechteck entsteht.

Der Rest ist "Pillepalle". Du zählst die Impulse aus dem Trigger in einem vorgegebenen konstanten Zeitfenster, z.B. genau 1s ... feddich.

RandyTomlinson

Hallo,

Danke für die Antworten. Nein, der "Tonkopf" ist frei, da hängt keine Elektronik drann.
Ich hab ein OWON B35 und kann den "Tonkopf" da direkt drann hängen und die Frequenz sauber auslesen.

Mein Vorhaben ist den Motor via Triac zu steuern, das heisst der Motor muss sehr genau bei 800Hz laufen.
Ich möchte erst mal nur die Frequenz welche der Tonkopf ausgibt lesen und dann bei 800Hz den Triac ausschalten und bei 799Hz wieder einschalten.

Das sollte doch Möglich sein, oder?

Das mit dem Magneten wäre ein nette Idee aber die Aussenglocke des Motors ist am unteren teil abgeschirmt weil dort ein Audioverstärker drann kommt und der Motor mit einem Magneten schwingungen verursachen würde.

Ich hab nun verschiedene Frequenz Counter Sketsches ausprobiert und mit einem BC238 einen kleinen Preamp aufs Steckbrett gebastelt. Keins der Sketche funktioniert. Wahrscheinlich weil die Impule eben Induktiv sind.

Freue mich auf neuen Input
Vielen Dank

chefin

Nein, mit einem Triac einen Motor durch ein und ausschalten auf 0,5U/min genau zu steuern ist fast nicht möglich. Zumal, wieso hat der 400U/min. Drehstrommotoren haben typischerweise 3000 oder 1500U/min abzüglich Schlupf.  Somit schon vorneweg keine genaue Drehzahl. Die Grunddrehzahl ist durch die Netzfrequenz vorgegeben. 400U/min kann man nicht direkt aus einem Netzfrequenzmotor erzeugen. Lässt wohl auf ein Getriebe schliessen.

Vieleicht mal genau zeigen, was du da für einen Motor hast. Möglicherweise ist es kein AC-Motor.


Jedenfalls, mit triac regelst du so schlecht, das du bestenfalls einen brauchbaren Mittelwert bekommst. +-5% vieleicht. Den bis zu einer Halbwelle(10ms) wirst du immer als Differenz haben. Und wie lange der Motor nachläuft hängt von Last und bewegter Masse ab.

Wäre einfacher dir zu helfen, wenn man genau wüsste was du hast.

combie

#5
Jul 18, 2017, 08:26 am Last Edit: Jul 18, 2017, 09:58 am by combie
Quote
Vieleicht mal genau zeigen, was du da für einen Motor hast. Möglicherweise ist es kein AC-Motor.
Das ist ein 3 Phasen Capstan Motor.
Außenläufer.
Da geht es mit Netzfrequenz drauf. Niederspannung(oft auch 110V).
Die dritte Phase wird per Kondensator erzeugt
Kein Getriebe

Original wird da eine Schlupfregelung verwendet.
Eine interessante Schaltung
Kein Triac!
Sondern über einen Transistor.



Mein Tipp:
Die Treiberstufe des Original nachbauen.
Und die Regelung im Arduino machen.

Alternativ:
3 Halbbrücken, wie es ein üblicher BLC Servo/Regler tut.

Quote
Zuerst muss man das Signal aus dem Lesekopf "aufbereiten".
Wird evtl nötig sein.

Denn:
Quote
Dann solltest du dir das Signal zuerst mit nem Oszi anschauen.
Erst die Signal Parameter in Erfahrung bringen, dann Auswertung bauen.


Im einfachsten Fall: (nur ein Vorschlag)

Vcc
|
|
R
|
|
X----------Tonkopf-----pin
|
|
R
|
|
GND

R, so um 10K (ausprobieren)

Die Tonkopf Spannung wird durch die 2 R auf 2,5V gezogen
Wenn die Impulshöhe ausreicht, pendelt der Schmitttrigger Eingang des AVR sauber zwischen seinen 2 Zuständen.
Irren ist menschlich.
Im Irrtum verharren ist Dummheit!

RandyTomlinson

Das ist ein 3 Phasen Capstan Motor.
Außenläufer.
Da geht es mit Netzfrequenz drauf. Niederspannung.
Die dritte Phase wird per Kondensator erzeugt
Kein Getriebe

Original wird da eine Schlupfregelung verwendet.
Eine interessante Schaltung
Kein Triac!
Sondern über einen Transistor.

Das ist korrekt. Es handelt sich um einen Capstan Motor einer Revox A77 Maschine welcher mit etwa 130V AC Betrieben wird

Mein Tipp:
Die Treiberstufe des Original nachbauen.
Und die Regelung im Arduino machen.

Dies ist genau das was mir in etwa vorschwebt. Ich möchte dazu erst mal ein Bild der Schaltung zeigen und dann erörtern was ich machen möchte.

Blau eingefärpter Bereich ist der Treiber:

http://www.soundwerkstatt.ch/files/speed_control2.jpg

An Q204 möchte ich ein Rechtecksignal einspeisen welches ich mit einer einfachen Astabilen 555 Schaltung generiere. (Edit: via comparator)

Ich hab noch ein voll funktionierendes A77. Dort könnte ich mit meinem OWON B35 im Betrieb die genaue Frequenz auslesen welche der "Tacho-Tonkopf" abgibt und dann diese Werte in einen Comparator einspeisen zusammen mit dem 555er Multivibrator? Als Comparator schwebt mir der 4046 PLL vor. Kann man sich das in etwa vorstellen?

Natürlich könnte ich auch mit einer kleinen Folie und einer Lichtschranke die Impulse messen und das ganze so aufbauen, aber das erscheint mir irgendwie nicht so genau zu sein weil 400RPM etwas langsam sind um eine exakte Messung zu machen?

So nun wisst Ihr auch was ich vorhabe ;-) Genau, ich versuche eine A77 zu Digitalisieren. Die beiden Anderen Motoren kann ich mit Triacs schalten (Vorher Analog via Relais)

Dazu habe ich jetzt aber doch auch noch eine Frage.

Die Wickelmotoren werden eigendlich mit verschiedenen Phasen gespiesen: 103V, 55V, 42V, 21V 15V

Der Grund ist dass z.B. der Zugmotor mehr Leistung bringen muss als der Abwickelmotor beim Vorwärtsspulen etc...
Die Wickelmotoren möchte ich aber mit einen BT137 steuern und als Optokoppler nehme ich die MOC3041. Kann ich mehrere durch Diaoden getrennte (Signal Rückfluss blockieren) Optokoppler verwenden deren Signal ich mit einem Trimmer einstelle dass ich dann am Triac jeweils die korrekte Spannung hab? Sollte gehen, oder? Das würde bedeuten dass ich von 103V auf 15V runterdrücke. Der BT137 kann ja bis 600V falls ich mich nicht arg irre. Also sollte die Belastung nicht so arg sein? Ich hab natürlich Kühlkörper drann.

Danke vielmals

Randy



combie

#7
Jul 18, 2017, 11:17 am Last Edit: Jul 18, 2017, 11:17 am by combie
Quote
An Q204 möchte ich ein Rechtecksignal einspeisen welches ich mit einer einfachen Astabilen 555 Schaltung generiere. (Edit: via comparator)
Warum noch einen NE555, wenn doch schon ein Arduino in der Schaltung stecken soll?

Quote
Ich hab noch ein voll funktionierendes A77. Dort könnte ich mit meinem OWON B35 im Betrieb die genaue Frequenz auslesen welche der "Tacho-Tonkopf" abgibt
Die Frequenz kannst du berechnen.
Anzahl Zähne * Drehzahl
Da muss nichts gemessen werden.

Die Pulsform, die Höhe, die ist interessant.
Der Innenwiderstand des Sensors.
Wie das Sensor Signal auf Belastung reagiert.
Und das bei verschiedenen Drehzahlen
Irren ist menschlich.
Im Irrtum verharren ist Dummheit!

RandyTomlinson

Warum noch einen NE555, wenn doch schon ein Arduino in der Schaltung stecken soll?
Gute Frage. Ja ich könnt natürlich meinen Uno oder gar Nano für die Frequenz Erzeugung nutzen.


Die Frequenz kannst du berechnen.
Anzahl Zähne * Drehzahl
Da muss nichts gemessen werden.
Ja doch leider.....Deine Rechnung ist logisch und ich hab das natürlich auch bereits so Überlegt. Das ergäbe dann eine Frequenz von 48Khz, aber im Servicebuch steht explizit dass bei einer Umdrehung von 400RPM eine Frequenz von 800Hz vom Tonkopf / Tacho erzeugt wird. Unterdessen hab ich das auch mit meinem Frequenzmesser gemessen und ist tatsächlich so. Warum das so ist, keine Ahnung denn Deine Rechnung müsste korrekt sein.

Ich hab jetzt mal den 555er aufgebaut und den Original Motorentreiber. Ich hab im moment 756Hz bei 49.9 Zyklen. Ich werd das ganze später mal testen und dann berichten. Aber wahrscheinlich werd ich schon einen Arduino Multivibrator einsetzen. Falls jemand grad ein Sketch hat wäre das toll. Ziel sind 800Hz bei 50 Zyklen.

chefin

400Umin sind ja nur 6,6U/sec und bei 120 Schlitze also besagte 800 Schlitze pro Sekunde.

Du wirst doch nicht 400U/sec gerechnet haben? Das währen dann stolze 24.000 U/min und dann kommen natürlich 48KHz zustande

Aber mache ich auch gerne, Drehzahlen welche auf Minutenbasis sind auf Frequenzen umzurechenen die sekundenbasierend sind.

RandyTomlinson

400Umin sind ja nur 6,6U/sec und bei 120 Schlitze also besagte 800 Schlitze pro Sekunde.

Du wirst doch nicht 400U/sec gerechnet haben?
doch hab ich. autsch. mein fehler.

ich hab jetzt mal via arduino PWM einen dimer gebaut welcher via optokoppler einen triac steuert. das würde funktionieren aber die RPM schwankt grauenhaft. unbrauchbar. ich muss wirklich eine lösung finden das signal am tonkopf abzufangen. ich hab den tip von combie versucht und aber kein ergebniss erhalten. ich denke ich muss diese 2x 10k nochmal aufbauen und dann mit dem voltmeter messen. 2.5V sind etwas wenig um den digitalen port als input zu triggern? muss das nicht zwischen 4.2V und max. 5V sein?

combie

Quote
10k nochmal aufbauen und dann mit dem voltmeter messen. 2.5V sind etwas wenig um den digitalen port als input zu triggern? muss das nicht zwischen 4.2V und max. 5V sein?
Die 2,5V sollen den Input auf "Mitte" halten.
Wenn Pulse kommen, sollten diese die Schmitttriggerschwelle überschreiten, und könnten somit registriert werden.

Aber da ich keine Ahnung habe, wie die Pulse aussehen, kann ich dir nicht sagen, ob sie verstärkt werden müssen.


Irren ist menschlich.
Im Irrtum verharren ist Dummheit!

RandyTomlinson

#12
Jul 21, 2017, 04:16 am Last Edit: Jul 21, 2017, 06:55 am by uwefed Reason: add CODE TAGs </>
Ich hab es tatsächlich Geschafft!!

Nachdem die sache mit den 2 R nicht funktioniert hat habe ich den Tonkopf einfach an einem Vorverstärker angeschlossen und dort den Kopfhörer Ausgang in den Arduino rein. Danach hab ich per Zufall ein Sketch gefunden welcher mal wirklich ohne Fehler funktioniert. Und siehe da, beim drehen des Motors hatte ich endlich eine Anzeige. Ich hab dann das Sketch minimalst umgeschrieben so dass eine LED an Pin 7 an ist und erst bei 400Hz ausschaltet.  

Es ist jetzt 4:12 uhr Morgens und ich kann Gedankenbefreit endlich pennen gehen. Morgen (heute) werde ich via Optokoppler den Triac nochmal anschliessen und den Motor in Betrieb nehmen und schauen ob das stabil bleibt. EIGENDLICH möchte ich den Optokoppler nicht benutzen und den Triac mit dem Signal direkt ansteuern aber das wird diesen wohl zerstören? Was erträgt der BT137 eigendlich am Gate? Vielleicht kann ich das mit einem starken Wiederstand runterschrauben? Hier noch das Sketch was ich gefunden habe.


Code: [Select]
// Timer and Counter example
// Author: Nick Gammon
// Date: 17th January 2012

// Input: Pin D5

// these are checked for in the main program
volatile unsigned long timerCounts;
volatile boolean counterReady;

// internal to counting routine
unsigned long overflowCount;
unsigned int timerTicks;
unsigned int timerPeriod;

const int ledPin =  7;  

void startCounting (unsigned int ms)
 {
 counterReady = false;         // time not up yet
 timerPeriod = ms;             // how many 1 ms counts to do
 timerTicks = 0;               // reset interrupt counter
 overflowCount = 0;            // no overflows yet

 // reset Timer 1 and Timer 2
 TCCR1A = 0;            
 TCCR1B = 0;              
 TCCR2A = 0;
 TCCR2B = 0;

 // Timer 1 - counts events on pin D5
 TIMSK1 = bit (TOIE1);   // interrupt on Timer 1 overflow

 // Timer 2 - gives us our 1 ms counting interval
 // 16 MHz clock (62.5 ns per tick) - prescaled by 128
 //  counter increments every 8 µs.
 // So we count 125 of them, giving exactly 1000 µs (1 ms)
 TCCR2A = bit (WGM21) ;   // CTC mode
 OCR2A  = 124;            // count up to 125  (zero relative!!!!)

 // Timer 2 - interrupt on match (ie. every 1 ms)
 TIMSK2 = bit (OCIE2A);   // enable Timer2 Interrupt

 TCNT1 = 0;      // Both counters to zero
 TCNT2 = 0;    

 // Reset prescalers
 GTCCR = bit (PSRASY);        // reset prescaler now
 // start Timer 2
 TCCR2B =  bit (CS20) | bit (CS22) ;  // prescaler of 128
 // start Timer 1
 // External clock source on T1 pin (D5). Clock on rising edge.
 TCCR1B =  bit (CS10) | bit (CS11) | bit (CS12);
 }  // end of startCounting

ISR (TIMER1_OVF_vect)
 {
 ++overflowCount;               // count number of Counter1 overflows  
 }  // end of TIMER1_OVF_vect


//******************************************************************
//  Timer2 Interrupt Service is invoked by hardware Timer 2 every 1 ms = 1000 Hz
//  16Mhz / 128 / 125 = 1000 Hz

ISR (TIMER2_COMPA_vect)
 {
 // grab counter value before it changes any more
 unsigned int timer1CounterValue;
 timer1CounterValue = TCNT1;  // see datasheet, page 117 (accessing 16-bit registers)
 unsigned long overflowCopy = overflowCount;

 // see if we have reached timing period
 if (++timerTicks < timerPeriod)
   return;  // not yet

 // if just missed an overflow
 if ((TIFR1 & bit (TOV1)) && timer1CounterValue < 256)
   overflowCopy++;

 // end of gate time, measurement ready

 TCCR1A = 0;    // stop timer 1
 TCCR1B = 0;    

 TCCR2A = 0;    // stop timer 2
 TCCR2B = 0;    

 TIMSK1 = 0;    // disable Timer1 Interrupt
 TIMSK2 = 0;    // disable Timer2 Interrupt

 // calculate total count
 timerCounts = (overflowCopy << 16) + timer1CounterValue;  // each overflow is 65536 more
 counterReady = true;              // set global flag for end count period
 }  // end of TIMER2_COMPA_vect

void setup ()
 {
 Serial.begin(115200);      
 Serial.println("Frequency Counter");
 pinMode(ledPin, OUTPUT);
 } // end of setup

void loop ()
 {
 // stop Timer 0 interrupts from throwing the count out
 byte oldTCCR0A = TCCR0A;
 byte oldTCCR0B = TCCR0B;
 TCCR0A = 0;    // stop timer 0
 TCCR0B = 0;    

 startCounting (500);  // how many ms to count for

 while (!counterReady)
    { }  // loop until count over

 // adjust counts by counting interval to give frequency in Hz
 float frq = (timerCounts *  1000.0) / timerPeriod;

 Serial.print ("Frequency: ");
 Serial.print ((unsigned long) frq);
 Serial.println (" Hz.");

 // restart timer 0
 TCCR0A = oldTCCR0A;
 TCCR0B = oldTCCR0B;

 // let serial stuff finish
 delay(200);

 if ((unsigned long) frq  <400) {
   // turn LED on:
   digitalWrite(ledPin, HIGH);
 } else {
   // turn LED off:
   digitalWrite(ledPin, LOW);
 }
 }   // end of loop

Go Up