Micom_Electric/마이컴_원칩 2008. 6. 28. 21:49

ATMega8/ATMega128/ATmega168/ATmega32
Bin Interpolation logic
//------------------------------------------------------------------------------
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
//------------------------------------------------------------------------------

중략

참고 : Num은 배열의 맨마지막 인덱스 숫자로서 실제배열 원소 갯수 - 1 의 숫자임

=========== 2010.11 수정됨 ======================================

int16_t BInterp(int16_t *xaxis, int16_t *yaxis, uint8_t num, uint16_t xval){
  // when call the num means the last index value : 0...9 num=9
// Binary interpolation routine
uint8_t left, right, mid;
int16_t yval;
if(xval <= xaxis[0]) return(yaxis[0]);
else if(xval >= xaxis[num]) return(yaxis[num]);
else{
    left = 0;
right = num;
}
while((left+1) < right){
    mid = (left + right) / 2;
    if(xval < xaxis[mid])
    right = mid;
    else if(xval > xaxis[mid])
    left = mid;
    else
    return(yaxis[mid]);
    }
// 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;
}

//------------------------------------------------------------------------------

posted by 털보네i
: