Frage zur map()-Funktion

Hallo,
ich habe eine Frage zu der map() Funktion.
Ich habe gelesen das man beim Erfassen von Werten mit den Analogeneingängen, die Werte von 0-1023 auf 0-255 skaliert.
Jetzt habe ich in folgendem Beispiel (dritte Zeile von unten) gesehen, dass die Werte auf 0-500 skaliert wurden.
Kann mir jemand sagen, ob das einen bestimmten Grund hat? Ich dachte es wäre nur möglich bis auf 255 zu gehen für Werte an den Analogeneingängen?

view plainprint?
const int M1 = 13;  
const int M2 = 12;  
const int M3 = 11;  
const int CC_CCW = 10;  
const int CLK = 9;  
const int RESET = 8;  
const int ENABLE = 7;  
const int Latch_Auto = 6;  
const int TQ = 5;  
  
void setup() {  
  pinMode(9, OUTPUT);  
  
  // Réglage du timer afin de génerer un signal PWM sur la pin 9  
  TCCR1A = _BV(COM1A0)   
         | _BV(COM1B0)        
         | _BV(WGM10)  
         | _BV(WGM11);  
  TCCR1B = _BV(WGM12)  
         | _BV(WGM13);       
           
  OCR1B = 0;               
  OCR1A = 15383;          
  TCCR1B |= _BV(CS11);     
    
  pinMode(M1, OUTPUT);   
  pinMode(M2, OUTPUT);   
  pinMode(M3, OUTPUT);   
  pinMode(CC_CCW, OUTPUT);   
  pinMode(CLK, OUTPUT);   
  pinMode(RESET, OUTPUT);   
  pinMode(ENABLE, OUTPUT);   
  pinMode(Latch_Auto, OUTPUT);   
  pinMode(TQ, OUTPUT);   
    
  digitalWrite(CC_CCW, HIGH);  
  digitalWrite(Latch_Auto, HIGH);  
  digitalWrite(TQ, HIGH);  
    
  // mode 1/16 de pas  
  digitalWrite(M1, HIGH);  
  digitalWrite(M2, HIGH);  
  digitalWrite(M3, LOW);  
     
  digitalWrite(RESET, HIGH);  
  digitalWrite(ENABLE, HIGH);  
}  
  
const int N = 50;  
unsigned int top;  
void loop() {  
  long val = 0;  
  // moyennage du potentiomètre  
  for (int i=0; i<N; i++)  
    val += analogRead(A5);  
   val /= N;  
     
   OCR1A = map(val, 0, 1023, 0, 500);  
   delay(1);  
}
long map(long, long, long, long, long);

Wie du siehst, beschränkt sich die Funktion nicht nur auf 1 Byte. In der Referenz ist leider kein richtiger Anhaltspunkt zu finden
http://arduino.cc/en/Reference/Map

Das man hier von 0 -255 "mapt" hat damit zu tun, dass der PWM Ausgang lediglich mit 8Bit hat. Somit kann man einfach mit Hilfe eines Potis den PWM Ausgang von 0 - 255 beschreiben.

P.S. für deine Variable "val" reicht ein int aus.

Mittels der Funktion map() kann man von jedem Wertebereich zu jedem anderen Wertebereich umformen. Die Variablen sind vom Typ long.
Die matematische Funktion die dahintersteht ist :

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Den Wertebereich wählt man nach Eigenschaften des "Eingangs" bzw "Ausgangs". Ein Analogeingang kann Werte von 0 bis 1023 annehmen. Im genannten Beispiel ist OCR1A ist ein Register des Timers.

Grüße Uwe

Nennt man die Map Funktion nicht auch verallgemeinerter Dreisatz? :grin:

willie1968:
Nennt man die Map Funktion nicht auch verallgemeinerter Dreisatz? :grin:

Nein, da man nicht unbedingt ein proportionales verhältnis von Eingang zu Ausgang der map()-Funktion hat. Das ist nur der Fall, wenn beide Minima 0 sind. Map() kann nicht nur skalieren (und invertieren), sondern auch den Wertebereich verschieben.

Alles klar, danke für die Antworten.