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])
//------------------------------------------------------------------------------
사용례
test = (float)Interpolation(voltageX, voltageY, 10, adc_value);