Hallo Leute, ich habe folgendes Problem bzw. ich steh glaub ich auf der Leitung: Ich messe mit einem ATMEGA8 eine Spannung (3V) und vergleiche sie mit dem berechneten ADC-Wert. Ist die gemessenen Spannungder größer dem ADC-Wert, führe ich in einer "switch-case" Anweisung gewisse Aktionen durch. Ist der gemessene Wert jedoch kleiner der ADC-Spannung, will ich damit direkt einen Ausgang schalten! Geht das überhaupt so, oder habe ich etwas vergessen? Ich habe es nach diesem Prinzip versucht, jedoch klappt es nicht: if (adcval < Messwert) { Setze Ausgang Motor_schließen; } Die Messung funktioniert, nur an der logik scheitert es anscheinend :( ! Der Hintergrund dieses Vorhabens ist, dass ich bei leer werdendem Akku (bzw.beim Unterschreiten einer Mindestspannung) einen Motor einfahren will. Vielleicht kann mir jemand helfen? MFG
meine glaskugel ist leider etwas eingestaubt... poste mal deinen code, ok. ? gruss, tom.
sweetwater schrieb: > Ich messe mit einem ATMEGA8 eine Spannung (3V) und vergleiche sie mit > dem berechneten ADC-Wert. Hä?
natürlich geht das, du darfs nur nicht vergessen, dass dein "Ausgang Motor_schließen" irgendwann wieder rückgesetzt werden muss. Wenns nicht geht evtl. DDR falsch konfiguriert?
sweetwater schrieb: > Ist der gemessene Wert jedoch kleiner der ADC-Spannung, will ich damit > direkt einen Ausgang schalten! was meinst du mit damit? Gramatikalisch gesehen, bezieht sich das "damit" doch auf "Wert". was soll das heißen, "Mit dem Wert will ich direkt einen Ausgang schalten"? edit: Das nächste Rätsel ist die Formulierung sweetwater schrieb: > Ich messe mit einem ATMEGA8 eine Spannung (3V) und vergleiche sie mit > dem berechneten ADC-Wert. Wenn Deutsch nicht deine Muttersprache ist, versuchs auf Englisch, wenns da besser aussieht. Die meisten können das auch.
@Vlad Tepesch zuerst, möchte ich darauf verweisen, das Deutsch sehrwohl meine Muttersprache ist. Des weiteren fällt es mir offensichtlich schwer, mein Problem klar darzustellen (da ich ein Einsteiger bin). Meines wissens nach, misst der interne ADU in meinem fall die Spannung eines Spanungsteilers (3V). Dieser Wert wird ja dann in eine Zahl umgewandelt. Um mit dem Wert etwas anfangen zu können, muss ich diesen ja mit einem anderen Wert vergleichen (den hab ich ausgerechnet --> in meinem Fall 615) Ist nun der gemessene Wert größer 615, sollen bestimmte Aktionen durchgeführt werden. Ist der gemessene Wert kleiner 615, will ich, das der Motor automatisch einfährt. Der gemessene Wert sinkt eben stetig, da meine Anwendung mit einem Akku betrieben wird. Daher soll der Motor beim Unterschreiten dieser bestimmten Spannung eingefahren werden. Mein Problem ist jetzt, dass nix passiert, sobald die gemessene Spannung kleiner meinem berechneten Wert ist. Wie sieht eine solche Zuweisung aus, damit ich direkt den Ausgang für den Motor schalten kann? (mit einem Taster zur Betätigung des Ausgangs ist das ja kein Problem, ein geeignetes Signal zu erzeugen, aber wie funktioniert das mit einem Vergleich von 2 Werten?) Ich hoffe, ich konnte mein Problem etwas besser darstellen. :)
gut, so war das nämlich nicht zu verstehen. sweetwater schrieb: > if (adcval < Messwert) > { > Setze Ausgang Motor_schließen; > } adcval sollte also eigentlich vergleichsGroesse heißen und die Relation wohl eher umgekehrt sein. zum eigentlichen Problem: Wie du den Motor aktivierst, hängt natürlich von deinem System ab. Da kann dir lhne Schltplan keine Antwort gegeben werden. Edit: für den Fall, dass der µC wirklich nur ein Signal ausgibt, den Motor also nicht direkt ansteuert, muss natürlich einfach nur der entsprechende Ausgang umgeschalten werden. Wie Das Funktioniert, steht in den Tutorials zB unter: https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports
Also ich habs mal so versucht (vereinfacht dargestellt, um einen schnellen Überblick zu ermöglichen): switch (Zustand) { case Akkuzustand_OK: if (adcval > 615) { switch (Funktion) { case Funktion1: if Taste_gedrückt { setze Ausgang Motor_öffnen; Funktion=Funktion2; } break; //es gibt noch weitere Funktionen, daher ein switch-case- Gerüst } } break; case Akkuzustand_LOW: if (adcval < 615) { setze Ausgang Motor_schließen; } break; Mit einem Netzgerät habe ich die sinkende Spannung eines Akku´s simuliert, jedoch wird der Ausgang für den Motor nicht gesetzt. Die "Funktionen" können aber bei zu geringer Spannung nicht mehr durchgeführt werden (Taste_gedrückt --> Motor ausfahren,...), was ja so sein sollte. Das heißt, das die Messung grundsätzlich funktioniert. Was mache ich falsch?
Hi, Deine Caseabfrage verstehe ich nicht ganz, du setzt voraus das der Case Akkuzustand_LOW schon anliegt um überhaupt den ADC wewrt mit 615 zu vergleichen, welcher Programmteil ist dafür verantwortlich den Akkuzustand auf LOW zu setzen?? Gruß Jochen
Jochen S. schrieb: > welcher Programmteil ist dafür verantwortlich den > > Akkuzustand auf LOW zu setzen ich hab´s mal ein wenig abgeändert...siehts so besser aus? Ich will mit dem "switch (Zustand)" eigentlich nur dafür sorgen, dass, so lange der Akku ausrechend gefüllt ist, die entsprechenden Funktionen durchgeführt werden. Für den Fall, dass die Spannung unter den bestimmten Wert fällt, soll Motor_schließen aktiviert werden. Solange der Akku nicht wieder entsprechend geladen ist, soll der Motor auch nicht wieder ausgefahren werden können, wenn man z.B. die Betätigungstaste dafür drückt...das nochmal zum Hintergrund Daher habe ich auch diese switch/case abfrage verwendet, da ich nicht weiß, mie man das sonst lösen könnte...Ist dieser Ansatz grundsätzlich schon mal richtig oder gäbe es da was eleganteres? danke schon mal für eure antworen! mfg
> Daher habe ich auch diese switch/case abfrage verwendet, > da ich nicht weiß, mie man das sonst lösen könnte... Du brauchst diesen ganzen switch über den Zustand gar nicht. Die gemessene Akkuspannung selber ist die Aussage darüber, ob der Akkuzustand gut ist oder nicht if( adcval > 615 ) { .... Akku ist noch genügend voll } else { .. Akku ist leer, leite Abschaltung ein wenn nicht schon geschehen } mehr brauchst du nicht.
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.