Forum: Mikrocontroller und Digitale Elektronik ARDUINO PWM-Frequenz wechseln, hier der Code: DUE?


von Vadislav (Gast)


Lesenswert?

Hallo Leute,

ich habe hier eine Seite gefunden, wie man die PWM-Frequenz ändern 
könnte für fast alle Arduino Boards.

http://arduino-info.wikispaces.com/Arduino-PWM-Frequency

Habe das getestet und es klappt auch wunderbar.

Meine Frage:

Der DUE ist leider nicht mit angegebn, kennt jmd. eine Seite bzw. weiß 
jmd. wo das steht bzw. wie der Code bzw. die Zeile lautet für die PINS ?

Danke!.

VG
Vadislav

von uwe (Gast)


Lesenswert?


von Peter D. (peda)


Lesenswert?

Vadislav schrieb:
> Der DUE ist leider nicht mit angegebn

Was ist denn ein DUE?

Wozu willst Du die Frequenz ändern.
Willst Du Töne erzeugen, einen Schrittmotor ansteuern oder was?

von PittyJ (Gast)


Lesenswert?

Hat der Due nicht einen ganz anderen Prozessor? (AVR <->Arm)
Da müßte das doch auch ganz anders gehen?

von Vadislav (Gast)


Lesenswert?

uwe schrieb:
> http://www.atmel.com/Images/doc11057.pdf
> Seite 873 und Seite 906

Danke UWE, aber wie würde denn der Befehl für eine PWM-Pin lauten ?

Brauche halt den µC für die Erzeugung einer höheren PWM.

Bei dem UNO gebe ich einfach in Simulink folgendes ein:

TCCR0B = TCCR0B & B11111000 | B00000001; für PIN 5, um 62.5 kHZ zu 
erhalten.

Was müsste man denn für den DUE eingeben ?

PittyJ schrieb:
> Hat der Due nicht einen ganz anderen Prozessor? (AVR <->Arm)
> Da müßte das doch auch ganz anders gehen?

Nein, der hat auch einen von atmel.

von Falk B. (falk)


Lesenswert?

@ Vadislav (Gast)

>Was müsste man denn für den DUE eingeben ?

>> Hat der Due nicht einen ganz anderen Prozessor? (AVR <->Arm)
>> Da müßte das doch auch ganz anders gehen?

Hat er.

>Nein, der hat auch einen von atmel.

Ja, Atmel ist der HERSTELLER, ARM ist der CPU-Typ. Der DUE ist ein ARM 
und hat GANZ ANDERE Register!

http://arduino.cc/en/Main/ArduinoBoardDue

Es ist ein Atmel SAM3X8E ARM Cortex-M3 CPU

Und huch, dort gibt es einen Link zum Datenblatt. Schau einer an!

http://www.atmel.com/Images/doc11057.pdf

Und Was lesen wir auf 869? Was von den Timern. Ja, das Datenblatt ist 
FETT! Das ist ein ganz anderes Kaliber als der kleine, nette AVR.

von uwe (Gast)


Lesenswert?

> Nein, der hat auch einen von atmel.
Auf dem DUE ist ein 32Bit ARM von Atmel (SAM3) auf den Anderen Arduinos 
sind 8 Bit AVRs von Atmel.
Du mußt im TC_CMRx (für  x timer 0 bis2) die Bits im Feld TCCLKS auf 0 
setzen. Dadurch würde sich aber auch das ganze andere zeitverhalten des 
DUEs ändern.
Wenns nicht gehen sollte ist warscheinlich das WPEN gesetzt.
Dann steht da:
This register can only be written if the WPEN bit is cleared in
“TC Write Protect Mode Register” on page 903
Also auf Seite 903:
Das Register TC_WPMR das Bit WPEN vorher löschen.

Aber mal ehrlich hast du irgendwas verstanden von dem was ich 
geschrieben habe? Lese und verstehe das Datenblatt. Wenn dir das zu hoch 
ist dann versuchs erst mal mit den 8 Bit AVRs und lese und verstehe das 
Datenblatt, mach das Tutorial durch und lass nen paar LEDs blinken mit 
Timern. Danach nimm dir nochmal den SAM3 vor und dessen Timer. und wenn 
ich sage mach das Tutorial durch dann meine ich auch lass die Arduino 
Sche***.
Der SAM3 kann übrigen dies wenn du kein Arduino Zeug benutzt:
Up to 8-channel 16-bit PWM (PWMC) with Complementary Output,
Fault Input, 12-bit Dead Time Generator Counter for Motor Control

von Vadislav (Gast)


Lesenswert?

Nein, ich bin nur Anwender, was ich will, ist nur den Befehl, um die 
PWM-Frequenz der PINS zu ändern.

Das ist nicht mein Aufgabengebiet, daher würde bräuchte ich nur kurz den 
Code...

von Falk B. (falk)


Lesenswert?

@Vadislav (Gast)

>Nein, ich bin nur Anwender, was ich will, ist nur den Befehl, um die
>PWM-Frequenz der PINS zu ändern.

Dann nutzt die Funktionen, die dir die Arduinoblibliotheken zur 
Verfügung stellen. Dass die nicht ALLE möglichen Einstellungen bieten, 
welche die Hardware kann, ist halt Pech. Beschwer dich bei den 
Programmierern.

von Linksammler (Gast)


Lesenswert?

Vadislav schrieb:
> Nein, ich bin nur Anwender, was ich will, ist nur den Befehl, um die
> PWM-Frequenz der PINS zu ändern.
>
> Das ist nicht mein Aufgabengebiet, daher würde bräuchte ich nur kurz den
> Code...

Und woher willst du wissen, dass dieser "eine" befehl existiert?

Je nachdem was du sonst noch timing-Abhängiges (direkt oder indirekt) 
benuzt, sind das vielleicht viele tausende Zeilen code, die man quer 
durch das ganze Arduino-Framework anpassen muss,

Also: Wenn google nix findet: Nimm einen AVR-Basierten Arduino, notfalls 
als reinen "PWM-Coprozessor", und folge den Anweisungen die du schon 
kennst.

"Hach, ich weiß nicht, wie ich bei meinem Porsche den zweiten Gang 
einlegen kann, deshalb fahr ich jetzt Dreirad".

von M. K. (sylaina)


Lesenswert?

Linksammler schrieb:
> Und woher willst du wissen, dass dieser "eine" befehl existiert?

Weil er das nicht weis fragt er ja. Ich halte das für durchaus legitim! 
;)

von uwe (Gast)


Lesenswert?

> Das ist nicht mein Aufgabengebiet
Dann ist das einfach: Gebe es demjenigen dessen Aufgabengebiet es ist.

von uwe (Gast)


Lesenswert?

Das Problem ist folgendes: Diejenigen die sich mit SAM3 und den Timern 
und dem Taktsystem usw. auskennen benutzen keine Arduino Libs, können 
dir also nur sagen wie es gehen würde wenn man keine Arduino Libs 
benutzt.
Diejenigen die Arduino Libs benutzen kennen sich mit SAM3 und den Timern 
und dem Taktsystem usw. nicht aus.
Wenn du weißt wie man mit den Arduino Libs in das Register TC_CMRx in 
die unteren 3 Bits eine 0 schreibst dann sollte es das gewesen sein.
Du mußt nur noch herausfinden ob TC_CMR0 oder TC_CMR1 oder TC_CMR2, dies 
hängt vom Timer welcher benutzt wird ab bzw. an welchem Pin das PWM 
Signal rauskommt. Da ich mich absolut nicht mit Arduino auskenne kann 
ich dir auch nicht sagen wie das geht, aber du solltest doch schon 
wissen wie man etwas in ein Register bzw. in eine Speicherstelle 
schreibt. Wenn nicht mußt du das halt herausfinden.
google doch mal Arduino TC_CMR.

von Karl H. (kbuchegg)


Lesenswert?

uwe schrieb:

> Wenn du weißt wie man mit den Arduino Libs in das Register TC_CMRx in
> die unteren 3 Bits eine 0 schreibst dann sollte es das gewesen sein.

Im Prinzip geht das genauso wie bei denjenigen, die kein Arduinio 
benutzen. Denn das Ardunio Framework baut auf genau denselben Grundlagen 
auf, wie auch die anderen Programme und mit dem richtigen Include File 
hast du auch das alles zur Verfügung.

Aber: das Arduino System ist ein Framework! Die interessante Frage ist, 
welche Teile will das Framework für sich selbst haben bzw. wo lasse ich 
besser die Finger davon, die Hardware unter dem Framework 
umzukonfigurieren.

Ein wichtiger Punkt bei Arduino ist genau das, das man eben nicht die 
unterste Ebene kennen muss. Genau dazu hat man ja das Framework, dass 
dieses die Hardware so gut es geht wegabstrahiert. Mit natürlich auch 
genau dem Effekt, dass das Framework dann oft auch auf dem kleinsten 
gemeinsamen Nenner aufsetzen muss. Was hier konkret bedeutet, dass man 
nicht alles, was die Hardware hergibt, auch über das Framework benutzen 
kann.

Wenn für mich das Framework 'Auto' nur aus 3 Pedalen, 1 Ganghebel und 
einem Lenkrad besteht, dann kann ich eben nicht mehr einfach so an der 
Zündverstellung rummachen. D.h. ich kann das schon. Nur muss ich dann 
eben ein wenig mehr können, als nur mit den 3 Pedalen und dem Ganghebel 
umgehen zu können. Die wiederrum sind aber nützlich, denn sie erlauben 
mir ein neues Auto zu kaufen und da ich dort genau die gleichen Pedale 
vorfinde, komme ich sofort zurecht.
Hat halt alles seine Vor und Nachteile.

von Vadislav (Gast)


Lesenswert?

Meine Hoffnung war ja, dass einer das schon vll. gemacht hat, siodass es 
einfach heißt:
mach dies und das in Simulink =)

von Peter D. (peda)


Lesenswert?

Eine PWM soll ja eine analoge Spannung erzeugen, d.h. die Frequenz ist 
schnurz piep egal.
Ein Framework für PWM-Frequenz wirst Du daher kaum finden.

Für die Frequenzerzeugung mußt Du nach der Anwendung unterscheiden.
D.h. ein Framework für Tonerzeugung oder Schrittmotorsteuerung sollte 
eher zu finden sein.

von Hipp (Gast)


Lesenswert?

Diese Aussagen sind völlig nutzlos und führen nicht weiter.
Wenn Sie eine Möglichkeit kennen die pwm-Frequenz zu erhöhen antworten 
seien Sie so nett und antworten bitte. Falls nicht helfen solche 
dämlichen Antworten niemandem weiter.
Beiträge dieser werden immer wieder von hilfesuchenden aufgerufen, da 
Schlagworte wie Due & Frequenz darin vorkommen.
Wenn dann nur dumme Kommentare in dieser Art bei zu lesen sind ist 
niemandem geholfen.
Ich kann nur sagen wie sehr mich solche Arroganz irritiert.
Wenn ich helfen kann tue ich es. Chauvinịstisches Verhalten um sich 
selbst auf die Schulter zu klopfen ist peinlich.

von Annika (Gast)


Lesenswert?

Hallo zusammen,

ich bin das Problem angegangen, indem ich die arduino-Funktion 
analaogWrite() angepasst habe. Ursprünglich mit 2 Übergabevariablen (Pin 
und DutyCycle) habe ich noch eine dritte Übergabevariable Frequenz 
eingefügt und den Code entsprechend angepasst. Man findet die Funktion 
in der Datei wiring_analog.c.


Das ist vielleicht nicht die eleganteste Variante, weil die Funktion 
analogWrite ja auch für andere Zwecke (eben analoge Werte an einen Pin 
schreiben, oder einen Timer ausgeben) verwendet wird. Wenn eine dieser 
Funktion gebraucht wird, muss man dann beachten als dritte 
Übergabevariable ein dummy zu übergeben, damit die Funktion akzeptiert 
wird.

Für mich funktioniert es so, und ich kann jede beliebige Frequenz bzw. 
Periode und DutyCycle über die PWM ausgeben lassen. Habe allerdings noch 
keine Grenzen ausgetestet.


Achso, ich brauchte die PWM, um den Controller für einen Schrittmotor 
anzusteuern. Das Framework für die Schrittmotoransteuerung ist für mich 
nutzlos, weil da das Programm in der Schrittmotorfunktion hängen bleibt, 
ich aber parallel noch andere Aufgaben ausführen muss.

von Einer K. (Gast)


Lesenswert?

Annika schrieb:
> indem ich die arduino-Funktion
> analaogWrite() angepasst habe.

Ich beglückwünsche dich zu deinem Erfolg!

von Herbert (Gast)


Lesenswert?

Peter D. schrieb:
> Eine PWM soll ja eine analoge Spannung erzeugen, d.h. die Frequenz ist
> schnurz piep egal.

Leider ein sehr großer Irrtum, die Frequenz macht einiges aus.
ZB, pfeifen bei Motoren.

von Frank S. (redspider124)


Lesenswert?

Die ursprüngliche Seite ist umgezogen und jetzte unter folgendem Link zu 
erreichen.:

https://arduinoinfo.mywikis.net/wiki/Arduino-PWM-Frequency

Gruß, Frank

von Veit D. (devil-elec)


Lesenswert?

Annika schrieb:
> Hallo zusammen,
>
> ich bin das Problem angegangen, indem ich die arduino-Funktion
> analaogWrite() angepasst habe. Ursprünglich mit 2 Übergabevariablen (Pin
> und DutyCycle) habe ich noch eine dritte Übergabevariable Frequenz
> eingefügt und den Code entsprechend angepasst. Man findet die Funktion
> in der Datei wiring_analog.c.
>
>
> Das ist vielleicht nicht die eleganteste Variante, weil die Funktion
> analogWrite ja auch für andere Zwecke (eben analoge Werte an einen Pin
> schreiben, oder einen Timer ausgeben) verwendet wird. Wenn eine dieser
> Funktion gebraucht wird, muss man dann beachten als dritte
> Übergabevariable ein dummy zu übergeben, damit die Funktion akzeptiert
> wird.

Genauso geht man vor. Wenn du die orignale Funktion bzw. Methode wieder 
herstellst mit genau dem gleichen Namen, dann unterscheiden sich beide 
in ihrer sogenannten Signatur. Nennt man Überladung. Damit musst du 
anderen Code nicht ändern der nur die 2 Standard Parameter benötigt.

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.