Forum: Mikrocontroller und Digitale Elektronik AVR: Max. Frequenz für AVR -Messung ?


von Peter S. (petersauber)


Lesenswert?

Hallo

Welche max. Frequenz kann ein AVR Mega 2560 über einen PIN 
(Hardware-Interrupt) oder Timerlösung erfassen ?
Je nach Programmierung erhalte ich von einer Oszilatorschaltung mal 
50kHz und mal 100kHz, wo die Frequenz eigentlich bei 350kHz liegen 
sollte.

Über verschiedene Libaries (FreqMeasure Library) werden 
Frequenzmessungen von mehreren MHz versprochen !

Peter

von Ulrich (Gast)


Lesenswert?

Von der Hardware ist die Maximale Frequenz ist etwas unter der halben 
Taktrate des µC, wenn man den externen Zähleingang nutzt. Das etwas 
unter kommt daher das high und low phase mindestens 1 Zyklus lang sein 
sollen, damit es sicher geht.

Je nach Software kann das Limit aber deutlich niedriger liegen. So ab 
etwa Systemtakt / 10 (Programm in ASM) kann es auch mit einer 
Softwarelösung, z.B. über den ICP-Eingang funktionieren. Je nach 
Zusatzfunktionen liegt das Limit ggf. auch niedriger.

Für höhere Frequenzen kann man einfach einen externen Teiler (z.B. :256) 
vorschalten.

von Norbert (Gast)


Lesenswert?

Peter Sauber schrieb:
> Welche max. Frequenz kann ein AVR Mega 2560 über einen PIN
> (Hardware-Interrupt) oder Timerlösung erfassen ?
> Je nach Programmierung erhalte ich von einer Oszilatorschaltung mal
> 50kHz und mal 100kHz, wo die Frequenz eigentlich bei 350kHz liegen
> sollte.

Nicht selber zählen, zählen lassen. (16Bit Timer ext.Clock)
Dann schafft man mehr als ein viertel jedoch weniger als den halben 
Systemtakt.

von Peter S. (petersauber)


Lesenswert?

Hi

Die CPU ist mit 16MHz (Arduino Mega2560) standardmässig getaktet.
D.h. ich könnte theoretisch locker 4 Mhz messen?
Habt ihr eine Code-Schnipsel für das zählen lassen ?

Peter

Norbert schrieb:
> Peter Sauber schrieb:
>> Welche max. Frequenz kann ein AVR Mega 2560 über einen PIN
>> (Hardware-Interrupt) oder Timerlösung erfassen ?
>> Je nach Programmierung erhalte ich von einer Oszilatorschaltung mal
>> 50kHz und mal 100kHz, wo die Frequenz eigentlich bei 350kHz liegen
>> sollte.
>
> Nicht selber zählen, zählen lassen. (16Bit Timer ext.Clock)
> Dann schafft man mehr als ein viertel jedoch weniger als den halben
> Systemtakt.

von Peter S. (petersauber)


Lesenswert?

Laut PinMapping unterstützt der Arduino Mega2560 nur ICP4+5.
1-3 sind nicht nach aussen geführt ?!

Bitte um Hilfe (Code-Schnipsel), wie man direkt zählen lassen kann.

Peter


Peter Sauber schrieb:
> Hi
>
> Die CPU ist mit 16MHz (Arduino Mega2560) standardmässig getaktet.
> D.h. ich könnte theoretisch locker 4 Mhz messen?
> Habt ihr eine Code-Schnipsel für das zählen lassen ?
>
> Peter
>
> Norbert schrieb:
>> Peter Sauber schrieb:
>>> Welche max. Frequenz kann ein AVR Mega 2560 über einen PIN
>>> (Hardware-Interrupt) oder Timerlösung erfassen ?
>>> Je nach Programmierung erhalte ich von einer Oszilatorschaltung mal
>>> 50kHz und mal 100kHz, wo die Frequenz eigentlich bei 350kHz liegen
>>> sollte.
>>
>> Nicht selber zählen, zählen lassen. (16Bit Timer ext.Clock)
>> Dann schafft man mehr als ein viertel jedoch weniger als den halben
>> Systemtakt.

von Ulrich (Gast)


Lesenswert?

Für die ganz hohen Frequenzen braucht man die Zähleingange (T0,T1,T3 
oder T4). Die Hilfe steht im Datenblatt unter Timer.

Mit den ICP Eingängen muss man dann von Hand zählen - da ist dann bei 
rund 1 MHz schluss, wenn man gut in ASM Programmiert, und wohl noch 
einiges Früher (z.B. 100 kHz) in einer Hochsprache. Wenn es über 
Interrupts gehen soll braucht der Code noch etwas länger - damit es für 
die 350 kHz reicht muss man sich dann schon anstrengen.

Wenn man es unbedingt schnell und per Hand machen will, dann ohne 
Interrupt, aber mit Auslesen des Flags (z.B. ICF4). Der Ablauf ist 
relativ einfach:
1) Timer initialisieren, SW Zähler auf Startwert (z.B. 8)
2) Flag löschen
3) Auf Falg warten, und den ICP Stand sichern
4) Auf Falg warten/ Löschen
5) SW Zähler runter zählen bis Null, sonst wieder zu 4.
6) Auf Falg warten, und den ICP Stand sichern
7) Berechnen der Frequenz aus Zahl der Perioden und der Zeit aus den ICP 
Ständen.
8) Wenn die Zeit zu kurz ist ggf. noch mal mit mehr Perioden messen.


In Welcher Sprache soll Das Programm sein ?

von Cyblord -. (cyblord)


Lesenswert?

Ein Arduino-Nutzer kriegt das sowieso nicht hin. Erstmal müssen die 
richtigen Anschlüsse bei deinem Board auch rausgeführt sein. Dann weißt 
du doch eigentlich gar über deinen Controller. Für sowas kannst du nicht 
einfach ne Arduino-Lib nehmen, sondern musst sich selbst mit Timern, 
ISRs und vielleicht sogar mit Assembler beschäftigen. Also fällt das für 
Arduino-Nutzer schonmal als Projekt raus.

viele Grüße
cyblord

von Frank (Gast)


Lesenswert?

Man muss zwei Interrupts verwenden:

a) PinChange-Interrupt, der einfach nur einen Speicherplatz bzw. eine 
Variable hochzählt

b) Timer-Interrupt, z.B. alle 1 Sekunde. Dieser disabled den 
Pinchange-Interrupt, kopiert den Zählerstand in eine andere Variable, 
setzt ihn auf Null und aktiviert den Pinchagnge-Interrupt wieder

Die par Takte, die fürs Disable/Enable, Kopiern und Nullen gebraucht 
werden, kann man per Software herausrechnen ...

von Frank (Gast)


Lesenswert?


von Ulrich (Gast)


Lesenswert?

Für die Frequenzmessung gibt es verschiedene Wege: die Perioden Zählen 
in einer Sekunde (oder einer anderen festen Zeit), oder als 2. gängige 
Methode die Zeit messen für 1, oder mehrere Perioden. Das Zählen der 
Perioden geht bei der 2. Methode in Software und begrenzt die maximale 
Frequenz. Aus der Periodendauer wird dann die Frequenz berechnet.

Wenn es um eine Frequenz im Bereich 300 kHz geht, aber wenigstens mehr 
als etwa 30 kHz, wäre die Benutzung des Hardwareeingangs zum Zählen 
wirklich sinnvoll - damit ist die Software nicht mehr wirklich 
Zeitkritisch. Das kann dann auch noch im Arduino Rahmen bleiben.

Wenn es darum geht auch bei kleinen Frequenzen (unter 10 kHz) noch eine 
hohe Auflösung zu erhalten, ist der ISP Eingang die richtige Wahl - über 
etwa 100-300 kHz wird es dann aber anspruchsvoll mit der Software. Der 
Pinchangeinterrupt oder ein externer Interrupt wäre da nur ein eher 
schlechte Alternative. Beim Programm gibt es auch noch mehrere 
Alternativen: Ohne oder auch mit Interrupts. Einfach nur für eine feste 
Zeit in Solftware zählen ist dabei eine eher schlechte Alternative zur 
1. Methode mit dem Zähleingang.

von Falg (Gast)


Lesenswert?

Ulrich schrieb:
> Auf Falg warten, und den ICP Stand sichern
> 4) Auf Falg warten/ Löschen

Ihr braucht auf mich nicht zu warten :-)

von Peter S. (petersauber)


Lesenswert?

Danke für die Tipps

Ich habe mal im Internet gestöbert und herausgefunden, dass per Bascom 
bis zu 4 MHz möglich sein sollen (Bascom-Kurs Elektor-Artikel 12/2009).
Da ich aber in der Arduinosprache bleiben oder eventl. auf ASM umsteige, 
möchte ich gerne wissen, ob jemand schon eine Frequenzmessung (ohne 
vorgeschalteten Teiler) mit bis zu 1 MHz programmiert hat?

Nutze einen Rechteckfrequenzgenerator + Messung zum Testen, welche 
allerdings grösser 50 kHz nicht mehr sauber funktioniert.

Peter

Ulrich schrieb:
> Für die Frequenzmessung gibt es verschiedene Wege: die Perioden Zählen
> in einer Sekunde (oder einer anderen festen Zeit), oder als 2. gängige
> Methode die Zeit messen für 1, oder mehrere Perioden. Das Zählen der
> Perioden geht bei der 2. Methode in Software und begrenzt die maximale
> Frequenz. Aus der Periodendauer wird dann die Frequenz berechnet.
>
> Wenn es um eine Frequenz im Bereich 300 kHz geht, aber wenigstens mehr
> als etwa 30 kHz, wäre die Benutzung des Hardwareeingangs zum Zählen
> wirklich sinnvoll - damit ist die Software nicht mehr wirklich
> Zeitkritisch. Das kann dann auch noch im Arduino Rahmen bleiben.
>
> Wenn es darum geht auch bei kleinen Frequenzen (unter 10 kHz) noch eine
> hohe Auflösung zu erhalten, ist der ISP Eingang die richtige Wahl - über
> etwa 100-300 kHz wird es dann aber anspruchsvoll mit der Software. Der
> Pinchangeinterrupt oder ein externer Interrupt wäre da nur ein eher
> schlechte Alternative. Beim Programm gibt es auch noch mehrere
> Alternativen: Ohne oder auch mit Interrupts. Einfach nur für eine feste
> Zeit in Solftware zählen ist dabei eine eher schlechte Alternative zur
> 1. Methode mit dem Zähleingang.

von Karl H. (kbuchegg)


Lesenswert?

Peter Sauber schrieb:
> Danke für die Tipps
>
> Ich habe mal im Internet gestöbert und herausgefunden, dass per Bascom
> bis zu 4 MHz möglich sein sollen (Bascom-Kurs Elektor-Artikel 12/2009).
> Da ich aber in der Arduinosprache bleiben oder eventl. auf ASM umsteige,
> möchte ich gerne wissen, ob jemand schon eine Frequenzmessung (ohne
> vorgeschalteten Teiler) mit bis zu 1 MHz programmiert hat?

Und jetzt mal Butter bei die Fische.
Welches Problem hast du mit den Timer-Takt Eingängen?

Du legst den Takt an und lässt den Timer zählen.
Soweit so gut.
Lässt du den Timer nur eine bestimmte Zeit lang zählen, wobei du die 
Zeit möglichst genau steuerst, dann lässt sich aus der Zeit und aus dem 
Zählerstand, wie weit der Hardware-Zähler gekommen ist, die Frequenz 
errechnen.

Wenn du wirklich irgendwann mal auch in Assembler programmieren willst, 
dann wird es nicht ausbleiben, dass du dich selber auch mal ein wenig 
mit deiner Hardware beschäftigst anstatt immer nur fertige Libraries 
oder BASCOM Programme im Web zu suchen.
Und wenn der entsprechende µC-Pin auf deinem Arduino nicht auf die 
Steckleiste herausgeführt ist, dann muss man sich den eben mit etwas 
Draht herausführen oder sonst irgendwie zugänglich machen.

von Peter S. (petersauber)


Lesenswert?

Hat schon jemand per Routine eine Frequenz von 1Mhz stabil gelesen und 
per Serial geprinted.
Die Variante bezüglich Frequenz anlegen, zählen und per Serial printen 
habe schon bis 100kHz erfolgreich getan. Bei höheren Frequenzen erfolgt 
aber kein print mehr, da wahrscheinlich der Hardware-Interupt zuviel 
Rechenpower zieht ?
Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.