Gepulste Spannung messen

Erst einmal ein "Hallo" in die Runde:)

ich möchte einige Transistoren selektieren. Dazu habe ich mir folgenden Aufbau überlegt: -Arduino Ausgang an den FET-Treiber -Arduino Analog Eingang mit einem Spannungsteiler an C und E des FET's

Messablauf: -Arduino PIN steuert den Treiber an, der den FET für kurze Zeit einschaltet (z.B. 300 us), sodass sich nicht stark erwärmt -Spannung zwischen C und E wird zu einem definierten Zeitpunkt gemessen (z.B. 250 us nach einschalten des FET) -Das Ganze wird einige Male (16) wiederholt, an den PC ausgegeben und der Mittelwert gebildet

Ich habe mich natürlich schon in Arduino eingelesen, bin mir aber nicht im Klaren, wie ich zeitgleich den Treiber ansteuern kann und die Spannung genau messen kann.

Kann mir dazu vielleicht jemand einen Tipp geben oder auf einen Beispielcode verweisen?

Besten Dank schonmal:)

Beispielcode auf die Schnelle nicht, aber das sollte kein Thema sein, wenn auch die 250µ recht kurz sind.

So als Pseudocode:

for (int i=0; i<16;i++){
  digitalWrite(pin, HIGH) ;
  delayMicroseconds(250) ;
  messarray[i]=Analogread();
  digitalWrite(pin, LOW) ;
  delay(100);
}
Auswertung();

Bin mir zwar nicht sicher aber ich glaube nicht, daß Du analogRead() nehmen kannst. Du wirt die Analoge Messung über die Register steuern müssen.

Grüße Uwe

Wegen der Geschwindigkeit? Das kann man auch so etwas beschleunigen wenn man man mit dem Precaler des ADCs spielt (eventuell auf Kosten der Genauigkeit): http://www.marulaberry.co.za/index.php/tutorials/code/arduino-adc/

Ein Standard analogRead() dauert ca. 120µs. Atmel empfiehlt zwar nicht mehr als 200kHz bei 10 Bit, aber 250kHz (60µs) scheint problemlos zu gehen. Muss man ausprobieren.

Das ideale sind natürlich noch höhere Geschwindigkeiten und die Auflösung auf 8 Bit reduzieren. Letzteres geht aber nicht mit analogRead()

Serenifly: Ein Standard analogRead() dauert ca. 120µs.

Die Frage ist, wann innerhalb der 120µs der Wert wirklich gelesen wird. Aber solange man die Aufgabenstellung nicht genauer kennt, ist es müsig sich den Kopf zu zerbrechen.

Eien A/D Wandlung startet mit dem Laden des Sample and Hold Kondensators. Das Laden muß nach den 250µS erfolgen. danach kann die Spannung sich ändern.

Grüße Uwe

Danke für die Antworten:)

Die Genauigkeit kann man doch einfach mit: AnalogReadResolution( 8 ) runterstellen oder? http://arduino.cc/de/Reference/AnalogReadResolution

Also eine Genauigkeit von 25 mV wäre schon nicht schlecht oder ist das gar nicht machbar?

Also eine konkrete Aufgabenstellung gibt es nicht, da ich sie mir selbst stelle. Ich möchte die FET's (eigentlich IGBT's) selektieren, um eine gleichmäßige Strom/Lastverteilung bei jeweils sieben parallel geschalteten IGBT's zu erreichen.

P.s.: Ich habe einen Due und habe mich schon gefreut, dass er mit einer Auflösung von 12bit messen kann, aber den Vorteil wird er dann wohl nicht ausspielen können. Aufgrund der gewünschten Genauigkeit würde ich dann eher mit der Last und der Versorgungsspannung (auf ca. 16 V) runtergehen und ggf. die Pulszeit erhöhen.

Was meint Ihr?

Ich meine daß Du einen Arduino DUE hast, hättest Du früher sagen sollen. Die meisten Antworten sind darum falsch, weil sie sich auf einen Arduino UNO bezogen. Grüße Uwe

Der Due unterstützt laut Datenblatt 10 Bit und 12 Bit. Keine 8 Bit.

Der hat aber von Haus aus schon eine kürzere Konvertierungszeit. Was ich oben gesagt habe gilt nur für AVR Prozessoren!

Laut Datenblatt Seite 1414f hat der SAM3X eine ADC Taktlänge von 50-1000ns (je nach Prescaler Einstellung) und braucht 20 Takte pro Wandlung.

uwefed:
Ich meine daß Du einen Arduino DUE hast, hättest Du früher sagen sollen. Die meisten Antworten sind darum falsch, weil sie sich auf einen Arduino UNO bezogen.
Grüße Uwe

Ok, Sorry. Wusste ich nicht. Das ist wie gesagt, alles sehr interessantes Neuland für mich;)

Serenifly:
Der Due unterstützt laut Datenblatt 10 Bit und 12 Bit. Keine 8 Bit.

Der hat aber von Haus aus schon eine kürzere Konvertierungszeit. Was ich oben gesagt habe gilt nur für AVR Prozessoren!

Laut Datenblatt Seite 1414f hat der SAM3X eine ADC Taktlänge von 50-1000ns (je nach Prescaler Einstellung) und braucht 20 Takte pro Wandlung.

Ah, das klingt gut. Das wären dann also im worst-case 20 us für die Wandlung?

guntherb:
Beispielcode auf die Schnelle nicht, aber das sollte kein Thema sein, wenn auch die 250µ recht kurz sind.

So als Pseudocode:

for (int i=0; i<16;i++){

digitalWrite(pin, HIGH) ;
  delayMicroseconds(250) ;
  messarray[i]=Analogread();
  digitalWrite(pin, LOW) ;
  delay(100);
}
Auswertung();

Das “messarray*=Analogread();” verstehe ich noch nicht ganz.*
Ok, laut Tutorial wird der Schleifenzähler als Index der Array Elemente verwendet, also hier das “i”.
Die Verwendung der Arrays an sich verstehe ich noch nicht. Werde da nochmal weiterlesen;)

Könnte man das Ganze nicht so machen?

const unsigned int treiberPin = 13;
const unsigned int messPin = A0;
const unsigned int BAUD_RATE = 9600;
int i = 0;
int spannung;

void setup() {
  Serial.begin(BAUD_RATE);
  pinMode(treiberPin, OUTPUT);
  pinMode(messPin, INPUT);
}

void loop() {
for (i=0; i<16;i++){
  digitalWrite(treiberPin, HIGH) ;
  delayMicroseconds(150) ;
  spannung = analogRead(messPin);
  delayMicroseconds(50);
  digitalWrite(treiberPin, LOW);
  Serial.println(spannung);
  delay(100);
}
}

Man müsste dann nur nach der Schleife abbrechen und den relativen Mittelwert (0-1023) mit Excel errechnen. Zum Vergleichen genügt das ja.

Wilson86:
Könnte man das Ganze nicht so machen?

Man müsste dann nur nach der Schleife abbrechen und den relativen Mittelwert (0-1023) mit Excel errechnen. Zum Vergleichen genügt das ja.

Das kann natürlich machen.
Aber dein Due langweilt sich ja schrecklich!

Ich würde auf alle Fälle noch einen Taster anschliessen, um die Messung zu starten.
Achtung: ich kenne den Due nicht, ich wieß nicht, ob der auch interne Pullups hat. Notfalls mußt eine exteren Pullup schalten.
Und die Mittelwertberechnug ist ja wohl ein Klacks für den Arduino.

const unsigned int treiberPin = 13;
const unsigned int messPin = A0;
const unsigned int BAUD_RATE = 9600;
const unsigned int TasterPin = 6;;
int i = 0;
int spannung[16];

void setup() {
  Serial.begin(BAUD_RATE);
  pinMode(treiberPin, OUTPUT);
  pinMode(messPin, INPUT);
  pinMode(TasterPin, INPUT_PULLUP); 
}

void loop() {
  Serial.println("Wenn bereit für Messung, Taste drücken.");
  while(digitalRead(TasterPin) == HIGH){  // Warten, dass Taster gedrückt wird.
    delay(100);
  }
  Serial.print("Messung läuft...");
  
  for (i=0; i<16;i++){
    digitalWrite(treiberPin, HIGH) ;
    delayMicroseconds(150) ;
    spannung[i] = analogRead(messPin);
    delayMicroseconds(50);
    digitalWrite(treiberPin, LOW);
    Serial.println(spannung[i]);
    delay(100);
  }
  // Mittelwert berechnen
  long int Mittelwert = 0;
  for (int i=0; i<16;i++) {
    Mittelwert = Mittelwert + long(spannung[i]);
  }
  Mittelwert = Mittelwert / 16;
  Serial.print("Mittelwert = ");
  Serial.println(Mittelwert);
}// end loop()

Das mit dem Array ist ganz einfach: Du hast nicht eine Variable mit einem Platz, sondern eine grosse Variable mit einzelnen Plätzen drin. Stell dir einen Karton vor, mit 16 Fächern drin. Mit “int Spannung[16]” definierst du einen solchen Karton mit der Aufschrift “Spannung” in dem 16 Fächer für int-Werte sind. und mit “Spannung[5]” greifst du in das 5. Fach.

Hallo Gunther,

Super, das sieht gut aus, danke. Auch für die super Erklärung:)
Habe die Antwort jetzt leider erst gesehen. Hatte mich gestern auch noch etwas mit den Arrays auseinander gesetzt.
Folgendes ist dabei herausgekommen, aber deins ist natürlich edler;)

const unsigned int treiberPin = 13;
const unsigned int messPin = A0;
const unsigned int BAUD_RATE = 9600;
int i = 0;
int spannung = 0;
int messarray[16];
int summe = 0;
int average = 0;

void setup() {
  Serial.begin(BAUD_RATE);
  pinMode(treiberPin, OUTPUT);
  pinMode(messPin, INPUT);
}

void loop(){
  analogReadResolution(10);
  if(Serial.available() > 0) {
      int command = Serial.read();
      if (command == '1') { 
        average = 0;
        summe = 0;
        spannung = 0;
        Serial.println("______________________");
        for (i=0; i<16;i++){
          digitalWrite(treiberPin, LOW) ;
          delayMicroseconds(150) ;
          messarray[i] = analogRead(messPin);
          delayMicroseconds(50);
          digitalWrite(treiberPin, HIGH);
          Serial.print("Messwert ");
          Serial.print(i+1);
          Serial.print(": ");
          Serial.println(messarray[i]);
          summe = summe + messarray[i];
          delay(100);
        }average = summe/16; 
        Serial.println();
        Serial.print("Summe: ");
        Serial.println(summe);
        Serial.println();
        Serial.print("Mittelwert: ");
        Serial.println(average);
        Serial.println();
      }else if (command =='2'){
       digitalWrite(treiberPin, LOW) ;
       delay(1000);
       digitalWrite(treiberPin, HIGH);
     }else{
      digitalWrite(treiberPin, HIGH);
    }
  }
}

Leider ist mir aber wohl der Due gestorben. Der IGBT Treiber ist auch kaputt. Bin mir nicht im Klaren, warum das passiert ist.
Ich hatte an der Schaltung nichts mehr geändert, sondern nur durchs Terminal die Messung bzw. die Testpulse gestartet.
beim dritten Start kam nichts mehr zurück.

Der µC auf dem Due wird nun warm, zwei der Led’s leuchten und es tut sich nichts mehr.
Wenn er an den PC angeschlossen wird, werden die beiden Ports erkannt, ich kann mich auch verbinden, aber die Übertragung des Codes bzw. das Terminal funktioniert nicht mehr.

Vielleicht hat sich der Treiber verabschiedet und den Due mitgerissen?

P.s.: Achja, HIGH/LOW habe ich vertauscht, da der Treiber das Signal negiert.

Wilson86: Leider ist mir aber wohl der Due gestorben. Der IGBT Treiber ist auch kaputt.

Das ist schade. Vor allem da der Due ja nicht ganz billig ist! IGBT, das bedeutet meist hohe Spannung, große Ströme. Hier kann es ganz schnell passieren, dass beim Schalten Störimpulse queer über die Schaltung huschen. Deshalb ist es sinnvoll den Controller gut zu schützen.

Wie sieht (sah) denn deine Schaltung aus?

Ja, wirklich ärgerlich.

Der IGBT war zum Testen nur an 13V mit einer 100 W Halogenlampe (zwischen Plus und Kollektor) angeschlossen.
Das Gate an den Treiberausgang, der Treibereingang an Pin 13 vom Due.
A0 vom Due mit Spannungsteiler an den Kollektor des IGBT.

Alles ohne sonstige Komponenten.

Was ich nun hinzufügen werde:
-Widerstand zwischen Gate und IGBT (ok, das ändert für den Due eigentlich nichts)
-3,3 V Surpressordiode an den Due Eingang (A0)
-Pullup an den Treibereingang

Somit sollte das Ganze schon etwas stabiler sein… hoffentlich.

Hast du noch weitere Vorschläge? z.B. Surpressordiode an Pin 13?

Das sicherste ist, du isolierst das vollständig durch einen Optokoppler. Dann hast du getrennte Stromkreise.

Wilson86: Der IGBT war zum Testen nur an 13V mit einer 100 W Halogenlampe (zwischen Plus und Kollektor) angeschlossen.

Auch wenn du keine induktive Last hast, kann beim Abschalten durch die Leitungsinduktivitäten ein Spannungspuls entstehen, der um ein Vielfaches über der Versorungsspannung liegt. ==> Das könnte deinen Due getötet haben.

Aber bei diesen Strömen ist auch die Masseführung nicht zu verachten. Auch hier entstehen gerne Spannungsversätze. AD-Eingänge zu schützen ist immer sehr schwer, weil Zenerdioden bereits bei Spannungen unterhalb der Zenerspannung nennenswerte Ströme ziehen. Besser ist hier eine Schottky-Diode gegen 3,3V, aber auch hier müssen die Leckströme beachtet werden, die sonst das Messergebnis beeinflussen.

Serenifly: Das sicherste ist, du isolierst das vollständig durch einen Optokoppler. Dann hast du getrennte Stromkreise.

Das ist beim AD leider nicht möglich.

Grr. Er will ja die Spannung messen. Ja. Da stand ich gerade kurz auf dem Schlauch :s

So, hier bin ich wieder. Ich habe weiter darüber nachgedacht, wie ich den Due ADC Eingang vor Überspannung schützen kann. Jemand aus UK gab mir folgenden Hinweis:

If you are using the arduino, how are you protecting it from the 12V when the part is off? I suppose a RC circuit with a diode clamp may be enough.

Aber was meint er damit?

Hat es was hiermit zu tun? http://de.wikipedia.org/wiki/Klemmschaltung_(Nachrichtentechnik)