2015-05-25 56 views
-1

C中是否有類似於Arduino的地圖?我已經搜索,但我找不到任何類似的東西,我可以使用。 現在我得到了從50到700的值,但我想映射它們使得50是0而700是1023.有沒有辦法在C中做到這一點?c中的地圖值

Map in arduino

void backRight(void) 
{ 
     printf("Ch5 %i\n", readADC(ADC_CHANNEL_5)); 

     error5 = setpoint5 - (float)readADC(ADC_CHANNEL_5); 
     printf("error 5 %i\n", (int) error5); 

     if(abs(error5) > MIN5) 
     { 
      integral5 = integral5 + error5 * dt5; 
     } 
     derivative5 = (error5 - pre_error5)/dt5; 

     output5 = Kp5 * error5 + Ki5 * integral5 + Kd5 * derivative5; 

     printf("Output %i\n",(int) output5); 
     if(output5 > MAX5) 
     { 
      output5 = MAX5; 
     } 
     else if(output5 < MIN5) 
     { 
      output5 = MIN5; 
     } 

     pre_error5 = error5; 
     printf("output5 %i\n", (int)output5); 

     changeDutyCycle(pwm_pin8, (output5/1023)*100); 
} 
+1

這與詞典無關(請參閱我的答案)。 – Olaf

+0

@pid:爲什麼拒絕?這個問題顯然是關於線性轉換函數,而不是數據結構「字典」。 – Olaf

+0

而且'map'函數通常也會從函數式編程中觸發與'map()'函數的關聯。 – Olaf

回答

3

一個map實際上是像Python的dict,而不是功能的數據類型。

來自arduino的函數將更好地稱爲scaletransform。它進行兩個線性轉換:偏移和縮放。您可以通過複製實現(即在您鏈接的頁面上)輕鬆採用該實現。

而且:這只是一個功能;是的,你可以實現和C.

+0

我可能會遺漏一些東西,但爲什麼你說'map'是一個數據類型而不是函數,而它*是一個函數? – ladislas

+0

@ladislas:問題和標記所示的映射實際上是一個數據類型。命名一隻貓「狗」並不是一個。 – Olaf

+0

好吧,我明白了:) – ladislas

0

使用功能,在您所提供的鏈接,你可以找到的map()實現:

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; 
} 

它應該是作爲複製/粘貼到C.實現容易..

0

50-700到0 - 1023將不會完全平滑,將會有值將不會被表示,但只需要減去50乘以1023併除以650 ...甚至可以是一個宏...

所以不要使用它加密phy或其他任何東西,但是對10位DAC進行縮放或其他操作都可以。