Главная » Хабрахабр » Одноступенчатый редуктор с приводом от Шагового Двигателя

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

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


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

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

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

В качестве привода я решил использовать Шаговый Двигатель (ШД) 23HS8430, он тоже у меня был в наличие и валялся без дела. По наличию у меня были обрезки дюралевого листа толщиной 6мм.

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

Учтя все ограничения, я перевел двигатель в 3Д модель и дальше стал сопрягать с ним остальные детали…

Углубляться в это не буду, достаточно будет прочитать главу про построение зубчатых передач из курса механики: детали машин. Теперь что касается построения зубчатой пары: в машиностроительной конфигурации Компас 3Д (v13) есть такая утилита как «Расчеты цилиндрической зубчатой передачи внешнего зацепления», в ней производим геометрический расчет, вводя требуемые параметры: число зубьев, модуль и т.д.

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

Для большего интереса я решил сделать шестерни с разным количеством зубьев и передаточным отношением 2:1.

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

После окончания 3Д проектирования, все детали перевел в 2Д вид и сохранил их в векторном формате *.dxf.

Полученный файл загрузил в станок и после обнуления координат, вырезал все детали. Для того чтобы вырезать все детали на станке, я преобразовал векторный формат в G-code через постпроцессор в программе ArtCam.

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

Отдельно на токарном станке выточили ось, на которую устанавливается ведомая шестерня.

Дальше все достаточно просто, собрал узел в едино, и осталось только его закрутить.
Но пришлось подождать месяц, так как драйвера для ШД у меня не оказалось, и я заказал драйвер DM542 на Али.

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

Сразу хочу оговориться, что код для прошивки ардуино нашел на просторах Интернета.

Диапазон частот 1Гц — 8МГц. Генератор частоты может: — генерировать меандр на 16 битном таймере. До частоты 2,8 кГц разрешение 1 герц, на частотах выше таймер аппаратно уже не может поддерживать это разрешение, поэтому более высокие частоты синтезируются, задавая параметром не требуемую частоту, а просто инкременируя регистр сравнения. Регулировка частоты производится энкодером. Вращая энкодер, с не нажатой кнопкой частота меняется на 1Гц; с нажатой кнопкой один шаг — 100Гц. Получается чем выше частота — тем больше шаг между щелчками энкодера. вращение энкодера с нажатой кнопкой так — же ускоряет счёт. Выше 2,8кГц. 0,1 мкф. Программного подавления дребезга контактов энкодера нет, поэтому нужно повесить конденсаторы 0,01.. На кнопке конденсатор не обязателен. относительно земли. Рассчитанная математически частота выводится в сериал.

/* Генератор 1 Hz..8 MHz. Энкодер подключен к пинам A0 и A1, кнопка энкодера подключена к A2. Требуется использовать конденсаторы 0,01..0,1uf относительно земли на каждый из 2х выводов энкодера.
Скетч для ардуино на мк atmega328 (UNO,Nano, MiniPro)
*/ float freq; void setup() {
pinMode (9,OUTPUT); // выход генератора
pinMode(A0,INPUT); // с рассчетом, что энкодере внешняя подтяжка- pinMode(A1,INPUT); // -к шине питания. Если нету, то подтянуть программно. pinMode(A2,INPUT_PULLUP); //кнопка энкодера Serial.begin(9600);
PCICR=1<<PCIE1; //разрешить прерывание PCINT
PCMSK1=(1<<PCINT9);// По сигналу на А1 создавать прерывание
TCCR1A=1<<COM1A0; //подключить выход OC1A первого таймера
TCCR1B=0;//
} ISR (PCINT1_vect){
static boolean gen_mode=0; //флаг режима управления
static uint32_t enc=1; //переменная счёта энкодера
uint32_t ocr=OCR1A;
uint32_t divider=1; //переменная коэфф. деления прескалера byte n=PINC&3; //считать значение энкодера
boolean knopka = PINC&(1<<2); // 0-кнопка нажата, 1-кнопка НЕ нажата.
if (freq<2848) gen_mode=0; //переключение режима управления по частоте
if (freq>=2848) gen_mode=1; //переключение режима управления по OCR // Если увеличение частоты
if (n==3||n==0) } else { if(ocr>9)ocr-=10; } } else knopka? enc++ : enc+=100; // в нч режиме } //end GetUP // Если уменьшение частоты
if (n==2||n==1){ if (gen_mode){ if (knopka){ if(ocr<65535) {ocr++; } } else { if(ocr<=65525)ocr+=10; } } else {if (knopka) { if (enc>=2)enc--; } else { if (enc>100) enc-=100; } } } //end GetDown if(gen_mode){ OCR1A=ocr; freq= (float)F_CPU/2 / (OCR1A+1); } else { //расчёт прескалера и OCR по нужной частоте
divider=1; ocr = (F_CPU / enc /2 /divider) -1;
if (ocr >65536) { divider=8; ocr = F_CPU / enc /2 /divider; if (ocr >65536) { divider=64; ocr = F_CPU / enc /2 /divider; if (ocr >65536) {divider=256; ocr = F_CPU / enc /2 /divider; if (ocr >65536) { divider=1024; ocr = F_CPU / enc /2 /divider; if (ocr >65536){ocr=65536; }}}}} OCR1A=ocr-1; //запись в регистр прескалера switch (divider) { case 1: TCCR1B=1|(1<<WGM12); break; case 8: TCCR1B=2|(1<<WGM12); break; case 64: TCCR1B=3|(1<<WGM12); break; case 256: TCCR1B=4|(1<<WGM12); break; case 1024: TCCR1B=5|(1<<WGM12); break; } freq= (float) F_CPU/2 / (OCR1A+1) /divider; } //end if !gen_mode
}
void loop() { if (freq <10000) { Serial.print(freq,1);Serial.println(" Hz "); }
if (freq >10000) { Serial.print(freq/1000,3);Serial.println(" kHz");} delay(100);
}

После того как все собрал, подсоединил и залил в Arduino скетч, можно приступать к включению:

Теперь про работу сего механизма: вращение и работа передачи вполне не плохое хоть и при звоне шестерен. В итоге получилось разогнать до 12,5 оборотов в секунду ведущую шестерню, а на ведомой соответственно в два раза меньше. Сгенерированная частота при этом составила порядка 5кГц при 400 имп/об. выставленное на драйвере. При этой частоте двигатель еще не уходил в ступор, а это значит, что можно было дать частоту и больше.

🙂 Спасибо за прочтение!


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

[Из песочницы] Решаем проблемы типов данных в Ruby или Make data reliable again

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

SamsPcbGuide, часть 8: Как получить правильную осциллограмму

Наверно, все умеют пользоваться осциллографом. Это очень легко – цепляешь «крокодил» к земле, остриё щупа – в необходимую точку измерения, регулируешь масштаб по вертикальной и горизонтальной осям и получаешь временную развёртку напряжения в этой точке. Да, так можно делать, но ...