Уроки ардуино: измеряем скорость вращения спинера

Измеряем скорость вращающегося спиннера с помощью Ардуино

Создадим экспериментальную установку для измерения скорости, частоты, времени периода вращения спиннера. С помощью лазерного излучателя и фоторезистора мы можем сделать это довольно легко.

Шаг 1. Введение

Мы использовали 4-битный светодиодный дисплей для отображения данных и кнопку для изменения отображения типа данных.

Что это нам покажет?

  • Тангенциальная скорость в м/с или км/ч;
  • Частота / Число оборотов в секунду;
  • Период времени в миллисекундах. Время полного оборота.

Как это работает?

  • Вращающийся спиннер иногда перекрывает испускаемый лазерный луч и Arduino помогает фиксировать эти изменения;
  • Он ждет, когда крыло спиннера перекроет луч и запомнит время, после, ан следующем крыле, также фиксирует время;
  • Итак, у нас есть одна треть периода времени, если вы используете спиннер с тремя крыльями и тогда – это просто математика.

Шаг 2. Список деталей

Что мы использовали в уроке?

  • Arduino Uno;
  • Макетную плату;
  • Источник лазера (часть набора датчиков 37 в 1), но вы также можете использовать фонарик, но вам может потребоваться немного изменить программу;
  • Фоторезисторный модуль KY-018 (часть набора датчиков 37 в 1);
  • 2 x Сопротивление 10 кОм;
  • 4-разрядная цифровая катодная трубка (не нужна для эксперимента, вы также можете показать результаты на вашем ПК);
  • 16 проводов Jumper M-M (папа – папа);
  • 9 проводов Jumper M-F (мама-папа);
  • Кнопка;
  • Деревянные поверхности для фиксации лазерного излучателя и фоторезистора;
  • Спиннер;
  • Горячий клей;
  • Скотч.

Шаг 3. Конструируем устройство

  1. Используйте горячий клей, чтобы сначала зафиксировать фоторезистор, а затем лазерный излучатель. Лазерный луч должен попадать на фоторезистор. Вы также должны зафиксировать макетную плату и Arduino.
  2. Подключите компоненты, как показано на фотографиях выше.
    – Подключите фоторезистор к A0;
    – Подключите кнопку к A1;
    – Подключите контакты светодиодного дисплея так:
    1 к Arduino D2
    2 к Arduino D6
    3 к Arduino D11
    4 к Arduino D3
    5 к Arduino D4
    6 к Arduino D7
    7 к Arduino D10
    8 к Arduino D9
    9 к Arduino D13
    10 к Arduino D8
    11 к Arduino D12
    12 к Arduino D5
  3. Заклейте отверстия спиннера скотчем, потому что это может повлиять на ваши данные.

Шаг 4. Программирование

Используйте код ниже. Я новичок в Arduino и программировании, поэтому код может быть не идеальным. Но для меня он сработал хорошо. Я хотел бы немного объяснить код:

  • Он содержит функцию, называемую «периодом», она ждет начала крыла (1) и измеряет пройденное время до следующего крыла (2).
  • В функции цикла он вычисляет и печатает его на светодиодном дисплее.
  • Функция changeSlide изменяет напечатанные данные, когда вы нажимаете кнопку.
  • Функция printNumber печатает указанный номер на дисплее светодиода. Он может обрабатывать только целые числа. Так, например: если вы хотите напечатать номер 23.46, вам нужно умножить его на 100, а затем поместить запятую после 2-й цифры. так вот: printNumber (23.46 * 100,2);

Если вы не используете светодиодный дисплей, вы должны удалить всю функцию printNumber. И вместо этого вы можете использовать последовательный монитор или любой другой дисплей,

Шаг 5. Итоговый результат и видео

Он показывает тангенциальную скорость по умолчанию. Нажмите кнопку, пока экран пуст:

  • Если он показывает FFFF, он отображает частоту.
  • Если он показывает 7777, он отображает период времени.
  • Если он показывает SSSS, он отображает скорость тангетиона в м/с, снова нажимайте его и он показывает скорость в км/ч.

Если у вас возникнут вопросы об эксперименте – пишите нам на почту или оставляйте комментарии.

ОБОРУДОВАНИЕ
ТЕХНОЛОГИИ
РАЗРАБОТКИ

Блог технической поддержки моих разработок

Урок 74. Регулировка скорости вращения двигателя без обратной связи. Измерение периода и частоты сигналов с помощью Ардуино.

Продолжение разработки ПИД-регулятора скорости вращения двигателя постоянного тока. В уроке запустим двигатель без обратной связи. Научимся измерять временные параметры импульсов дискретного сигнала.

Попробуем управлять двигателем только с помощью ШИМ, не используя датчик оборотов.

Регулировка скорости вращения двигателя без обратной связи.

Я написал простую программу, которая формирует ШИМ пропорциональный напряжению на входе A0.

  • Измеряет напряжение сигнала на входе A0.
  • Усредняет его для защиты от помех.
  • Формирует ШИМ с коэффициентом заполнения пропорциональным среднему напряжению на выводе A0.
  • При формировании ШИМ учитывает “мертвое время”.
  • Выводит значение ШИМ в последовательный порт для контроля.

Вот скетч программы:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Поясню, что такое “мертвое время”. Допустим, ШИМ работает с высокой частотой, например, 62,5 кГц. Если мы зададим ему коэффициент заполнения 1, то это означает, что с периодом 16 мкс будет формироваться импульс длительностью 0,0625 мкс. Импульс такой короткой длительности транзисторный ключ не отработает, не успеет. В результате транзистор будет какое-то время в полуоткрытом режиме и не к чему хорошему это не приведет. Особенно на высоком напряжении.

Поэтому необходимо искусственно ограничивать импульсы минимальной длины. Если значение 1 транзистор не способен отработать, значит, вместо него необходимо формировать 0. Тоже самое в конце диапазона ШИМ. Например, значение 254 необходимо заменить на 255.

Отработку ”мертвого времени” производит следующий блок программы.

#define DEAD_TIME 10 // мертвое время

// мертвое время
if( valPwm
if( valPwm > (MAX_PWM – DEAD_TIME) ) valPwm= MAX_PWM;

Если значение ШИМ меньше заданного, оно заменяется на 0. Если больше, то оно равно максимальному значению ШИМ.

В программе в определенных пределах можно изменять частоту периода ШИМ.

TCCR2B= 1; // 62 500 Гц
//TCCR2B= 2; // 7 812 Гц
// TCCR2B= 3; // 1 953 Гц
// TCCR2B= 4; // 977 Гц
// TCCR2B= 5; // 488 Гц
// TCCR2B= 6; // 244 Гц
// TCCR2B= 7; // 61 Гц

Для формирования ШИМ используется таймер 2 и вывод 11.

Можно переключиться на вывод 3. Изменения коснутся только строки.

Использование других выводов недопустимо.

Загружаем скетч в контроллер, открываем монитор последовательного порта.

Вращаю переменный резистор, подключенный к входу A0. Монитор показывает изменение ШИМ. В положении резистора от 0 до максимума ШИМ равен 0, затем скачком меняется до 10. Дальше плавное изменение до 245 и скачок до 255. Т.е. заданное ”мертвое время” 10 отрабатывается правильно.

Дальше подключаем к схеме питание 12 В и проверяем работу ключа с мотором-вентилятором. Я проверил для разных частот ШИМ. Как не странно, лучше всего работает на низких частотах 244 и 61 Гц. Мотор начинает вращаться с ШИМ равным 30. На частоте 62,5 кГц вентилятор начинает вращаться при значении ШИМ 60. На средних частотах он еще противно пищит.

Когда Игорь проводил эти испытания на мощном двигателе 500 Вт, он категорично выбрал высокую частоту 62,5 кГц. На высоких частотах его двигатель вращается равномерно, без вибраций. Тише работает, начинает крутиться с меньшего значения ШИМ. Т.е. для каждого двигателя лучше выбирать частоту ШИМ экспериментально.

В любом случае регулировка с помощью ШИМ без обратной связи работает, скорость двигателя изменяется плавно. Конечно, частота оборотов непредсказуема и зависит от механической нагрузки.

Измерение периода и частоты входных импульсов с помощью Ардуино.

Чтобы стабилизировать скорость вращения мотора необходимо ее измерять. А скорость в свою очередь определяется частотой импульсов датчика Холла. Об этом сказано в предыдущем уроке. Как следствие возникает задача – измерение периода и частоты импульсов. Давайте на короткое время забудем про двигатель и научимся измерять частоту импульсов дискретного сигнала.

Задача не очень простая. Скорость вращения мотора у Игоря достигает 12000 об/мин. При такой скорости и использовании с датчиком Холла двух магнитов надо измерять временные параметры с периодом 2,5 мс. Если мы хотим обеспечить точность не более 1%, то разрешающая способность измерителя должна быть не более 250 мкс.

Но бывают и более скоростные двигатели. Часто используются датчики, которые формируют более 2 импульсов на оборот. Это еще уменьшает время дискретности измерителя.

А с другой стороны двигатель может вращаться и со скоростью 60 об/мин. Это соответствует периоду импульсов 0,5 сек.

  • наш измеритель должен иметь высокую разрешающую способность по времени (не более десятков мкс)
  • и широкий диапазон измерения (не менее 1 сек).

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

Поэтому будем использовать аппаратный узел микроконтроллера – таймер в режиме захвата. У микроконтроллера ATmega328 только таймер 1 может работать в этом режиме.

Лучше будет, если вы почитаете об этом режиме в документации на ATmega328. Я расскажу коротко и чисто с практической точки зрения.

Входной сигнал подключаем к входу ICP1 (вывод 8). Использование других выводов недопустимо.

Микроконтроллер выделяет нужный фронт сигнала на входе ICP1 (я задал перепад с высокого уровня на низкий) и по нему перегружает содержимое таймера 1 в специальный регистр ICR1. Можно считать значение этого регистра и тем самым узнать, когда был перепад входного сигнала, даже если чтение произошло позже самого события.

Дальше немного сложно в понимании, но объем информации небольшой. При желании можно разобраться по шагам.

Мы задаем режим работы таймера 1. Переводим его в режим простого счетчика от внутреннего генератора с максимальной частотой. В этом режиме каждые 0,0625 мкс к счетчику прибавляется 1. При достижении максимального значения 65536, он начинает считать с 0. Также задаем режимы для захвата и разрешаем прерывания таймера 1 по захвату и переполнению.

// установка режима захвата таймера 1
pinMode (8, INPUT_PULLUP); // вход сигнала захвата ICP, входные измеряемые импульсы
TCCR1A = 0; // нормальный режим работы таймера 1
TCCR1B = 0; // выбор отрицательного фронта входного сигнала
TCCR1B = (1 включение подавления шума входного сигнала, частота тактирования – внутренний генератор, без деления
TCNT1 = 0; // сброс счетчика
TIMSK1 = (1 разрешения прерываний таймера 1 по захвату и переполнению

Создаем обработчик прерывания по захвату (фронту входного сигнала).

// прерывание по сигналу захват (по отрицательному фронту измеряемого сигнала)
ISR (TIMER1_CAPT_vect) <
periodTime = (unsigned long)ICR1 | (((unsigned long)numOverflowTimer1)
TCNT1 -= ICR1;
numOverflowTimer1 = 0;
>

В нем мы считываем значение регистра ICR1 и сохраняем его в переменной periodTime .

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

Что равносильно сбросу в 0 в момент захвата.

В результате вышеописанных действий в переменной periodTime оказывается время между захватами. Т.е. время между отрицательными фронтами входного сигнала. Реальное время будет равно значению periodTime , умноженному на дискретность таймера 0,0625 мкс.

Все было бы хорошо, но при периоде сигнала более 4096 мкс ( 65536 * 0,0625 мкс) таймер 1 переполнится. Значит, нам надо считать еще и переполнения таймера 1.

Для этого создаем обработчик прерываний по переполнению таймера.

// прерывание по переполнению таймера 1
ISR (TIMER1_OVF_vect) <
numOverflowTimer1++;
>

И полученное значение прибавляем к periodTime.

periodTime = (unsigned long)ICR1 | (((unsigned long)numOverflowTimer1)

Теперь все. В переменной periodTime получаем период входных импульсов. Для вычисления реального времени необходимо умножить его на 0,0625 мкс.

Пишем программу измерения временных параметров входного сигнала и проверяем ее работу.

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Для проверки формируем на выводе 5 сигнал ШИМ с частотой 976,56 Гц.

analogWrite(5, 200); // формирование тестовых импульсов на выводе 5 (976,56 Гц)

Соединяем вывод 8 с выводом 5. Запускаем монитор последовательного порта.

Тестовый сигнал формируется аппаратным способом, поэтому имеет высокую стабильность.

Надо проверить работу нашего измерителя в полном диапазоне.

Для этого тестовый сигнал на выводе 5 формируем с помощью системного времени Ардуино.

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Период задается в строке.

#define TEST_TIME 10 // время периода тестового сигнала (мс)

Проверяем для периода 10 мс.

Вот период 100 мс

Высокой точности от формирования тестового сигнала с помощью системного времени ждать не приходится. Но измеритель работает нормально в широком диапазоне периода входного сигнала.

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

В следующем уроке вернемся к двигателю. Будем измерять его скорость вращения.

Тахометр или спидометр: Поток мыслей про измерение частоты в Arduino

Предистория

Если дома есть Arduino, в гараже машина или мотоцикл, а то и хоть мотособака, в голове туманные представления о программировании — возникает желание измерить скорость движения или обороты двигателя, посчитать пробег и моточасы.

В данной статье я хочу поделиться своим опытом по изготовлению подобных поделок.

Немного физики

Для измерения частоты вращения нам понадобится датчик положения колеса/вала/круга/итп. Датчик ставится как правило один. Возможно, что он будет срабатывать не один раз на каждый оборот. Например, у вас датчик Холла и 4 магнита на колесе. Таким образом, для правильного вычисления частоты нужно знать:

  • количество срабатываний датчика на один оборот К;
  • минимальная ожидаемая частота Мин.
  • максимальная ожидаемая частота Макс.

То есть, если частота меньше разумного минимума, то считаем, что она равна нулю, если больше максимума — игнорируем показания.

С количеством срабатываний понятно, но зачем ещё эти мины и максы? Давайте рассмотрим сначала варианты расчёта частоты.

Со скоростью всё проще, достаточно знать число π, диаметр колеса, а частоту вращения мы уже знаем.

Болванка для кода

Так как мы имеем дело с такими нежными величинами как время и пространство, то лучше сразу освоить прерывания.

Обратите внимание на модификатор volatile у переменной counter. Все переменные, которые будут изменяться в обработчике прерывания (ISR) должны быть volatile. Это слово говорит компилятору, что переменная может изменяться неожиданно и доступ к ней нельзя оптимизировать.

Функция ISR() вызывается каждый раз, когда появляется единица на ноге fqPin. Мы эту функцию не вызываем, это делает сам контроллер. Он это делает, даже когда основная программа стоит в ступоре на функции delay(). Считайте, что ISR() обслуживает событие, от вас не зависящее и данное вам свыше как setup() и loop(). Контроллер прерывает выполнение вашей программы, выполняет ISR() и возвращается обратно в ту же точку, где прерывал.

Обратите внимание, что в функции loop() мы отключаем прерывания вообще любые для того, чтобы прочитать переменную counter и сохранить её во временную переменную cnt. Потом, конечно же, включаем снова. Так мы можем потерять один вызов, конечно же, но с другой стороны, переменная unsigned long имеет 32 бита, а процессор ATMega32 8-битный, вряд ли он скопирует данные за один такт, а ведь в процессе копирования может случиться прерывание и часть данных изменится. По этой же причине мы копируем значение counter локально так как значение этой переменной при использовании в разных местах программы может быть разным опять же из-за изменения её в прерывании.

Тело функции ISR() должно быть максимально коротким, точнее, сама функция должна выполняться максимально быстро. Это важно, так как прерывается выполнение вашего кода, который может оказаться чувствительным к непредвиденным задержкам. Некоторые библиотеки отключают прерывания для выполнения чувствительных с задержкам операций, например для управления светодиодной лентой WS2812.

Считаем обороты за единицу времени.

Первое, что приходит в голову, это взять интервал времени и посчитать количество измерений.

Как и у многих простых решений, у этого есть неочевидные минусы. Для повышения точности измерений вам необходим довольно большой интервал времени. Принцип тот же, что и у Шума квантования. При времени оборота колеса сравнимом с временем подсчёта, существенные изменения скорости вращения не будут замечены. Показания такого частотомера будут различаться до двух раз на каждый отсчёт.

Для повышени точности на малой скорости можно увеличить число К, как это сделано, скажем, в автомобильной технике для датчика ABS. Можно увеличить время подсчёта. Делая и то и другое мы подходим ко второй проблеме — переполнению счётчика. Да, переполнение легко лечится увеличением количества бит, но арифметика процессора Arduino не умеет считать 64-битные числа столь быстро, как хотелось бы и как она это делает с 16-разрядными.

Увеличение времени расчёта тоже не очень хорошо тк нам надо знать частоту прямо сейчас, вот при нажатии на газ, а не через пару секунд. Да и через пару секунд мы получим скорее некое среднее значение. За это время можно несколько раз сделать врумм-врумм.

Есть другой метод. Он лишён вышеописанных недостатков, но, как водится, имеет свои.

Считаем интервал между отсчётами

Мы можем засечь время одного отсчёта и другого, вычислить разницу. Величина, обратная вычисленному интервалу и есть частота. Круто! Но есть минусы.

Что делать, если наше колесо крутится еле-еле и измеренный интервал превышает разумные пределы? Выше я предложил считать частоты ниже разумного минимума за ноль.

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

Так же хотелось бы некую статистику подсчётов для улучшения показаний, а мы берём лишь последнее значение.

Методом проб и ошибок я подобрал интервал отображения данных на дисплее в 250мс как оптимальный. Если чаще, то цифры размазываются, если реже — бесит тормознутость.

Комбинированный метод

Можно попробовать объединить достоинства обоих методов.

То есть, мы засекаем время не просто между отсчётами, а время между проверками данных и делим на количество отсчётов за это время. Получается усреднённый интервал между отсчётами, обратная величина от которого есть частота. Предоставим компилятору оптимизировать вычисления.

Обратите внимание, что за интервал считается не время опроса, как в первом примере, а время от последнего отсчёта до предыдущего последнего отсчёта в прошлом опросе. Это заметно поднимает точность вычисления.

Таким образом, мы можем получать вполне достоверные данные как на низких так и на высоких частотах.

Если использовать кооперативную многозадачнось, то можно сделать подсчёт, скажем раз 100мс, а вывод на дисплей раз в 250мс. Очень короткий интервал опроса снизит чувствительность к низким частотам.

Как говорят в рекламе, “но это ещё не всё”.

Ошибки дребезга

Для устрашения вас предположу, что измеряем частоту вращения двигателя от индуктивного датчика зажигания. То есть, грубо говоря, на высоковольтный провод намотан кусок кабеля и мы измеряем индукцию в нём. Это довольно распространённый метод, не правда ли? Что же здесь сложного может быть? Самая главная проблема — современные системы зажигания, они дают не один импульс, а сразу пачку.

Но даже обычная система зажигания даёт переходные процессы:

Старинные же кулачковые контактные вообще показывают замечательные картинки.

Как с этим бороться? Частота вращения не может вырасти мгновенно, не даст инерция. Кроме того, в начале статьи я предложил ограничить частоту сверху разумными рамками. Отсчёты, что происходят слишком часто можно просто игнорировать.

Другой вид помех — это пропадание отсчётов. Из-за той же инерции у вас не может измениться частота в два раза за одну миллисекунду. Понятно, что это зависит от того, что вы собственно измеряете. Частота биения крыльев комара может, вероятно и за миллисекунду упасть до нуля.

Статистическая обработка в данном случае становится уже достаточно сложной для маленькой функции обработки прерывания и я готов обсудить варианты в комментариях.

Особенности измерения скорости движения и скорости вращения.

При измерении скорости вращения бензинового двигателя надо обязательно учесть величину К, которая совсем не очевидна. Например, вы намотали провод на кабель свечи и ожидаете, что там будет одна искра на один оборот. Это совсем не так. Во-первых, у 4-тактного двигателя вспышка происходит один раз на два оборота, у 2-тактного один раз на оборот коленвала. Во-вторых, для упрощения системы зажигания коммутатор подаёт искру на неработающие в данный момент цилиндры, типа на выпуске. Для получения правильного К надо почитать документацию на двигатель или подсмотреть показания эталонного тахометра.

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

Вывод информации

Типичная обида начинающего разработчика автомобильной и мотоциклетной электроники “стрелки дёргаются, цифры нечитабельны” лечится простым способом — надо обманывать клиента. Вы что думаете, автомобильный тахометр всегда показывает вам правду? Конечно же нет! Хотя вам этот обман нравится и вы хотите, чтобы ваш прибор дурил голову так же.

Стрелки

Если включить зажигание на новом модном автомобиле или мотоцикле, стрелки приборов сделают красивый вжух до максимума и медленнее опадут до нуля. Вот! Вот это нам и надо сделать. Надо, чтобы при показе максимальной величины стрелка не метнулась к ней мгновенно и не упала как акции лохотрона в ноль.

Итак, нам надо учитывать максимальную скорость стрелки на увеличение и максимальную на уменьшение показаний. Совсем хорошо сделать эти скорости нелинейными, чтобы стрелка сначала двигалась быстрее, а потом чуть помедленнее приближалась к заданному значению.

Вот пример с нелинейным выводом показаний:

Вы можете поиграть с коэффициентами. Этот же принцип используется при выводе громкости сигнала, например, у любого аналогового индикатора: стрелки, полоски, яркость, цвет, размер итп. Приведённый пример самый простой, но и не самый красивый. Предлагайте ваши варианты в комментариях.

Цифры

С цифрами всё намного сложнее. Быстрые изменения показаний приводят к тому, что несколько порядков сливаются в мутное пятно. Для скорости, как и писал выше, можно задать интервал раз в секунду и глаз успеет прочитать три цифры.

В мототехнике не зря делают аналоговые индикаторы оборотов, точные цифры не нужны, важна относительная близость к оборотам максимального крутящего момента, к максимальным вообще и холостые.

Я предлагаю менять частоту вывода информации на дисплей в зависимости от степени изменения величины. Если обороты меняются, скажем, на 5% от последнего подсчёта, а не показа — можно затупить и показывать раз в 300-500мс. Если на 20%, то показывать раз в 100мс.

Можно огрубить шкалу и показывать только две значащие цифры

С учётом мототематики, можно довольно точно показывать обороты холостого хода как описано чуть выше и огрублять вывод на оборотах от двух холостых. На высоких оборотах для гонщиков важнее делать блинкеры типа “передачу вниз”, “передачу вверх” и “ты спалишь движок”. То есть держать двигатель около максимального крутящего момента и не дать ему крутиться выше максимальных разрешённых оборотов. Блинкеры замечательно делаются с помощью SmartDelay когда можно унаследовать от этого класса свой с заданной ногой контроллера и частотой мигания, там есть методы для переопределения и они вызываются раз в заданное время.

Идеи по отображению цифр тоже приветствуются в комментариях.

Вывод

Если наступить на все грабли, можно стать опытным разработчиком.

Программа тахометра

Увидим вереницу чисел — это и есть количество оборотов. Каждые 100мс в порт вываливается текущее число оборотов, которое пока для нас бесполезно. Вот если бы у нас вращалось колесо робота, то умножив количество оборотов на длину окружности колеса мы бы получили пройденное расстояние! Обязательно попробуем это сделать в уроке про контроль движения робота.

А пока перейдем к скорости вращения.

Расчёт скорости

Изменим программу. Каждые 100мс будем считать скорость по формуле:

где rot — количество оборотов, dt — время, пройденное с последнего расчёта.

Откуда взялось 60000? Дело в том, что формула V = rot/dt даст нам скорость в единицах об/мс. Ведь dt у нас в миллисекундах. Чтобы превратить миллисекунды в секунды нужно dt поделить на 1000. А чтобы секунды в минуты — еще поделить на 60. Вот и получается: V = rot * 60000/dt.

Загрузим программу и откроем плоттер для изображения наших данных в виде графика. Если мотор подключен к лабораторному источнику питания, можно менять напряжение и смотреть как меняется скорость вращения.

Также на графике виден шум — это колебания скорости вращения. К сожалению, коллекторный двигатель постоянного тока — машина не совершенная и его скорость имеет свойство «плавать». Но это тема совсем другого разбирательства.

Источники:

http://mypractic.ru/urok-74-regulirovka-skorosti-vrashheniya-dvigatelya-bez-obratnoj-svyazi-izmerenie-perioda-i-chastoty-signalov-s-pomoshhyu-arduino.html

http://habr.com/post/346126/

http://robotclass.ru/tutorials/arduino-tacho-irq/3/

http://xn--18-6kcdusowgbt1a4b.xn--p1ai/%D0%BC%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D0%B0%D1%8F-%D0%BF%D0%BB%D0%B0%D1%82%D0%B0/

Ссылка на основную публикацию