INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
27.12.2014, 21:43
Beitrag #25
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
@MaHa1976 lass mal gut seinSmile
Ich denke Marlox weiß an der Stelle genau was er macht und was er braucht.

Er hat eine Fräsmaschine bei der die Spindeldrehzahl mit einem Frequenzumrichter geregelt wird. Dafür braucht er nur ein 0...10V Signal. Alles andere macht der FU.

Seine Entscheidung ist nur ob er diese Spannung mittels PWM über einen PWM-Analog-Wandler oder über drei Relaiskontakte bereit stellt.

Wenn der FU eine 12V oder 24V Steuerspannung bereit stellt würde ich die Relaisvariante wählen, weil er dadurch den Arduino in Bezug auf den FU potentialfrei halten könnte.

lg
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2014, 21:52
Beitrag #26
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Leider Nein, aber deswegen habe ich die Steuerung (und nacher auch den Arduino) auf dem selben Potential wie das Netzteil, das dem FU die 24V bereit stellt.
Ich hoffe, das ist so richtig? Bei der Steuerung funktioniert es zumindest schon lange so, und ich meine, da ist der selbe IC verbaut wie auf dem PWM-Wandler (die Steuerung gibt ja eigentlich auch nur PWM aus, aber da habe ich den Wandler direkt als Zubehörteil dazu gekauft)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2014, 22:06
Beitrag #27
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
ah... Ok... da hab ich wohl was überlesen.

dann ist das so tatsächlich der einfachste Weg...

aber statt Relais würde ich hier auch Transistoren nehmen... z.b. n-Kanal-MOSFets

nimm einen Widerstand z.B. mit 12kOhm gegen 24V als "Ausgang". Den Ausgang/Widerstand beschaltest du dann über verschiedene Widerstände und MOSfets

(die Widerstände sind nur grob geschätzt- als Beispiel)
MOSFet 1 steuert ohne Widerstand Masse durch - da hast du dann 0V
MOSFet 2 mit 8kOhm macht ca. 10V
MOSFet 3 mit 6kOhm macht ca. 8V
MOSFet 4 mit 4kOhm ca. 6V...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2014, 22:24
Beitrag #28
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Wenn eh schon keine Potentialtrennung mehr vorhanden ist weil alles aus einem Netzteil versorgt wird, ist die Version mit dem "PWM-DA HS Baustein" die bessere Alternative sein.
Bei dem Teil steht aber auch:
"Das PWM-Signal sollte eine Frequenz von mind. 1,95kHz aufweisen, um die Restwelligkeit möglichst gering zu halten."
Der Arduino macht aber nur 490Hz oder 980 Hz. Daran kann man aber drehen.
24V sind aber auch etwas viel für einen Arduino. Deshalb ist es vorteilhaft einen externen 8V oder 9V Festspannungsregler davor zu schalten.

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 11:20
Beitrag #29
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Morgen Smile

Das mit der Frequenz habe ich auch schon gelesen, aber wie gesagt, mein Schaltplan scheint dem beim PWM-DA HS verwendeten exakt zu gleichen und der funktioniert zumindest dahingehend, dass er gleichbleibende Spannungen ausspuckt. Was die Restwelligkeit genau bedeutet, weiß ich leider nicht. Ich sag ja, Elektronik ist nicht mein Fachgebiet...

In der Steuerung sind auch noch 5V und 12V Netzteile zu haben, da hat irgendwie jedes Modul so seine Extrawünsche gehabt Wink Wollte den mit den 12V versorgen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 21:20 (Dieser Beitrag wurde zuletzt bearbeitet: 28.12.2014 22:03 von Marlox.)
Beitrag #30
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Hallo Leute,

ich brauche jetzt doch nochmal eure Hilfe, denn irgendwie habe ich wohl die falschen Suchbegriffe...

Ich habe das Programm mal getestet (funktioniert übrigens wunderbar!), und habe dann die ersten Versuche gestartet, das PWM in Angriff zu nehmen.

Die erste Phase bekomme ich auch hin, aber dann wirds schon wieder problematisch.
Wie stelle ich eine "wenn größer als X und kleiner als Y, dann mache Z" Bedingung?

Ich wollte das eigentlich so machen (Augenmerk auf Mode 4, ziemlich weit unten):
Code:
// Warmlaufprogramm für Frässpindel
// 27.12.2014

int out1 = 11;
int out2 = 12;
int out3 = 13;
int knopfA = 2;
int knopfB = 3;
int knopfC = 4;
int knopfD = 7;
int knopfE = 6;
int Analog5 = 5;

// Zeitkonstanten
#define lzPhase1     5*1000UL   // 120*1000ms = 120 Sekunden
#define lzPhase2     10*1000UL   // 120*1000ms = 120 Sekunden
#define lzPhase3     15*1000UL   //  60*1000ms =  60 Sekunden

// Variablen für Programmablauf
int mode                   = 0;   // 0 = nichts ausgewählt
                                  // 1 = Phase 1 ausgewählt
                                  // 2 = Phase 2 ausgewählt
                                  // 3 = Phase 3 ausgewählt
                                  // 4 = kompletter Warmlauf ausgewählt
                                  // 5 = Abbruch ausgewählt
                    
int modeAkt                = 99;  // 0 = nichts aktiv
                                  // 1 = Phase 1 aktiv
                                  // 2 = Phase 2 aktiv
                                  // 3 = Phase 3 aktiv
                                  // 4 = kompletter Warmlauf aktiv
                                  // 5 = Abbruch aktiv
                                  // 99 = undefiniert, nach Programmstart

unsigned long aktStartzeit     = 0;      //aktuelle Startzeit
unsigned long sekundentakt     = 0;
boolean       sekundenimpuls   = false;
unsigned long Laufzeit         = 0;

// Funktionsprototypen (wird bei der Arduino IDE eigentlich nicht gebraucht)
void tastenAbfragen (void); // Taster einlesen
void mode0          (void); // Leerlauf
void mode1          (void); // Phase 1
void mode2          (void); // Phase 2
void mode3          (void); // Phase 3
void mode4          (void); // kompletter Warmlauf
void mode5          (void); // Abbruch


//-------------------------------------------------------------------------
void setup()
{
  Serial.begin(9600);    
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
  pinMode(out3, OUTPUT);
  pinMode(knopfA, INPUT_PULLUP);
  pinMode(knopfB, INPUT_PULLUP);
  pinMode(knopfC, INPUT_PULLUP);
  pinMode(knopfD, INPUT_PULLUP);
  pinMode(knopfE, INPUT_PULLUP);
  Serial.println(F("Testprogramm Spindel Warmlauf"));
}

//-------------------------------------------------------------------------
void loop()
{
  tastenAbfragen();

  switch(mode)
  {
    case  0:
      mode0();    
    break;    

    case  1:
      mode1();
    break;    

    case  2:
      mode2();    
    break;    

    case  3:
      mode3();    
    break;    

    case  4:
      mode4();    
    break;    

    case  5:
      mode5();    
    break;    


    default:
      mode = 0;
    break;    
  }  

// 1s Taktsignal bilden
if ( millis() - sekundentakt >= 1000 )
  {
    sekundentakt   = millis();
    sekundenimpuls = true;
  }
}

//-------------------------------------------------------------------------
// Taster einlesen
void tastenAbfragen (void)
{
  if ( !digitalRead(knopfA) && (mode != 1) )  mode = 1;
  if ( !digitalRead(knopfB) && (mode != 2) )  mode = 2;
  if ( !digitalRead(knopfC) && (mode != 3) )  mode = 3;
  if ( !digitalRead(knopfD) && (mode != 4) )  mode = 4;
  if ( !digitalRead(knopfE) && (mode != 5) )  mode = 5;
}

// Leerlauf - alles aus
void mode0 (void)
{
  if ( modeAkt != 0)
  {
    modeAkt = 0;
    Serial.println();
    Serial.print(F("Leerlauf - warte auf Tastendruck"));
  }
  digitalWrite(out1, LOW);  // Ausgang 1 AUS
  digitalWrite(out2, LOW);  // Ausgang 2 AUS
  digitalWrite(out3, LOW);  // Ausgang 3 AUS
  analogWrite(Analog5, 0);  // Ausgang Analog 5 auf NULL
}

// Warmlauf Phase 1
void mode1 (void)
{
  if ( modeAkt != 1)
  {
    modeAkt = 1;
    aktStartzeit = millis();
    Serial.println();
    Serial.print(F("Warmlauf Phase 1"));
  }  

  if ( millis() - aktStartzeit < lzPhase1)
  {
    digitalWrite(out1, HIGH);  // Ausgang 1 EIN
    digitalWrite(out2, LOW);   // Ausgang 2 AUS
    digitalWrite(out3, LOW);   // Ausgang 3 AUS
  }  
  else
  {
    Serial.println();
    Serial.println(F("Warmlauf Phase 1 abgeschlossen"));
    mode = 0;  
  }      
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }
}

// Warmlauf Phase 2
void mode2 (void)
{
  if ( modeAkt != 2)
  {
    modeAkt = 2;
    aktStartzeit = millis();
    Serial.println();
    Serial.print(F("Warmlauf Phase 2"));
  }  

  if ( millis() - aktStartzeit < lzPhase2)
  {
    digitalWrite(out1, LOW);   // Ausgang 1 AUS
    digitalWrite(out2, HIGH);  // Ausgang 2 EIN
    digitalWrite(out3, LOW);   // Ausgang 3 AUS
  }  
  else
  {
    Serial.println();
    Serial.println(F("Warmlauf Phase 2 abgeschlossen"));
    mode = 0;  
  }      
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }
}

// Warmlauf Phase 3
void mode3 (void)
{
  if ( modeAkt != 3)
  {
    modeAkt = 3;
    aktStartzeit = millis();
    Serial.println();
    Serial.print(F("Warmlauf Phase 3"));
  }  

  if ( millis() - aktStartzeit < lzPhase3)
  {
    digitalWrite(out1, LOW);   // Ausgang 1 AUS
    digitalWrite(out2, LOW);   // Ausgang 2 AUS
    digitalWrite(out3, HIGH);  // Ausgang 3 EIN
  }  
  else
  {
    Serial.println();
    Serial.println(F("Warmlauf Phase 3 abgeschlossen"));
    mode = 0;  
  }      
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }
}


// Kompletter Warmlauf
void mode4 (void)
{
  if ( modeAkt != 4)
  {
    modeAkt = 4;
    aktStartzeit = millis();
    Serial.println();
    Serial.print(F("Kompletter Warmlauf"));
  }
  if ( millis() - aktStartzeit < 12000)
  {
    analogWrite(Analog5, 128);
  }
  
  if ( millis() - aktStartzeit > 12000 < 24000)
  {
    analogWrite(Analog5, 191);
  }
  
  if ( millis() - aktStartzeit > 24000 < 30000)
  {
    analogWrite(Analog5, 255);
  }
  else
  {
    Serial.println();
    Serial.println(F("Kompletter Warmlauf abgeschlossen"));
    mode = 0;  
  }      
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }  
}

// Not-Aus
void mode5 (void)
{
  if ( modeAkt != 5)
  {
    modeAkt = 5;
    Serial.println();
    Serial.print(F("Not-Aus"));
  }
  digitalWrite(out1, LOW);  // Ausgang 1 AUS
  digitalWrite(out2, LOW);  // Ausgang 2 AUS
  digitalWrite(out3, LOW);  // Ausgang 3 AUS
  mode = 0;
}


Aber das von mir verwendete Format > xxx < xxx kennt er offensichtlich nicht.
Einen direkten Ersatz dafür konnte ich aber im Netz bisher auch nicht finden.

Ich habe dann versucht, mir mehrere Variablen zu schaffen, die ich dann abfrage und entsprechend true oder false setze, um das einzugrenzen, aber da verliere ich jedes Mal den Überblick...

Gibt es da vielleicht eine Lösung für, die ich nur noch nicht kenne? Ich kann kaum glauben, dass es für die Frage "if größer als X, aber kleiner als Y" keinen extra Befehl gibt?

Nachdem ich jetzt einige Stunden damit rumgefrickelt habe und nicht weiter komme, muss ich doch nochmal bei euch fragen, bevor der Frust siegt


Ich habe übrigens absichtlich nur 12000 und nicht 120000 verwendet, sonst muss man beim Testen so lange warten Wink



Autsch... Ich dachte eigentlich, das kommt in einem Code-Fenster, aber da habe ich wohl das falsche Format erwischt... Sorry, ich versuche das mal eben zu beheben...



OK, so ist es besser Big Grin

Hmm, jetzt dachte ich, ich hab was gefunden, aber das klappt auch nicht so recht...

Code:
// Kompletter Warmlauf
void mode4 (void)
{
  if ( modeAkt != 4)
  {
    modeAkt = 4;
    aktStartzeit = millis();
    Serial.println();
    Serial.print(F("Kompletter Warmlauf"));
  }
  if ( millis() - aktStartzeit < 12000)
  {
    analogWrite(Analog5, 128);
  }

  if ( (millis() - aktStartzeit > 12000) && (millis() - aktStartzeit < 24000))
  {
    analogWrite(Analog5, 191);
  }
  
  if ( (millis() - aktStartzeit > 24000) && (millis() - aktStartzeit < 30000))
  {
    analogWrite(Analog5, 255);
  }
  else
  {
    Serial.println();
    Serial.println(F("Kompletter Warmlauf abgeschlossen"));
    mode = 0;  
  }      
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 22:05
Beitrag #31
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Hi Marlox,

man kann mehrere Bedinungen bei einer if-Abfrage miteinander kombinieren.
Verunden, verodern oder wie auch immer. Aber jede Bedingung muss ein boolenan Wert (true/false) als Ergebnis liefern.

if ( millis() - aktStartzeit > 12000 < 24000), geht deshalb so nicht.

Du willst if ( millis() - aktStartzeit > 12000) UND if ( millis() - aktStartzeit < 24000).

Dann sieht das funktionierende Ergebnis wie folgt aus:
Code:
if (   (millis() - aktStartzeit > 12000) && (millis() - aktStartzeit < 24000)  )

&& ergibt eine UND Verknüpfung beider Bedingungen
|| eine ODER Verknüpfung
!& eine UND NICHT Verknüpfung

Man kann so auch mehr als zwei Bedingungen miteinander verknüpfen und bei Bedarf auch mit Klammern ( ) innerhalb der if-Abfrage Teilergebnisse bilden.

Gutes Gelingen
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 22:07 (Dieser Beitrag wurde zuletzt bearbeitet: 28.12.2014 22:07 von MaHa1976.)
Beitrag #32
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
versuche mal ((millis() - aktStartzeit) > 12000)

also erstmal die Berechnung, dann den Vergleich mit dem Sollwert
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Unterschiedliche Programme durch Switch/ Case SpeedShifter 26 606 04.10.2016 15:29
Letzter Beitrag: SpeedShifter
  4 Tasten für 4 Laufzeiten des gleichen Programms Nimes 8 366 18.07.2016 16:32
Letzter Beitrag: Scheams
  Altes Digitales Display mit Text/Bits durch Genuino Micro versorgen - SPI-Bibliothek? RollingStone 0 202 25.06.2016 17:46
Letzter Beitrag: RollingStone
  2 Tasten drücken damit licht angeht tjard 11 547 19.06.2016 12:24
Letzter Beitrag: hotsystems
  Deckel offen erkennung durch Temperaturabfall MarkoM 3 259 08.06.2016 14:18
Letzter Beitrag: hotsystems
  [Suche] Library Programmierer/in für privates Projekt avoid 8 577 19.05.2016 15:01
Letzter Beitrag: avoid
Sad Suche simplen Scetch für ESP8266-Modul torsten_156 14 1.130 19.04.2016 07:54
Letzter Beitrag: amithlon
  nur ein URL aufruf ohne PHP toto1975 3 606 05.04.2016 08:26
Letzter Beitrag: iks77
  Suche LCD.h Zip bojojo 4 861 11.02.2016 17:31
Letzter Beitrag: bojojo
  Aus While-Schleife durch Interrupt aussteigen Zill3 10 1.183 08.02.2016 16:28
Letzter Beitrag: ardu_arne

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste