Problem bei Frequenzmessung

Hallo,

ich will mir einen Sketch zur Netzfrequenzmessung basteln.
Soweit alles kein Problem, aus einem NE 555 einen Schmittrigger gebastelt auf
Pin8 rein und mit pulseIn gemessen.
Mit dem Oszilloskop angeschaut, der Rechteck sieht gut aus und ist syncron zu den
50Hz.
Bei der Messeung bekomme ich aber immer so ca 57 Hz raus.
Als Quelle mal Pin 5 via PWM genutzt und ich erhalte so ca. 1131 Hz anstatt der
erwarteten 980.

Hier ein Minisketch :
void setup()
{
pinMode(8,INPUT);
pinMode(5,OUTPUT);
Serial.begin(9600);
analogWrite(5,0x80);
}

void loop()
{
float float_val;
long duration;

duration = pulseIn(8,HIGH) + pulseIn(8,LOW);
float_val = 1000000.0 / (float) duration;
Serial.print("Frequenz ist : ");
Serial.println(float_val);
delay(500);
}

Die Abweichung entspricht so ungefähr 500/433.

Wenn ich den selben Sketch in der Firma auf den selben Arduino flasche stimmen die Werte.
mit offenem angefassten pin 50Hz Brummen auf pin 5 so ziemlich genau 980Hz.

Also an irgendwelchen Bootloaderoptions kann es nicht liegen, es ist ja der gleich Arduino.
Also kann doch nur irgendeine Lib anders sein, oder irre ich ?

p.s. das der mit seinem Resonator nicht sehr genau ist ist mir klar, deswegen habe ich mir
ja auch einen diskret aufgebaut mit Quartz der aber genau das gleiche Verhalten zeigt wie
die Orginalplatine.

Ulli

Hast du in der Firma ein anderes Oszi ? oder nimmst du das von Zuhause mit?

Da habe ich gar kein Oszi,

Ich brauche mir doch nur die Ausgaben im Seriellen Monitor angucken.
In der Firma zeigt es mir am PWM Pin 5 den Wert 980. Das ist genau der
Wert der bei Pin5 mit analogWrite(5,0x80) zu erwarten ist.
(Bei Pin 10 die Hälfte, sieh PWM Faq)

Ulli

beeblebrox:
Mit dem Oszilloskop angeschaut, der Rechteck sieht gut aus und ist syncron zu den
50Hz.

Deswegen dachte ich.
Da bei dir zuhause ja nicht das gewúnschte rauskommt, programmier doch mal den UNO in der Firma und mess dann dort und danach zuhause.

Vielleicht hast du ja zuhause 57Hz. :frowning: :confused:

Nein,

zum Testen (siehe Sketch) messe ich ja im Moment den PWM-Pin den Arduinos.
Der Messfehler zu hause war ja gleich, egal ob ich die 50Hz oder den Arduinopin (5)
nehme.

Ulli

Also an irgendwelchen Bootloaderoptions kann es nicht liegen, es ist ja der gleich Arduino.
Also kann doch nur irgendeine Lib anders sein, oder irre ich ?

Meine Glaskugel sagt:
Du hast eine falsche Frequenz in einer boards.txt eingetragen.
Oder ein falsches Board ausgewählt.

Hmmm,

also Arduino UNO ist in beiden korrekt eingestellt.
Die Boards.txt könnte es natürlich sein. Aber spielt die denn nicht nur
eine Rolle wenn man den Bootloader flascht ?
Ich wüsste auch nicht warum die sich geändert haben sollte.
Hätte ich dann nicht auch Probleme mit der seriellen Schnittstelle ?

Ok, kann ich heute Abend mal kontrollieren.

Ulli

void setup() 
{
  Serial.begin(9600);
  Serial.println(F_CPU);
}

void loop() {}

Ansonsten kannst du ja auch noch das Disassembler Listing kontrollieren.
Der Unterschied muss ja im Code zu sehen sein.

avr-objdump -DS  DeinArduinoCode.cpp.elf

Aaalso,

ich habe gerade auf meinem Firmenrechner mal absichtlich den Eintrag in der Boards.txt verfälscht.
Und siehe da bin zu einer gewissen Abweichung spielt die serielle bei 9600 noch mit nur meine
Messwerte werden genau so falsch wie bei der Entwicklungsumgebung zu Hause.
Dann wird es sich finden. Danke.
Ich dachte echt Infos über der Takt wisse hätte nur der Bootloader.
Wieder was gelernt.

Ulli

Ich dachte echt Infos über der Takt wisse hätte nur der Bootloader.

Dein pulseIn() liefert dir doch eine Zeit, und keine Anzahl Takte.
Dafür muss irgendwie mit F_CPU gerechnet werden.

Is klar :o
Aber ich hätte nicht gedacht das der aktuelle Takt aus einem Environment beim
kompilieren gefischt wird, sondern irgendwie berechnet, aus einem CPU-Register
gewonnen oder sonstwas gemacht würde.

vielen Dank
Ulli

Gibt auch das:
https://www.pjrc.com/teensy/td_libs_FreqMeasure.html

Das läuft über einen Timer im Interrupt Capture Modus. Blockiert also anders als pulseIn() auch nicht. Und hat eine Funktion um aus den Takten die Frequenz zu berechnen.

sondern irgendwie berechnet, aus einem CPU-Register gewonnen oder sonstwas gemacht würde.

Dem Prozessor ist nicht bekannt mit welchem Takt er läuft

Jetzt brat mir eine einen Storch.
Arduino nach Hause gebracht mit dem Sketch aus der Firma.
Alles OK F_CPU 16000;
Hier übersetzt : F_CPU 16000 aber wieder falsche Messwerte.
Was kann das noch sein ?

Ulli

Disassembler Listing

IDE in anderer Version parallel installieren und damit testen. dann mit anderem PC testen.

Dann beim Nachbarn testen :confused:

Der Bootloader ist eine Sache, Der Sketch einen andere. Compiliert wird auf dem PC und der weiß nicht mit welcehr Frequenz der Arduino läuft. Einzig durch das eingestellte Board bekommt die IDE / der Compiler diese Infomation. Für Funktionen bei denen die Zeit wichtig ist (zB delay(), pulsein(), millis() micros() serielle Schnittstelle usw) muß der sketch je nach Frequenz des Arduinos mit anderen Parametern programmiert werden.

Zu Deiner Zeitabweichng habe ich leider keinen Lösungsvorschlag. daß es 14% Abweichung ist ist kurios.

Grüße Uwe

Das Erstaunliche ist das ich hier zu Hause 2 Computer stehen habe und das Problem trill bei beiden auf.

Ulli

Ok,

dann mal im Anhang das Assemblerlisting.

Ulli

So,

noch ein Versuch mal gezipped.

von Zip nach .gz umbennen !

Ulli

simple.asm.zip (243 KB)

Hier mal meins:

List.zip (270 KB)