Hallo,
ich habe folgende Funktion:
1 | //Park position: kleinere Werte bedeuten rückwärts, größere Werte bedeuten vorwärts
|
2 | #define ZERO_SPEED_POS_VALUE 511
|
3 | //Toleranzbereich des Potentiomaterwerts um die Null-, Max- und Min-Position.
|
4 | #define TOLERANCE 10
|
5 | #define MAX_ADC_VALUE 1023
|
6 | #define MAX_SPEED_VALUE 1023
|
7 |
|
8 | unsigned int calc_speed_cmd (uint16_t steering_poti_value)
|
9 | {
|
10 |
|
11 | //if ( (steering_poti_value >= (MAX_ADC_VALUE-TOLERANCE)) | (steering_poti_value <= TOLERANCE) )
|
12 | //return ((uint16_t) MAX_SPEED_VALUE);
|
13 |
|
14 | if (steering_poti_value > (ZERO_SPEED_POS_VALUE + TOLERANCE)){
|
15 | return ( (uint16_t) (float)(steering_poti_value - ZERO_SPEED_POS_VALUE) * (float)MAX_SPEED_VALUE / (float)(MAX_ADC_VALUE - ZERO_SPEED_POS_VALUE));
|
16 | }
|
17 | if (steering_poti_value < (ZERO_SPEED_POS_VALUE - TOLERANCE)){
|
18 | return ( (uint16_t) ((float)MAX_SPEED_VALUE - ((float)steering_poti_value * (float)MAX_SPEED_VALUE / (float)ZERO_SPEED_POS_VALUE)));
|
19 | }
|
20 | return 0;
|
21 | }
|
Die Funktion erledigt folgende Aufgabe:
Ich habe einen ADC-Wert (0-1024) und möchte daraus ein DutyCycle für
meine PWM generieren. Die Werte von 511 bis 1023 sollen dabei auf den
Wertebereich 0 bis 1023 abgegbildert werden. Die Werte von 0 bis 511 auf
den Bereich 1023 bis 0. Also habe ich bei 511 sozusagen den kleinsten
DutyCycle, bei 1023 oder 0 den Größten.
Das Ganze hat um den Wert 511 noch eine Toleranz, so dass ich auch bei
etwas kleineren und etwas größeren Werten trotzdem den DutyCycle 0 habe.
Nun meine Frage: Ich möchte das eigentlich ohne den Typecast auf float
erledigen. Leider verstehe ich noch nicht ganz, wie der implizite
Typecast bei C oder beim gcc-avr abläuft. Wo finde ich Informationen
dazu? Gibt es da ein Manual oder so, wo das steht?