Kleinsten Wert finden, Variablen vergleichen und auswerten

Gast #4420397
Hallo,

Sitze grade vor einem unverständlichen Problem:

Von 4 Double-Variablen soll die kleinste gefunden werden.
Wenn die andrern Varaiblen um > 0,2 größer sind soll eine Aktion 
ausgeführt werden.

Es kommt jedoch überall # raus.
-->Dass sollte eigentlich garnicht möglich sein.

Seht ihr den Fehler?
1
void autobalance(uint8_t ueb)
2
{
3
  if (ueb==0)  //Automatisches balancing
4
  {
5
    //Finden der kleinsten Spannung
6
    uint8_t spg_klein=0;
7
    if ((spg1<spg2) && (spg1<spg3) && (spg1<spg4))
8
    {
9
      spg_klein=spg1;
10
    }
11
    else if ((spg2<spg1) && (spg2<spg3) && (spg2<spg4))
12
    {
13
      spg_klein=spg2;
14
    }
15
    else if ((spg3<spg1) && (spg3<spg2) && (spg3<spg4))
16
    {
17
      spg_klein=spg3;
18
    }
19
    else
20
    {
21
      spg_klein=spg4;
22
    }
23
    //----------Ein/Abschalten der Balancing R's
24
    if (spg1>(spg_klein+0.2))
25
    {
26
      zeile1[6]='#';
27
      balance(0,1);
28
    }
29
    else
30
    {
31
      zeile1[6]=' ';
32
      balance(0,0);
33
    }
34
    if (spg2>(spg_klein+0.2))
35
    {
36
      zeile1[14]='#';
37
      balance(1,1);
38
    }
39
    else
40
    {
41
      zeile1[14]=' ';
42
      balance(1,0);
43
    }
44
    if (spg3>(spg_klein+0.2))
45
    {
46
      zeile2[6]='#';
47
      balance(2,1);
48
    }
49
    else
50
    {
51
      zeile2[6]=' ';
52
      balance(2,0);
53
    }
54
    if (spg4>(spg_klein+0.2))
55
    {
56
      zeile2[14]='#';
57
      balance(3,1);
58
    }
59
    else
60
    {
61
      zeile2[14]=' ';
62
      balance(3,0);
63
    }
64
  }
65
}
Gast #4420433
Es geht um ein Balancing-System, dabei soll die höchste Spannung nur 
0,2V größer als die anderen sein.

-->Im Bedarfsfall wird ein Parallelwiderstand geschaltet.
-->Dann soll dies durch ein '#' auf dem Display angezeigt werden.

Spg 1 = 7,88V
Spg 2 = 6,36V
Spg 3 = 6,52V
Spg 4 = 6,11V

Aktuell werden alle Spannungen außer Spg 1 mit '#' angezeigt und 
entladen.

Habe die Spannungen nun in ein Array gepackt, doch am Problem ändert 
sich nichts.
1
void autobalance(uint8_t ueb)
2
{
3
  if (ueb==0)  //Automatisches balancing
4
  {
5
    double spg_klein=100;
6
    for (int i=0;i<4;i++)
7
    {
8
      if (spg[i]<spg_klein)
9
      {
10
        spg_klein=spg[i];
11
      }
12
    }
13

14
    //----------Ein/Abschalten der Balancing R's
15
    if (spg[0]>(spg_klein+0.2))
16
    {
17
      zeile1[6]='#';
18
      balance(0,1);
19
    }
20
    else
21
    {
22
      zeile1[6]=' ';
23
      balance(0,0);
24
    }
25
    if (spg[1]>(spg_klein+0.2))
26
    {
27
      zeile1[14]='#';
28
      balance(1,1);
29
    }
30
    else
31
    {
32
      zeile1[14]=' ';
33
      balance(1,0);
34
    }
35
    if (spg[2]>(spg_klein+0.2))
36
    {
37
      zeile2[6]='#';
38
      balance(2,1);
39
    }
40
    else
41
    {
42
      zeile2[6]=' ';
43
      balance(2,0);
44
    }
45
    if (spg[3]>(spg_klein+0.2))
46
    {
47
      zeile2[14]='#';
48
      balance(3,1);
49
    }
50
    else
51
    {
52
      zeile2[14]=' ';
53
      balance(3,0);
54
    }
55
  }
56
}
Gast #4420453
Loddar schrieb:
> Matze schrieb:
>> Es geht um ein Balancing-System, dabei soll die höchste Spannung nur
>> 0,2V größer als die anderen sein.
>
> und warum suchst du dann nach der kleinsten Spannung?

Hab's falsch formuliert,
Es soll die kleinste Spannung ermittelt werden.
Alle anderen Spannungen sollen so geregent werden, dass sie maximal 0,2V 
größer sind.
Gast #4420472
Matze schrieb:
> if (spg[0]>(spg_klein+0.2))
>     {
>       zeile1[6]='#';
>       balance(0,1);
>     }
>     else
>     {
>       zeile1[6]=' ';
>       balance(0,0);
>     }

ändere das doch Mal in

 if ( spg[0]==spg_klein )
       zeile1[6]='#';
     else
       zeile1[6]=' ';

usw.
um zu kontrollieren was als kleinste Spannung gefunden wird,
Programmieren besteht zu einem großen Teil in systematischer Fehlersuche 
...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.