Show Posts
Pages: 1 2 3 [4] 5 6 ... 79
46  International / Deutsch / Re: Frequenz messen on: June 19, 2014, 07:55:01 am
...Bekomme dauernd Fehlermeldungen beim Kompilieren.
Es wäre hilfreich zu wissen welche Fehlermeldung.
Und auch der  zugehörige Code hilft ungemein bei der Fehlersuche!
47  International / Deutsch / Re: Switch statt multiple loops? on: June 15, 2014, 10:15:17 am
Wenn hier das touchscreen berührt wird soll sofort die position gespeichert werden
definiere "sofort"!

Wenn du das in normalen seriellen bzw "kooperativem" Multitasking programmierst, dann liegen deine loop() durchläufe im Bereich weniger ms. Ich komme bei komplexen Programmen selten über 20ms. Selbst 100ms sind für einen Microkontroller eine Ewigkeit. Für den Menschen ist das aber noch "sofort".

Das kann z.B. so aussehen: (als Pseudocode)
Code:
void loop(){
  Tastenlesen();
  AnzeigeAkutaliesieren();
  Relaisansteuern();
}
void Tastenlesen(){
  if Tastegedrückt{
     verarbeiten;
  } else return;
}
void AnzeigeAkutaliesieren(){
  if Wertegeändert{
    neue Werte schreiben;
  else return;
}
void Relaisansteuern(){
  if neue Ausgangswerte;
  else return;
}
48  International / Deutsch / Re: Hilfe Bei der Bauteilsuche on: June 15, 2014, 09:48:44 am
Damit hat man den Quantisierungsfehler mit einer ganz einfachen Methode umgangen und quasi verbannt.
Nein, hast du nicht.
Du wirst immer einen Quantisierungsfehler haben.

du hast auf der einen Seite die Analoge Welt, die unendlich fein auflösen kann (theoretisch), auf der anderen Seite die digitale Welt, die in 0 und 1 rechnet, und damit zwangsläufig Stufen einführt.
egal wie hoch du die Auflösung der ADCs wählst, am Ende hast immer Spannungsschwellen, an denen von einem Wert auf den nächsten umgeschaltet wird. Und was zwischen den Schwellen passiert, weißt du auf der digitalen Seite nicht. Das ist Systembedingt und nicht zu ändern.

In der Praxis macht das aber keinen Unterschied. Bei 10bit-ADs reden wir hier von einem Fehler kleiner 5mV!
Das liegt weit unterhalb jeglicher Toleranzen die durch die beteiligten Bauteile mit einbringen.
49  International / Deutsch / Re: Frequenz messen on: June 14, 2014, 02:24:02 pm
Könnte es sein, dass dein Tiefpass ein so grosses Tau hat, dass sich die Spannung garnicht ändert zwischen zwei Messungen?
Wie lange braucht die Spannung, nach MUX-wechsel, um abzusinken?
Setze doch mal die Zeit von readsensor() von 100ms auf 1000ms.

wie genau sieht deine Schaltung denn jetzt aus?
50  International / Deutsch / Re: Frequenz messen on: June 14, 2014, 02:12:34 pm
delta ist nur eine temporäre Variable. Das passt schon.

Aber ich bin ehrlich gesagt ratlos. smiley-red
Ich kann den Code aber auch nur trocken durchgehen, weil mir die HW fehlt....
51  International / Deutsch / Re: Hilfe Bei der Bauteilsuche on: June 14, 2014, 02:03:38 pm
... kommt man eben wieder zurück auf seine ursprünglichen 5V. Wenn man nicht zurückkommt stimmt was an der Rechnung nicht. Am Ende sagt noch einer 2 ist gleich 2,003 usw. Wo kommen wir denn da hin. Das würde ja die Grundlagen der Mathematik auf den Kopf stellen.
du kannst hier keine stetigen Funktionen ansetzen, wie das ganze digital, eben unstetig ist!

....  Dennoch muß man 1023 für 5V ansetzen..
Nein. Muß man nicht. Wo steht das? In den Datenblättern der AD-Wandler nicht.

Extrem Bsp. 1Bit AD.
0 ... 0V
1 .... 5V

Möchtest Du mir jetzt ernsthaft erzählen das Du bei 1 dann auf der Anzeige 0,5V sehen möchtest?.
Dein Beispiel stimmt nicht:
Mit einem Bit hast du zwei Bereiche: LSB entspricht also 2,5V
0:   0V ... 2,5V
1:   2,5V   5V
Du kannst keine 0,5V anzeigen, weil du die Information nicht hast!
Mit einem 1-Bit AD hast du nur die Information: >2,5V oder < 2,5V

Wegen dem Datenblatt. Ja sehe ich. Das ist aber absolut unlogisch. Der höchste digitalisierte Endwert muß dem Spannungsmaximal AREF entsprechen. Wenn irgendwas 100% ist, kann es nicht plötzlich nur noch 99,9% sein.
Es tut mir leid, wenn die existierenden AD-Wandler nicht zu deiner Theorie passen.
Es gibt inzwischen sogar ADCs, die "runden", aber das verschiebt das Problem nur um den Wert eines halben Bits, das Prinzip bleibt das gleiche. Schau dir einfach mal die Datenblätter von ADC an. Suche nach "Transfer Characteristic" oder "Conversion Characteristic". Vielleicht können dich ja die Hersteller der ADCs überzeugen, wenn ich es nicht vermag.
52  International / Deutsch / Re: Frequenz messen on: June 14, 2014, 11:20:08 am
Ich vermute auch den Mux als ursache.

Probier doch mal einen Testsketch, in dem du von Hand die Mux-Kanäle durchschaltest und dir den AD-Wert anzeigen läßt.
So was, z.B.:
Code:
//Mux control pins
const int s0 = 22;
const int s1 = 23;
const int s2 = 24;
const int s3 = 25;

int Channel;

int muxChannel (byte _ch){
    PORTA &= 0xF0;
    PORTA |= _ch;
  }

void setup() {
  Serial.begin(115200);
 
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);

  digitalWrite(s0, LOW);
  digitalWrite(s1, LOW);
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);
}

void loop() {
  while (Serial.available() > 0) {
    Channel = Serial.parseInt();
    muxChannel(byte(Channel));
  }
 
  delay(100);
  int Wert = analogRead(A0);
  Serial.print("Kanal: ");
  Serial.print(Channel);
  Serial.print("\tPortA: ");
  Serial.print(PORTA);
  Serial.print("\tWert: ");
  Serial.println(Wert);
}
Hier kannst du über die Tastatur des PC den Kanal eingeben und in aller Ruhe messen, was wo passiert.
53  International / Deutsch / Re: Hilfe Bei der Bauteilsuche on: June 14, 2014, 10:56:14 am
Die 3 steht für 5V und nicht für irgendeine Differenz.
Verzeihe mir, aber meiner Meinung nach irrst du.
die "3" (bei einem 2bit AD-Wandler) steht nicht für "5V", sondern für eine Spannung "zwischen 3,75V und 5V". Das nennt man Quantisierungsfehler. Weil ein digitaler Wert eben nicht exakt einen analogen Spannungswert wiederspiegelt.


Rechne mal 4,88mV * 1023. Man erhält 4992,24V und keine 5V.
Ja, die 4,88mV sind gerundet. Genauer sind es eben 5V/1023 = 4,8828125mV
Und 1023 * 4,8828125mV = 4,9951171875V;  Ein AD-Ergebnis von 1023 sagt: eine Spannung zwischen 4,9951171875V und 5V.
(Falls die VREF 5.00000V haben sollte)


Anderes Bsp. Lineal 0 bis 10cm. Wieviel Zentimeterunterteilungen sind dazwischen. Genau 10 und nicht 11. Hier kommt auch niemand auf die Idee mit 11 zurechnen.
Damit widerlegst du deinen eigenen Rechenweg.  smiley-wink
ein 10-bit AD kann 1023 (3FF hex) darstellen, aber nicht 1024 (400 hex) weil 1024 schon 11 Bit benötigen würde.
Um bei deinem dezimalen Beispiel zu bleiben:
Mit einem Digit kann ich maximal "9" darstellen. "10" baucht schon 2 digits.
Ich habe also im Dezimalsystem mit einem Digit 101 = 10 Wertebereiche.
Die sind durchnummeriert von 0-9:

Ein Messwert von 1,25cm würde interpretiert als "1cm" (Nachkommastellen gibt es keine), ein Messwert von 9,4cm als "9cm"
Wir Menschen würde nun einen Wert von 9,8cm als "10cm" interpretieren, weil wir in Gedanken runden. Das kann der µC aber nicht. Für den würde eine 9 eben eine 9 bleiben.

Um das zu untermauern, einen Auszug aus dem Datenblatt des Maxim-ADs MAX7578:

Das ist ein 12-Bit AD und bereits bei 4,99878 V gibt er FFF hex zurück. Es gibt keinen Wert für 5V.


Dir ist aber schon klar, das wir hier auf sehr theoretischem Nivau diskutieren?
In der Praxis wird der Rechenfehler über den wir hier reden, deutlich überspielt durch Rauschen, Ungenauigkeiten und Fehler im AD.

Aber mir macht die Diskussion Spaß!
 smiley-lol smiley-lol smiley-lol smiley-lol smiley-lol smiley-lol smiley-lol

Gunther

54  International / Deutsch / Re: Hilfe Bei der Bauteilsuche on: June 14, 2014, 02:41:38 am
Hallo Gunther,

jetzt fiel der Groschen. Danke für gute Erklärung.   smiley
Rückwärts gedacht, wenn der Spannungsteiler R1/R2 links aus den +/- 15V gespeist würde, dann wäre AREF vom Arduino egal. Oder?
Leider nein.
Generell: wenn du eine Spannung mißt, die ausserhalb des Arduinos erzeugt wird, eine Batterie, eine Solarzelle, ein Sensor mit eigener Versorgung, dann geht die VREF mit ein.
Wenn du ein Verhältnis mißt (klassisch: NTC mit Vorwiderstand), bei dem die Versorung aus der VREF kommt, dann kürzt sich VREF aus der Formel raus und sie geht nicht mit ein.

In diesem konkreten Fall würde die Schaltung nicht funktionieren, wenn du R1/R2 aus den 15V speist. Die "virtuelle Masse" brauchst du ja, um auch negative Sensorausgangsspannungen messen zu können.

Was ich jedoch korrigieren muß in Deiner Rechnung ist, dass man durch 1023 teilen muß und nicht durch 1024.  smiley-wink Sonst ist das Ergebnis immer um die Auflösung von 1Bit daneben. Die Proberechnung rückwärts geht dann nicht mehr auf. Zur Beruhigung, dass www ist voll mit diesem Rechenfehler.  smiley-wink
Dass das WWW voll ist davon, liegt vielleicht daran, dass es kein Rechenfehler ist!

Du verstehst es leichter, wenn du es an einem 2-Bit AD Wandler betrachtest:
Der zerlegt des messbaren Spannungsbereich in 22 = 4 Bereiche: 00, 01, 10, 11.   (Entspricht 0,1,2,3 in Dec)
Bein AREF = 5V sieht das so aus:

der höchste Wert, 3 hex oder 11 bin, steht für eine Spannung zwischen 3,75V und 5V
Bei 10bit entsprechend: Der Bereich wird in 210 = 1024 Bereiche geteilt.
Der höchste AD-Wert (1023 = 400hex = 11 000 000 bin) steht für eine Spannung zwischen 4,995V und 5,0V, weil ein Bit einen Spannungsbereich von 5V / 1024 = 4,88mV darstellt.

55  International / Deutsch / Re: Hilfe Bei der Bauteilsuche on: June 13, 2014, 12:34:05 pm
Die Spannung an AD1 ist von VREF abhänging, die wird "neutral" gemessen.

Die Spannung an AD0 kommt aber von einer unabhängigen Quelle aussen, und die "sitzt" auf der virtuelle Masse (der 2,5V Hilfsspannung, die mit AD1 zurückgemessen wird.

Wenn die externe Spannung 0V ist, dann ist alles ok. Dafür sorgt der Vergleich der beiden Werte.
Wenn aber eine externe Spannung anliegt,  dann wird diese runtergeteilt, und mit ADO gemessen und die Differenz zu AD1 gebildet.
nun erhalte ich ein Ergebnis in Bit.
Den Wert eines Bits erhalte ich durch die REchnung: VREF/1024
Den Wert der externen Spannung berechnet sich zu:
Uext = (AD0 - AD1) * VREF/1024 / R4 * (R3+R4)

Wie du nun schön sehen kannst: Der Wert von Uext ist direkt von VREF abhängig.
56  International / Deutsch / Re: Hilfe Bei der Bauteilsuche on: June 13, 2014, 05:05:40 am
Doch, die Spannung an AREF spielt eine Rolle!
Die kann man nur ignorieren, wenn du eine ratiometrische Messung hast, also eine Reihenschaltung von Vorwiderstand und Sensor, die aus eben der AREF gespeist wird.

Hier hast du aber eine externe Spannungsquelle, die 2% Genauigkeit der Arduino-Versorgung geht also voll ein.
Die Frage ist, ob die 2% stören.
57  International / Deutsch / Re: 3kW Heizung, Leistung regulieren und messen on: June 11, 2014, 02:11:52 am
Quote
Mit der Schaltung brauchst du eigentlich keinen SW-Filter mehr.
Naja, das signal schwank wie gesagt immernoch +- 1-2Digits und pro Digt sind das ja ca 0,3V am.
Da hat Serenifly recht: ein paar Bits Schwankung wirst du immer haben.

Den Filter habe ich mal ausprobiert und er klappt ganz gut.

Aber warum muss ich alle 13 sek was messen? Ohne das hat es auch geklappt.
Wenn du einen definierten Filter haben willst, mit bekannter Grenzfrequenz, dann brauchst du eine definierte Abtastrate. Das müssen nicht 13ms sein. Aber wenn du den Filter einfach in der Loop laufen lässt, dann weißt du nicht, wie oft er aufgerufen wird und kennst daher auch nicht das Verhalten deines Filters.


Desweiteren versuche ich gerade eine konstante zu finden mit der ich die lineare Interpolation vllt ablösen kann.
Diese zahl ist ca. 0,307V pro digit.
Im von 223V +-1V war diese zahl 0,3075. Damit wurde das Signal haargenau umgerechnet wie bei meinem Messgerät. Jedoch entfernte sich die Genauigkeit mit größerem Abstand von 223V.
Die  Konstante ändert sich nur minimal an der 4. stelle nach dem komma.
(Zumindest waren das die bisherigen erkenntnisse im bereich 222V-224V)

Hast du nen Rat wie ich die Formel(bis jetzt nur multiplikation mit konstante) überarbeiten müsste? Oder sollte ich bei der linearen Interpolation bleiben?
Wenn sich etwas in der 4. Stelle nach dem komma ändert, dann wird das in der Praxis keine Auswirkungen haben.
Wir sind wieder mal bei der Frage die wir schon einige Male diskutiert hatten:
Wie genau sieht die Übertragungskennlinie deiner Messschaltung aus?
Du hast ja bisher nur einen sehr kleinen Bereich vermessen  (223.,1V - 224,7V) und der war nicht sehr linear.
du müsstest mal einen größeren Spannungsbereich vermessen.
58  International / Deutsch / Re: 3kW Heizung, Leistung regulieren und messen on: June 08, 2014, 05:34:31 am
Es lag am Elko der war wohl schon etwas älter.
Schön, dass du den Fehler finden konntest!

Quote
Wie filter ich das signal per Software? So wie im Smoothing example?
Mit der Schaltung brauchst du eigentlich keinen SW-Filter mehr.

Falls doch, dann nehme ich lieber den gleitenden Durchschnitt. Das spart, gerade bei größeren Filterkonstanten, viel Speicher.
das Prinzip ist einfach: du definierst dir einen Filterfaktor: const int FF = 99;
du tastest alle x ms das analoge Signal ab: Neuwert = analogread(A0);
dann nimmst du 1/100stel von Neuwert und addiert 99/100stel vom letzten Sensorwert:
Sensorwert = (Neuwert + FF * Sensorwert)/(FF+1):

Die Grenzfrequenz des Filters liegt bei FF * Abtastrate. Wenn du also alle 10ms einen Wert mißt hast du mit FF=99 eine Grenzfrequenz von ca. einer Sekunde.
Ich würde als Abtastrate aber nicht 10ms nehmen, sondern z.B. 13ms. Auf alle Fälle eine Frequnz die kein Vielfaches der Neztfrequenz 50Hz ist.

Und nochwas: Sensowert MUSS von Typ float sein, ebenso wie die Rechnung in float ausgeführt werden muß.
59  International / Deutsch / Re: Eingänge mit 24V schalten on: June 06, 2014, 12:53:23 am
Ich sag' mal: wenn ein Blitz in deine Hausinstallation einschlägt, ist ein kaputter Arduino dein kleinstes Problem!

Wenn Störspannungen induziert werden, durch Blitzschlag in der Nähe (selten) durch nicht entstörte Klingeln oder Türöffner(wahrscheinlicher) oder andere Einflüsse, dann sollte die Schaltung, die ich oben skizziert habe, ausreichen. Optokoppler halte ich für übertrieben, Z-Diode brauchts denke ich auch nicht.  Es sein denn, die 24V sind extrem unsauber. (z.B. Industrieumgebung)
60  International / Deutsch / Re: Eingänge mit 24V schalten on: June 05, 2014, 07:42:57 am
ok, Hausinstallation ist meist nicht sooo sauber.
den Spannungteiler kannst du so niederohmig lassen, dann empfehle ich aber dringend noch eine ZDiode (oder ein Schottky-Dioden Pärchen wie oben beschrieben) gegen die Spitzen und einen Kondensator >1µ als Störschutz und Entprellung.

Besser wäre aber:
Zuerst ein niederohmiger Widerstand nach Masse als Abschluss.
Dann ein Spannungteiler z.B. 100k / 22k + kerko  (> 470nF)
Damit hast du eine hochohmige Ankopplung an den Arduino mit einem Tau von 8ms eine ausreichende Entprellung.
Pages: 1 2 3 [4] 5 6 ... 79