PWM zeitverzögert ausgeben

Hallo,

ich hatte eine Topic bezüglich keypad shield due und zeitverzögerung eröffnet, jetzt habe ich mich entschieden doch ein UNO zu nehmen. Mit dem Uno ist es simpler die Frequenz zu ändern usw.

ich hab ein Sketch geschrieben , könnten ihr drüber bitte drüber schauen, ob das alles stimmt?

Es soll folgendes realiesiert werden.

Zwei PWMs (PWMUhv & PWMUdesat) die synchron ablaufen nach betätigen der taster1.
mit taster 2 wird die Zeit dekrementiert und taster 3 dekrementiert das habe ich mit einer for schleife verwirklicht. wenn die taste 4 betätigt wird soll die eingestellt zeit übernomen werden und eine if abfrage gestartet werden . Bei der if abfrage habe ich ein problem und zwar ist das Problem, das die PWMUhv einfach weiter laufen soll und PWMUdesat erst ein positive Flanke bekommt nachdem PWMUhv eine positive Flanke bekommt und die zeit, die eingestellt wurde, abgelaufen ist. aber PWMUdesat soll gleich mit PWMUhv die negative Flanke bekommen.

ich wollte noch ein PWMUdesat mit PWMFehler inventieren, damit der pegel nie auf 0V runterschalte, das würde ich dann aus den zwei Pins auf zwei spannungswandler schalten und die dann auf ein kabel verbinden.

#include <PWM.h>
#include <LiquidCrystal.h>
#include <Arduino.h>


// Tasten belegung
const int Taster1 = 2;      // PWMUhv und PWMUdesat schalten
const int Taster2 = 4;      // Zeit inkrementieren
const int Taster3 = 7;      // Zeit dekrementieren
const int Taster4 = 8;      // PWMFehler High oder Low Schalten
const int Taster5 = 12;     // inventierte PWMUhv und PWMUdesat
const int Taster6 = 13;     // Fehler auslösen (Trigger)


// PWM ausgabe
const int PWMUhv = 3;       // Spannung für Treiber
const int PWMUdesat = 11;   // Spannung für Desat
const int PWMFehler = 9;    // Spannung Fehler


// Variablen der Tasten
int state1 = LOW;
int state2 = LOW;
int state3 = LOW;
int state4 = LOW;
int state5 = LOW;
int state6 = LOW;

//Variable
int Zeit = 0;

void setup()
{
  pinMode(Taster1, INPUT);         // Taster1 als Eingang deklariert
  pinMode(Taster2, INPUT);         // Taster2 als Eingang deklariert
  pinMode(Taster3, INPUT);         // Taster3 als Eingang deklariert
  pinMode(Taster4, INPUT);         // Taster4 als Eingang deklariert
  pinMode(Taster5, INPUT);         // Taster5 als Eingang deklariert
  pinMode(Taster6, INPUT);         //Taster 6 als Eingang deklariert
  pinMode(PWMUhv, OUTPUT);         // PWMUhv als Ausgang deklariert
  pinMode(PWMUdesat, OUTPUT);      // PWMUdesat als Ausgang deklariert


 //Timer 2
  TCCR2B= _BV(CS21);              //prescaler8=3,9KHz; CS22=0; CS21=1; CS20=0; Timer2
  TCCR2A= _BV(WGM21) | _BV(WGM20) | _BV(COM2A1) | _BV(COM2B1); // WGM22=0; WGM21=1; WGM20=1; COM2A1=Pin11 nicht inventiert; COM2B1= Pin3 nicht inventiert 
  // TCCR2A= _BV(WGM21) | _BV(WGM20) | _BV(COM2A1) | _BV(COM2B1)| _BV(COM2B0); Pin3  inventiert( Udesat High Uvh Low ; Udesat Low Uvh High)  
  
  OCR2A= 128;   //Duty 50% für Pin 11
  OCR2B= 128;   //Duty 50% für Pin 3

  
  pinMode(PWMFehler, OUTPUT);      // PWMFehler als Ausgang deklariert
 
 
 //Timer1
  TCCR1B= _BV(CS11);             //Prescaler8= 3,9kHz CS12=0; CS11=1 CS10=0; 
  TCCR1A= _BV(WGM12) | _BV(WGM10) | _BV(COM1A1); // WGM13=0; WGM12=1; WGM11=0; WGM10=1; COM1A1=Pin 9
  OCR1A= 128;   //Duty 50% für pin 9
}



void loop() {
if (digitalRead(Taster1) ==HIGH)   // Wenn die Taste1 gedrückt ist 
{
  state1 = !state1;                // Ausgabe Signal umkehren -> Low zu High und umgekehrt
  digitalWrite(PWMUhv, state1);
  digitalWrite(PWMUdesat,state1);   // Signal an den Pins ausgeben 
  delay(200);                       //Taste entprellen   
}
for (Zeit= 0; Zeit<= 100; Zeit++;)
{
  if (Taster2== HIGH)
  {
  Zeit++;
}
  else if (Taster3== HIGH)
  {
    Zeit--;
  }
  else if (Taster6 == HIGH)
  {
    Zeit;
    break;
  } 
  break;
  end
  }
  
if (digitalRead(Taster6) ==HIGH && (Taster4 == HIGH) && PWMUhv == HIGH )   // Wenn die Taste6, Taste4  gedrückt ist und PWMUhv high 
{
  state6= !state6;
  state4= !state4;                  // Ausgabe Signal umkehren -> Low zu High und umgekehrt
  digitalWrite(PWMUdesat,HIGH);   // Zeitversetz 
  digitalWrite(PWMFehler, state4);
  delay(200);                       //Taste entprellen 
}

else if(digitalRead(Taster6) == HIGH && Taster4== LOW && PWMUhv== HIGH)
{
  state6 = !state6;
  digitalWrite(PWMUdesat,HIGH);  //Zeitversetzt
  delay(200)
}

}

Mau85: ich hab ein Sketch geschrieben , könnten ihr drüber bitte drüber schauen, ob das alles stimmt?

Ich habe Deinen Sketch „quergelesen“, aber nicht geguckt, ob alles in Ordnung ist.

Gibt es denn ein konkretes Problem mit Deinem Code? Bekommst Du Fehlermeldungen, wenn Du ihn kompilieren willst?

Der Arduino-Editor hat (habe ich selbst erst kürzlich entdeckt) eine Funktion, die Code „schön“ formatiert (mit Einrückungen, Leerzeichen vor und nach '=' usw.). Ich finde, dass diese Funktion ganz ordentlich arbeitet. Erfreulich ist, dass Du Kommentare machst. Wenn Du Deinen Code nochmal in leicht aufgehübschter Form postest und sagst, ob es ein konkretes Problem damit gibt, gucke ich gerne richtig drüber.

Gruß

Gregor

das verstehe ich nicht mit taster 2 wird die Zeit dekrementiert und taster 3 dekrementiert

hast du deine Taster mit Pulldown Widerständen angeschlossen? Sonst könntest du mit den internen Pullup's arbeiten. Zum Entprellen reichen vermutlich 20ms. Warum hast du deine state's als int deklariert, das sind doch boolsche Variablen?

Woher kommt die PWM.h und was macht die? Warum hast du die Arduino.h includiert?

Du hast zwar mit der Änderung des Prescalers die PWM Frequenz auf 3,9 kHz gebracht, du nutzt aber kein analogWrite() und hast jede Menge delay's in deinem Sketch.

Hallo,

ich veruche seit geraumer zeit PWM zeitverzögert auszugeben leider klappt es nicht, wie funktioniert so was habt ihr tipps? ich habe den timer geändert usw , weil ich eine andere frequenz benötige, aber ich komme nicht klar ie ich das mit zeitversetzt hinbekommen soll

danke

Also ich versteh's leider nicht was Du genau möchtest.

Beschreib das doch bitte mal in anderen Worten, vielleicht fällt dann der Groschen.

ich will eine Pwm1. pwm2 soll eine positive flanke bekommen, aber das soll erst geschehen wenn pwm1 high ist und eine gewisse zeit abgelaufen ist.

Dein Sketch ist ziemlich verwirrend, und mit den vielen Delays wird das kaum funktionieren :-(

Wenn Du das zweite Signal verzögern möchtest, dann stelle fest wann das erste Signal high wird (Start=millis()), warte bis millis()-Start>=Zeit, dann den zweiten Pin auf high setzen. Entsprechend für low.

ok danke, das würde dann eine zeitversetze pwm2 zu pwm1 ausgeben auch in µs? würde die dann auch gleichzeitig mit pwm1 auf low gehen?
die (start=millis()) und den rest dann auch in loop eingeben? in meinen fall wären es dann micros,oder?

ich verstehe nicht wie du das meinst, kannst du mir bitte ein beispiel zeigen?

Mau85: Hallo, [..]

Hallo Mau85,

manchmal ist es besser wenn man (in diesem Fall du) mal beschreibt, was man überhaupt will. Ich meine im Sinne von "Ich will einen Bagger mit zwei Schaufeln bauen .."

Im Moment kann man dir wahrscheinlich deshalb nicht helfen, weil niemand weiß was dein Ziel ist.

Grüße Harry

ich will ein igbt ansteuern , und brauche pwm ausgänge mit 4khz das habe ich soweit hinbekommen, mein problem liegt jetzt darin das ich eine von der pwm zeitversetzt haben will zu der ersten. die pwm2 soll aber erst bei hoher flanke und nach abgelaufener zeit, eine hohe flanke bekommen und die sollen dann beide auf low gehen.

Und mach mal einen Plan vom Signalverlauf mit Zeitachse und den Tastendrücken als Ereignisse.

Ich glaube verstanden zu haben, mehr oder weniger zumindest, was du willst. Ich glaube aber nicht, dass es so einfach zu lösen ist.

so soll es aussehen wie auf dem bild. das soll durch eine tasten de- oder incrementiert werden bis zu max 1oµs

Bild ist angehängt

auf dem bild ist zb 5 µs

Bild ist jetzt eigefügt

Der eine Puls soll 10µs HI und 240µs LO sein (4kHz = 250µs) ? Der andere 5µs HI und 245µs LO. Und beide so synchronisiert, dass sie gleichzeitig HI->LO gehen aber dmit 5µs Versatz LO->HI ?

Und das ist fest, oder was soll variabel einstellbar sein ?

Ich schätze mal, das ganze geht besser mit Timer Interrupt programmiert als per Hardware PWM.

Womit hast du denn jetzt ein Problem?
Mit der Tastenauswertung?

Oder mit der Nacheilung?
Da kann dir geholfen werden:

nacheilen.png

const byte PWMUhv = 3;       // Spannung für Treiber
const byte PWMUdesat = 11;   // Spannung für Desat
 

void initTimer2PWM()
{
  TCCR2B= _BV(CS21);  //prescaler8=3,9KHz; CS22=0; CS21=1; CS20=0; Timer2
  TCCR2A= _BV(WGM21) | _BV(WGM20) | _BV(COM2A1) | _BV(COM2B1)| _BV(COM2A0)| _BV(COM2B0);  
  OCR2B= 128;   //Duty 50% für Pin 3
}

void setup() 
{
    pinMode(PWMUhv, OUTPUT);         // PWMUhv als Ausgang deklariert
    pinMode(PWMUdesat, OUTPUT);      // PWMUdesat als Ausgang deklariert
    initTimer2PWM();
}


int nacheilung = 0;
void loop() 
{
     OCR2A= 128 + nacheilung; 
     delay(200);
     nacheilung++;
     if(nacheilung>100) nacheilung = 0;
}

Ja das habe ich gesucht, cool danke dir.

probelme habe ich jetzt ach mit der Tastenauswertung, nach betätigen der taste passiert nichts :(

Also bei mir funktioniert es nicht so we bei dir, meine ausgabe ist hinten länger gezogen. Die bekommen gleichzeitig die positive flanke aber die negative flanke versetzt, woran kann es bei mir liegen?