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
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.