Subtrahieren funktioniert nicht wie es soll.

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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.