Show Posts
Pages: 1 2 [3] 4 5 ... 78
31  International / Deutsch / Re: Frequenz messen on: June 22, 2014, 08:34:33 am
Du tappst völlig im Dunklen, solange du nicht weißt, was dein Tiefpass wirklich tut.

Mach' doch endlich mal eine Messung wie sich dein Filter verhält!
Nimm doch mal die Sprungantwort auf!

Du hast es auch immer noch nicht für nötig befunden, die Schaltung die du nun tatsächlich verwendest zu posten. Ich habe den Verdacht, dass sie sich von der von mir skizzierten Schaltung zumindest in den Werten  unterscheidet.

Aber am wichtigsten: Nimm die Sprungantwort auf!
Plan- und Ziellos in der Software rumzuändern hilft nicht, solange du die Signale, die du verarbeiten willst nicht kennst.
32  International / Deutsch / Re: 3kW Heizung, Leistung regulieren und messen on: June 21, 2014, 12:15:56 pm
Beim Netzmesser habe ich einen anderen Gleichrichter verwendet, der wohl einen größeren Wiederstand hat.
Nun Habe ich 227V im Netz 2,9V am arduino, zuvor hatte ich ca 3,6V.
Wird das dadurch nicht ungenauer da mehr Volt pro digit sind? sollte ich vllt einen der Widerstände kleiner machen? Und wenn ja welchen?
R1 kleiner oder R2 größer.

Quote
Was mir aufgefallen ist das die Lampe immer mal kurz aus und an geht. Woran könnte das liegen und wie könnte ich es beheben?
Dazu mußt du erstmal herausfinden, was die Ursache ist.
Also die relevanten Größen seriell ausgeben (Achtung: nur wenige Werte ausgeben, durch die Serielle Ausgabe nicht die Echtzeit verletzen!), und sehen, wie sie sich beim Aussetzen der Lampe verhalten.
ich würde zuerst mal damit anfangen, U_Netz auszugeben und den Wert, den du OCR1A zuweisst.

Was noch sein kann: du rufst deine Funktionen in der Loop() ohne synchronisation zur Netzfrequenz auf. Vielleicht gibt es hier ja manchmal Konflikte? Ausserdem vermischt du int und float.

Du könntest mal sowas probieren:
Code:
void Sollwert(byte Prozent){ //Leistung in Prozent
 float U_Netz = U_NetzLesen();
 
// das MUSS float sein!
  float Faktor_U =  U_ref / U_Netz;   // das ist der Korrekturfaktor, den du aus der abweichenden Spannung hast.
  float Faktor_G = Faktor_U * Prozent;  // das ist dein Gesamtfaktor, um den du mittels Phasenanschnitt deine Spannung

const int Tabpunkte = 50;
const float WerteTab[Tabpunkte][2]={     // 1.Spalte V in Prozent 1= 220V , 2.Spalte Zeit in Microsekunden
{... gekürzt};

int i = 0;   
  while (i < Tabpunkte && Faktor_G > WerteTab[i][0]){i++;}  // passenden Eintrag in der Tabelle suchen
  // richtigen Wert interpolileren
  int OCR1A_Wert = int((((WerteTab[i][1] - WerteTab[i-1][1]) * ( Faktor_G - WerteTab[i-1][0] ))/ (WerteTab[i][0] - WerteTab[i-1][0] )) + WerteTab[i-1][1]);
  noInterrupts(); //Interrupts abschalten, damit bei der Zuweisung zum Register nicht unterbrochen werden kann.
  OCR1A = OCR1A_Wert
  interrupts();
}
33  International / Deutsch / Re: Anfänger-Schaltungsfrage zu LEDs on: June 21, 2014, 03:40:12 am
Das funktioniert, aber nur, wenn du nur jeweils EINE LED anschaltest.
Wenn du mehrere zugleich anschalten willst kommt es zu den von Jurs beschrieben Effekten.
34  International / Deutsch / Re: Frequenz messen on: June 21, 2014, 03:36:08 am
Kann es sein, dass mein Tiefpass an den falschen Werten schuld ist?  Als ich ihn ganz am Anfang mit nur einem Sensor betrieben hatte, hat es ja eine ganze Weile gedauert, bis sich der Wert auf den tatsächlichen Zustand des Sensors eingependelt hatte


Genau das meinte ich vor einer Woche:
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?


Wie müsste ich da dann den Code anpassen, um das ausprobieren zu können?
Am einfachsten:
Nur einen Code, der dir den AD-Wert auf dem Sermon ausgibt:
Code:
void loop(){
  Serial.print(millis());
  Serial.print("\t");
  Serial.println(analogRead(A0);
}
Dann gibst du einen Sprung auf den Eingang den Tiefpasses ( => Sprungantwort!) d.h. legst zuerst den Eingang des Filtes auf Masse, dann schaltest du um (umstecken) auf das Signal des Sensors.
Nun kannst du sehen, wie lange es dauert, bis sich der Filter eingependelt hat.

wenn du die Schaltung so hast, wie ich sie dir damals skizziert hatte, dann sollte das innerhalb von 100ms erfolgt sein.
35  International / Deutsch / Re: Problem mit Schaltung aus "Die elektronische Welt mit Arduino entdecken" on: June 20, 2014, 11:23:33 am
Meist liegt es am einem Fehler im Aufbau.
Ein Kabel falsch gesteckt, ein Wackelkontakt....
Prüfe das nochmal Pin für Pin
36  International / Deutsch / Re: Frequenz messen on: June 19, 2014, 01:28:57 pm
Das sollte so funktionieren:

in der Funktion readsensor() das hochzählen der Kanalnummer _SNr wieder aktivieren und hier (nicht am Anfang) den Befehl selectchannel() reinschreiben.
Code:
  if(++_SNr >= AnzahlSensoren) _SNr = 0;  // nächsten Sensor anwählen,
  selectChannel(_SNr);                        // und die Muxleitung neu setzen
37  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!
38  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;
}
39  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.
40  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?
41  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....
42  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.
43  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.
44  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

45  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.

Pages: 1 2 [3] 4 5 ... 78