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
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?
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.
@ 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 SAM3X8EARM 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.
> 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
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...
@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.
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".
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!
;)
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.
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.
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.
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.
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.
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.
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.