Forum: Mikrocontroller und Digitale Elektronik ATMEGA: AUSGANG direkt mittels ADC-Wert schalten?


von sweetwater (Gast)


Lesenswert?

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

von tom (Gast)


Lesenswert?

meine glaskugel ist leider etwas eingestaubt...

poste mal deinen code, ok. ?

gruss, tom.

von Vogelfrei (Gast)


Lesenswert?

sweetwater schrieb:
> Ich messe mit einem ATMEGA8 eine Spannung (3V) und vergleiche sie mit
> dem berechneten ADC-Wert.
Hä?

von Peter L. (Gast)


Lesenswert?

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?

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von sweetwater (Gast)


Lesenswert?

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

:)

von Vlad T. (vlad_tepesch)


Lesenswert?

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

von sweetwater (Gast)


Lesenswert?

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?

von Jochen S. (jochen_s)


Lesenswert?

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

von sweetwater (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von sweetwater (Gast)


Lesenswert?

Ok, ich versuch´s morgen mal auf diese Weise!

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.