mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM SAM3x Zähleingang


Autor: chris_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: chris_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
const DueTimer2::Timer DueTimer2::Timers[9] = {
  {TC0, 0, TC0_IRQn,   22, PIO_PERIPH_B},
  {TC0, 1, TC1_IRQn,   59, PIO_PERIPH_A}, // A5
  {TC0, 2, TC2_IRQn,   31, PIO_PERIPH_A},
  {TC1, 0, TC3_IRQn,   57, PIO_PERIPH_B}, // A3
  {TC1, 1, TC4_IRQn,   56, PIO_PERIPH_B}, // A2
  {TC1, 2, TC5_IRQn,   67, PIO_PERIPH_A},
  {TC2, 0, TC6_IRQn, NULL, PIO_PERIPH_B}, // n/a
  {TC2, 1, TC7_IRQn, NULL, PIO_PERIPH_B}, // LED "RX"
  {TC2, 2, TC8_IRQn,   30, PIO_PERIPH_B},
};

Die Zahlen nach der TCx_IRQn definition definieren dort die Timer Pins. 
Die Frage ist, woher kommen die?

Autor: chris_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marco H. (damarco)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Lib wird dir aber nicht so wirklich hilfreich sein. Da sie den 
Capture Mode nicht unterstützt.
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
Autor: Kaj (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Kaj (Gast)
Datum:

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

Autor: chris_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco H. (damarco)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco H. (damarco)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.