Forum: Mikrocontroller und Digitale Elektronik Arduino Due: Nanosekunden-Delay


von Raff (Gast)


Lesenswert?

Ich habe einen Arduino DUE und möchte damit ein Delay von 100 ns 
erzeugen. Da ich nur eine Delay-Funktion für µs gefunden habe, wollte 
ich mir die Informationen aus dem Datenblatt des µC holen. Allerdings 
habe ich bislang nur mit einem ATMEGA2560 gearbeitet und komme mit dem 
Datenblatt des SAM3X8E noch nicht ganz zurecht.

Zunächst einmal habe ich die folgenden Fragen:
-  Mit welchem Takt laufen die Timer?
-  Wie heißen die Interrupt-Handler?
-  Lässt sich der DUE auch über Atmel-Studio und den 
ICE-Programmieradapter (JTAG) programmieren?

Ich würde mich freuen, wenn ihr mir helfen könntet und die passenden 
Stellen im Datenblatt zeigen könntet.

von Alex D. (daum)


Lesenswert?

Ich habe zwar noch nie etwas mit den Atmel SAM Chips gemacht, aber hier 
ist was ich im Datenblatt finden konnte:

Der Timer Takt lässt sich mit den TCCLKS bits im TC_CMRx Register 
einstellen. Die wahrscheinlich schnellste clock einstellung ist 0 für 
MCK/2.

Mit den Interrupt Handlern kann ich dir leider nicht helfen.

Programmieren mit Atmel Studio sollte funktionieren, wirst aber einen 
Programmer dafür brauchen.

von Alex G. (dragongamer)


Lesenswert?

Ist dir bewusst dass 100ns einer Frequenz von 10Mhz entspricht?
Da der DUE mit 84Mhz taktet, bedeutet dies dass 100ns nur etwa 8.4 
Takten entspricht...
D.h. exakt 100ns wirst du nicht hinbekommen und am nächsten dran kommst 
du mit 8 NOPs.

von Kaj (Gast)


Lesenswert?

Raff schrieb:
> Wie heißen die Interrupt-Handler?
1
void TCx_Handler(void) {
2
3
}
x = Nummer des Timers, also 0 bis 8

Andere Interrupts heissen z.B. UART_Handler, USART0_Handler, 
PIOD_Handler, TRNG_Handler, etc.

Der Watchdog ist per default aktiv, wenn du den abschalten willst:
1
void disable_watchdog(void)
2
{
3
  WDT->WDT_MR |= DISABLE_WATCHDAOG;
4
}

Bei Interrupts kannst du Prioritaeten verwenden, z.B.:
1
NVIC_SetPriority(TC1_IRQn, 5);
2
NVIC_EnableIRQ(TC1_IRQn);
3
4
NVIC_SetPriority(TC7_IRQn, 6);
5
NVIC_EnableIRQ(TC7_IRQn);
6
7
NVIC_SetPriority(USART3_IRQn, 7);
8
NVIC_EnableIRQ(USART3_IRQn);
9
10
NVIC_SetPriority(UART_IRQn, 8);
11
NVIC_EnableIRQ(UART_IRQn);
12
13
NVIC_SetPriority(TRNG_IRQn, 10);
14
NVIC_EnableIRQ(TRNG_IRQn);

von Alex D. (daum)


Lesenswert?

Alex G. schrieb:
> Da der DUE mit 84Mhz taktet, bedeutet dies dass 100ns nur etwa 8.4
> Takten entspricht...

Stimmt, das würde mit Timer gar nicht gehen, ein Cortex-M3 hat eine 
Interrupt latenz von 12 cycles, also schon 140ns.

von Frickelfritze (Gast)


Lesenswert?

Raff schrieb:
> Ich würde mich freuen, wenn ihr mir helfen könntet und die passenden
> Stellen im Datenblatt zeigen könntet.

Wenn ich solche schwierigen Frage lese dann frage ich erst
mal was eigentlich damit gemacht werden soll ... bevor ich
mich bemühe, nachschlage und Rat gebe.

Also: wozu soll's denn gut sein?

von Jim M. (turboj)


Lesenswert?

Frickelfritze schrieb:
> Also: wozu soll's denn gut sein?

Solche Art Delay braucht man beispielsweise vom runterziehen des CS zur 
1. Clockflanke bei einigen SPI Slaves.

Je nach anwendung braucht der OP also nur 8 oder 9 von
1
__NOP();

von Frickelfritze (Gast)


Lesenswert?

Jim M. schrieb:
> Solche Art Delay braucht man beispielsweise vom runterziehen des CS zur
> 1. Clockflanke bei einigen SPI Slaves.

Das sollte der TO schon selbst wissen wenn er fragt.
Und ich schätze dass er es dazu nicht braucht, dazu sind
seine Aussagen/Fragen zu naiv.

von Raff (Gast)


Lesenswert?

Frickelfritze schrieb:
> Also: wozu soll's denn gut sein?

Ich will ein PWM erzeugen, das seinen Duty Cycle zyklisch verändert. 
Mein PWM hat eine Periodendauer von 6,098 µs und bei dem kleinsten Duty 
Cycle, den ich einstellen möchte, habe ich eine On-Time von 190 ns.

Alex D. schrieb:
> Die wahrscheinlich schnellste clock einstellung ist 0 für
> MCK/2.

Ich gehe mal davon aus, dass MCK der Master Clock von 84 MHz ist und 
meine Timer dann mit 42 MHz laufen können?

von Peter D. (peda)


Lesenswert?

Raff schrieb:
> Ich will ein PWM erzeugen

Was stört Dich denn an der Hardware-PWM?
Vielleicht, daß sie keine CPU-Zeit verbraucht und keinen Jitter hat?

von Raff (Gast)


Angehängte Dateien:

Lesenswert?

Peter D. schrieb:
> Was stört Dich denn an der Hardware-PWM?

Das war schon meine erste Überlegung.

Hätte dann MCK/512 verwendet, damit ich die Periodendauer von 6,09 µs 
erhalte.

Dann müsste ich alle 6,09 µs einen neuen Wert in das Register für den 
Duty Cycle (das Register habe ich auf die schnelle nicht gefunden). 
Hierfür würde ich dann ja einen weiteren Timer benötigen, mit dem ich 
die 6,09 µs messe.

Ich hatte bei dieser Lösungsmöglichkeit aber die Befürchtung, dass ich 
den Duty-Cylce nicht so einstellen kann, dass ich eine High-Zeit von 190 
ns bei der ersten Periode, 380 ns bei der zweiten Perioden, usw. 
erhalte.

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

Das kannst du drehen und wenden, dass verhältniß von Takt zur 
Anfordernist zu knapp und zu krumm. Für dass was du willst ist er zu 
lahm, selbt mit grifen in die Trickkiste. In reinem ASM kämest du in die 
Nähe wäre der Takt günstiger aber IRQs benötige au Zeit und die ist bei 
derlei Anforderungen zu knapp, glaube ich. soll das ein Videosignal 
werden? 190 ns hab ich schonmal irgendwo gefunden keine Ahnung wobei.

Namaste

von Marco H. (damarco)


Lesenswert?

Nö Hardware PWM und das Value kommt vom DMA Controller.. Der schiebt 
jede Periode ein Value nach.. Leider kann der DMA glaube ich nicht auf 
die PIO zugreifen, so lässt sich auch jedes Signal erzeugen..

: Bearbeitet durch User
von Raff (Gast)


Lesenswert?

Ich möchte den Duty Cycle des PWMs mit einer Frequenz von 2,5 kHz (T=400 
µs) verändern. Also bei der ersten Periode ist der Duty Cycle 0%. Dann 
steigt er kontinuierlich, bis er bei t=200 µs bei 100 % ist und fällt 
danach wieder kontinuierlich bis auf 0%. Dann wiederholt sich das Ganze.
Bei der Frequenz des PWM an sich möchte ich den maximalen Wert nehmen, 
der möglich ist. Meiner Meinung nach ist das jetzt ungefähr 42 kHz 
(T=23,8 µs -> auf 24 µs ).

400 µs/23,8 µs= 16,8 -> Nach 8 Wiederholungen möchte ich 100 % haben

23,8 µs/ 8 = 2,976 -> ON-Time wird nach jeder Periode um 3 µs erhöht 
(würde sogar mit Arduino-Funktion gehen DelayMicroseconds)

Sind leider alles unschöne Werte.  Würdet ihr das anders machen?

von Jim M. (turboj)


Lesenswert?

Raff schrieb:
> Dann müsste ich alle 6,09 µs einen neuen Wert in das Register für den
> Duty Cycle (das Register habe ich auf die schnelle nicht gefunden).
> Hierfür würde ich dann ja einen weiteren Timer benötigen, mit dem ich
> die 6,09 µs messe.

Das macht man auf den dicken Cortex-Mx via DMA. Ich bin mir einigermaßen 
sicher das der SAM3X8E die dazu nötige Hardware an Board hat.

Unterstützung in den Arduino Libs würde mich allerdings eher 
überraschen, denn die kleinen ATMega kennen kein DMA weil das alte 
Designs sind.

Das ist die Stelle wo man sich das dicke Refernz Hanbuch zum SAM3X8E mal 
raussuchen und durchlesen müsste...

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Alex G. schrieb:
> D.h. exakt 100ns wirst du nicht hinbekommen und am nächsten dran kommst
> du mit 8 NOPs.

Winfried J. schrieb:
> In reinem ASM kämest du in die
> Nähe

Leider ist bei solchen Prozessoren die Zeit pro Instruktion nicht fix. 
Je nach Zustand der Pipeline oder des Flash(-Cache, falls vorhanden) 
kann auch ein NOP kürzer oder länger dauern. Durch Instruktionen zählen 
lässt sich nur  schwer ein präzises Timing erreichen. Dazu müsste man 
mindestens den Code aus dem RAM ausführen und den Bus für sich alleine 
haben (d.h. alles DMA abschalten).

Daher sollte man so etwas auf jeden Fall ganz mit DMA machen - dann ist 
die CPU ganz frei und kann parallel alles mögliche andere tun. Mit den 
SAM3X8E-Controllern kenne ich mich nicht so gut aus, aber bei den STM32 
geht das definitiv.

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

Niklas G. schrieb:

> SAM3X8E-Controllern kenne ich mich nicht so gut aus, aber bei den STM32
> geht das definitiv.

Der STM32F103 spielt nach minimaler Initialisierung eine 
3-Phasen-Sinus-PWM ab, ohne auch nur eine CPU-Takt zu benötigen. In 
meinen (Test-)Fall macht er 2..200Hz "Drehstrom" mit ca. 30kHz 
PWM-Frequenz. Sollte der SAM das nicht können, wäre ich überrascht.

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.