8

我只是在看一些示例代码并遇到了一行,我不完全理解为什么需要这样做。我了解您正在接受模拟值。这个值显然在 0 到 1024 之间?为什么是这样?为什么输出需要映射在 0 到 255 之间?什么决定了这里使用的论点?有问题的行:

   // map it to the range of the analog out:
      outputValue = map(sensorValue, 0, 1024, 0, 255); 

代码中突出显示:

created 29 Dec. 2008
 Modified 4 Sep 2010
 by Tom Igoe

 This example code is in the public domain.

 */

// These constants won't change.  They're used to give names
// to the pins used:
const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to
const int analogOutPin = 9; // Analog output pin that the LED is attached to

int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600); 
}

void loop() {
  // read the analog in value:
  sensorValue = analogRead(analogInPin);            
  **// map it to the range of the analog out:
  outputValue = map(sensorValue, 0, 1024, 0, 255);**  
  // change the analog out value:
  analogWrite(analogOutPin, outputValue);           

  // print the results to the serial monitor:
  Serial.print("sensor = " );                       
  Serial.print(sensorValue);      
  Serial.print("\t output = ");      
  Serial.println(outputValue);   

  // wait 10 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(10);                     
}

非常感谢您的回复。

4

2 回答 2

12

模拟输出只有 0 到 255 之间的可接受范围。

因此,该值必须映射在可接受的范围内。

地图方法的文档在这里:http ://arduino.cc/en/Reference/map

因为 Arduino 的analogRead 分辨率为0-1023,analogWrite 分辨率仅为0-255,所以在使用电位计之前需要对这些原始数据进行缩放...

此解释来自 Arduino 传感器教程(在“代码”标题下): http ://arduino.cc/en/Tutorial/AnalogInOutSerial

于 2012-01-26T19:39:33.453 回答
2

为什么?有时您需要将 0 到 1023 转换为 0 到 1023 以外的值范围,而该map()函数试图让工程师更容易做到这一点。我在这个论坛帖子中详细解释了一种情况,我可以将具有 0 到 1023 整数值的数组的 0 到 90 或 100 个索引转换为 xy 图形图!

idx范围从 0 到接近 100 的某个值。
test[idx]是 ADC 值,因此范围从 0 到 1023。

int x1= map(1, 0, idxmax, 0, 160);
int y1= yf - 2 - map(test[1], TPS_floor[_tps], TPS_max[_tps], 0, dy);
for(idx=0; idx < idxmax-1;  ){
    int x0 = map(idx, 0, idxmax, 0, 160);
    int y0 = yf - 2 - map(test[idx], TPS_floor[_tps], TPS_max[_tps], 0, dy);
    tft.drawLine(x0, y0, x1, y1, YELLOW);
    idx++;
    x1 = map(idx+1, 0, idxmax, 0, 160);
    y1 = yf - 2 - map(test[idx+1], TPS_floor[_tps], TPS_max[_tps], 0, dy);
}

因此,上面的代码将 0-~100 的 x 和 0-1023 的 y 转换为: map() 将数组的索引及其值转换为该图!

我的构建记录在这里。(截至 2013 年 7 月 31 日,正在进行中)

我个人认为,清楚地说明“为什么”是最好的解释。我希望我的回答能帮助任何质疑这个“为什么”的人......为什么。

于 2013-08-01T08:31:45.443 回答