Guten Morgen! Beim programmieren einer PWM auf dem Arduino Mega R3 hat bei mir das technikherz höher geschlagen und mir sind Fragen aufgekommen... leider bin ich ein blutiger µC Neuling. Ganz schnell musste ich feststellen, dass man die PWM ja in Software programmieren könne. Gesagt getan. Ergebnis: Der Duty Cycle ist instabil. -> Ab in die Tonne damit. Neuer Versuch: PWM mit Interrupt -> Super!! Ne, wie? Nur definierte Frequenzen? Ich möchte aber genau 25KHz! Nicht 31234 oder 3142... Zufällig bin ich dann auf die PWM.h gestoßen, die ist von 2012 und funktioniert nicht mehr sauber auf den neuen Boards. kann aber ein breites Frequenzspektrum abdecken. Nur wie? Ich weiß, dass das schon Advanced Programming ist aber genau da will ich hin kommen! Ich hab gelesen, dass diese Header möglicherweise mit sowas wie Lookup-Tables arbeitet um Rechenzeit zu vermeiden usw... Also was möchte ich eigentlich fragen: Ich möchte einfach nicht mit solchen Bibliotheken arbeiten, genau aus dem Grund, dass plötzlich bei Version x.xx nichts mehr funktioniert. Ich möchte in der Lage sein, Probleme dieser Art beheben zu können. Nur werde ich von der Fülle des ATmega2560 Datenblatts erschlagen. Wie beginne ich am besten mit dem Lernen? Und ganz brennend interessiert mich, wie hat der Entwickler es geschafft, mit vorgegebenen Prescaler werten, variable Frequenzen umzusetzen? leider gab es in den Quelle keine Antwort darauf. Danke schonmal im Voraus!
Begeisterter schrieb: > Wie beginne ich am besten mit dem Lernen? Am besten du zeigst erst mal deine "Header Library" damit wir wissen wovon du redest. Ich habe schon mal "Header Library" statt Header Library geschrieben weil es so etwas eigentlich nicht gibt.
Begeisterter schrieb: > Und ganz brennend interessiert > mich, wie hat der Entwickler es geschafft, mit vorgegebenen Prescaler > werten, variable Frequenzen umzusetzen? Vermutlich hat er das Datenblatt, welches dir nicht schmeckt, gelesen und verstanden. Auch wird er wohl die Programmiersprache gelernt haben, welche er da verwendet. Begeisterter schrieb: > leider gab es in den Quelle > keine Antwort darauf. Ich nehmen mal an, dass die Quelle DIE ANTWORT ist. Nur, das verstehen lernen, das kann ich dir nicht abnehmen.
Begeisterter schrieb: > Ich möchte aber genau 25KHz Nun, die Timer im MC können nur um ganze Zahlen teilen. Für 25kHz muß daher der CPU-Takt ein ganzzahliges Vielfaches von 2*25kHz sein. Die andere Frage ist, ob Du eine Frequenz oder eine PWM haben willst. Eine Frequenz hat typisch einen Tastgrad von 50%. Eine PWM hat einen wählbaren Tastgrad (entspricht dem Analogwert) und die genaue Frequenz ist uninteressant. Begeisterter schrieb: > Zufällig bin ich dann auf die PWM.h gestoßen Solange Du nicht genau auf diese PWM.h verlinkst, kann niemand damit was anfangen.
Mega256Helper schrieb: > Ich habe schon mal "Header Library" statt Header Library > geschrieben weil es so etwas eigentlich nicht gibt. Im Arduino Umfeld sind "Header only" Lib üblich. Die Weitergabe von vorkompilierten Libs ist dagegen unüblich, bis Sinn frei. Dafür ist die Umgebung zu Heterogen. Hier kannst du herauslesen, was mit einer "Arduino Library" gemeint ist. https://arduino.github.io/arduino-cli/library-specification/
Moin, wenn du mir interrupts arbeiten möchtest und davon 25k pro Sekunde auslösen möchtest, kannst du den Overflow eines Timers per CTC mode einstellen. Dadurch kommst du auf saubere Frequenzen (im Rahmen der uC Abweichungen des Taktes) Viele Grüße Jonas
Ich würde mit einem kleineren Vertreter der AVR-Mikrocontroller erste Erfahrungen sammeln, dann ist es übersichtlicher. MfG
Guten Morgen, Danke für die tollen Antworten :D. Ob mir das Datenblatt schmeckt, weiß ich noch nicht. Gegessen hab ich das noch nicht... Für alle Anderen, die ernsthaft antworten möchten hier der Link: https://forum.arduino.cc/index.php?topic=117425.0 @Peter.D Also deine Definition einer PWM verstehe ich nicht, eine PWM hat immer eine Frequenz und einen Duty Cycle. Beides ist variabel wählbar. Ein 50% Duty Cycle ist nicht die Definition einer Frequenz?! @Christian S. Ich hab das Board hier und würde mich gern nach und nach reinarbeiten. Das muss nicht alles innerhalb eines Tages passieren. Ich habe wirklich Interesse daran, gut darin zu werden.
:
Bearbeitet durch User
Jonas schrieb: > Moin, > wenn du mir interrupts arbeiten möchtest und davon 25k pro Sekunde > auslösen möchtest, kannst du den Overflow eines Timers per CTC mode > einstellen. Dadurch kommst du auf saubere Frequenzen (im Rahmen der uC > Abweichungen des Taktes) > > > Viele Grüße > Jonas Danke Jonas, kannst du mir das genauer erklären oder gibt es soetwas wie ein Tutorial für den Einstieg? Hast du generell einen Tip, wie man am klügsten beginnt?
Milky W. schrieb: > Beides ist variabel > wählbar. Aber nur in der Theorie. In der Praxis begrenzt der Zählumpfang und der CPU-Takt den Bereich und die Auflösung. Braucht man eine bestimmte Auflösung der PWM, ist es daher sinnvoller, nicht auf einer bestimmten Frequenz zu beharren. Und oft auch unnötig. Sind z.B. 10Bit Auflösung gefordert, ergibt sich die Frequenz zu 16MHz / 1024 = 15,625kHz.
Milky W. schrieb: > Ich habe wirklich Interesse daran, gut darin zu werden. Milky W. schrieb: > Hast du generell einen Tip, wie man am klügsten beginnt? Sprache lernen, hier C++. Und Datenblatt auswendig lernen. Dann hast du das gesamte Spektrum der Möglichkeiten offen vor dir liegen.
Peter D. schrieb: > Milky W. schrieb: >> Beides ist variabel >> wählbar. > > Aber nur in der Theorie. > In der Praxis begrenzt der Zählumpfang und der CPU-Takt den Bereich und > die Auflösung. > Braucht man eine bestimmte Auflösung der PWM, ist es daher sinnvoller, > nicht auf einer bestimmten Frequenz zu beharren. Und oft auch unnötig. > Sind z.B. 10Bit Auflösung gefordert, ergibt sich die Frequenz zu 16MHz / > 1024 = 15,625kHz. Das gerade ist ja das Besondere an der PWM.h. Der Typ hat (zwar mit der Einschränkung, dass am ende "nur" 4 PWMs ausgegeben werden) ein Duty Cycle und Frequenzstabiles PWM-Signal erzeugt, dass ein breites Frequenzspektrum liefert, obwohl der ATmega2560 mit dem Prescaler (1, 8, 32, 64, 128, 256) eingeschränkt ist. Gerade das ist die spannende Kunst dahinter. Ich habs mit nem Oszi nachgeprüft, 750Hz 10% -> Stabile 748Hz und 10,18% laut Oszi. Mit Prescale garnicht möglich!
Arduino Fanboy D. schrieb: > Sprache lernen, hier C++. > Und Datenblatt auswendig lernen. Jain. Ich hab 2Semster C++ gehabt... mit Bitoperationen usw. in der form wie hier, hatten wir aber nichts zutun. Das ist schon was anderes, je nach Bereich. Datenblatt auswendig lernen... naja, es muss ja irgendwie auch ne bleibende, wiederkehrende Logik geben, die man anwenden kann. Gibt es vllt gute Bücher oder Tutorials, die son bisschen zeigen wie moderne µC arbeiten? ne Anleitung zur Selbstausbildung?
Milky W. schrieb: > 750Hz 10% -> Stabile 748Hz > und 10,18% laut Oszi. Mit Prescale garnicht möglich! Warum denn nicht? 16MHz / 750Hz = 21333 Fast PWM: OCR1A = 21332 (= 750,01Hz) OCR1B = 2132 (= 10%)
Milky W. schrieb: > Mit Prescale garnicht möglich! Wenn du das Datenblatt lesen würdest, würdest du sehen, dass die PWM Frequenz keineswegs nur von der CPU Clock und dem Prescaler abhgängig ist.
"The N variable represents the prescaler divider (1, 8, 64, 256, or 1024)." TOP wird im richtigen Modus durch OCRnA oder ICRn festgelegt (beides 16-bit Register)
:
Bearbeitet durch User
> Gibt es vllt gute Bücher oder Tutorials, die son bisschen zeigen wie
moderne µC arbeiten? ne Anleitung zur Selbstausbildung?
Naja, das Datenblatt. Plus das ASM Instruction Manual. Seite fuer Seite.
Wenn man einen hat sind die anderen nicht mehr so kompliziert. Vieles
ist aehnlich.
Ich hab's auch selbst erlernt beim Bau eines 8086 Computers. Ja. ist
schon eine Weile her. Damals gab es noch gar nichts. Der PC wurde grad
erfunden.
:
Bearbeitet durch User
Peter D. schrieb: > Milky W. schrieb: >> 750Hz 10% -> Stabile 748Hz >> und 10,18% laut Oszi. Mit Prescale garnicht möglich! > > Warum denn nicht? > > 16MHz / 750Hz = 21333 > Fast PWM: > OCR1A = 21332 (= 750,01Hz) > OCR1B = 2132 (= 10%) Ich sage ja, dass ich ein blutiger Anfänger bin. Ich finde ja gut, dass du das kannst. Nur wie komme ich dahin? Was im Datenblatt steht sieht etwas anders aus?!
Milky W. schrieb: > Was im Datenblatt steht sieht etwas anders aus?! Dann check mal die 16-bit Timer im Datenblatt ;-)
Hallo, wenn ich 25kHz höre vermute ich es geht um eine Lüftersteuerung nach Intel Specs. Empfehlung sind die 16 Timer PWM Modi 8 bis 11 solange keine sehr hohen Frequenzen nötig sind, Fast PWM Mode ginge auch, erzeugt jedoch unschöne Nadelimpulse bei Compare 0 bzw. Max. Jetzt nimmste das Datenblatt, suchst die Modi zugehörige Formel raus, stellst die um nach TOP und rechnest ein wenig hin und her. Denke daran das TOP maximal "nur" 65535 sein kann. Damit suchste dir den passenden Prescaler raus mit möglichst hohen TOP Wert. Je höher der TOP Wert um so höher deine Auflösung für Duty Cycle. Dieser TOP Wert bestimmt dir zusammen mit dem Prescaler die Frequenz deiner PWM. Der Wert landet je nach Modi im OCRnA bzw. ICRn Register. Weil deine 25kHz hier nicht live verändert werden kannste einen Modi mit ICRn für TOP verwenden. Damit haste alle anderen OCRn frei zum schalten und walten. Dank Buffer in den Modi kannste die OCRn ohne Verenkungen live ändern. Das heißt du kannst alle OCRn Pins bzw. dessen Interrupts für deine individuelle PWM verwenden. Duty Cycle Werte dann entsprechend zwischen 0 und TOP Wert. Die zu setzenden Bits für die Modi, Prescaler und Pin Toggle findest du in den Tabellen, dann guckste dir die Timer Register an und schaust wo die Bits drin sind und setzt diese entsprechend. Bei Arduino bitte vorher alle Timerregister nullen, weil die vorbelegt sind für die analogen Ausgänge. Ansonsten macht der Timer nicht das was du möchtest.
Moin, ich hab nicht mitgelesen, ich poste hier einfach meine Lösung, hab auch etwas gebraucht um zu kapieren, was nicht stimmt. Ich verwende diese Library (v05): https://code.google.com/archive/p/arduino-pwm-frequency-library/downloads Die funktioniert, aber die Pinzuweisungen sind falsch, daher habe ich eine kleine switch-case Struktur, die das grade biegt. Will ich PWM auf Pin 2, muss ich der library Pin 5 geben, usw. Nur Pin 11 und 12 funktionieren auch so korrekt.
1 | #include <PWM.h> |
2 | |
3 | InitTimersSafe(); |
4 | |
5 | int pin = 2; |
6 | unsigned long pwm_value = 32768; |
7 | |
8 | int pwm_pseudo = 0; |
9 | switch (pin) { |
10 | case 2: pwm_pseudo = 5; break; |
11 | case 3: pwm_pseudo = 2; break; |
12 | case 7: pwm_pseudo = 6; break; |
13 | case 8: pwm_pseudo = 7; break; |
14 | case 11: pwm_pseudo = 11; break; |
15 | case 12: pwm_pseudo = 12; break; |
16 | case 45: pwm_pseudo = 46; break; |
17 | case 44: pwm_pseudo = 45; break; |
18 | } |
19 | SetPinFrequency(pwm_pseudo, 20000); |
20 | pwmWriteHR(pwm_pseudo, pwm_value); |
Ist so natürlich kein funktionierender Code, aber die nötigen Schritte um 50% PWM auf Pin 2 zu erzeugen sind aufgeführt.
was schrieb: > Ist so natürlich kein funktionierender Code, aber die nötigen Schritte > um 50% PWM auf Pin 2 zu erzeugen sind aufgeführt. ... bei 20.000Hz übrigens. 50% sind das, weil der Wertebereich von pwmWriteHR() 16 Bit beträgt, also 0 - 65535.
Hallo, man muss zwischen der Gehäusepin Nummerierung und der Arduino Nummerierung unterscheiden. Die PWM zu Fuss zu machen ist nicht sooo schwer. Erfordert nur einmal so richtig reinknien, Notizen machen, Bsp. Code schreiben, testen und abspeichern.
:
Bearbeitet durch User
was schrieb: > [code] > int pwm_pseudo = 0; > switch (pin) { > case 2: pwm_pseudo = 5; break; > case 3: pwm_pseudo = 2; break; > case 7: pwm_pseudo = 6; break; > case 8: pwm_pseudo = 7; break; > case 11: pwm_pseudo = 11; break; > case 12: pwm_pseudo = 12; break; > case 45: pwm_pseudo = 46; break; > case 44: pwm_pseudo = 45; break; Danke! Ich werds aber zu fuß machen um das µC-Programmieren richtig zu lernen. Es gibt wirklich geile Quellen im Netz, mit Projekten, wo bspw. mit Python o.ä. Funktionen vorab berechnet wurden, dann daraus LUTs gespeichert, diese in den SRAM (so hab ichs bisher verstanden) geschrieben wurden um Geschwindigkeit zu gewinnen. Einfach nur geil... schade, dass ich nicht schon viel früher damit angefangen habe.
Milky W. schrieb: > daraus LUTs > gespeichert, diese in den SRAM (so hab ichs bisher verstanden) > geschrieben wurden um Geschwindigkeit zu gewinnen. Ööhh was? Es geht hier eigentlich "nur" darum die richtigen Werte in die richtigen Register der Timer zu schreiben, damit die das Signal produzieren, das man haben will. Die Library nimmt dir nur die Arbeit ab rauszufinden, welche Werte und welche Register das sind. Wenn die geschrieben, machen die Timer ihr Ding, das braucht keine CPU-Takte mehr, da gibt's nichts mehr zu optimieren. LUTs sind da um häufig benötigte Werte nicht immer wieder neu berechnen zu müssen, sondern einfach einmal und die dann merken.
student schrieb: > LUTs sind da um häufig benötigte Werte nicht immer wieder neu berechnen > zu müssen, sondern einfach einmal und die dann merken. Danke Herr Student, ja. Das war etwas Off Topic.
Hallo, also diese Timer Settings haben nun eher nichts mit LUTs zu tun. Da gehts dann eher um Helligkeitsberechnungen für Leds u.ä.. Mach erstmal das Eine und dann das Andere.
Veit D. schrieb: > Hallo, > > also diese Timer Settings haben nun eher nichts mit LUTs zu tun. Da > gehts dann eher um Helligkeitsberechnungen für Leds u.ä.. Mach erstmal > das Eine und dann das Andere. Hi! Ja das ist mir klar. Denke jedem. Das war einfach ein Beispiel warum mich µC so begeistern. Ich bin Neuling und mir war nicht klar, dass dies mit den Dingern möglich ist obwohl es ja doch sehr offensichtlich ist.
Milky W. schrieb: > du das kannst. Nur wie komme ich dahin? > Probiere viel aus, lies viel, lerne logisch zu Denken, schaue andere vorgefertigte Programme an, besonder diejenigen in den Tutorials, gewöhne Dich an englischsprachige Erklärungen und Datenblätter, habe Geduld, es kann Jahre dauern. Benutze Multimeter und Oszilloskop, um die Ergebnisse zu analysieren. mfG
:
Bearbeitet durch User
Christian S. schrieb: > habe > Geduld, es kann Jahre dauern. Ohne Vorkenntnisse WIRD es Jahre dauern, bis man wirklich souverän programmiert. Da darf man sich nichts vormachen. Und selbst das klappt nur, wenn man tatsächlich die ganze Zeit SELBER programmiert und nicht nur Wichsvorlagen zusammenkleistert... Von nix kommt nix. So ist das halt in der bitterbösen Realität. Und übrigens: selbst wenn man souverän programmiert, muss man immer noch ständig dazu lernen, das hört eigentlich niemals wirklich auf... Genau das ist ja das Schöne an dem Job: es wird nie langweilig, weil es immer was Neues zu erforschen gibt. Oder anders ausgedrückt: Wer keinen Spaß am Lernen hat, wird niemals ein auch nur halbwegs tauglicher Programmierer werden.
c-hater schrieb: > Christian S. schrieb: > >> habe >> Geduld, es kann Jahre dauern. > > Ohne Vorkenntnisse WIRD es Jahre dauern, bis man wirklich souverän > programmiert. Da darf man sich nichts vormachen. Und selbst das klappt > nur, wenn man tatsächlich die ganze Zeit SELBER programmiert und nicht > nur Wichsvorlagen zusammenkleistert... > > Von nix kommt nix. So ist das halt in der bitterbösen Realität. > > Und übrigens: selbst wenn man souverän programmiert, muss man immer noch > ständig dazu lernen, das hört eigentlich niemals wirklich auf... > > Genau das ist ja das Schöne an dem Job: es wird nie langweilig, weil es > immer was Neues zu erforschen gibt. Oder anders ausgedrückt: Wer keinen > Spaß am Lernen hat, wird niemals ein auch nur halbwegs tauglicher > Programmierer werden. Naja... was heißt Jahre? Von wie vielen reden wir hier? Das halte ich auf jeden Fall für Unfug. Natürlich kommt immer Neues. Das Werkzeug ändert sich aber nicht unbedingt in der gleichen Geschwindigkeit. Woher ich das weiß? Ich habe E-Technik studiert und Transistoren nutzt man wie lange? Genau!
Milky W. schrieb: > Woher ich das weiß? Ich habe E-Technik studiert und Transistoren nutzt > man wie lange? Genau! Aha. Du baust also z.B. einen 1kW-Solarwechselrichter mit OC816... Du hast das ja schließlich vor Jahrzehnten studiert, da gab's kaum was Besseres als den OC816... Merkst du selber, wie vollkommen idiotisch deine Argumentation ist? Die Anforderungen haben sich massiv gewandelt, die Möglichkeiten haben sich massiv gewandelt und auch die Werkzeuge (das sind nicht die Transistoren!) haben sich massiv gewandelt... Und genauso ist es auf dem Gebiet der Software. Nur noch viel krasser und dynamischer...
c-hater schrieb: > Milky W. schrieb: > >> Woher ich das weiß? Ich habe E-Technik studiert und Transistoren nutzt >> man wie lange? Genau! > > Aha. Du baust also z.B. einen 1kW-Solarwechselrichter mit OC816... > > Du hast das ja schließlich vor Jahrzehnten studiert, da gab's kaum was > Besseres als den OC816... > > Merkst du selber, wie vollkommen idiotisch deine Argumentation ist? Die > Anforderungen haben sich massiv gewandelt, die Möglichkeiten haben sich > massiv gewandelt und auch die Werkzeuge (das sind nicht die > Transistoren!) haben sich massiv gewandelt... > > Und genauso ist es auf dem Gebiet der Software. Nur noch viel krasser > und dynamischer... Ja gut, du wirst sicher Recht haben. Zuweisung haben sich total gewandelt! Schleifen und Operatoren auch! C/C++ ist seit Jahren ausgestorben! Alle programmieren jetzt nur Python KIs! Wobei, KIs sind ja alt! Ausgestorben! Du scheinst mir der Typ Auswendiglernen zu sein, der keine Parallelen erkennt, sobald ein Bauteil effizienter/schneller/präziser wird... oh wait! Dont feed the troll. Ich beantrage den Thread zu bereinigen und zu schließen. Alles wurde beantwortet und sollte für andere Leser mit selben Problem angenehm Lesbar bleiben.
was schrieb: > Ist so natürlich kein funktionierender Code, aber die nötigen Schritte > um 50% PWM auf Pin 2 zu erzeugen sind aufgeführt. Ich hab mal ne Nachfrage. Hast du einen älteren Arduino Mega oder den R3?
Milky W. schrieb: > Hast du einen älteren Arduino Mega oder den R3? Keine Ahnung. Dürfte keine Rolle spielen, Mega2560
HI
>Ist doch egal..
Ja, beides der Arduinomüll.
Achtung jetzt kommt gleich eine Anti-Arduino-Bashing Tirade. Also gut
aufpassen.
MfG Spess
spess53 schrieb: > Achtung jetzt kommt gleich eine Anti-Arduino-Bashing Tirade. Also gut > aufpassen. Dann lass mal hören
HI
>Dann lass mal hören
Das ist der eigentlich Part des Arduinofanatikers 'Arduno Fanboy'.
MfG Spess
spess53 schrieb: > Das ist der eigentlich Part des Arduinofanatikers 'Arduno Fanboy'. Was ist dann dein Part?
trippy schrieb: > Milky W. schrieb: >> Hast du einen älteren Arduino Mega oder den R3? > > Keine Ahnung. Dürfte keine Rolle spielen, Mega2560 Dürfte, ja. Nur lässt auch deine Pinbelegung mit switch case, alle pins bis auf 11 und 12 auf low. Genauso auch die direkte Pinzuweisung. Dachte ich teste das mal.
Milky W. schrieb: > Ja gut, du wirst sicher Recht haben. Zuweisung haben sich total > gewandelt! Schleifen und Operatoren auch! C/C++ ist seit Jahren > ausgestorben! Alle programmieren jetzt nur Python KIs! Wobei, KIs sind > ja alt! Ausgestorben! > > Du scheinst mir der Typ Auswendiglernen zu sein, der keine Parallelen > erkennt, sobald ein Bauteil effizienter/schneller/präziser wird... oh > wait! Dont feed the troll. > > Ich beantrage den Thread zu bereinigen und zu schließen. Alles wurde > beantwortet und sollte für andere Leser mit selben Problem angenehm > Lesbar bleiben. Ich habe vor 5 Jahren mein E-Tech Studium abgeschlossen. Seit dem hat sich meine verwendete Toolchain, die Werkzeuge oder Technologien von Projekt zu Projekt geändert. Klar es gibt gemeinsamkeiten... immer ARM, immer make (manchmal mit cmake), immer C/C++. Jemanden so anzufahren nur weil man nicht wahr haben will, dass man sich in ein schnell lebendes Gebiet begibt... najaaa. Genau das ist ja das schöne an dem Job... neues Projekt kann bedeuten dass man zuerst selbst lernen, recherchieren und weiterbilden muss. Das hält einem jung und agil ist doch super! Software mit Transistoren zu vergleichen.... najaaa Arduino ist eine guter Einstieg, bin zwar selber kein Fan. Aber mein Cousin hat sich damit viel beigebracht. Auch wenn er manchmal sehr Fachfremde Ausdrücke benutzt =D die Unterhaltungen mit ihm sind trotzdem spannend
Milky W. schrieb: > Dürfte, ja. Nur lässt auch deine Pinbelegung mit switch case, alle pins > bis auf 11 und 12 auf low. Genauso auch die direkte Pinzuweisung. Dachte > ich teste das mal. ehm waad? switch case und Pinbelegung ?!?
Milky W. schrieb: > Nur lässt auch deine Pinbelegung mit switch case, alle pins bis auf 11 > und 12 auf low. Genauso auch die direkte Pinzuweisung. Dachte ich teste > das mal. Dann zeig doch mal deinen vollständigen Code, dann lass ich denn bei mir mal laufen
@Milky W. Hoffe dir ist die Lust nicht vergangen. Ist wirklich ein spannendes Umfeld. Aber man sollte sich bewusst sein, das es nicht in paar Monaten erlernt ist. Mit Arduino kommst du schnell voran und erfährst relativ schnell Erfolge. Aber sei dir auch bewusst, dass wenn du die Plattform wechseln möchtest, dass dann auch wieder neues Wissen erlernt werden muss. Das ist kein Nachteil sondern bietet Abwechslung und vor allem neue Möglichkeiten!
was schrieb: > Milky W. schrieb: >> Nur lässt auch deine Pinbelegung mit switch case, alle pins bis auf 11 >> und 12 auf low. Genauso auch die direkte Pinzuweisung. Dachte ich teste >> das mal. > > Dann zeig doch mal deinen vollständigen Code, dann lass ich denn bei mir > mal laufen
1 | /*Pin Korrektur: Extern(Abgriff) -> Intern
|
2 | * 2 -> 5
|
3 | * 3 -> 2
|
4 | * 7 -> 6
|
5 | * 8 -> 7
|
6 | * 11 -> 11
|
7 | * 12 -> 12
|
8 | */
|
9 | #include <PWM.h> |
10 | |
11 | int led = 12; // Arduino Output Pins. |
12 | int led1 = 11; |
13 | int32_t freq = 750; //Ferquenz (in Hz) |
14 | //int32_t freq1 = 200; //Ferquenz (in Hz)
|
15 | unsigned int dutyCycle = 6554; //Gerundet 0,1*2^16; 10% Duty Cycle von 16bit |
16 | unsigned int dutyCycle1 = 32768; |
17 | |
18 | |
19 | void setup() |
20 | {
|
21 | //Initialisiert alle Timer bis auf 0 um die Timefunktionen (mili() usw.) nicht zu ändern
|
22 | InitTimersSafe(); |
23 | |
24 | //sets the frequency for the specified pin
|
25 | bool success = SetPinFrequencySafe(led, freq); |
26 | bool success1 = SetPinFrequencySafe(led1, freq); |
27 | |
28 | //Ist die Frequenz erfolgreich gesetzt setze Pin 13 High
|
29 | if(success && success1) { |
30 | pinMode(13, OUTPUT); |
31 | digitalWrite(13, HIGH); |
32 | }
|
33 | }
|
34 | |
35 | void loop() |
36 | {
|
37 | //pwmWrite funktioniert wie analogWrite aber nur für Initialisierte Pins
|
38 | pwmWriteHR(led, dutyCycle); |
39 | pwmWriteHR(led1, dutyCycle1); |
40 | }
|
hast du noch eine Quelle zu PWM.h? Dann könnte man schauen was pwmWriteHR den genau macht. Bin ein bisschen skeptisch, aber glaube diese Funktion sollte nicht in den loop... Was ist eigentlich das Fehlerbild das sich bei dir zeigt? Und was ist dein Ziel? Ich gehe mal davon aus das du die Helligkeit einstellen möchtest...
Milky W. schrieb: > Nur lässt auch deine Pinbelegung mit switch case, alle pins > bis auf 11 und 12 auf low. Genauso auch die direkte Pinzuweisung. Dachte > ich teste das mal. In deinem Code fehlt das pinMode(..., OUTPUT); In meinem Beispielcode auch, mein Fehler. Bei den Pins 11 und 12 ist das anscheinend nicht notwendig, ich habe einen Verdacht warum, aber ich hab' aufgehört zu graben, als es funktioniert hat. Also hier nochmal minimales Beispiel für 10% PWM auf Pin 2:
1 | /*Pin Korrektur: Extern(Abgriff) -> Intern |
2 | 2 -> 5 |
3 | 3 -> 2 |
4 | 7 -> 6 |
5 | 8 -> 7 |
6 | 11 -> 11 |
7 | 12 -> 12 |
8 | */ |
9 | #include <PWM.h> |
10 | |
11 | int physical_pin = 2; |
12 | int pwm_lib_pin = 5; // Siehe Korrektur Tabelle oben |
13 | int32_t freq = 750; //Frequenz (in Hz) |
14 | unsigned int dutyCycle = 6554; //Gerundet 0,1*2^16; 10% Duty Cycle von 16bit |
15 | |
16 | |
17 | void setup() |
18 | { |
19 | //Initialisiert alle Timer bis auf 0 um die Timefunktionen (mili() usw.) nicht zu ändern |
20 | InitTimersSafe(); |
21 | |
22 | //sets the frequency for the specified pin |
23 | pinMode(physical_pin, OUTPUT); |
24 | bool success = SetPinFrequency(pwm_lib_pin, freq); |
25 | } |
26 | |
27 | void loop() |
28 | { |
29 | pwmWriteHR(pwm_lib_pin, dutyCycle); |
30 | } |
warumNurImmer schrieb: > Bin ein bisschen skeptisch, aber glaube diese Funktion sollte nicht in > den loop... Sinnvoll oder notwendig ist es in diesem Minimalbeispiel nicht, schaden tut's aber auch nicht. Einmal setzen reicht natürlich auch.
was schrieb: > Sinnvoll oder notwendig ist es in diesem Minimalbeispiel nicht, schaden > tut's aber auch nicht. Einmal setzen reicht natürlich auch. Ok, cool! Funktioniert also so =) Hatte nur so den verdacht, das diese Funktion auch ein Reset auslösen könnte... =)
was schrieb: > In deinem Code fehlt das pinMode(..., OUTPUT); > In meinem Beispielcode auch, mein Fehler. Erstmal danke dafür! Aber das ist ja schon ziemlich Banane. Es ist nicht nur nirgendwo ersichtlich, dass die Reihenfolge kaputt ist, noch ,dass man generell zwischen Intern und Extern unterscheiden muss. Daraus lernt man sehr gut, quasi ein Paradebeispiel, dass es besser ist from scratch zu lernen statt mit Biblioptheken dieser Art zu starten, denn dann bekommt man solche Ratespielchenprobleme nicht.
Milky W. schrieb: > dass es besser ist > from scratch zu lernen statt mit Biblioptheken dieser Art zu starten, > denn dann bekommt man solche Ratespielchenprobleme nicht. Sauberer ist es auf jeden Fall, ja. Ich war halt unter Zeitdruck und die richtige Pinzuordnung per Bruteforce rauszufinden ging schneller, als die ganze Timer-und-PWM-Modi-Geschichte wirklich zu verstehen :P Früher oder später kommt man aber nicht drumrum, also wenn man irgendwie Zeit findet, lieber gleich richtig.
Unterschätze die Bibliotheken nicht... Die werden bei grösseren Projekten sehr oft eingesetzt, in gewissen Betrieben sogar eigene geschrieben. Mit einer anständigen Versionsverwaltung und einem SCM sollte dass dann auch nicht zu kompatibilitäts Problemen führen. Aber ja, etwas wie ein PWM Treiber kann man selber schreiben. Und ist auch sehr hilfreich zum lernen und verstehen. In unserem Studium haben wir zum Beispiel im ersten Semester uC eine Hardwareabstraktion selber geschrieben (natürlich nicht komplett, dazu reichte die Zeit nicht). Aber dabei habe ich viel gelernt... GPIO, Timer, PWM, ADC, DMA, SPI, I2C ect...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.