Forum: Mikrocontroller und Digitale Elektronik ATmega2560 PWM.h library


von Begeisterter (Gast)


Lesenswert?

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!

von Mega256Helper (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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/

von Jonas (Gast)


Lesenswert?

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

von Christian S. (roehrenvorheizer)


Lesenswert?

Ich würde mit einem kleineren Vertreter der AVR-Mikrocontroller erste 
Erfahrungen sammeln, dann ist es übersichtlicher.


MfG

von Milky W. (jabba385)


Lesenswert?

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
von Milky W. (jabba385)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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.

von Milky W. (jabba385)


Lesenswert?

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!

von Milky W. (jabba385)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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%)

von A. Z. (donvido)


Lesenswert?

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
von Pandur S. (jetztnicht)


Lesenswert?

> 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
von Milky W. (jabba385)


Angehängte Dateien:

Lesenswert?

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?!

von A. Z. (donvido)


Lesenswert?

Milky W. schrieb:
> Was im Datenblatt steht sieht etwas anders aus?!

Dann check mal die 16-bit Timer im Datenblatt ;-)

von Veit D. (devil-elec)


Lesenswert?

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.

von was (Gast)


Lesenswert?

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.

von was (Gast)


Lesenswert?

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.

von Veit D. (devil-elec)



Lesenswert?

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
von Milky W. (jabba385)


Lesenswert?

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.

von student (Gast)


Lesenswert?

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.

von Milky W. (jabba385)


Lesenswert?

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.

von Veit D. (devil-elec)


Lesenswert?

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.

von Milky W. (jabba385)


Lesenswert?

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.

von Christian S. (roehrenvorheizer)


Lesenswert?

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
von c-hater (Gast)


Lesenswert?

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.

von Milky W. (jabba385)


Lesenswert?

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!

von c-hater (Gast)


Lesenswert?

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...

von Milky W. (jabba385)


Lesenswert?

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.

von Milky W. (jabba385)


Lesenswert?

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?

von Einer K. (Gast)


Lesenswert?

Ist doch egal..

von trippy (Gast)


Lesenswert?

Milky W. schrieb:
> Hast du einen älteren Arduino Mega oder den R3?

Keine Ahnung. Dürfte keine Rolle spielen, Mega2560

von spess53 (Gast)


Lesenswert?

HI

>Ist doch egal..

Ja, beides der Arduinomüll.

Achtung jetzt kommt gleich eine Anti-Arduino-Bashing Tirade. Also gut 
aufpassen.

MfG Spess

von trippy (Gast)


Lesenswert?

spess53 schrieb:
> Achtung jetzt kommt gleich eine Anti-Arduino-Bashing Tirade. Also gut
> aufpassen.

Dann lass mal hören

von spess53 (Gast)


Lesenswert?

HI

>Dann lass mal hören

Das ist der eigentlich Part des Arduinofanatikers 'Arduno Fanboy'.

MfG Spess

von trippy (Gast)


Lesenswert?

spess53 schrieb:
> Das ist der eigentlich Part des Arduinofanatikers 'Arduno Fanboy'.

Was ist dann dein Part?

von Milky W. (jabba385)


Lesenswert?

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.

von warumNurImmer (Gast)


Lesenswert?

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

von warumNurImmer (Gast)


Lesenswert?

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 ?!?

von was (Gast)


Lesenswert?

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

von warumNurImmer (Gast)


Lesenswert?

@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!

von Milky W. (jabba385)


Lesenswert?

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
}

von warumNurImmer (Gast)


Lesenswert?

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...

von was (Gast)


Lesenswert?

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.

von warumNurImmer (Gast)


Lesenswert?

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... =)

von Milky W. (jabba385)


Lesenswert?

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.

von was (Gast)


Lesenswert?

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.

von warumNurImmer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.