Forum: Mikrocontroller und Digitale Elektronik einfacher Durchgangstest durch RC-Serienschaltung ?


von Helge (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bräuchte bitte Hilfe bei der Durchführung eines Durchgangstests 
eines in Serie geschalteten RC-Glieds(siehe Bild anbei).
Ich muss eingentlich nur eine Ja/Nein Aussage liefern, ob ein 
Kontaktiersystem an K1 & K2 einen Kontakt herstellt. Mit Gleichspannung 
komme ich ja hier nicht weiter, da der Kondensator das blockt.

Mit Hilfe der ADC Eingänge an einen AVR wollte ich ein 50Hz-Signal über 
das RC-Glied senden, und dann über eine Diode und Kondensator 
gleichrichten.
Leider fällt mir die Spannung hier komplett zusammen, ich nehme an, 
aufgrund der hohen Impedanz der Schaltung.
Die Lösung wäre evtl. ein Impedanzwandler an den ADC-Eingängen, nur habe 
ich auf der Platine nur Platz für ein paar einache Bauteile.

Ist es irgendwie möglich mit einer geschickten Anordnung von ein paar 
passiven Bauteilen dennoch ein kleines Gleichspannungssignal am Ausgang 
zu generieren ?

Danke für eure Hilfe,

Helge

von Micha H. (mlh) Benutzerseite


Lesenswert?

Helge schrieb:
> Mit Hilfe der ADC Eingänge an einen AVR wollte ich ein 50Hz-Signal über
> das RC-Glied senden, und dann über eine Diode und Kondensator
> gleichrichten.

Wozu? Wenn Du sowieso einen ADC im Microcontroller nutzt, bieten sich 
doch alle Möglichkeiten der Software. Wozu also vorher gleichrichten und 
damit das hochimpedante Signal niederbügeln?

von Helge (Gast)


Lesenswert?

Micha H. schrieb:
> Wozu? Wenn Du sowieso einen ADC im Microcontroller nutzt, bieten sich
> doch alle Möglichkeiten der Software. Wozu also vorher gleichrichten und
> damit das hochimpedante Signal niederbügeln?

Mir fehlt's leider ein an den Programmierkenntnissen, eine 
Flankenerkennung zu bewerkstelligen. Eine Gleichspannung am ADC ist ja 
doch einfach zu messen.

Aber mit der Gleichrichterdiode funktioniert es ja leider auch nicht,
da das Signal dabei zusammenbricht.

von Helge (Gast)


Lesenswert?

Micha H. schrieb:
> Wozu? Wenn Du sowieso einen ADC im Microcontroller nutzt, bieten sich
> doch alle Möglichkeiten der Software. Wozu also vorher gleichrichten und
> damit das hochimpedante Signal niederbügeln?

Ich denke, mir bleibt hier nur die Auswertung des Signals ohne 
Gleichrichtung.
Am Oszilloskop messe ich nach Einschalten der Versorgungspannung ein 
Signal mit 4,5V als Sinushalbwelle, d.h. ich kann den ADC noch 
betreiben, weil das Signal nicht über der Vcc von 5V liegt.
Eigenartigerweise messe ich beim Abschalten der Versorgungsspannung ein 
abgerundetes Rechtecksignal mit 1V Spitze/Spitze.
Kann es sein, dass der ADC den Port-Eingang hochohmiger schaltet und 
dadurch das Signal weniger gedämpft wird ?

von Helge (Gast)


Lesenswert?

Ich denke, das einfachste wäre es, wenn ich einfach über die PIN-Abfrage 
den Port abtaste.
Das Problem dabei ist nur, dass, je nachdem wann der ADC genau misst, 
die Aussage positiv oder negativ ist, da der Port ja nur auf high steht, 
wenn die Sinuswelle gerade oben ist.

Wie könnte ich seitens der SW programmieren, dass die Messung 
zuverlässig wird, und nicht eine statistische Aussage wird ?

von Mike (Gast)


Lesenswert?

Helge schrieb:
> Wie könnte ich seitens der SW programmieren, dass die Messung
> zuverlässig wird, und nicht eine statistische Aussage wird ?

Indem du Signalerzeugung und Abtastung synchronisierst und zeitlich 
aufeinander abstimmst.

von Helge (Gast)


Lesenswert?

Mike schrieb:
> Indem du Signalerzeugung und Abtastung synchronisierst und zeitlich
> aufeinander abstimmst.

Das kann ich leider nicht bewerkstelligen, das das Signal letzlich nur 
über ein Steckernetzteil erzeugt wird.

Beim Abfrageversuch ist in etwa jeder zweite Wert am Port high, ich 
vertraue dann doch am einfachsten auf den Zufall und frage einfach 20x 
ab, dann sollte zumindest ein "high"-Wert dabei sein.
Die Frage ist nur, wie ich das SW-technisch umsetzte.
Ich frage ja immer einen Port ab, und bräuchte letztlich eine Aussage, 
ob in einer gewissen Anzahl von Messungen zumindest ein Wert dabei ist, 
der high ist. Der Zustandsabfrage von z.BSP. PINC5 wird aber ja immer 
überschrieben.
Dafür habe ich bis jetzt noch keine Lösung.

von San L. (zwillingsfreunde)


Lesenswert?

Helge schrieb:
> 50Hz-Signal

Du kennst die Frequenz. Eine Periode dauert 20ms. Theoretisch kannst du 
nun einfach während 20ms dauernd abfragen. Dann bist du sicher, dass 
eine ganze Periode durch ist und falls das teil funktioniert ganz 
bestimmt eine positive halbwelle zu erkennen war.

Helge schrieb:
> Der Zustandsabfrage von z.BSP. PINC5 wird aber ja immer
> überschrieben.

Wie wärs mir gemessene Daten speichern?

: Bearbeitet durch User
von Mike (Gast)


Lesenswert?

Helge schrieb:
> Das kann ich leider nicht bewerkstelligen, das das Signal letzlich nur
> über ein Steckernetzteil erzeugt wird.

Warum erzeugst du das Signal nicht mit dem µC. Dann kennst du es.

Mir scheint, es wird Zeit, dass du einmal das Gesamtproblem darstellst. 
Sonst läuft das hier gewaltig in die Irre.

von Helge (Gast)


Lesenswert?

San Lue schrieb:
> Wie wärs mir gemessene Daten speichern?

ja stimmt, aber wie ?
Ich müsste für jeden Schleifendurchlauf in einer Variablen den Messwert
für PINC5 speichern. Dann habe ich dann die Messwerte 1-20. Aber wie 
verknüpfe ich diese Variablen um als eine Aussage zu erhalten, ob 
zumindest ein Messwert auf high ist ?

von San L. (zwillingsfreunde)


Lesenswert?

Helge schrieb:
> ja stimmt, aber wie ?
> Ich müsste für jeden Schleifendurchlauf in einer Variablen den Messwert
> für PINC5 speichern.

Dann mach das.

Ich habe dir hier mal kurz einen Codeschnippsel geschrieben. Wichtig: 
KEIN Copy Paste möglich!!! Musst du schon noch einmal überarbeiten, 
allerdings gibt es dir bestimmt eine Grobe Idee wie das ganze möglich 
wäre.
1
char Daten[20];    // Array mit 20 Stellen
2
char Merker;  
3
char i;
4
5
6
while(i < 20) {    // Ca. 20 ms Schleife
7
8
  if(PINC5 == 1) {    // Wenn PINC5 High ist
9
    Merker = 1;    // Setze Flag
10
  }
11
  else {
12
    Merker = 0;    // Sonst lösche Flag
13
  }
14
15
16
  Daten[point] = Merker;    // Speichere Daten in Array
17
  point++;      // Inkrementiere Speicherplatz
18
19
  Delay_ms(1);      // 1 Millisekunde Delay
20
  i++;        // Inkrementiere i
21
22
}
23
24
Merker = 0;        // Nach Messung alles auf Startwerte setzen
25
point = 0;
26
i = 0;

Code geschrieben in 3 Minuten, wer Fehler findet darf sie behalten ;)

Zum Auswerten könntest du dann Beispielsweise alle 20 Plätze des Arrays 
miteinander addieren. Ist der Wert grösser als 0, so hat mindestens ein 
Speicherplatz eine 1 und somit weisst du, dass mindestens einmal ein 
Signal gemessen wurde.

Desweiteren:
Das mit dem "Merker" ist evt. unnötig. Vielleicht ist es auch möglich, 
direkt den Wert des PIN's in das Array zu übertragen.
1
Daten[point] = PINC5;

Weiss allerdings nicht, ob das probleme geben könnte. Nie probiert.

: Bearbeitet durch User
von Helge (Gast)


Lesenswert?

Vielen Dank für den Code, dass hilft mir schon sehr viel weiter.
ich versuche den gleich mal an meinen Code anzupassen,
Danke!

von San L. (zwillingsfreunde)


Lesenswert?

Kein Problem.

Falls du etwas Lektüre dazu brauchst um das alles zu verstehen:
http://home.fhtw-berlin.de/~junghans/cref/CONCEPT/arrays.html
Oder hier:
http://www.c-howto.de/tutorial-arrays-felder.html

Finde ich realtiv gut beschrieben was ein Array ist.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.