Subtrahieren funktioniert nicht wie es soll.

OP #3212125
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
> 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
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.
OP #3212149
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
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

Eine eigene Frage? Dieser Thread ist über 13 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.