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?
Hier gibt es eine Timer-Library für den Arduino DUE: https://github.com/ivanseidel/DueTimer In einer früheren Version war folgende Definition zu finden
1 | const DueTimer2::Timer DueTimer2::Timers[9] = { |
2 | {TC0, 0, TC0_IRQn, 22, PIO_PERIPH_B}, |
3 | {TC0, 1, TC1_IRQn, 59, PIO_PERIPH_A}, // A5 |
4 | {TC0, 2, TC2_IRQn, 31, PIO_PERIPH_A}, |
5 | {TC1, 0, TC3_IRQn, 57, PIO_PERIPH_B}, // A3 |
6 | {TC1, 1, TC4_IRQn, 56, PIO_PERIPH_B}, // A2 |
7 | {TC1, 2, TC5_IRQn, 67, PIO_PERIPH_A}, |
8 | {TC2, 0, TC6_IRQn, NULL, PIO_PERIPH_B}, // n/a |
9 | {TC2, 1, TC7_IRQn, NULL, PIO_PERIPH_B}, // LED "RX" |
10 | {TC2, 2, TC8_IRQn, 30, PIO_PERIPH_B}, |
11 | };
|
Die Zahlen nach der TCx_IRQn definition definieren dort die Timer Pins. Die Frage ist, woher kommen die?
Endlich komme ich der Sache näher. Hier ist das Clock-Input Routing für den Arduino DUE: https://github.com/ivanseidel/DueTimer/blob/master/TimerCounter.md
Die Lib wird dir aber nicht so wirklich hilfreich sein. Da sie den Capture Mode nicht unterstützt.
1 | TC_Configure(t.tc, t.channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | clock); |
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.
:
Bearbeitet durch User
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
Ob die Pins beim Arduino-Board rausgeführt sind ist natürlich eine andere Frage...
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.