Seggel schrieb:
> Hallo Herr Buchegger,
Herr Buchegger?
Der 'Herr Buchegger' ist mein Vater. Ich bin einfach der Karl Heinz
(oder nur Heinz).
Und unter Programmierern sind wir automatisch per Du.
> muss ich an der Hardwaremäßig verbauten Schaltung etwas ändern das habe
> ich schonmal herausgelesen.
Ja, schmeiss den Widerstand raus. Du brauchst nur das Poti.
Der ADC liefert dir dann die Potistellung als Zahlenwert von 0 bis 1023,
Endstellung zu Endstellung.
Bei einem Potiwert von 0 soll die Berechnung einen OCR Wert von 1000
ergeben.
Bei einem Potiwert von 1023 soll die Berechnung einen OCR Wert von 2000
ergeben.
(weil du ja Zeiten von 1.0ms bis 2.0ms haben willst und die PWM so
aufgesetzt ist, dass die ms einfach mal 1000 den OCR Wert ergeben.
d.h.
gesucht sind
das k und das d, welches genau diese Umrechnung erledigen.
Da setzen wir einfach mal die bekannten Zahlenwerte ein
1 | 1000 = k * 0 + d ( I )
|
2 | 2000 = k * 1023 + d ( II )
|
und erhalten somit 2 Gleichungen in 2 Unbekannten ( k und d ). Das lässt
sich aber lösen.
Aus der Gleichung I lässt sich unmittelbar ablesen, dass das d gleich
1000 sein muss.
Das in die Gleichung II eingesetzt
und ein wenig umgeformt
1 | 2000 - 1000 = k * 1023
|
2 | 1000 = k * 1023
|
3 | 1000 / 1023 = k
|
ergibt dann auch den Wert für k.
die gesuchte Gleichung, die die Umrechnung erledigt lautet also
1 | OCR_Wert = ADC_Wert * 1000 / 1023 + 1000
|
mit den bekannten Zahlenwerten kann man das noch ausprobieren und man
sieht: jep stimmt. die vorgegebenen ADC Werte 0 und 1023 werden genau
auf die gewünschten Werte 1000 und 2000 umgerechnet.
Ein kleines Problem gibt es noch. Der ADC WErt kann maximal 1023 werden.
1023 mal 1000 ist aber zu groß für eine int Berechnung. Macht aber nix,
der µC hat ja Zeit, lassen wir ihn einfach 32 Bit rechnen.
1 | OCR1A = ADCW * 1000L / 1023 + 1000;
|
und schon braucht kein Mensch mehr den Widerstand und der Wertebereich
des ADC wird vollständig ausgenutzt.
Und sowas
1 | TCCR1A = 0b10100010;
|
2 | TCCR1B = 0b00011010;
|
will ich gleich gar nicht gesehen haben. Die Bits haben NAMEN! Atmel hat
keine Kosten und Mühen gescheut, dir diese Namen auch im Programm zur
Verfügung zu stellen. Siehe zb hier
FAQ: Timer
(und für den ADC gilt dasselbe)