Subtrahieren funktioniert nicht wie es soll.

#3212125
Lesenswert?

Hallo Community!

Ich versuche derzeit zum üben einen Spannungsregler mit einem Atmega8 zu 
bauen.
Das ganze funktioniert auch ziemlich super. Selbstverständlicherweise 
reagiert das ganze nicht so schnell wie ein Spannungsregler den es 
fertig zu kaufen gibt. Es geht aber um den Lerneffekt.

Vorgeschichte:

Ich lese am ADC0(Versorgungsspannung) und ADC1(Sollspannung) die 
verschiedenen Spannungen ein. Dabei kommen Werte von 0 bis 1023.
Daraus berechne ich den Faktor, und multipliziere diesen mit 255. Dann 
gebe ich dem PWM Register OCR2 diesen Wert.
1
int main(void){
2
  int variable = 0;
3
  int variablex = 0;  
4
  int x1=0, x2=0;
5
}
1
while(1){
2
    x1 = MESSWERT(0);
3
    x2 = MESSWERT(1);
4
              
5
    variable = (x2 / x1) * 255;
6
    if (variable < 0){variable = 0;}
7
    if (variable > 255){variable = 255;}
8
    variablex = variable;
9
        
10
    OCR2 = variablex
11
}

Mein Problem ist jetzt folgendes:

Leider regelt der PWM (oder 'variablex') nur in viertel Schritten. Also 
63, 127, 191 und 255.
Ich kann mir aber nicht erklären weshalb das so ist.
'variablex' steht noch im Code weil ich das ganze mal mit Float probiert 
hatte. Hat leider ebenso wenig funktioniert.


Habt ihr eine Idee?


Grüße
Phil



Edit: Zum debuggen habe ich ein Display angeschlossen und lasse mir die 
beiden Spannungen anzeigen sowie die Variable 'variablex'. (Siehe Bild) 
Da kann ich ablesen das variablex nur 4 verschiedene Werte anzeigt (63, 
127, 191 und 255).
Angehängte Dateien:
Gast #3212139
Lesenswert?

> variable = (x2 / x1) * 255;
> if (variable < 0){variable = 0;}
> if (variable > 255){variable = 255;}


(x2 / x1) wird als int gerechnet. Damit kann dort nur eine ganzzahliger 
wert >= 0 rauskommen.  Das ganze mal 255 ist immer 0, 255, 512 usw.

und wenn du jetzt

> if (variable > 255){variable = 255;}

machst, dann kommt dort zwangsläufig immer 255 oder 0 raus.
#3212140
Lesenswert?

1. Ich sehe in Deinem Code keine Subtraktion.
2. Der gezeigte Code ist nicht der, den Du auf Deinem µC laufen hast. 
Die while-Schleife ist ausserhalb der main-Funktion.
3. Lasse Dir auf dem LCD nciht die Spannungen anzeigen, sondern direkt 
die Variablen x1 und x2.
#3212149
Lesenswert?

J.-u. G. schrieb:
> 1. Ich sehe in Deinem Code keine Subtraktion.

Divison, Tut mir leid.

J.-u. G. schrieb:
> 2. Der gezeigte Code ist nicht der, den Du auf Deinem µC laufen hast.
> Die while-Schleife ist ausserhalb der main-Funktion.

Ist ein Code ausschnitt in welchem die beiden Schleifen getrennt gezeigt 
sind.

J.-u. G. schrieb:
> 3. Lasse Dir auf dem LCD nciht die Spannungen anzeigen, sondern direkt
> die Variablen x1 und x2.

Dann mach ich das mal.
Gast #3212194
Lesenswert?

auch das dürfte nicht gehen
1
 float variable = 0; //standart pwm
2
 int x1=0, x2=0;
3

4
 x1 = MESSWERT(0);
5
 x2 = MESSWERT(1);
6
              
7
 variable = (x2 / x1);

x2 / x1 wird kein float ergeben! Statt Video sollte du eventuell die 
Grundlagen von C und den Datentypen dir mal anschauen.

Auch wenn es mit float möglich ist, solltest du wenn möglich darauf 
verzichten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren