Micom_Electric/마이컴_원칩 2008. 6. 28. 20:10

AVR ATMega - one chip - Interpolation logic
인터폴레이션 로직, 작은 배열인 경우 적용할 수 있다, 리니어 서치법으로 작성해서
큰 배열인 경우 속도가 느리므로 그경우는 quick search 방법으로 변경할 필요가 있다
(퀵서치 또는 이분법은 대학교 때 작성해 본거라 기억이 없다 ㅠ.ㅠ)

axisX - x 축 값을 넣어둔 배열
axisY - y 축 값을 넣어둔 배열

범위를 벗어난 경우는 상 하한치를 돌린다.
//------------------------------------------------------------------------------
const uint16_t voltageX[] =
 {0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
const uint16_t voltageY[] =
 {0, 50,  100, 150, 200, 250, 300, 350, 400, 450,  500}; //100 times
//------------------------------------------------------------------------------

중략

//------------------------------------------------------------------------------
uint16_t Interpolation(uint16_t xaxis[], uint16_t yaxis[], uint8_t num, uint16_t xval){
 uint8_t min=0, max=0;
 uint16_t yval;

 min = 0;
 max = num;
 for(uint8_t i = 0; i < num; i++){
  if(xaxis[i] >= xval){
   max = i;
   break;
  }else
   min = i;
 }
  // incline = (yaxis[right]-yaxis[left]) / (xaxis[right]-xaxis[left])

// yval = y[left] + (incline * offset)
// rearrange formula to avoid float
   yval = (yaxis[right]-yaxis[left]) * (xval-xaxis[left]);
yval = yaxis[left] + yval / (xaxis[right]-xaxis[left]);
return yval;
}
//------------------------------------------------------------------------------

사용례

 test = (float)Interpolation(voltageX, voltageY, 10, adc_value);

posted by 털보네i
: