Hallo zusammen. Ich habe folgendes Problem. Ich möchte mit zwei Binären
Eingängen am Arduino einen PWM Ausgang langsam steigen bzw. fallen
lassen. Da in diesem Programm später noch Teile hinzukommen die parallel
laufen sollen, muss ich ohne "delay()" arbeiten. Je größer die Differenz
desto schneller soll er zu dem Ausgangswert fahren, bzw. umgekehrt.
Bit1|Bit0
0|0 = PWM Ausgang 0
0|1 = PWM Ausgang 64
1|0 = PWM Ausgang 128
1|1 = PWM Ausgang 255
Bis jetzt arbeite ich erstmal nur mit Bit 0.
Das Problem was ich jetzt erst noch habe ist, dass der Duty-Cycle immer
Stark springt und nicht bei dem Wert weiter macht wo er gerade steht.
Wenn Bit 0=1 fährt er nach 64, wenn danach Bit0=0 springt er nach Null.
1 | unsigned int pos = 0; // variable to store the servo position
|
2 | int direction = 0;
|
3 |
|
4 |
|
5 | bool Rev_Bit0; //Eingang für Auflösung der Drehgeschwindigkeit
|
6 | bool Rev_Bit1;
|
7 |
|
8 | #define runEvery(t) for (static typeof(t) _lasttime;(typeof(t))((typeof(t))millis() - _lasttime) > (t);_lasttime += (t))
|
9 |
|
10 |
|
11 | void setup()
|
12 | {
|
13 | TCCR1B = TCCR1B & 0b11111000 | 0x01; // Setzt Timer1 (Pin 9 und 10) auf 31300Hz
|
14 | pinMode(8, INPUT); // Initialisiere Eingang 7 und 8 als Eingang
|
15 | pinMode(7, INPUT);
|
16 |
|
17 | }
|
18 |
|
19 |
|
20 | void loop()
|
21 | {
|
22 |
|
23 | Rev_Bit0 = digitalRead(8); //Lese kontinuierlich Eingänge und schreibe in Variable
|
24 | Rev_Bit1 = digitalRead(7);
|
25 |
|
26 | if (Rev_Bit0 == true){
|
27 | runEvery(50) //run every 50 milliseconds
|
28 | {
|
29 | if(pos < 64 )
|
30 | {
|
31 | pos = pos + 1;
|
32 | }
|
33 | }
|
34 | analogWrite(9,pos);
|
35 | }
|
36 |
|
37 | if (Rev_Bit0 == false){
|
38 | runEvery(50) //run every 50 milliseconds
|
39 | {
|
40 | if(pos > 0)
|
41 | {
|
42 | pos = pos - 1;
|
43 | }
|
44 | }
|
45 | analogWrite(9,pos);
|
46 | }
|
47 |
|
48 | }
|