Forum: Mikrocontroller und Digitale Elektronik Arduino Fade mehrere PWM gleichzeitig


von Ziro (Gast)


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

von Ziro (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?


von User N. (Gast)


Lesenswert?

Die funktion analogWrite([da wo das PWM signal kommen soll],[0-128]) das 
geht aber nur mit den PWM ausgängen.Beim UNO digital Out:11,10,9,6,5

von aSma>> (Gast)


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

von Simor Skinner (Gast)


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

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.