Forum: Mikrocontroller und Digitale Elektronik Arduino Fade PWM ohne delay()


von JJobfso (Gast)


Lesenswert?

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
}

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.