Mikrocontroller: Welche Taktrate sollte man bei einer Drezahlmessung von maximal 30 Hz nehmen?

... komplette Frage anzeigen

4 Antworten

wenn du 30Hz messen willst und 1% genau sein willst dann brauchst meiner Meinung nach 30*100 = 3kHz. für 2% die Hälfte

Antwort bewerten Vielen Dank für Deine Bewertung

Neben den bisherigen Antworten noch eine kleine Anmerkung: Je nachdem wie dein Sensor aufgebaut ist, achte unbedingt darauf, dass keine allzu großen Induktionsspannungen / -ströme entstehen. Sonst grillst du dir evtl. das eine oder andere Bauteil. :)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von MrRayman
19.09.2016, 17:24

Danke für den Hinweis.

1

Ich würde dir das Nequist-Shannon-Theorem empfehlen. Mindestens mehr als doppelt so hoch wie die zu messende Frequenz.

Antwort bewerten Vielen Dank für Deine Bewertung

der Arduino taktet mit 16Mhz, 

da so eine Messung kontinuierlich stattfindet ist der interne Oszillator vollkommen ausreichend

bin aber kein Experte

hier ein guter Sketch für diesen Zweck vom Arduino Forum




// Frequency counter sketch, for measuring frequencies low enough to execute an interrupt for each cycle
// Connect the frequency source to the INT0 pin (digital pin 2 on an Arduino Uno)

volatile unsigned long firstPulseTime;
volatile unsigned long lastPulseTime;
volatile unsigned long numPulses;

void isr()
{
 unsigned long now = micros();
 if (numPulses == 1)
 {
   firstPulseTime = now;
 }
 else
 {
   lastPulseTime = now;
 }
 ++numPulses;
}

void setup()
{
 Serial.begin(19200);    // this is here so that we can print the result
 pinMode(3, OUTPUT);     // put a PWM signal on pin 3, then we can connect pin 3 to pin 2 to test the counter
 analogWrite(3, 128);
}

// Measure the frequency over the specified sample time in milliseconds, returning the frequency in Hz
float readFrequency(unsigned int sampleTime)
{
 numPulses = 0;                      // prime the system to start a new reading
 attachInterrupt(0, isr, RISING);    // enable the interrupt
 delay(sampleTime);
 detachInterrupt(0);
 return (numPulses < 3) ? 0 : (1000000.0 * (float)(numPulses - 2))/(float)(lastPulseTime - firstPulseTime);
}

void loop()
{
 float freq = readFrequency(1000);
 Serial.println(freq);
 delay(1000);
}

Quelle: https://forum.arduino.cc/index.php?topic=64219.30

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von MrRayman
19.09.2016, 17:28

Danke für die Hilfe.

Ich werde wohl das Programm erst einmal mit einen Arduino testen. Später wollte ich es leicht modifizieren und mir eine eigene Platine löten.

0

Was möchtest Du wissen?