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
Hochleistungs-Rechteckgenerator für Silberkolloid oder EMP
01.06.2014, 23:42 (Dieser Beitrag wurde zuletzt bearbeitet: 02.06.2014 00:02 von JoeDorm.)
Beitrag #1
Rainbow Hochleistungs-Rechteckgenerator für Silberkolloid oder EMP
Hallo,

nachdem ich das Projekt Lambdasteuerung abgeschlossen habe, möchte ich ein Neues beginnen:

Ich mache dies für einen Freund, der mich um so ein Gerät bat. Vor 2 Jahren hatte ich schonmal so ein Gerät gebaut, allerdings ohne Rechner, was auch nicht grade lapidar war; Es funktioniert bis heute zufriedenstellend.

Aufgabenstellung:

Generierung eines genauen Rechtecksignals, wo die Einschaltdauer einstellbar ist, aber die Ein-, und Auszeit exakt gleich sind.
Dies wird benötigt, um zu vermeiden, das sich die Elektroden ungleichmäßig abnutzen und zur Vermeidung von Partikelablösung, die bei monomolekularem Silberkolloid unerwünscht sind.

Es soll ein Relais gesteuert werden 5V 2xUM, welches sozusagen die Spannung umkehrt, und so quasi +-40V Rechteck bringt.
Ob sowas mit anderen Leistungskomponenten preiswerter oder geschickter gemacht werden kann, weiß ich noch nicht.

Es soll auch eine Laufzeit voreinstellbar sein, z.B. 8 Stunden takten, was über Tasten eingestellt werden kann.

Wie man eine PPM-Messung genau macht, weiß ich nicht, könnte mir aber vorstellen, das dies auch möglich sein könnte, um einen bestimmten PPM-Wert zu erreichen, um dann abschalten zu können.

Auf diese Art ergibt sich die Möglichkeit, eine externe beliebige Gleichspannung oder Gleichstrom entsprechend dem Rechtecksignal zu takten.
Eine vereinfachte Form wäre im Prinzip ein Blinkgeber, der das Relais steuern würde.
Man kann damit aber auch in einer definierten Zeit einen oder mehrere Kondensatoren aufladen, um die gesammelte Energie anschließend in einen EMP-Impuls zu verbraten. Wie auch immer, sowas wäre vielseitig verwendbar.
Grenzen setzen lediglich die Spannungsfestigkeit der Komponenten.

Was bräuchte ich an Rechnerleistung? Mega, Uno, Nano, Pico?
Gleichzeitig sollen die Laufzeit überwacht, und die korrekte Taktung erzeugt werden, und wenn möglich auch PPM-Messungen gemacht werden können. Letzteres aber nur, wenn es nicht zu aufwendig ist; Wäre aber nice to have.

Starten werde ich mit einem Uno, da ich für einen solchen noch einen LCD-Shield mit Tasten habe.

Die Voreinstellung der Laufzeit setze ich erstmal auf 8 Stunden, mit Position in der ersten Zeile des Displays.
Die Taktzeit hat eine Voreinstellung von 4 Sekunden und eine Position in der 2. Zeile auf dem 2-zeiligen Display.
Taster sind ja reichlich vorhanden und da nehme ich je 2 Tasten um die Werte zu verändern.

Wenn jemand Interesse hat mitzuwirken, würde ich mich freuen.
Gruß Joe

Hallo,
bisher habe ich auf die Verwendung von Steckbrettern weitestgehend verzeichten können, und habe daher kaum Erfahrung damit.

Um die Schaltung mit dem Relais vorab zu testen, möchte ich gerne ein Relais in das Steckbrett stecken.
Wie lang müssen die Pins des Relais sein, um auch einwandfreien Kontakt zu haben?

Welches Relais(5V 2xUM) könnte man für eine direkte Ansteuerung mit einem Uno-Ausgang benutzen?

Gruß Joe

Unser Projekt Rolleyes http://global-science-circle.net http://global-science-circle.org http://global-science-circle.info UND http://radio-gsc1.info
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.06.2014, 07:34 (Dieser Beitrag wurde zuletzt bearbeitet: 02.06.2014 07:37 von rkuehle.)
Beitrag #2
RE: Hochleistungs-Rechteckgenerator für Silberkolloid oder EMP
Moin Joe,

ich habe mal ein bischen in die Welt geguckt und ua. folgende grundsätzliche Aussagen gefunden:
Laufzeit:
Es ist nicht sinnvoll, für die Laufzeit die internen Timer zu nutzen, da diese durchaus mal eine Drift von 2 Sekunden / Stunde bringen können. (Hängt wohl stark von den verbauten Quarzen ab). Hier ist wohl eher eine externe Zeitquelle (RTC / NTP) mit Möglichkeit zur Korrektur angesagt.
Letztlich dürfte sich die max. Ungenauigkeit der Laufzeit jedoch durch die Verzögerungen bei den Relais ergeben.
Rechtecksignal:
Für das Rechtecksignal selbst würde ich nicht so etwas wie tone() bzw. die Tone - Lib benutzen. Da für das Rechtecksignal immer nur kurze Zeitabstände relevant sind, kann man hiier widerum durchaus mit micros() / millis() arbeiten.
Entscheidend ist jedoch wie zeitgenau das Ganze laufen soll. (Hier fehlt ein bischen Input).
Generell macht es bzgl. Rechenleistung keinen Unterschied welchen Arduino du benutzt, da beide ja mit 16 MHz takten (Nano läuft mit 12 MHz) und der Befehlssatz der gleiche ist. Letztlich sind wohl eher die verfügbaren Pins entscheidend.

Grüße Ricardo

PS: Übrigens ein interessantes Projekt!

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.06.2014, 13:45 (Dieser Beitrag wurde zuletzt bearbeitet: 04.06.2014 15:10 von JoeDorm.)
Beitrag #3
RE: Hochleistungs-Rechteckgenerator für Silberkolloid oder EMP
Hallo Ricardo,
schön, Dich hier im Thread zu sehen.

Die Genauigkeit kann durchaus um ein paar Millisekunden differieren.
Wenn 1 Sekunde das Relais angezogen wird, dann soll es auch 1 Sekunde abfallen, plus minus 2 Millisekunden.
Habe ja noch den alten leicht defekten Mega, welchen ich nun dafür nehmen werde.
Das LCD-Shield mit den Tasten paßt da gut drauf.

Ich habe mir für die Relaisangelegenheit eine Relaisplatine mit 4 Relais bestellt, die leider nur 1xUM sind, also Einfachwechsler. So brauche ich 2 Relais die gegenläufig angesteuert werden. Zudem benötige ich das 3.Relais, um über Start die Spannung zur Verfügung stellen zu können. Ansonsten wäre ja ggf. immer eine Spannung an Relais 1+2 und ohne Ansteuerung ist eine Polarität ja schon gegeben.
Ist ja alles auf einer Karte, und noch galvanisch getrennt über Optokoppler.
Könnte eine gute Kombination sein. Mal sehn wie die Anschüsse an der Relaiskarte sind.

Was mir noch grade an Bedarf einfällt, wäre, das Gerät auch als Taktung für ein Weidezaungerät nehmen zu können. Da mache ich dann doch das Rechtecksignal beidflankig zeitlich getrennt einstellbar.

Die letzte Einstellung würde ich gerne speichern und beim Start abrufen.
Da könnte ich was an bewährtem Code brauchen.

Jetzt suche ich noch ein Gehäuse wo ich die Teile reinbekomme, plus ein paar Buchsen und einen Ein/Aus-Schalter, also nicht zu klein, aber Kunststoff kanns ja auch sein.

Habe da noch eine Frage: Hat jemand mit Entstörung der Arduinos Erfahrung?
Wenn ich noch ein bissel Input zur PPM-Messung bekäme, würde ich es gleich mit in den Code reinnehmen. Kann ich aber auch später nachziehen.

Gruß Joe

Unser Projekt Rolleyes http://global-science-circle.net http://global-science-circle.org http://global-science-circle.info UND http://radio-gsc1.info
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.06.2014, 18:30 (Dieser Beitrag wurde zuletzt bearbeitet: 05.06.2014 20:24 von JoeDorm.)
Beitrag #4
RE: Hochleistungs-Rechteckgenerator für Silberkolloid oder EMP
Hallo,
ich habe erstmal eine Variante von Programm für den Mega geschrieben.
Es ist schon mal brauchbar.

An den Administrator: Ich würde Dich bitten, den Thread in die Rubrik Projekte zu verschieben, falls möglich. Dank im voraus. Shy

Im Display zu sehen ist oben links M=0, was bedeutet, das LZS verändert werden kann. M steht für Menü 0 bis 2.
M=0 bedeutet das der LZS-Wert(Laufzeitvorgabe in Stunden) verändert werden kann.
Für die Veränderung des M-Wertes ist die Left-Taste zuständig, quasi als Vorwahl für den zu ändernden Bereich..
M=1 regelt die Ein-Zeit(HSek) in Sekunden, M=2 die Aus-Zeit(LSek), natürlich für die Ralais. Die Veränderung Wert+1 oder Wert-1 geschieht über die Up-, und Down-Taste.

Die Right-Taste startet und stopt den quasi Timer, also die Laufzeit in Stunden. Nach einem Stop und einem folgenden Start fängt die Laufzeit wieder von vorn an.

Digitalport r1 und r2 betreffend R1 und R2, schalten die zu schaltende Spannung ein. Ist wichtig, damit man bei höheren Spannungen keine verbraten bekommt. Um Goldkolloid erzeugen zu können, brauchts eine wesentlich höhere Spannung. Wenn man die Elektroden anschließt solls ja nicht ins Grab gehen ;-)

Digitalport r3 und r4 betreffend R3 und R4, schalten im Takt die eingeschaltete Spannung durch. Falls Gleichspannung zugeführt wurde, hat man auf den beiden Ausgängen am Relais eine wechselnde Spannungsumkehrung. Wenn HSek und oder LSek auf 0 stehen, werden die Relais nicht mehr getaktet und es steht eine Dauerspannung an dem Relaisausgang, gleich der zugeführten externen Spannung..

Digitalport r5 und r6 gehen direkt an 2 Ausgangsbuchsen. Dort liegt dann lediglich der Ausgang des Megaports dran. Ist also kaum belastbar. Diese werden gleichzeitig mit r3 und r4 geschaltet, also im gleichen Takt. Hier darf es auch mal schneller zugehen. Wenn der HSek und oder LSek auf 0 stehen, dann wird entsprechend dem letzten delay(xx) ganz unten getaktet. Für die Relais ist das nicht zu gebrauchen, da schnell kaputt.

Die linke Taste, also Select ist noch nicht verwendet, aber dort plane ich ggf. für später ein 2.Programm ein.
Die Reset-Taste macht eben den besagten Reset und setzt ggf. verstellte Werte erstmal auf den Anfangswert zurück.

Das kann sich störend auswirken, da der Lieblingswerte, falls nicht vorgegeben beim Reset oder Einschalten zum Tragen kommen.
Hier ist evtl. eine Speicherung geplant, die automatisch stattfindet, wenn ein Durchlauf ohne Unterbrechung durchlaufen wurde. Dann soll der gespeicherte Wert die Vorgaben beim Start oder Reset überschreiben.

Damit man sieht, das da was arbeitet, wird in der 1.Zeile rechts abwechselnd ein Sekundencounter und die Laufzeit in ganzen Stunden ausgegeben.

Das wars erstmal.
Falls noch jemand Ideen hat, nur her damit...

Gruß Joe

Code:
#include <PString.h>
char buf[20]; //String Buffer für PString Methode
double M=0, S=0, R=0, LZS=24, RS=0, HS=4, LS=4, ms=0, offset=0;
double msH=0,msL=0;
int r1=22; //Relais1, Strom ja/nein
int r2=24; //Relais2, Strom ja/nein
int r3=26; //Relais3, + -
int r4=28; //Relais4, - +
int r5=30; //Plain aus
int r6=32; //Plain aus

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
int read_LCD_buttons() {
  adc_key_in = analogRead(0);      // read the value from the sensor
  if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
  if (adc_key_in < 50)   return btnRIGHT;  
  if (adc_key_in < 195)  return btnUP;
  if (adc_key_in < 380)  return btnDOWN;
  if (adc_key_in < 555)  return btnLEFT;
  if (adc_key_in < 790)  return btnSELECT;  
  return btnNONE;  // when all others fail, return this...
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
String str(double d, int nk, int sichtbarVonRechts=0) {
  PString(buf, sizeof(buf), d, nk);
  String b=(buf);
  if(sichtbarVonRechts>0) {
    b=String("00000")+b;
    b=b.substring(b.length()-sichtbarVonRechts,  b.length());
  }
  return (b);
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
void setup() {
  ms=0; offset=0;
  lcd.begin(16, 2);              // start the library
  lcd.setCursor(0,0);
  lcd.print("M=  LZS=    s   "); // print a simple message
  lcd.setCursor(0,1);
  lcd.print("HSek=   LSek=   "); // print a simple message
  // set the digital pin as output:
  pinMode(r1, OUTPUT);
  pinMode(r2, OUTPUT);
  pinMode(r3, OUTPUT);
  pinMode(r4, OUTPUT);
  pinMode(r5, OUTPUT);
  pinMode(r6, OUTPUT);
  digitalWrite(r1, LOW);
  digitalWrite(r2, LOW);
  digitalWrite(r3, LOW);
  digitalWrite(r4, LOW);
  digitalWrite(r5, LOW);
  digitalWrite(r6, LOW);
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
void loop() {
  ms=millis();
  if(S==1) {
    if(offset==0) offset=ms; //offset ist von runtime abzuziehen
    RS=(ms-offset)/1000;//echte Laufzeit in Sekunden
    lcd.setCursor(13,0);
    if(R==0)lcd.print(str(RS,0,3));
    if(R==1)lcd.print(str(RS/60/60,0,3));
  }
  lcd_key = read_LCD_buttons();  // read the buttons
  switch (lcd_key) {              // depending on which button was pushed, we perform an action
   case btnNONE: {
     break;
   }
   case btnSELECT: { //Menüauswahl
      break;
   }
   case btnLEFT: { //Menüauswahl
     M+=1;
     if(M==3) M=0;
     delay(555);
     break;
   }
   case btnUP: {
     if(M==0) {LZS+=1; if(LZS>=999) LZS=999;}
     if(M==1) {HS+=1;  if(HS>=99)     HS=99;}
     if(M==2) {LS+=1;  if(LS>=99)     LS=99;}
     delay(222);
     break;
   }
   case btnDOWN: {
     if(M==0) {LZS-=1; if(LZS<0) LZS=0;}
     if(M==1) {HS-=1;  if(HS<0)  HS=0;}
     if(M==2) {LS-=1;  if(LS<0)  LS=0;}
     delay(222);
     break;
   }
   case btnRIGHT: { //Start/Stop Prozess Relais
     S+=1, R=0;
     if(S==2) S=0;
     if(S==1) {
       msL=ms+HS*1000;
     } else if (S==0) {
       offset=0;
     }
     delay(555);
     break;
   }
  }
  lcd.setCursor(2,0); lcd.print(str(M,0,1));
  lcd.setCursor(8,0); lcd.print(str(LZS,0,3));
  lcd.setCursor(5,1); lcd.print(str(HS,0,2));
  lcd.setCursor(13,1);lcd.print(str(LS,0,2));
  if(S==1) {
    digitalWrite(r1, HIGH);
    digitalWrite(r2, HIGH);
    if(R==0 && msL<=millis()) {//Relais einschalten
      if(HS>0&LS>0)digitalWrite(r3, HIGH);
      if(HS>0&LS>0)digitalWrite(r4, HIGH);
      digitalWrite(r5, HIGH);
      digitalWrite(r6, HIGH);
      msH=ms+HS*1000;
      R=1;
    } else
    if(R==1 && msH<=millis()) {//Relais ausschalten
      digitalWrite(r3, LOW);
      digitalWrite(r4, LOW);
      digitalWrite(r5, LOW);
      digitalWrite(r6, LOW);
      msL=ms+LS*1000;
      R=0;
    }
  } else
    {digitalWrite(r1, LOW);R=0;}
  if(LZS!=0 && RS/60/60>=LZS) {
    digitalWrite(r1, LOW);
    digitalWrite(r2, LOW);
    digitalWrite(r3, LOW);
    digitalWrite(r4, LOW);
    digitalWrite(r5, LOW);
    digitalWrite(r6, LOW);
    S=0, offset=0, msH=0, msL=0;
  }
  delay(10);
}

Unser Projekt Rolleyes http://global-science-circle.net http://global-science-circle.org http://global-science-circle.info UND http://radio-gsc1.info
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.06.2014, 19:57
Beitrag #5
RE: Hochleistungs-Rechteckgenerator für Silberkolloid oder EMP
Yo,
ich liebe es wenn Code richtig kurz und knackig geschrieben ist Smile
Die delay() ersetzen, r1 bis r6 als const und lcd.print() mit F-Makro, dann gehts kaum noch kleiner.
Sieht aber schon jetzt sehr sehr straight aus!

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Dumheit oder doch ein Fehler im System ? Gandalf 7 545 03.09.2016 10:16
Letzter Beitrag: amithlon
  Modellbahn in Klein oder Groß fraju 2 1.856 20.07.2015 12:40
Letzter Beitrag: fraju
  Autoradio/Car PC realisierbar oder zu komplex Simons 0 2.095 25.05.2014 12:08
Letzter Beitrag: Simons

Gehe zu:


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