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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.