Часть 1 из 4От импульсов к лошадиным силам. Или как я хотел просто измерить обороты, а пришлось вспомнить физику, математику и немного помучить микроконтроллер 
Продолжаю строительство диностенда.
И пока механическая часть постепенно обрастает железом, решил заняться ещё одной интересной задачей — разработкой собственной программы телеметрии.
Причём речь не только о красивых стрелочных приборах, графиках мощности и крутящего момента.
Нарисовать стрелку, которая бодро бегает по шкале, не такая уж сложная задача.
Гораздо интереснее понять, насколько правду она показывает.

Ведь никаких датчиков лошадиных сил, как известно, не существует.
А жаль!
Прикрутил бы такой датчик к ролику, подключил три провода и пошёл пить кофе.
Но приходится идти более сложным путём.
Попробую рассказать, с чего начинал, какие проблемы обнаружились и почему задача измерения оборотов оказалась гораздо интереснее, чем представлялось первоначально.
Немного физикиПринцип работы инерционного диностенда довольно прост.
Двигатель через колесо раскручивает массивный ролик, обладающий определённым моментом инерции.
Чем больший крутящий момент передаётся на ролик, тем быстрее при прочих равных условиях увеличивается его угловая скорость.
Кинетическая энергия вращающегося тела определяется формулой:
E = ½ × J × ω²Здесь J — момент инерции в кг·м², а ω — угловая скорость в рад/с.
Если мы знаем момент инерции и можем определить угловое ускорение ролика, то получим динамический момент:
M = J × αгде α — угловое ускорение, рад/с².
А мощность, затрачиваемая на ускорение вращающихся масс:
P = M × ω = J × α × ωВот, собственно, и вся основная физика инерционного диностенда.
Конечно, это базовая модель.
В реальном стенде есть механические потери, другие вращающиеся массы, а мощность непосредственно на коленчатом валу двигателя не равна мощности, передаваемой ролику.
Однако сейчас речь именно об измерениях, поэтому вопросы учёта потерь пока оставим в стороне.
Обратите внимание на один важный момент.
Для вычисления мощности недостаточно просто знать скорость вращения ролика.
Необходимо определить, насколько быстро эта скорость изменяется.
То есть вычислить ускорение.
Именно с этого момента простая задача измерения оборотов начинает постепенно превращаться в довольно увлекательное издевательство над собственным мозгом.
Первая идея — оптический энкодер
Первоначально я рассматривал использование оптического энкодера высокого разрешения.
Логика вполне понятная: чем больше импульсов за оборот, тем подробнее мы можем отслеживать вращение ролика.
Современные энкодеры способны выдавать сотни и тысячи импульсов, а при квадратурном декодировании можно получать ещё больше отсчётов.
Казалось бы, ставим энкодер с максимальным разрешением, подключаем к микроконтроллеру и наслаждаемся точностью.
Но, как обычно, выяснилось, что большое количество цифр ещё не означает большого количества правды.
Метод №1. Считаем импульсыСамый очевидный способ измерения оборотов — подсчитывать количество импульсов за фиксированный промежуток времени.
Например, каждые 10 миллисекунд контроллер считает поступившие импульсы и вычисляет скорость.
Формула простая:
RPM = 60 × N / (K × T)Здесь N — количество зарегистрированных импульсов, K — число учитываемых импульсов за один оборот, T — длительность измерительного окна в секундах.
Этот способ называют M-method, или методом подсчёта импульсов.
Теперь немного математики.
Предположим, энкодер обеспечивает 1024 учитываемых отсчёта за оборот, а измерительное окно составляет 10 миллисекунд.
При скорости 60 об/мин за это время должны пройти:
N = 1024 × 60 / 60 × 0,01 = 10,24 импульса.Но контроллер, зараза такая, дробные импульсы регистрировать отказывается.

Поэтому в одном окне он насчитает 10, а в другом 11.
Посмотрим, что получится.
При 10 импульсах:
RPM = 60 × 10 / (1024 × 0,01) = 58,59 об/минПри 11 импульсах:
RPM = 60 × 11 / (1024 × 0,01) = 64,45 об/минА теперь самое интересное.
Реальная скорость вращения составляет 60 об/мин, но наши измерения показывают:
10 импульсов: 58,59 об/мин, ошибка −2,34%.
11 импульсов: 64,45 об/мин, ошибка +7,42%.
И это при совершенно постоянной скорости вращения!
Ролик спокойно крутится с частотой 60 об/мин и даже не подозревает, какие страсти происходят внутри микроконтроллера.
Один дополнительный импульс изменяет результат сразу на:
ΔRPM = 60 / (1024 × 0,01) = 5,86 об/мин.Проблема называется квантованием измерения.
Естественно, возникает желание увеличить время подсчёта.
Например, вместо 10 миллисекунд использовать 100.
Тогда получаем:
ΔRPM = 60 / (1024 × 0,1) = 0,586 об/мин.Шаг квантования уменьшился в десять раз!
Замечательно!
Правда, теперь мы измеряем среднюю скорость за более длительный интервал.
Если в течение этого времени ролик заметно ускорился, информация о быстрых изменениях скорости частично потеряется.
Посмотрим на ситуацию при разных оборотах, сохранив измерительное окно 10 мс.
60 об/мин: 10,24 импульса, показания 58,59 или 64,45;
600 об/мин: 102,4 импульса, показания 597,66 или 603,52;
3000 об/мин: 512 импульсов, показания 3000 при идеальных условиях.
На высоких оборотах относительное влияние одного лишнего или недостающего импульса становится меньше, но сам шаг квантования остаётся прежним — те же 5,86 об/мин.
Причём третья строка не означает, что на 3000 об/мин измерение всегда идеально.
Просто в выбранном примере за 10 мс укладывается целое количество периодов.
В реальном измерении присутствуют границы окна, нестабильность скорости, временные погрешности и другие факторы.
Получается своеобразный обмен: уменьшаем погрешность квантования, но ухудшаем временное разрешение.
Для обычного тахометра такое поведение вполне может быть приемлемым.
Но диностенд-то интересует не только скорость.
Ему ещё и ускорение подавай!