2012-04-22 4 views
1

저는 Arduino를 사용하여 현재 구축중인 로봇에 PID 제어 알고리즘을 구현하고 있습니다.다른 변수의 상대 값으로 하나의 변수를 결정하는 방법은 무엇입니까?

제 질문은 프로그래밍의 논리와 더 관련이 있습니다.

변수, 오류, int eps를 계산해야합니다. 이 eps는 -7에서 +7 사이입니다. 로봇에서

내가 0과 7000

내 알고리즘 사이의 값을 가진 두 배의 형태로 입력을 취득하면이 같은 일을 일해야 : 등등

if(input >= 500){ 
    if(input >= 1000){ 
      if(input >= 1500){ 
      .......... 
      } 
    }else{ 
      eps = 6; 
    } 
}else{ 
    eps = 7; 
} 

그리고를 ... 즉

I는 입력에 포함되는 간격에 따라 결정됩니다 EPS에 값을 할당해야합니다.

내 질문은 MOS 될 것입니다 이를 효율적으로, 시간과 자원을 절약하는 방법?

저는 Eclipse가 아니라 Arduino와 자체 IDE를 사용하고 있습니다.

답변

3

7이 7000에 해당하고 -7이 0에 해당하고 엡실론의 다른 값 사이의 간격이 같으면 (500), eps = static_cast<int>(input/500.0) - 7을 쓸 수 있습니다. Arduino의 정적 형변환에 대해서는 확신이 없습니다 - 당신은 더 낮은 정수 (바닥)로 값을 올림해야합니다. 아두 이노는지도 기능이 있습니다)

+0

Arduino에서'static_cast'를 사용하면 문제가 없습니다. –

+0

답변 해 주셔서 감사합니다. 나는 이것들 각각을 시험해보고 어떤 것이 가장 잘 작동하는지 보게 될 것이다.16MHz Arduino를 사용하고 있으며 모든 비트가 도움이되도록 센서에서 샘플을 빠르게 가져와야합니다. – Eugen

+0

많은 감사합니다 !! 매력처럼 일했습니다! : D – Eugen

3

, 당신은 EPS를 결정하는 다른 알고리즘이있는 경우

, 더 명확하게 명시하시기 바랍니다, 우리는이를 위해 수학을 생산하기 위해 노력하겠습니다. http://arduino.cc/en/Reference/map

그래서 이와 같은 것이 필요합니다. eps = map (입력, 0, 7000, -7, +7); 나는 가장 빠른 방법을 말할 것

+0

'map '은 명백한 수동 매핑 (즉, 입력 값을 출력에 고르게 분배하지 않음)과 동일한'문제 '를 나타내는 것으로 보입니다. 물론 이것은 필수 기능 일 수 있으므로 반드시 버그는 아닙니다 ... –

2

은 다음과 같습니다

switch (int(input)/500) 
{ 
case 0: ... // 0..500 
case 1: ... // 500..1000 
case 2: ... // 1000..1500 
etc 
} 
2

그것은 당신이 달성하기 위해 무엇을하려고하는 코드 예제는 전혀 분명하지 않다,하지만 당신이 균일하게 (0 7000) 배포하려는 input 가정 (-7 to 7) eps 값을 사용하면 모든 간격이 똑같이 표시되므로 500의 배수를 사용할 수 없습니다. 500을 사용하면 매우 작은 범위의 input 값에서만 극값 (-7 또는 7) 중 하나가 발생합니다 .

int eps(double input) { 
    return ((int)(input/500.0)) - 7; 
} 

그러나,이 기능을 사용하면 모든 다른 사람보다 7의 eps 값이 훨씬 더 희소하게 다음과 같은 매핑을 생성합니다

당신은, 예를 들어, epsinput에서 계산하기 위해 다음과 같은 기능을 사용할 수 있습니다 :

  input   | eps 
>= 0.0 and < 500.0 | -7 
>= 500.0 and < 1000.0 | -6 
>= 1000.0 and < 1500.0 | -5 
>= 1500.0 and < 2000.0 | -4 
>= 2000.0 and < 2500.0 | -3 
>= 2500.0 and < 3000.0 | -2 
>= 3000.0 and < 3500.0 | -1 
>= 3500.0 and < 4000.0 | 0 
>= 4000.0 and < 4500.0 | 1 
>= 4500.0 and < 5000.0 | 2 
>= 5000.0 and < 5500.0 | 3 
>= 5500.0 and < 6000.0 | 4 
>= 6000.0 and < 6500.0 | 5 
>= 6500.0 and < 7000.0 | 6 
>= 7000.0    | 7 

당신이 고른 분포를 원하는가 아닌 경우, 다음과 같은 코드를 사용해야합니다