irgendwie stehe ich gerade auf dem Schlauch.
Ich versuche, mit der FreeqMEasure Bibliothek und meinem Nano-Nachbau (ATmega328P) eine Frequenz zu messen.
Ich gehe mal davoin aus, das mein Eingang Pin 8 ist? Auszug aus der FreqMeasureCapture.h:
im Beispiel von Paul Stoffregen gibt es keine Delays in der loop(). Die würde ich mal weglassen ...
Wie sehen die Ergebnisse dann aus?
Gruß
ec2021
Wenn Du es blinken lassen willst, versuche es mal so (nicht getestet, sollte es aber eigentlich gleich tun ...):
#include <FreqMeasure.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
unsigned long pause = 100; // 100 Millisekunden Pause bis zur Ansteuerung der nächsten LED.
int sum = 0;
int count = 0;
void setup()
{
Serial.begin(9600);
FreqMeasure.begin();
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
//Frequenzmessung Beispiel
if (FreqMeasure.available()) {
//einige Messungen mitteln
sum = sum + FreqMeasure.read();
count = count + 1;
if (count > 10) {
float frequency_meas = FreqMeasure.countToFrequency(sum / count);
sum = 0;
count = 0;
Serial.println(frequency_meas);
}
}
blink();
}
void blink() {
static unsigned long lastChange = 0;
static byte state = LOW;
if (millis() - lastChange >= pause) {
lastChange = millis();
state = !state;
digitalWrite(LED_BUILTIN, state);
}
}
Auch wenn delay() nachgesagt wird, dass es keine Interrupts sperrt, ist das anscheinend nur ein Teil der Wahrheit, da es auf micros() zurückgreift. Diese Funktion wiederum sperrt - wenn auch nur kurz - Interrupts beim Einlesen von timer0_overflow_count, alle 1024 Mikrosekunden.
Generell sollte man - wo immer es geht - auf delay() verzichten und nichtblockierenden Code bevorzugen.
Auch nicht wirklich vertrauenswürdig.
Die Frequenz steigt kontinuierlich
Wobei ich auch noch glaube, dass ich den falschen Pin verwende.
In der h-Datei steht ICP1 is pin 8
Demnach hab ich mein Eingangssignal an D8 angeschlossen, was auf jeden Fall falsch ist
Arduinos bzw dessen Nachbauten mit Resonator als Taktfrequenzbestimendes Element sind sehr ungenau ( 0,5% typisch). Solche Vertreter sind: UNOR3, NANO, MINI ecc.
Da ist ein Arduino wie einer mit einem ATmega32U4 mit Quarz vorzuziehen.
Genauigkeit 100ppm oder 0,001%.
Grüße Uwe