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