Forum: Mikrocontroller und Digitale Elektronik ARM SAM3x Zähleingang


von chris_ (Gast)


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?

von chris_ (Gast)


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?

von chris_ (Gast)


Lesenswert?

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

von Marco H. (damarco)


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.

: Bearbeitet durch User
von Kaj (Gast)


Angehängte Dateien:

Lesenswert?

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

von Kaj (Gast)


Lesenswert?

Ob die Pins beim Arduino-Board rausgeführt sind ist natürlich eine 
andere Frage...

von chris_ (Gast)


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.

von Marco H. (damarco)


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.

von chris_ (Gast)


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.

von Marco H. (damarco)


Lesenswert?

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.

von chris_ (Gast)


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.

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.