Построить кривую по трем или более точкам?

Тема в разделе "Arduino & Shields", создана пользователем black-stripe, 8 июл 2018.

  1. black-stripe

    black-stripe Нерд

    Всем привет.

    Делаю тахометр для авто.
    ЭБУ мотора выдает 0-5 В в зависимости от оборотов.
    Обороты 0-7500 об/мин.
    Необходимая точность 50 об/мин.

    Для того, чтобы дробные числа напряжения хранить в массиве и сопоставлять им данные из массива оборотов не хватает памяти (минимум 76 значений float).

    Нужна математика, наверняка, есть формула расчета промежуточных значений по известным точкам?

    Дело в том, что изменения не линейны, ключевых точек замерить вольтметром могу сколько угодно, сейчас сделал на каждую 1000 оборотов.

    Заглушенный - 0,55
    400 об/мин - 0,8 В
    600 - 0,83
    850 - 0,89
    900 - 0,92
    1000 - 0,95
    2000 -1,42
    3000 - 1,85
    4000 - 2,32
    5000 - 2,7
    6000 - 3,15
    7000 - 3,5


    Выпускники физматов и просто образованные люди, подскажите направление мысли или формулу.

    Спасибо.
     
  2. b707

    b707 Гуру

    Во-первых,нафига там флоат? Напряжение вы измеряете функцией analogRead() , которая выдает целые числа - так зачем вам эти значения переводить в напряжение? Переводите сразу в обороты.
    Вовторых,,у вас таблица значений - константы, значит можно положить ее в PROGMEM - в котором хватит места не только на 76 значений. а даже на пару тысяч
     
  3. black-stripe

    black-stripe Нерд

    Действительно, зачем я пытаюсь работать с напряжением, если могу работать с целыми числами аналогрид ))) спасибо. Пока сделаю так.

    А что по поводу интерполяций /апроксимаций?Хочется оставить ключевые точки, а остальное высчитать, так как в коде несколько сопоставлений входящих данных и с готовым набором - это видится оптимальным решением.
     
  4. DIYMan

    DIYMan Гуру

    См. кривые Безье.
     
  5. Arkad_snz

    Arkad_snz Гик

    Когда-то я вошел в этот форум в надежде встретиться со знатоками в давно интересной мне области (робототехника), да и область - особенная - не арифметика, и не литература - в школе и д/с не рассказывают.
    Можно было (мне по-первости) ожидать, что здесь (вживую) "трут" передовые идеи, смелые, неординарные решения... Ну, а, где еще! Живых корифеев темы я уже прослушал, наобщался. То, что есть в книгах - сходил в библиотеку - ознакомился.
    Остается "живое" общение с обоюдным накоплением опыта...
    А, на поверку: Появляется новая тема - "О! Посмотрим, что-то новенькое!?", Глянь - а там "Как навернуть гайку на болт?", и долгие рассуждения о моделях и особенностях гаек и болтов...
    Теперь вот оказывается, что задача интерполяции - краеугольная задача робототехники, и над ней бьются лучшие умы страны.
     
    ИгорьК и parovoZZ нравится это.
  6. black-stripe

    black-stripe Нерд

    Открытое информационное пространство снижает порог входа в тему, понижает средний результат, но помогает развивать отрасль.

    Хотите дискуссий на уровне - вперед, в MIT и Boston Dynamics, где нет вопросов от новичков и много робототехники.

    Отвечайте по теме, пожалуйста, каким бы ни был вопрос.
     
  7. Например вы хотите кривую вычислить по 4 аргументам x1,x2,x3,x4 (обороты) c соответствующими им данными АЦП (y1,y2,y3,y4). Составляете систему уравнений из 4 полиномов (4-1)й степени

    y1 = A + B * x1 + C * x1^2 + D * x1^3
    y2 = A + B * x2 + C * x2^2 + D * x2^3
    ...
    y4 = A + B * x4 + C * x4^2 + D * x4^3

    и решаете ее - ищете коэффициенты A,B,C,D. Задачка для 5-классника.

    Сами понимаете - в какую сторону считать - напряжение от оборотов или обороты от напряжения - дело ваше.
     
    Последнее редактирование: 9 июл 2018
    Mitrandir и parovoZZ нравится это.
  8. parovoZZ

    parovoZZ Гуру

    А вот у меня другая функция и работает в разы быстрее)))
     
  9. DetSimen

    DetSimen Гуру

    Сплайны тебя спасуть, я думаю.
     
  10. black-stripe

    black-stripe Нерд

    Плохо жить без осциллографа, завел обороты в ардуину и посмотрел еше раз - ба! Да это ж меандр с изменяемой частотой.
    Вообщем проблему решил посчитав импульсы в в единицу времени по прерыванию.

    Спасибо за советы, проведу эксперименты со всеми вариантами, но уже к резистивному датчику температуры с опорным напряжением.
     
    Последнее редактирование: 9 июл 2018
  11. black-stripe

    black-stripe Нерд

    Для температурных датчиков сделал интерполяцию на полиномах Лагранжа. Семь точек достаточно, чтобы покрыть 220 градусов и 0-5 В. Однако, эксель интерполирует точнее при равнораспределенных ключевых точках, при использовании полинома четвертой степени пришлось кучковать ключевые точки ближе к отрезкам графика с наибольшей кривизной.
    Как-нибудь потом разберусь почему в экселе так хорошо выходит интерполяция.
     
  12. Не понял. Если вам надо кривую по семи точкам - задавайте семь полиномов шестого порядка
    Yn = A + B*Xn + ... + G*Xn^6
    И решайте - ищите коэффициенты A...G. Только это перебор - обычно 4-х хватает запредельно.
    .
    Главное - когда решаете - не пользуйтесь десятичными дробями (типа 12, 0345). Калькулятор округляет промежуточные результаты. Это приводит к накоплению
    ошибки и неточности в результате. Пользуйтесь натуральными дробями типа 123 / 456. Об этом в математике специально предупреждают. Я забыл предупредить, пардон.
    Лучший способ решения - методом Гаусса. В десятичный вид переводите в самом конце.
     
    Последнее редактирование: 11 июл 2018
  13. parovoZZ

    parovoZZ Гуру

    у меня в ЛЭТИ за такое сразу незачет на экзамене ставили.