Arduino PWM funktiniert nicht?

2 Antworten

Es ist sehr lange her, dass ich einen Arduino in den Fingern hatte, aber ich vermute man sollte in setup() noch den Pin als Input konfigurieren.

pinMode(pwmPin, INPUT);

Und dann sollte die PWM auch nicht langsamer als 1 Hz sein, denn das ist der Default-Timeout für dein pulseIn() und wenn nach Ablauf von einer Sekunde kein Puls erkannt wird, wird 0 zurückgeliefert (ausser du gibts beim Aufruf von pulseIn() ein längeres timeout an).

Ich glaube, du hast das Prinzip einer PWM (PulsWeitenModulation) nicht verstanden. Es geht dabei darum, wie lange das Signal high-Pegel und wie lange low-Pegel hat. Das liefert die dann einen Wert zwischen 0 und 100%.

aber zuerst einmal finde ich es überraschend, dass dein Roboterarm ein PWM-Signal liefert. Normalerweise erwartet der Arm ein PWM-Signal. aber das hast du sicherlich im Manual des Arms gelesen. An dieser Stelle findest du auch dien PWM-Grundfrequenz des Signals. Du must dich entscheiden, wie genau du das Signal detektieren willst, sprich welchen Fehler du in der Signalwandlung du noch als akzeptabel erachtest. Daraus kannst du aus der Grundfrequenz mit den NyQuist-Theorem die minimale Abtastfrequenz berechnen, mit der du das Signal abtasten musst. Dazu schreibst du dir am besten eine Interrupt-Service-Routine die du zyklisch mit einem Timer aufrufst. Dann berechnest du über die numerische Anzahl der Aufrufe den gleitenden Mittelwert und den sendest du dann über die serielle Schnittstelle an dienen Monitor.

Typischerweise fragt man 100 mal öfter ab, als das PWM Grundfrequenz hat.

Hier hat schon mal einer Versucht ein PWM Signal einzulesen

https://forum.arduino.cc/t/servo-pwm-signal-auslesen/450288/6

Wenn du aber den Arm Steuern willst und deshalb eine PWM-ausgaben machen willst hat schon mal jemand für dich gelöst und public domain gestellt

https://www.exp-tech.de/blog/arduino-tutorial-pulsweitenmodulation-pwm


FloTec09 
Beitragsersteller
 20.08.2023, 10:34

Vielen Dank! Ich habe das ganze jetzt mit analogRead gelöst, daher ich dann im AN- Zustand des Servs eine 1023 am Monitor agezeigt kriege, und beim Schließen des Servs einen Wert so um 930 herum, das Reicht für mein Anwendungsebiet.

easylife2  19.08.2023, 22:33

Also eigentlich finde ich die Verwendung von pulseIn(), das ich bisher auch noch nicht kannte, eine sehr elegante Lösung für diesen Zweck. Zusammen mit pulseInLong() hat man eigentlich schon alles was man braucht, um zunächst die Periode der PWM und dann immer wieder ohne großen Aufwand die Pulslänge (high oder low) auszulesen. Über das Verhältnis von Pulslänge zu Periodendauer bekommt man dann direkt den duty-cycle.

HansWurst45  19.08.2023, 22:36
@easylife2

pulsLn ist fast gut, aber nur fast, denn so wie dich das sehe (ich programmieren nicht in der Arduino-Umgebung) wartet der Prozessor bei diesem Systemaufruf solange bis der Pin low wird und zählt dabei die Zeit mit. Da ist schon viel schönes bei, aber in der Zeit, in der der Prozessor wartet kann es nichts anderes machen. Das ist blöd, wenn man z.B. noch Kommunikation bedienen will oder eine Echtzeitaufgaben lösen will

easylife2  19.08.2023, 22:41
@HansWurst45

Ja, das ist richtig. Man könnte also höchstens einen Cycle auswerten, und dann für ein oder mehrere Cycles etwas anderes machen, um dann wieder einen Cycle der PWM zu messen. Bei sich nur langsam ändernden Werten sicherlich ein gangbarer Weg.

Interrupt wäre natürlich ideal, aber Arduino ist halt auch auf Einfachheit ausgelegt und nicht unbedingt auf maximale Performance.

FloTec09 
Beitragsersteller
 20.08.2023, 08:17
@easylife2

Ja, ich werde das mal mit pulseInLong() probieren..

FloTec09 
Beitragsersteller
 20.08.2023, 08:27
@FloTec09

Mein Programm wartet dann sowieso nur auf eine Änderung im Puls-Zyklus...