Hallo Zusammen,
im Moment versuche ich gerade heraus zu bekommen, welche Pins bei einem
SAM3x an einen Zähler geroutet werden können.
Beim Arduino DUE gibt es wohl ein Routing von PIN D22 auf den Timer0.
Ich brauche aber 3 Zahler. Die Frage ist: welche Pins sind geeignet?
Außerdem wird die Hardware des TC nicht benutzt, jedenfalls konnte ich
nichts finden was die PIO entsprechend konfiguriert.
Alle Informationen findet man hier
http://www.atmel.com/Images/Atmel-11057-32-bit-Cortex-M3-Microcontroller-SAM3X-SAM3A_Datasheet.pdf
"Die Zahlen nach der TCx_IRQn definition definieren dort die Timer Pins.
Die Frage ist, woher kommen die?"
Der Sam3x hat drei 32bit Timer, jeder Timer hat 3 Channels und jeder
Channel die Signale TIOAn TIOBn.
Jeder Channel hat einen eigenen Interrupt TCn_IRQn.
chris_ schrieb:> Ich brauche aber 3 Zahler
Der SAM3X8E hat 3 Zähler mit je 3 Kanälen, grob betrachtet hat das Ding
also 9 Zähler.
chris_ schrieb:> Die Frage ist: welche Pins sind geeignet?
Das findest du im Datenblatt, ab Seite 48, Kapitel 11.3
Peripheral Signal Multiplexin on I/O Lines
>Die Lib wird dir aber nicht so wirklich hilfreich sein. Da sie den>Capture Mode nicht unterstützt.
Ja, der Capture-Eingang wäre sehr gut für die Frequenzmessung.
Ich habe die Lib jetzt aber so weit modifiziert, dass man die
Frequenzmessung über ein CallBack relativ genau machen kann:
https://github.com/ChrisMicro/DueTimer/blob/master/examples/frequencyMeasurementArduinoDUE/frequencyMeasurementArduinoDUE.ino
Zugegebenermaßen nicht so "scharf" wie es sein sollte, misst aber
trotzdem im gegebenen Sketch ziemlich genau.
Du startest den Timer 0 und dann lässt du den Timer 3 mit Externen CLK
hoch zählen und vergleichst gegen den Timer 0 wie lange es gedauert hat.
Ziemlich unlogisch. Da man das mit dem TIOA selbst messen kann. Dazu
lässt man den Zähler frei laufen TIOA 0->1 lädt RA 1->0 RB. Bei der
Variante muss man den Überlauf berücksichtigen.
Alternativ setzt man den Zähler bei der 0->1 Flanke zurück und triggert
TIOA bei 1->0 wobei das Register RA geladen wird. Hier hier bleibt aber
ein geringer Fehler da es ein paar takte dauert bis der Zähler
zurückgesetzt wurde.
Vorsicht beim Slow Clock der ist standardmäßig auf den internen
Oszillator der so ziemlich weit weg liegt. Das umschalten des SCLK auf
den extern Quarz nicht vergessen.
>Du startest den Timer 0 und dann lässt du den Timer 3 mit Externen CLK>hoch zählen und vergleichst gegen den Timer 0 wie lange es gedauert hat.
Nein. Zähler 3 ist der Gate-Timer. Dieser löst jede Sekunde einen
Interrupt aus. Zähler 0 zählt die Pulse an Pin22. In der
Interruptroutine wird dieser zuerst gestoppt, dann ausgelesen und dann
wieder gestartet. Da das Programm etwas Zeit zwischen "Stop" und "Start"
benötigt, gibt es einen kleinen Fehleroffset, der korrigiert werden
muss. Das Ergebnis ist dann ziemlich genau. Was die Genauigkeit angeht,
ist die Frequenzmessung natürlich auch durch die Genauigkeit des Arduino
DUE Quarz begrenzt. Die ganze Messung habe ich mal vor einiger Zeit mit
einem kalibrierten Zähler mit Ofenquarz getestet und das Ergebnis war
gut und stabil.
Insofern lasse ich die Routine mal als Messlatte für Verbesserungen von
anderen Leuten stehen.
Darum geht es nicht du verschwendest einen Timer Channel. Die Hardware
kann das viel genauer und einfacher. Vielleicht ist es beim Arduino so
üblich unlogische Dinge zu Programmieren.
Also ich würde er davon abraten, wenn nicht irrend etwas dagegen
spricht.
>Vielleicht ist es beim Arduino so üblich unlogische Dinge zu Programmieren.
Das hat sich eher so aus der vorhandenen Lib ergeben. Aber das ist ja
das schöne an der Open-Source Bewegung: Man kann den Code nehmen,
erweitern oder verbessern.
Insofern steht es Dir frei, eine bessere Version zu erstellen. Denn wie
geht der Spruch von Erich Kästner: "Es gibt nichts Gutes, es sei denn
man tut es".
Im Moment gibt es nur meine Version und sieht ist der Maßstab, den es zu
überbieten gilt.