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
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.
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:> 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)
> 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.
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?!
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.
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
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?
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
intled=12;// Arduino Output Pins.
12
intled1=11;
13
int32_tfreq=750;//Ferquenz (in Hz)
14
//int32_t freq1 = 200; //Ferquenz (in Hz)
15
unsignedintdutyCycle=6554;//Gerundet 0,1*2^16; 10% Duty Cycle von 16bit
16
unsignedintdutyCycle1=32768;
17
18
19
voidsetup()
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
boolsuccess=SetPinFrequencySafe(led,freq);
26
boolsuccess1=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
voidloop()
36
{
37
//pwmWrite funktioniert wie analogWrite aber nur für Initialisierte Pins
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
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...