Arduino Fade mehrere PWM gleichzeitig

Gast #4507493
Ich möchte drei Motoren mittels PWM ansteuern. Jeder Motor soll über 
jeweils zwei Eingänge am Arduino auf 0-33-66-100% gefahren werden 
können. Das Problem welches ich nun habe ist, dass es ja mit delay() 
nicht funktioniert und andere Lösungen bisher ebenfalls in leere 
endeten. Auch die Lib aus Github LEDFade brachte nicht den gewünschten 
erfolg, ich hoffe ich könnt mir auf die Sprünge helfen.

mfg
Gast
Dazu sei noch gesagt, dass zwischen den Werten 0-33-66-100 der Wert 
linear steigen bzw fallen soll. Die Zeit muss eingestellt werden können, 
ähnlich ie bei delay.
Gast
Servus,

Ziro schrieb:
> Dazu sei noch gesagt, dass zwischen den Werten 0-33-66-100 der Wert
> linear steigen bzw fallen soll. Die Zeit muss eingestellt werden können,
> ähnlich ie bei delay.

Wie willst du vorgehen: interrupts oder pollen?

Hier erstmal pollen:
Du erstellst für jeden Zustand eine Variable (bool):
1
uint8_t motor1_zustand0=0;
2
uint8_t motor1_zustand33=0;
3
uint8_t motor1_zustand66=0;
4
uint8_t motor1_zustand100=0;
5

6
uint8_t motor2_zustand0=0;
7
...
Du musst in der main eine "Echtzeit" programmieren. D.h. z.B. alle 10ms 
soll dein Programm abgespult werden.
1
Pseodocode:
2
if(!(millis()%10)){ //10ms
3

4
  programm:
5
  if (motor1_zustand0){
6
  //hier deine loop, Kopfrechnen musst du selber bei 10ms Abtastzeit
7
  }
8

9
  if (motor1_zustand33){
10
  //hier deine loop, Kopfrechnen musst du selber bei 10ms Abtastzeit
11
  }
12
  ...
13
}
jetzt wird alle 10ms nach den Zuständen geguckt.

Noch besser wäre ein switch case.
1
typedef enum{
2
zustand0=0, zustand33, zustand66, zustand100
3
}MOTOR_ZUSTAND_t
4

5
MOTOR_ZUSTAND_t MOTOR1_t,MOTOR2_t,MOTOR3_t,MOTOR4_t;
Und schon läuft der Rubel! :D
Gast
Innerhalb der Main sollte man das nicht realisieren.
Sowas macht man eigentlich mittels einer InterruptServiceRoutine (ISR).
Entweder du arbeitest am Ardu-Framework vorbei direkt au den Registern 
des Controllers oder du schaust, ob es eine Art "Timer Interrupt 
Library" gibt.
Noch genauer genommen macht man das möglichst nicht mal innerhalb der 
isr, sondern setzt da nur ein Flag, welches in der Main abgehandelt 
wird.
Allerdings wird dann die Zeitkonstante deines Fades jittern. Da die 
Fadeberechnungen keine Monsteraufgabe ist, würde ich erstmal den Ansatz 
verfolgen eine Timer gesteuerte isr zu nehmen und darin die 
Fadeberechnungen zu machen.
Die Welt sieht wieder anders aus, wenn du z.B. Nachrichten über Uart 
empfangen willst.
Dann kannst du den Code aus der isr aber auch in eine normale Funktion 
auslagern und den Flag-Ansatz verfolgen.

Die milli(); von Ardu läuft soweit ich weiß irgendwann über - da muss 
man aufpassen...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.