PWM über Arduino ohne PWM Digital Kontakte?
Hallo,
ich habe einen Arduino Mega 2560 und möchte damit über einen MOSFET eine Pumpe regeln. Jedoch ohne die "PWM" Digital Kontakte, da diese anderweitig belegt sind. Ist dies möglich über einen normalen digitalen Pin? Also dass man diesen Eingang einfach pulst?
Mit dem MOSFET möchte ich aus 12V DC eine Ausgangsspannung von min. 3V bis max. 12V pulsen.
2 Antworten
Ja, das ist möglich... Das PWM-Signal muss halt von Software erzeugt werden. Es ist dann nicht so genau - es hat einen Jitter. Hier dürfte das jedoch nicht stören.
Klassisches Vorgehen: Timer einstellen und Interrupt auslösen lassen. In der Interrupt-Routine dann Pin entsprechend ein- und ausschalten. Ich denke aber, dass es da bereits Bibliotheken dafür gibt.
PWM ist keine echte Analogspannung... weil du schreibst 3V-12V. Auch die normale MOSFET-Beschaltung macht keine Analogspannung daraus. Durch das Pulsen wird nur die Energiemenge begrenzt, sodass der Effekt zu einer regelbaren Analogspannung vergleichbar ist.
Nicht wie oft, sondern wie lange innerhalb einer festen Zeitspanne. Das ist PWM. Wenn du häufiger und seltener pulst, ist das PDM (Pulse Density Modulation), ist aber schwieriger zu handhaben.
ah okay. Ja okay ich bleibe bei PWM. Und wie finde ich raus wie lange die Periodendauer ist? Weil Effektivwert = Pulsdauer/Periodendauer. Heißt ich muss wissen wie lange die Periodendauer der Rechteckspannung ist. Wie finde ich das raus? Über ein Oszilloskop? Oder gibt es auch andere wege.
Das legst du selbst fest.
Nimm einen Timer und lasse den eben von 0 bis 255 laufen.
Dann hast du 1 Compare Interrupt und ein Overflow Interrupt. Beim Overflow Interrupt schaltest du den Pin ein und beim Compare Schaltest du ihn aus.
Dein Dutycycle ist dann eben der Maximalwert durch den Wert im Compare Register. Also wenn im Compare Register 127 steht hast du 127/255 = 0.498 also 49.8% Dutycycle.
Deine Periodendauer ist dann fix die Laufzeit des Timers. Also bei 8MHz Timerclock und ohne Prescaler wärens dann 31.25kHz. Es empfiehlt sich allerdings hier einen Prescaler zu verwenden um die CPU Last zu senken.
Ich würde dir raten, eine Bibliothek für Software-PWM zu suchen. Den "händischen" Weg (selbst programmieren) hat Kelec erläutert.
Möglich über Software PWM. Muss man sich halt anschauen ob einem das reicht.
Ja genau. Dann gebe ich über einen digital Pin vom Arduino (wie du beschrieben hast) einfach ein HIGH und LOW aus und je nachdem wie oft auf den MOSFET gepulst wird, kommt dann dementsprechend eine höhere oder niedrigere Effektivspannung für die Pumpe bei raus. Richtig?