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);
}
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.
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)
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.
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.
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.
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 ?
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.
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.
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 ?
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.