gepulste Gleichspannung am Eingang

OP #4937946
Lesenswert?

Hallo zusammen,
ich habe durch einen Optokoppler der mit 230V beschaltet wird (SFH628 
mit zwei antiparallelen Dioden) am Eingang meines AVR eine "gepulste" 
Gleichspannung.
kann ich diese durch Software in eine glatte "1" oder "0" verwandeln.
Mit meinen bisherigen Versuchen hatte ich immer einen mehr oder weniger 
Zufallstreffer.
Angehängte Dateien:
Gast #4938006
Lesenswert?

In Hardware: Hüllkurvendemodulator (Diode und Kondensator sowie 
Entladewiderstand)

In Software: dauerhafte Abtastung mit mindestens 200Hz und dann DSV (FIR 
oder IIR Tiefpass, danach Grenzwert per if).

Software alternativ: Missing Pulse Detector. Beispielsweise indem man 
die Spannung auf nen Pin gibt und danach dann 10ms wartet. Dann muss da 
wieder ne Spannung anliegen.
Gast #4938017
Lesenswert?

Wie oft fragst Du den Pin ab?

Wenn es jede z.B. ms ist, dann geht sowas:
1
static int cnt; /* Zwischenspeicher zum überbrücken einer halben Periode (5ms) + ein wenig Reserve */
2
static int on;  /* boolscher Zustand An oder AUS */
3

4

5
    if(PinX==0) 
6
    {
7
       cnt = 15;
8
    }
9

10
    if(cnt)
11
    {
12
       cnt--;
13
       on = 1;
14
    }
15
    else
16
    {
17
       on = 0;
18
    }

Wenn Du weniger als alle 2ms abfragst, dann brauchst Du einen 
Kondensator am µC-Pin. Mit einem Tau von z.B. 10ms;
Gast #4938045
Lesenswert?

Achim S. schrieb:
> 1) Du musst über eine komplette Halbwelle messen. Also 10ms. Dauert die
> Schleife so lange?

Das Ziel ist nicht, den Netzsinus zu rekonstruieren, das Ziel ist 
festzustellen, ob er vorhanden ist.

Es reicht also völlig, sich nen Pinchange-Interrupt zu machen und von da 
an nen 15ms langen Watchdog-Timer loslaufen zu lassen. Bei jedem 
Pinchange Interrupt wird der auf 0 gesetzt, wenn er überläuft weiss man 
dass die Spannung gefehlt hat.
#4938106
Lesenswert?

Christoph P. schrieb:
> Ziel ist es, dass die Variable "eingange" den tatsächlichen Zustand
> wiederspiegelt.
>
> einfach wäre schön ;-)
1
    eingange = PINE;
2
    _delay_ms(5);
3
    eingange &= PINE;
Selbst wenn eine Abfrage den Nulldurchgang (=H-Pegel am Eingang) 
erwischt, liegt die zweite garantiert außerhalb und durch das UND setzt 
sich der L-Pegel (=Netzspannung vorhanden) durch.
Gast #4938455
Lesenswert?

Christoph P. schrieb:
> kann ich diese durch Software in eine glatte "1" oder "0" verwandeln.

Sicher.
1
eingange = 0;
Was war jetzt dein Problem ?

> Mit meinen bisherigen Versuchen hatte ich immer einen mehr oder weniger
> Zufallstreffer.

Was erwartest du bei Wechselspannung ? Klar ist die mal höher und mal 
niedriger, und manchmal sogar aus. Dein eingange wird das exakt 
wiedergeben.

Christoph P. schrieb:
> for(x=0;x<90;x++)
>   {
>     eingange |= PINE;
>
>   }
>
> Ziel ist es, dass die Variable "eingange" den tatsächlichen Zustand
> wiederspiegelt.

Dann sollte man wohl besser
1
eingange = PINE;
schreiben.

Offenbar willst du gar nicht wissen, dass es Wechselspannung ist.

Dich interessieren die Pausen und Nulldurchgänge nicht.

Du wilkst nur wissen, ob es innerhalb der letzten 50tel Sekunde mal an 
war.

Da du offenbar keine Programmhauptschleife hast, zumindest zeigst du sie 
nicht, vielleicht ja aus Faulheit, ist sicher der Vorschlag von THOR 
angemessen: PinChangeInterrupt und Reset durch Watchdog, also Zeitgeber 
(Timer).

Ob dein Port E überhaupt pin change interrupts kann, wissen wir nicht, 
da du zu faul warst den verwendeten Microcontroller zu nennen. Als AVR 
vermutlich ja.
#4938474
Lesenswert?

Christoph P. schrieb:

> ich habe durch einen Optokoppler der mit 230V beschaltet wird (SFH628
> mit zwei antiparallelen Dioden) am Eingang meines AVR eine "gepulste"
> Gleichspannung.
> kann ich diese durch Software in eine glatte "1" oder "0" verwandeln.

Per Hardware reicht vermutlich schon ein kleiner Elko zwischen
Emitter und Kollektor. Grösse müsste man ausprobieren.
Gast #4938719
Lesenswert?

Der Ausgangspegel des Optokopplers zeigt SO ETWA an, ob gerade
eine positive, oder negative Halbwelle der Wechselspannung
vorliegt.

Im Übergangsbereich werden Werte zwischen den von Digital-
schaltungen benötigten High- und Low-Pegeln ausgegeben, die
auch noch durch höherfrequente Störspannungen auf der
Wechselspannung überlagert sein können.

Prinzipiell wird auch die positive Halbwelle am Eingang kürzer,
als die negative Halbwelle ausgegeben, weil die Eingangs-LED
erst oberhalb von 1,5...2 V zu leuchten beginnt.

Ganz sichere ist: Das ist KEIN Nulldurchgangsdetektor!

Was willst du mit dem Optokopplersignal erreichen?
Nur wenn das bekannt ist, kann es auch zielführende Tipps
geben. Mit Spekulation erreicht man NIX.
OP #4939118
Lesenswert?

Guten morgen.

Erstmal vielen Dank für die vielen Vorschläge.

Meine Lösung sieht nun so aus :
1
     
2
  int x=0,y=0 ;
3
  int eingange;
4
  for(x=0;x<20;x++)
5
  {
6
    y|=~PINE;
7
    delayms(3);
8
  }
9
  eingange =~y;

mit einem logischen NOT hat es nicht geklappt.

Gesucht war tatsächlich nur eine Softwarelösung.

Den Kondensator(330nF) parallel zum Ausgang des OK habe ich nicht 
erwähnt da er keinen Einfluss auf das wackeln am Ausgang hat.

Der Vorwiderstand ist so gewählt das kaum Strom fließt und ist in der 
Realität auf mehrere Widerstände aufgeteilt. Die Verlustleistung beträgt 
ca 1/4W.

Das Arbeiten mit Interrupts ist prinzipiell eine gute Sache in die ich 
mich weiter reinarbeiten muss.

Die von mir vorgestellte Lösung ist quick and dirty und eigenet sich nur 
solange es keine Störungen gibt, die zwischendurch einen unbeschalteten 
Eingang auf Masse zieht.

Nochmal vielen Dank für die zahlreichen Vorschläge und Ideen.
#4939142
Lesenswert?

Christoph P. schrieb:
> Den Kondensator(330nF) parallel zum Ausgang des OK habe ich nicht
> erwähnt da er keinen Einfluss auf das wackeln am Ausgang hat.

Na ist doch prima, dass da schonmal ein Kondensator da ist.

Wenn du jetzt noch den Wert des Pullups (der Widerstand zwische uC-Pin 
und 5V) verraten würdest...

Der ist vermutlich zu niederohmig gewählt.
Bei 330nF würde ich es mal mit 47K versuchen.

Christoph P. schrieb:
> Der Vorwiderstand ist so gewählt das kaum Strom fließt und ist in der
> Realität auf mehrere Widerstände aufgeteilt. Die Verlustleistung beträgt
> ca 1/4W.

Wenn schon wenig Strom durch die LED fließt, ist es um so wichtiger, 
dass der Pullup am Ausgang nicht zu niederohmig ist.
#4939320
Lesenswert?

Christoph P. schrieb:
> Und möchte feststellen, ob L1 anliegt oder nicht

Damit ist die Sache doch sehr eindeutig. Idealisiert bedeutet es:
Strom aus = immer 0
Strom an = überwiegend 1 mit zyklisch wiederkehrenden Nullen alle 10 
Millisekunden (eine Halbwelle)

Zuzüglich gelegentlicher Störungen. Das kann man genauso handhaben wie 
das Entprellen eines Tasters. Will man abfragen oder kontinuierlich 
überwachen?

Einer der einfachsten Varianten bei festgelegter Hardware dürfte es 
sein, den Port per Timer im Millisekundentakt abzufragen. Waren 5 oder 
mehr der letzen 10(eine Halbwelle) Messungen eine 1, so liegt Spannung 
an. Waren es weniger.... Nun ja, die 5 ist nicht festgetackert und kann 
angepaßt werden. Damit wären Nulldurchgang und Störungen zugleich 
behandelt.

Det Takt ist fast willkürlich. Er ist schnell genug um oft genug 
abzutasten, aber auch nicht zu hoch und mit den Timern ist es meist 
leicht einen Takt in der Größenordnung hinzubekommen. Der exakte Wert 
ist nicht kritisch.
Gast #4939474
Lesenswert?

Christoph P. schrieb:
> Der Vorwiderstand ist so gewählt das kaum Strom fließt
> und ist in der Realität auf mehrere Widerstände aufgeteilt.
> Die Verlustleistung beträgt ca 1/4W.

Also hast Du im Mittel 1mA für den Optokoppler, ganz schön knapp. Ich 
vermute mal, dass Dein Ausgangssignal damit unnötig kurz wird, weil der 
erst bei recht hoher Spannung schaltet.

Ich würde statt des Widerstandes einen Kondensator 0,1µF X2 und einen 
Angstwiderstand um 5kOhm verwenden. Dann schaltet er früher durch und 
Dein Zeitfenster am Ausgang wird größer.
#4939531
Lesenswert?

Manfred schrieb:
> Dann schaltet er früher durch und
> Dein Zeitfenster am Ausgang wird größer.

Man möchte am Ausgang eigentlich überhaupt kein "Fenster" sondern ein 
High oder Low.
Daher ist ja da schon ein Kondensator.
Aber die Grenzfrequenz des durch den Pullup und Kondensator gebildeten 
Tiefpasses scheint eben zu hoch geraten zu sein.

Wenn der richtig dimensioniert ist, kann die Nulldurchgangsphase sogar 
10% der Gesamtzeit sein, und es würde immer noch ein ziemlich 
eindeutiges und dauerhaftes LOW nach dem Tiefpass entstehen.
Gast #4939669
Lesenswert?

Joe F. schrieb:
> Manfred schrieb:
>> Dann schaltet er früher durch und
>> Dein Zeitfenster am Ausgang wird größer.
>
> Man möchte am Ausgang eigentlich überhaupt kein "Fenster" sondern ein
> High oder Low.
Ja!

> Daher ist ja da schon ein Kondensator.
Macht man ihn größer, wird er vermutlich nicht geladen. Bei
> Die Verlustleistung beträgt ca 1/4W.
dürfte er 220k als Vorwiderstand haben.

Über den Sinus betrachtet zwischen 0 und 1,5mA Strom durch die LEDs, was 
soll da hinten noch kommen - aus dem Gefühl heraus 3..5ms aktiv? Ob da 
genug Strom ist, einen C zu laden, bezweifele ich - von daher meine 
Idee, primärseitig anzufassen.
#4939771
Lesenswert?

Manfred schrieb:
>> Daher ist ja da schon ein Kondensator.
> Macht man ihn größer, wird er vermutlich nicht geladen. Bei

deswegen sage ich ja, Kondensator so lassen, und Pull-Up möglichst 
hochohmig.
47K / 330n kommen schon hin. Das wären 10 Hz Grenzfrequenz.

>> Die Verlustleistung beträgt ca 1/4W.
> dürfte er 220k als Vorwiderstand haben.
>
> Über den Sinus betrachtet zwischen 0 und 1,5mA Strom durch die LEDs, was
> soll da hinten noch kommen - aus dem Gefühl heraus 3..5ms aktiv? Ob da
> genug Strom ist, einen C zu laden, bezweifele ich - von daher meine
> Idee, primärseitig anzufassen.

Ja, das mit dem geringen Strom am Transistor sehe ich auch so, daher: 
hochohmiger am Ausgang.
Der Kondensator muss über den Transistor übrigens entladen werden.
Ob das sauber funktioniert, sieht man am besten, wenn man mal ein 
Oszilloskop an das Signal hält...

Wenn der Transistor den Pegel schon gar nicht auf 0V runterzieht, oder 
nur extrem langsam, dann ist zu wenig Strom an der LED.
Gast #4942834
Lesenswert?

Christoph P. schrieb:
>     y|=~PINE;
>   ...
>   eingange =~y;

> mit einem logischen NOT hat es nicht geklappt.

Ich dachte, PINE sei ein Pin gewesen. Mir war nicht klar, dass Du 
einen ganzen Port parallel auswertest.

Das logische NOT geht natürlich nur bei einem binären Signal (nur 0 oder 
1, nicht 0x40 oder so)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren