Датчик обороты для двигателя ардуино

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

Например: по нашей программе роботу нужно проехать 2 метра и повернуть налево, считаем что  у робота 2 одинаковых колеса с 3-ей шаровой опорой как у тележки Lego и они равны диаметру D = 5 см.

 Вычисляем длину окружности колеса = P x D = 3,14 х 5 = 15,7 см; Вычисляем сколько оборотов должны сделать двигатели робота чтобы он проехал 2 метра = 200 : 15,7 = 12,7 оборотов.

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

Модуль Датчик обороты для двигателя ардуиносчитывания угловых скоростей для моделей роботов FC-03 или  энкодер — это небольшая печатная плата с установленными на ней микросхемой LM393, а также несколькими другими электронными компонентами.

FC-03 модуль считывания угловых скоростей называют ещё датчиком оборотов или энкодером. Название происходит от принципа работы датчика.
Используется энкодер для определения скорости двигателя, подсчета импульсов. Датчик оборотов FC-03 снабжен специальным штырьковым разъемом (типа «папа») для подключения к плате микроконтроллера Arduino, AVR, ARM или д.р.

Модуль считывания угловых скоростей, созданный на основе двойного компаратора LM393 и щелевого датчика предназначен для совместного использования со специальными дисками, которые одеваются на вал редуктора или электродвигателя. Таким образом, микроконтроллер получает информацию непосредственно от энкодера о количестве оборотов, проделанных двигателем, и так определяется его скорость.

Диски одеваются на вал редуктора или электродвигателя, чтобы микроконтроллер получал информацию непосредственно от энкодера о количестве оборотов проделанных двигателем.

Датчик обороты для двигателя ардуино

Рис.1 Щелевой датчик ITR9608

Принцип действия

Воспринимающий элемент модуля – оптическая пара  ITR9608. В одном выступе корпуса расположен инфракрасный светодиод, направленный на фототранзистор находящийся в другом выступе.

Если в щель между выступами внести непрозрачную пластину, то ИК излучение от светодиода перекрывается и фототранзистор закрывается. Такой компонент иногда называют фотопрерывателем, но он только фиксирует прерывание светового потока.

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

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

Датчик скорости вращения FC-03 используется для измерения частоты вращения. Определить с его помощью направление вращения нельзя. На валу двигателя или шестерни редуктора устанавливается диск с отверстиями. Оптопара модуля имеет прорезь шириной 5 мм.

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

Электроника модуля делает сигнал датчика пригодным для восприятия цифровыми логическими микросхемами или микроконтроллером.

Принципиальная схема энкодера FC-03:

Датчик обороты для двигателя ардуино
Рис. 2
Датчик обороты для двигателя ардуино Датчик обороты для двигателя ардуино

Рабочее напряжение: 3.3 Вольт ~5.0 Вольт;
Ток потребления энкодера: 1.4 мА;
Ширина паза в щелевом датчике: 5 мм —  между передатчиком (инфракрасным светодиодом) и приемником (инфракрасным фототранзистором);
Используется микросхема: LM393 (двойной компаратор) с широким диапазоном питающего напряжения; импульсы прямоугольной формы TTL  (0 и 1)
и аналоговый сигнал по величине чувствительности ;
Плата модуля: PCB (англ. printed circuit board) — печатная плата;
LED (светодиоды) индикаторы питающего напряжения и цифрового выходного сигнала: низкий уровень, светодиод горит, высокий уровень-светодиод гаснет;
Вес: 8 г ;
Размеры  (ДxШxВ) прибл.: 32 x 14 x 10 мм;
Диаметр отверстия для монтажа датчика оборотов: 3 мм;
Рабочая температура: от 0 ° C ~ + 70 ° C; Датчик обороты для двигателя ардуино
VCC: напряжение: + 3.3 Вольт ~5.0 Вольт;

GND: напряжение: — 3.3 Вольт ~5.0 Вольт.

LM393 Датчик скорости для Arduino построен на микросхеме LM393 (двойной компаратор).

Датчик обороты для двигателя ардуиноДатчик обороты для двигателя ардуино

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

Характеристики микросхемы LM393:

  • Тип компаратора: Precision
  • Количество компараторов в микросхеме LM393: 2 штуки
  • Время отклика компаратора составляет: 1.3 мкс
  • Тип выхода компаратора: CMOS, MOS, TTL, DTL, ECL
  • Ток потребления компаратора составляет: 1 мА
  • Диапазон напряжения питания компаратора: от ± 1.0 В до ± 18 В
  •   Даташит микросхемы LM393 (формат PDF размер 144 КБ)
  • Модуль считывания угловых скоростей  снабжен специальным штырьковым разъемом (типа «папа») для подключения к плате микроконтроллера Arduino, AVR, ARM и др.
  • FC-03 модуль имеет специальное отверстие в плате, что облегчает его монтаж и крепление на любую роботизированную платформу или шасси робота.

Используется FC-03 модуль для определения скорости двигателя, подсчета импульсов, обнаружения препятствия. Он также станет полезным компонентом для любого робота под управлением микроконтроллера.

Используемые ресурсы:

Arduino и модуль фотоимпульсного датчика скорости вращения двигателя

Модуль датчика оборотов двигателя предназначен главным образом для определения скорости вращения вала электродвигателя. Этот модуль в совокупности с микроконтроллером может определять помимо скорости также количество импульсов и положение вала.

Датчик обороты для двигателя ардуино

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

Так в данном случае измеряется скорость – под событиями здесь понимаются импульсы, полученные в результате срабатывания оптического датчика во время вращения диска с прорезями. Датчик состоит из светодиода и фототранзистора, который воспринимает наличие или отсутствие излучения светодиода.

Схема

Представленная схема может быть использована для отправки зарегистрированных импульсов в микроконтроллер. Основой схемы является оптический датчик OS25B10 (OC1) со светодиодом и фототранзисторным выходом.

Далее идет микросхема сдвоенного компаратора LM393 (IC1), настроенная в качестве простого триггера Шмита. Зелёный светодиод (LED1) показывает наличие приложенного к схеме напряжения, а красный светодиод (LED2) контролирует выход модуля датчика скорости двигателя. Рекомендуемое рабочее напряжение модуля составляет от 4.5 до 5.5 В.

Датчик обороты для двигателя ардуино

Обратите внимание, что резистор R1 (180 Ом) используется здесь для ограничения рабочего тока светодиода внутри оптического датчика OS25B10 (OC1).

При необходимости вы можете изменить его номинал для вашего прототипа. Также вы можете подкорректировать значение резистора R2 (10 КОм) для получения необходимого напряжения для вашей схемы.

Резистор R7 (10 КОм) является опциональным подтягивающим резистором.

Энкодерный диск

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

Датчик обороты для двигателя ардуино

Энкодерный диск имеет несколько слотов или отверстий. Вы можете легко изготовить свой собственный диск из листа нержавеющей стали или жесткого пластика.

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

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

Датчик обороты для двигателя ардуино

Подключение и код

Датчик обороты для двигателя ардуиноПодключение:Датчик обороты для двигателя ардуино

Код:

int encoder_pin = 2; // импульсные сигналы от модуля
unsigned int rpm; // количество оборотов в минуту
volatile byte pulses; // количество импульсов
unsigned long timeold;
// количество импульсов на оборот
// в зависимости от вашего энкодерного диска
unsigned int pulsesperturn = 12;
void counter()
{
//обновление счета импульсов
pulses++;
}
void setup()
{
Serial.begin(9600);
pinMode(encoder_pin, INPUT);
//Прерывание 0 на цифровой линии 2
//Срабатывание триггера по спаду сигнала
attachInterrupt(0, counter, FALLING);
// Инициализация
pulses = 0;
rpm = 0;
timeold = 0;
}
void loop()
{
if (millis() — timeold >= 1000) {
//Не обрабатывать прерывания во время счёта
detachInterrupt(0);
rpm = (60 * 1000 / pulsesperturn )/ (millis() — timeold)* pulses;
timeold = millis();
pulses = 0;
Serial.print(«RPM = «);
Serial.println(rpm,DEC);
//Перезагрузка процесса обработки прерываний
attachInterrupt(0, counter, FALLING);
}
}

  • Перевод © digitrode.ru
Читайте также:  Датчик температуры двигателя ford kuga

Тахометр на Arduino

Тахометр — это полезный инструмент для подсчета RPM (оборотов в минуту) колеса или всего, что крутится. Самый простой способ сделать тахометр — это использовать ИК передатчик и приемник. Когда связь между ними прерывается, вы знаете, что что-то вращается и можете применять код для вычисления RPM, ориентируясь на частоту прерывания связи.

В этой статье мы рассмотрим, как использовать ИК-передатчик и приемник для изготовления тахометра с применением Arduino. Результат отображается на ЖК-дисплее 16х2.

Датчик обороты для двигателя ардуино

Целью данного проекта является создание системы с одним входом и одним выходом. На входе устройства присутствует сигнал, изменяющийся с высокого (+5В) на низкий (+0В) уровень при нарушении связи.

Согласно этому сигналу, Arduino будет увеличивать значение внутреннего счетчика.

Потом проводится дополнительная обработка и расчет, и по прерыванию триггера на ЖК-дисплей будет  выводиться рассчитанное RPM.

Для связи мы будем использовать ИК-луч от ИК-светодиода, включенного через низкоомный резистор так, чтобы светиться ярко. В качестве приёмника мы будем использовать фототранзистор, который при отсутствии света ИК-светодиода «закрывается».

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

Для вывода результата будет использоваться Arduino LCD интерфейс, поэтому мы можем вывести окончательное значение RPM на ЖК-дисплей.

  • Элементы:
    Arduino UNO
    16×2 LCD
    Макетная плата
    Подстроечный резистор 5 кОм
    Перемычки
    SIP разъёмы
    2x 2N2222 NPN транзистор
    Инфракрасный светодиод
    Фототранзистор
    Резистор 10 Ом
    Резистор 100 кОм
    Резистор 15 кОм или 16 кОм
  • Компьютерный вентилятор

Подробный список элементов

Все элементы используемые в проекте указаны выше, но я более подробно опишу функции основных элементов.

Arduino UNO
Это плата Arduino, которую мы будем использовать для обработки импульсов от прерывания ИК-луча, которые сообщают о нахождении лопасти компьютерного вентилятора между приемником и датчиком. Arduino будет использовать эти импульсы наряду с таймером, чтобы вычислить RPM вентилятора.

ЖК-дисплей 16×2
После того, как Arduino вычислило RPM, эта значение будет отображаться на дисплее в понятном для пользователя виде.

Подстроечный резистор 5 кОм
Этот подстроечный резистор будет использоваться для регулировки контрастности ЖК-дисплея 16×2. Он дает аналоговое напряжение в диапазоне от 0 до +5В, позволяя настроить яркость ЖК-дисплея.

Инфракрасный светодиод и Фототранзистор
Фототранзистор открывается, когда мощный ИК-свет падает на него. Поэтому, когда ИК-светодиод горит, он держит фототранзистор открытым, но если ИК-светодиод закрывается например, лопастью вентилятора, то фототранзистор закрывается.

2N3904 и 2N3906
Эти транзисторы используются для преобразования уровня сигнала, с целью обеспечения выходных импульсов с фототранзистора для Arduino, в которых нет никаких напряжений кроме +0 и +5В.

Принципиальная схема

Датчик обороты для двигателя ардуино

В схеме, интерфейс связи с ЖК-дисплеем упрощен и имеет только 2 линии управления и 4 линии передачи данных.

Особенности схемы

Интерфейс ЖК-дисплея 16×2
2 управляющих контакта и 4 для передачи данных подключены от Arduino к ЖК-дисплею. Это то, что указывает ЖК-дисплею, что и когда делать.

Схема обрыва ИК-луча
Сигнал обрыва ИК-луча идет на 2-ой цифровой контакт Arduino. Это прерывает Arduino, что позволяет ему засчитать импульс и позволяет тахометру получать данные.

Arduino LCD библиотека

Для этого проекта мы будем использовать Arduino LCD библиотеку. В основном мы будем просто обновлять значение RPM на второй строке на новое.

В качестве подготовки, посмотрите на код приведенный ниже, в котором при помощи этой библиотеки на ЖК-дисплей выводиться «Hello, World!» В тахометре мы будем использовать похожий код, особенно: «lcd.print(millis()/1000);».

Датчик обороты для двигателя ардуино

Разберитесь в функциях этой ЖК-библиотеки как можно подробнее, прежде чем двигаться дальше. Она не слишком сложна и хорошо документирована на сайте Arduino.

Подсчет RPM при помощи Arduino

Так как мы собираемся подсчитать RPM компьютерного вентилятора, мы должны понимать, что для подсчета мы используем прерывание ИК-луча. Это очень удобно, но мы должны учитывать, что у компьютерного вентилятора 7 лопастей. Это значит, 7 прерываний равно 1 обороту.

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

Время 1-го оборота = P * (µS/оборот)
RPM = кол-во оборотов/мин = 60 000 000 * (µS/мин) * (1/P) = (60 000 000 / P) * (кол-во оборотов/мин)

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

Сборка схемы

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

Датчик обороты для двигателя ардуино

Для начала подключается +5В и линии данных/управления ЖК-дисплея. Затем ЖК-дисплей, потенциометр контрастности и светодиод питания.

Датчик обороты для двигателя ардуино

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

Датчик обороты для двигателя ардуино

Хватит разговоров о аппаратной части! Давайте начнем делать прошивку/программу, чтобы увидеть работу устройства!

  1. Программная часть
  2. Есть две основных части кода, которые показаны и подробно описаны ниже:
       -Основной цикл обновления ЖК-дисплея
  3.    -Обновление времени прерываний

В основном цикле считаются обороты и обновления ЖК-дисплея. Поскольку основной цикл это гигантский while(1) цикл, то он будет работать всегда, RPM считаться, а ЖК-дисплей обновляться несколько раз в секунду. Функция в прерывании подсчитывает время между прерываниями ИК, поэтому считать RPM можно в основном цикле.

Помните, что компьютерный вентилятор имеет 7 лопастей, так что это тахометр предназначен для работы только с такими вентиляторами. Если ваш вентилятор или другое устройство дает только 4 импульса за оборот, измените в  коде «(time*4)».

Два вентилятора работают на примерно 3000 оборотов в минуту и ​​2600 оборотов в минуту, с погрешностью около + / -100 оборотов в минуту.

Обзор тахометра на Arduino

Вентилятор генерирует импульсы прерывания, а на выходе мы видим RPM. Хотя точность не 100%, а примерно 95%, при стоимости элементов 10$ есть смысл построить этот тахометр на Arduino.

Что теперь делать?

Системы на основе обрыва луча полезны не только при измерении RPM, но и в качестве других датчиков. Например, вы хотите знать, открыта дверь или закрыта. Возможно, вы хотите знать, не проходило-ли что то под роботом. Есть много применений обрыва луча, а схема используемая тут настолько проста, что есть много путей для улучшения и сборки других удивительных устройств.

Заключение

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

Скачать список элементов (PDF)

Оригинал статьи

Прикрепленные файлы:

  • lcd_tachometer.rar (1 Кб)

Управление скоростью вращения двигателя постоянного тока с помощью Arduino

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

Для управления скоростью вращения такого двигателя можно использовать различные методы, но в этом проекте мы будем использовать для этой цели широтно-импульсную модуляцию (ШИМ).

Читайте также:  Гольф 3 какие бывают у них двигатели

Управлять скоростью вращения двигателя постоянного тока мы будем с помощью потенциометра, поворачивая его ручку.

Датчик обороты для двигателя ардуино

Общий принцип использования ШИМ

Управляя скоростью модуляции ШИМ (Pulse Width Modulation, PWM) можно регулировать, к примеру, силу свечения светодиода – данный принцип пояснен на следующем рисунке. Аналогичный механизм используется и для управления скоростью вращения двигателя.

Датчик обороты для двигателя ардуино

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

Если переключатель будет замкнут в течение 8ms и будет разомкнут 2ms в течение интервала 10ms, тогда лампочка будет гореть только в течение интервала 8ms.

В рассмотренном примере можно сказать, что среднее выходное напряжение (на лампочке) будет составлять 80% от напряжения батареи.

В другом случае выключатель замыкается на 5ms и размыкается на эти же самые 5ms в течение интервала 10ms, таким образом среднее напряжение на лампочке будет составлять 50% от напряжения батареи. Принято говорить, что если напряжение батареи 5В и цикл занятости составляет 50%, то среднее напряжение на оконечном устройстве (лампочке) будет составлять 2.5В.

В третьем рассмотренном на рисунке случае цикл занятости составляет 20% и поэтому среднее напряжение на оконечном устройстве (лампочке) будет составлять 20% от напряжения батареи.

Применяя все сказанное к рассматриваемому нами примеру управления скоростью вращения двигателем можно сказать, что чем больше будет коэффициент заполнения ШИМ (отношение длительности ON состояния к периоду), тем выше будет скорость вращения двигателя.

Необходимые компоненты

Схема устройства

Представлена на следующем рисунке.

Датчик обороты для двигателя ардуиноОбъяснение работы программы

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

В ниже представленных строчках кода мы инициализируем переменные c1 и c2 и назначаем аналоговый контакт A0 выходу потенциометра, а 12-й контакт будем использовать для ШИМ.

int pwmPin = 12;
int pot = A0;
int c1 = 0;
int c2 = 0;

В следующих строчках кода мы устанавливаем контакт A0 на ввод данных, а контакт 12 (который является контактом ШИМ) на вывод данных.

void setup() {
pinMode(pwmPin, OUTPUT); // pin 12 — на вывод данных
pinMode(pot, INPUT); // pin A0 — на ввод данных
}

  pinMode(pwmPin, OUTPUT); // pin 12 — на вывод данных  pinMode(pot, INPUT);  // pin A0 — на ввод данных

Теперь, в функции loop (), мы считываем аналоговое значение с контакта A0, используя функцию analogRead(pot), и сохраняем его в переменной c2. Затем мы вычитаем значение c2 из 1024 и сохраняем получившийся результат в c1.

Затем подаем на контакт 12 ШИМ высокий уровень (HIGH) и после задержки, определяемой переменной c1, подаем на этот контакт низкий уровень (LOW).

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

Причина, по которой мы вычитаем аналоговое значение из 1024, состоит в следующем. Дело в том, что аналого-цифровой преобразователь (АЦП) Arduino Uno имеет разрешение 10 бит, то есть может принимать целые значения в интервале 0 — 2^10 = 1024.

Это означает что он преобразует входное значение напряжения в интервале от 0 до 5 В в целое значение в интервале от 0 до 1024.

Таким образом, если мы умножим входное значение напряжения на 5/1024, то мы получим цифровое значение входного напряжения.

void loop()
{
c2= analogRead(pot);
c1= 1024-c2;
digitalWrite(pwmPin, HIGH); // подаем напряжение высокого уровня на pin 12
delayMicroseconds(c1); // ждем c1 микросекунд (high time)
digitalWrite(pwmPin, LOW); // подаем напряжение низкого уровня на pin 12
delayMicroseconds(c2); // ждем c2 микросекунд (low time)

  digitalWrite(pwmPin, HIGH); // подаем напряжение высокого уровня на pin 12  delayMicroseconds(c1);   // ждем c1 микросекунд (high time)  digitalWrite(pwmPin, LOW);  // подаем напряжение низкого уровня на pin 12  delayMicroseconds(c2);   // ждем c2 микросекунд (low time)

Объяснение работы схемы и исходный код программы

Датчик обороты для двигателя ардуино

В представленной схеме мы управляем скоростью вращения двигателя постоянного тока с помощью потенциометра на 100 кОм, вращая ручку которого мы изменяем коэффициент заполнения ШИМ сигнала. Потенциометр 100 кОм подсоединен к аналоговому входному контакту A0 Arduino UNO, а двигатель постоянного тока соединен с контактом 12 Arduino (который является контактом ШИМ). Принцип работы программы основан на том, что она считывает значение напряжения с аналогового контакта A0. Значение напряжения на этом аналоговом контакте изменяется с помощью потенциометра. Потом после необходимых вычислений коэффициент заполнения ШИМ регулируется в соответствии с этим значением.

К примеру, если мы получаем значение 256 (то есть это уже преобразованное цифровое значение) с аналогового входа, то в этом случае высокий уровень на контакте ШИМ будет в течение 768 мс (1024-256), а низкий уровень будет в течение 256 мс. Следовательно, коэффициент заполнения ШИМ будет равен 75%. Человеческий глаз не может различить колебания такой высокой частоты поэтому ему кажется что двигатель постоянно вращается со скоростью 75% от максимальной.

int pwmPin = 12; // вводим переменную для контакта 12 (он будет использоваться для ШИМ)
int pot = A0; // вводим переменную для обозначения аналогового входа A0
int c1 = 0; // объявляем переменную c1
int c2 = 0; // объявляем переменную c2
void setup() // setup loop
{
pinMode(pwmPin, OUTPUT);
pinMode(pot, INPUT);
}
void loop()
{
c2= analogRead(pot);
c1= 1024-c2; // вычитаем c2 из 1024 и сохраняем результат в c1
digitalWrite(pwmPin, HIGH);
delayMicroseconds(c1);
digitalWrite(pwmPin, LOW);
delayMicroseconds(c2);
}

int pwmPin = 12; // вводим переменную для контакта 12 (он будет использоваться для ШИМ)int pot = A0; // вводим переменную для обозначения аналогового входа A0 int c1 = 0;   // объявляем переменную c1int c2 = 0;   // объявляем переменную c2void setup()  // setup loop  c1= 1024-c2;         // вычитаем c2 из 1024 и сохраняем результат в c1  digitalWrite(pwmPin, HIGH);   digitalWrite(pwmPin, LOW);  

Видео, демонстрирующее работу схемы

Урок 29. Тахометр. Определяем скорость вращения при помощи датчика линии

Датчик обороты для двигателя ардуино

Тахометр собранный с использованием датчика линии прост в подключении. Вам не нужно вносить конструктивные изменения в деталь, скорость вращения которой требуется измерить: сверлить отверстия, делать прорези, устанавливать дополнительные элементы и т.д. Достаточно нанести на неё контрастную линию (чёрную на светлой поверхности или белую на тёмной) и поднести датчик линии, Вы сразу получите точный результат, количество оборотов в минуту. Скетч не нуждается в корректировке, независимо от того, какого цвета будет линия.

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеку:

  • Библиотека iarduino_4LED (для работы с четырёхразрядным LED индикатором).

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE.

Видео:

Схема подключения:

LED индикатор подключается к любым двум выводам Arduino (как цифровым, так и аналоговым), номера указываются в скетче. Датчик линии подключается к любому аналоговому входу, номер указывается в скетче.

Датчик обороты для двигателя ардуино

В данном уроке, LED индикатор подключён к цифровым выводам 2 и 3, а датчик линии подключён к аналоговому входу A0.

Алгоритм работы:

  • Вывод информации на LED индикатор осуществляется только в момент перехода датчика линии со светлого на тёмное поле.
  • Первой строкой функции loop, проверяем не находится ли датчик линии на тёмном поле, если это так, то …
  • Выводим количество оборотов в минуту на LED индикатор (если не зафиксировано переполнение millis) и сохраняем время перехода
  • Выполняем цикл while до тех пор, пока датчик линии не покинет тёмное поле. Благодаря чему предыдущая операция выполняется только 1 раз, за всё время нахождения датчика на тёмном поле.
  • Если датчик находится на тёмном или светлом поле, дольше 6 секунд, то выводим надпись «STOP» (эти строки можно убрать, если количество оборотов Вашего устройства ниже 10 в минуту).
Читайте также:  Волга 406 двигатель регулятора давления топлива

Код программы:

#include // подключаем библиотеку для работы с четырёхразрядным LED индикатором
iarduino_4LED dispLED(2,3); // объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов индикатора ( CLK , DIO )
const uint8_t pinLine = A0; // объявляем константу с указанием номера аналогового входа, к которому подключен датчик линии
uint32_t strLine = 0; // время перехода датчика со светлого на тёмное поле
void setup(){
dispLED.begin(); // инициируем LED индикатор
}
void loop(){
if(analogRead(pinLine)>400){ // если показания датчика линии больше 400 (тёмное поле)
if(strLine350){ // ждём пока датчик линии не выйдет из тёмного поля
if((millis()-strLine)>6000){dispLED.print(«STOP»);} // если датчик находится на тёмном поле дольше 6 секунд, то выводим на индикатор надпись «STOP»
}
} if((millis()-strLine)>6000){dispLED.print(«STOP»);} // если датчик находится на светлом поле дольше 6 секунд, то выводим на индикатор надпись «STOP»
}

скачать

Ссылки:

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

Датчик обороты для двигателя ардуино

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

Предыдущий урок     Список уроков     Следующий урок

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

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

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

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

Поясню, что такое “мертвое время”. Допустим, ШИМ работает с высокой частотой, например, 62,5 кГц.

Если мы зададим ему коэффициент заполнения 1, то это означает, что с периодом 16 мкс будет формироваться импульс длительностью 0,0625 мкс. Импульс такой короткой длительности транзисторный ключ не отработает, не успеет.

В результате транзистор будет какое-то время в полуоткрытом режиме и не к чему хорошему это не приведет. Особенно на высоком напряжении.

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

  1. Отработку ”мертвого времени» производит следующий блок программы.
  2. #define DEAD_TIME 10  // мертвое время
  3. // мертвое время
    if( valPwm < DEAD_TIME ) valPwm=0; 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. Изменения коснутся только строки.

  1. TCCR2A= 0b00100011;
  2. Использование других выводов недопустимо.
  3. Загружаем скетч в контроллер, открываем монитор последовательного порта.
  4. Датчик обороты для двигателя ардуино

Вращаю переменный резистор, подключенный к входу 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
Ссылка на основную публикацию
Adblock
detector