ARM SAM3x Zähleingang

Gast #4676575
Lesenswert?

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?
Gast #4676857
Lesenswert?

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?
#4677021
Lesenswert?

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.
Gast #4677063
Lesenswert?

>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.
#4677316
Lesenswert?

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.
Gast #4677612
Lesenswert?

>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.
Gast #4678816
Lesenswert?

>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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren