Про алгоритм поиска максимума параболы.
Атмосферное давление от высоты (приблизительно):
P = P_0 * exp(h / h_0)
где h_0 — постоянная атмосферы (приблизительно 7500 метров).
Тогда высота от давления:
h = h_0 * ln(P / P_0)
где P_0 — давление на поверхности земли.
Логарифм приблизительно считается так:
ln(x) = 1 - x + x
2 / 2 - x
3 / 6 ... +(-x)^n / n!
Сильно точно считать не имеет смысла, так как атмосфера всё равно устроена несколько иначе.
Для использования барометра надо ещё знать, что показывает АЦП при вакууме.
Назовём эту величину U_00. и запомним её в EEPROM.
Тогда:
P = U - U_00 — будем считать текущим значением давления;
P_0 = U_0 - U_00 — будем считать давлением на поверхности, его надо запомнить перед стартом;
Теперь можно вычислять высоту над местом старта:
x = P / P_0
h = h_0 * (x - x*x / 2)
АЦП.
Как я уже писал когда-то, полезен такой фильр:
dU = U_new - U_f;
if (dU > 0) U_f++;
if (dU < 0) U_f--;
В этом случае помехи или сбои не будут сильно влиять на фильтрованное знвчение U_f.
Потом множество фильтрованных измерений можно усреднить на некоторый интервал времени.
Замечу, что если усредняем, скажем, за секунду, и если только что закончился очередной интервал, то усреднённое значение относится к моменту времени на полсекунды в прошлом.
Поиск максимума параболы. Без вывода, сразу ответ. Для интервала усреднения 1 секунда.
h_1 — последнее усреднённое значение;
h_2 — предпоследнее усреднённое значение;
h_3 — пред-пред-последнее усреднённое значение;
t = ((h_1 - h_3) / (2 * h_2 - h_1 - h_3) - 3) / 2
t — это через сколько секунд будет достигнут максимум.
Если оно положительное, значит в будущем, если отрицательное, уже поздно.:)
Вообще-то, вот эта величина является ускорением (dt — интервал усреднения):
a = (2 * h_2 - h_1 - h_3) / 2 / dt
2
И это ускорение должно быть равно в апогее 9.81.
Сначала, пока ракета летит быстро и тормозится воздухом, ускорение гораздо больше g, в апогее (если полёт вертикальный) оно равно g, потом, когда опять ракета тормозится воздухом, оно меньше g.
Вычисленное ускорение можно использовать как предохранитель от ложного срабатывания, если оно значительно (в разы) больше g, то взводить блокирующий таймер. Например из расчёта t = a / g - 1 секунд, но не более 5.