Недавно собрал новый станок ЧПУ для сверления и гравировки печатных плат, корпусов и прочих мелочей.
Для станка ЧПУ приобрел мотор шпиндель с регулировкой оборотов.
Радиолюбительский зуд не давал покоя — захотелось иметь на станочке показометр оборотов. Вариант с оптическим энкодером показался слишком сложным. Датчика холла, который применяется во всех автомобилях, не было под рукой. И тут на одном форуме подкинули идейку — попробовать ИК сенсор. Как раз без дела лежал ИК датчик препятствий, который не знал куда применить. Решил его попробовать — и вот что из этого получилось.
Данный модуль применяется в основном в ардуинщиками в роботостроительстве как ИК датчик препятствия. Представляет маленькую очень бюджетную платку (особенно если покупать партиями штук по 10)
Схема у этого сенсора очень простая
В основе лежит ИК пара диод-транзистор. Что вроде L-53P3C/L-53F3C работающие в диапазоне 940нм
Компаратор LM393 сравнивает уровень фоторанзистора с уровнем, выставляемым подстроечным резистором.
Подцепил к валу шпинделя кусочек фольги, поднес сенсор к валу, покрутил подстроечник — модуль стал моргать светодиодом в так вращения.
Поковырявшись в своей барахолке нашел ATmega328 в DIP корпусе (писал по ним статью) и четырехразрядный семисегментный индикатор
Максимальная скорость вращения у мотора 12000RPM и лучше было бы применить 5-разрядный индикатор, но будем работать с чем имеем
Накидал такую схему
Порядок подключения выводов индикатора к микроконтроллеру значения не имеет (так как настраивается в программе) и обусловлен исключительно из удобства проектирования печатной платы
«Квадратный» дизайн платы потому что на данном этапе я осваивал изготовление печатных плат на станке ЧПУ
Закругленные полигоны сложнее, а главное, дольше выбирать гравировкой.
Основным достоинством изготовления плат на станке является то, что весь процесс происходит не отрывая зада от кресла. С покупкой ламинатора я отказался от этого метода, оставив для станка сверление отверстий и обрезку плат.
Итак гравируем, сверлим, режем
Паяем плату и можно приступать к отладке программы
Для работы индикатора применяется простая и удобная библиотека SevSeg, позволяющая подключать индикатор к каким угодно выводам МК, применять индикаторы как с общим катодом, так и анодом да еще и яркостью управлять.
Для измерения частоты попробовал библиотеку FreqMeasur. МК с ней отлично мерит сигнал с генератора от 10 до 200Гц (а больше мне и не нужно)
А вот когда на вход контроллера подал с сигнал с сенсора, результат получился плачевным.
Частота прыгала как ненормальная. Виной этому оказался «дребезг» сигнала с оптического датчика. Фольга давала массу помех. Попытка настроить сигнал подстроечником или заменить кусочек фольки на другой не дали ощутимого результата.
Тогда я решил давить «дребезг» программно. Осциллограф показал, что помехами являются импульсы в 0.3 — 1 мкс, тогда как сигнал — это импульсы 5мс (При частоте 12000RPM) и больше.
В результате родилась такая программка с подавлением помех длительностью менее 2мкс
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
// Библиотека работы с 7-сегментным индикатором // https://github.com/sparkfun/SevSeg #include <mSevSeg.h> SevSeg myDisplay; byte displayType = COMMON_CATHODE; //Your display is either common cathode or common anode byte digit1 = 18; byte digit2 = 19; byte digit3 = 8; byte digit4 = 10; byte segA = 17; byte segB = 9; byte segC = 12; byte segD = 14; byte segE = 15; byte segF = 16; byte segG = 13; byte segDP = 11; byte numberOfDigits = 4; int dot = 0; uint32_t ms, ms1 = 0, ms0 = 0, ms2 = 9; uint32_t rps = 0; uint32_t count = 0; char buf[10]; void setup(){ // Инициализация индикатора myDisplay.Begin(displayType, numberOfDigits, digit1, digit2, digit3, digit4, segA, segB, segC, segD, segE, segF, segG, segDP); myDisplay.SetBrightness(100); myDisplay.DisplayString("----", 0); // Инициализация входа для счета импульсов attachInterrupt(0, pulseCount, RISING); } void loop(){ ms = millis(); char s[10]; uint16_t rpm = 0; // Перевыдача дисплея myDisplay.DisplayString(buf, dot); // Каждую секунду перевыдаем значение скорости if( ms2 == 0 || ms2 > ms || ( ms - ms2 )>1000 ){ ms2 = ms; // Переводим в коичество оборотов в минуту rpm = rps*60; // Отображение 10=тичной точки, сли число больше 4-х разрядов if( rpm > 9999 ){ dot = 2; sprintf(buf,"%4d",rpm/10); } else{ dot = 0; sprintf(buf,"%4d",rpm); } rps = 0; } } /** * Счетчик импульсов */ void pulseCount(){ uint32_t ms = micros(); // Убираем импулься менее 2 мс (дребезг) if( ms - ms0 > 2000 )count++; ms0 = ms; // 0.5 сек цикл подсчета импульсов if( ms - ms1 > 500000 ){ ms1 = ms; rps = count*2; count = 0; } } |
Программа показала 100% результат с тестового генератора. При включенном моторе с сенсора показывались стабильные обороты, которые хорошо коррелировали с режимом работы мотора. На том и остановимся
Корпус
Корпус делаю на станочке из обрезков ПВХ пластика 3мм
Еще одна проблема нартсовалась при выборе места установки счетчика на станок.
В длинных проводах наводились сильные помехи от мотора и БП и индикатор, отлично работавший «на коленках» никак не хотел работать на станке. В результате смонтировал контроллер в непосредственной близости от сенсора и запитал его через импульсный DC-DC преобразователь от 24В. (Напряжения для шаговиков, подсветки, вентиляторов охлаждения).
Так мой новый станочек обзавелся счетчиком оборотов шпинделя. индикаторы К слову, данный измеритель должен практически без изменения схемы и программы заработать и с «кошерным» датчиком холла и магнитиком на валу.
Как работает станок с датчиком можно посмотреть здесь
Кот за любой кипишь кроме голодовки )))
Дуб дубом я в программировании, не могли бы Вы переделать программу под индикатор 1602?
В 1995 дребезг можно было убрать обычным RC фильтром низкой частоты, частота регулируется подстроечником в цепи фильтра.
Вместо фольги можно белую пленку самоклейку приклеить, до этого нанести на нее 6 черных полос, а далее достаточно подключить частотомер
И еще! от регулятора оборотов выходит не непрерывный а широтноимпульсный сигнал, можно на выходе поставить преобразователь частота — напряжение и снимать обороты обычным мультиметром
Зачем нужен резистор подтяжки и его номинал D5 на +, почему его нет в схеме?
Я использовал дисплей с общим анодом(ca56-21srwa), распиновка точно такая как у вашего. Есть проблема с мерцанием дисплея и не верные показания(не подскажите куда смотреть?).
А можно выложить хекс и фьюзы для повторения?
HEXсы и фьюзы сильно заточены под конкретный МК
Здесь исходник, который за пару минут компилится под то что нужно
Алексей, я на компиляторы смотрю широко раскрытыми глазами. Да и нет их у меня. Все, что умею — это прошить микроконтроллер.
МК то какой?
Никто не хочет поделиться секретными материалами. Жаль, хотелось бы собрать этот девайс для самодельного токарного станочка.
Ээээээээээ… Да тут Ардуино, что ли. Если нет, то какой компилятор, ради такого дела установлю, даже программатор сделаю.
Я программирую в Arduino IDE. Там уже есть компилятор. Данный контроллер прошит загрузчиком Optiboot и полностью совместим с Arduino UNO
Как это сделать, написано здесь:
http://samopal.pro/atmega328-arduino/
Но можно заливать программу через ICSP программатор без загрузчика
Можно также использовать вместо микросхемы MK Arduino UBO, Arduino NANO или Arduino Pro Micro на аналогичном контроллере
Автор, доброго времени суток! У меня не заработал Ваш скетч на UNO.
Почему в каждом цикле uint16_t rpm = 0; или это ошибка в скетче?
Не понял вопроса
Сперва объявляется переменная с начальным значением 0. Потом она используется.
Дребезг контактов не от фольги, а так работает компаратор, LM339 в данном случае, любой компаратор так работает. Вблизи точки срабатывания возникает точка неопределённости, и система на очень высокой частоте мечется. Так происходит на каждом фронте и спаде сигнала. Нужен не компаратор, а триггер шмитта, который впринципе уже встроен в микроконтроллер.
Поэтому микросхему исключить, а сигнал брать прямиком в коллектора оптопары.
Но вообще, продаются отличные оптические сенсоры с интегрированным триггером шмитта — в этом случае помехи не страшны.