Только что по приколу попробовал оба вида расчета.
Подключение библиотеки math.h и расчет экспоненты съедает 4к флеша и порядка 250 байт оперативной памяти.
Выполняется примерно 5300 тактов процессора. А там еще наверняка надо будет выполнить кучу действий, кроме вычисления экспоненты (умножения, деления..).Код:#include <math.h> ... uint8_t i; double d; double volatile p=0; d=1.545444342+i; p=p+exp(d); if (p==0) p=1; }
Код с аппроксимацией 16-битных значений
Основное затраченное время - выполнение умножений и делений. Выполняется порядка 350 тактов при 4х попаданиях в цикл (20 тактов на цикл). Съедает порядка 160 байт флеш-памяти, не ест оперативную память.Код:#define Temp1Count 5 uint16_t Temp1[Temp1Count][2] PROGMEM = // первое значение - абсцисса, второе - ордината { {0,40}, {5,80}, {26,200}, {42,300}, {70,400}, }; ... uint16_t InTemp; uint16_t RealTemp; uint16_t InLeftTemp; InTemp=5; i=Temp1Count; do { i--; InLeftTemp=pgm_read_word(&Temp1[i][0]); } while ((i>=0)&&(InTemp<InLeftTemp)); uint16_t InRightTemp=pgm_read_word(&Temp1[i+1][0]); uint16_t OutLeftTemp=pgm_read_word(&Temp1[i][1]); uint16_t OutRightTemp=pgm_read_word(&Temp1[i+1][1]); RealTemp=OutLeftTemp+(OutRightTemp-OutLeftTemp)*(InTemp-InLeftTemp)/(InRightTemp-InLeftTemp); if (RealTemp==81) ...
Тут правда надо четко просчитать, чтобы не было переполнений при умножении, либо вычисление RealTemp делать в int32.
В общем все зависит от необходимой точности и наличия ресурсов.




Ответить с цитированием