Arduino Due: Nanosekunden-Delay

Gast #5598896
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.
#5598905
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.
Gast #5598962
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);
Gast #5599026
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?
Gast #5599211
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.
Gast #5599284
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?
Gast #5599325
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.
Angehängte Dateien:
(Firma: Nisch-Aufzüge) Persönliche Seite #5599457
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
Gast #5599568
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?
#5599710
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...
Persönliche Seite #5599717
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.
#5600235
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.

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