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
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?
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.
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 ?
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 ?
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.
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.
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?
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.
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 ?
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
charDaten[20];// Array mit 20 Stellen
2
charMerker;
3
chari;
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.