Moin,
ich habe hier folgende Funktion geschrieben. Urpsrünglich hatte ich sie
für float Werte geschrieben, was auch funktioniert hat. Jetzt möchte ich
sie auf Integer Werte umschreiben und bekomme falsche Werte. Sicherlich
läuft ein Integer über oder so, aber ich weiss nicht wo.
1 | #define PWM_TOP 1600
|
2 |
|
3 | void SetPWM(uint8_t dutycycle)
|
4 | {
|
5 | uint16_t _ocr1a = 0;
|
6 | // Fehlerhafte Eingabe abfangen
|
7 | if (dutycycle > 100) dutycycle = 100;
|
8 | if (dutycycle < 0) dutycycle = 0;
|
9 |
|
10 | //Vergleichswert berechnen
|
11 | _ocr1a = ((PWM_TOP*dutycycle) / 100);
|
12 |
|
13 | sprintf(sbuf,"OCR1A: %u", _ocr1a);
|
14 | usb_send_str(sbuf);
|
15 |
|
16 | //Vergleichswert setzen
|
17 | OCR1A = _ocr1a;
|
18 | }
|
Erwarten würde ich:
_ocr1a = 1600*50/100 = 80.000/100 = 800
Das Ergebnis ist:
_ocr1a = 144
Ich dachte erst, dass das Zwischenergebnis von 80.000 das Problem wäre,
da es nicht in uint16_t passt. Aber die Berechnung mit uint32_t ergab
das gleiche unsinnige Ergebnis.
Ich sehe meinen Fehler gerade echt nicht...
Viele Grüße,
Christian