Arduino Fade mehrere PWM gleichzeitig

Gast #4507493
Lesenswert?
• ▲
▼
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 #4530700
Lesenswert?
• ▲
▼
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 #4531494
Lesenswert?
• ▲
▼
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren