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?
:
Bearbeitet durch User
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 | 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
Vielen Dank für den Code, dass hilft mir schon sehr viel weiter. ich versuche den gleich mal an meinen Code anzupassen, Danke!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.