Помощь в осмыслении.
Добавлено: Сб авг 16, 2025 21:23:58
Здравствуйте уважаемые. Возникла необходимость в сверлильном станочке для сверления плат (после аварии плохо работает правая рука).
Понимаю что проще ЧПУ станок.
Но пока нет ни денег ни возможностей (может и будет но гораздо позже).
Начал с Логики работы такого станка.
Далее начал писать код на arduino.
На данный момент реализовано:
1. Подсветка PWM на DF6113.
2. управление шаговым двигателем Nema17 драйвером TMC2209 и выставление через меню микрошага 1-32.
3. PWM выход для управления скоростью DC мотора.
4 Частично написано меню для LCD 2004 c редактированием и сохранением во внешней EEPPROM параметров.
В чём суть:
Я уже запутался в логике:)
Поругайте и предложите свой вариант.
Самое главное подскажите как реализовать драйвер для 775 мотора с управлением от STM32
Обновлённая логика
1. Аппаратная часть
STM32F103C8T6 (Blue Pill)
TMC2209 в режиме Step/Dir, управление микрошагами по MS1/MS2
ШВП 1204 (4 мм хода за оборот)
NEMA17, 200 шагов/оборот
LCD 2004 + I2C
Поворотный энкодер с кнопкой
Кнопки:
Drill (сверление по Drill)
Drill PCB (сверление Peck Drill)
UP (ручной подъём)
DOWN (ручное опускание)
2. Переменные, хранящиеся в EEPROM
posDrillStart — стартовая позиция Drill (мм от стола)
posDrillPCBStart — стартовая позиция Drill PCB (мм от стола)
pcbThickness — толщина PCB (мм, 0.5–3.0)
drillDepth — глубина сверления Drill (мм)
peckDepth — глубина одного захода Peck Drill (мм)
speedMoveDrill — скорость перемещения для Drill (мм/с)
speedDrillDrill — скорость сверления для Drill (мм/с)
speedMovePeck — скорость перемещения для Peck Drill (мм/с)
speedDrillPeck — скорость сверления для Peck Drill (мм/с)
microsteps — текущий режим микрошагов (1, 2, 4, 8, 16, 32)
3. Вычисления шагов на мм
stepsPerMM = (200 * microsteps) / 4.0
(где 200 — шагов на оборот, 4.0 мм — шаг ШВП 1204)
4. Общий алгоритм сверления
Для обоих режимов:
Вычислить surface_mm = pcbThickness
Стартовая позиция:
start_mm = surface_mm + 2.0
start_steps = start_mm * stepsPerMM
Переместиться в стартовую позицию с speedMove
Drill (одиночное сверление):
Опуститься до:
target_mm = surface_mm - drillDepth
с speedDrill
2. Подняться в start_mm с speedMove
Peck Drill:
Цикл:
currentDepth = peckDepth
while currentDepth < drillDepth:
опуститься до (surface_mm - currentDepth) с speedDrillPeck
подняться до start_mm с speedMovePeck
currentDepth += peckDepth
Последний заход:
Если drillDepth % peckDepth != 0, последняя глубина = drillDepth
Подняться в start_mm после завершения цикла
5. Логика меню
1. Установить позицию Drill (мм)
2. Установить позицию Drill PCB (мм)
3. Установить толщину PCB (мм)
4. Установить глубину сверления Drill
5. Установить глубину захода Peck Drill
6. Настройки скоростей:
6.1 Скорость перемещения Drill
6.2 Скорость сверления Drill
6.3 Скорость перемещения Peck Drill
6.4 Скорость сверления Peck Drill
7. Настройка микрошагов (MS1/MS2)
8. Перейти в позицию Drill
9. Перейти в позицию Drill PCB
6. Логика кнопок
Drill → запускает Drill по текущим настройкам
Drill PCB → запускает Peck Drill
UP → ручной подъём (в прерывании)
DOWN → ручное опускание (в прерывании)
Энкодер → перемещение по меню
Нажатие энкодера → вход в режим редактирования / подтверждение
Начало кода:
/*
drill_z_final_sync.ino
Финальная прошивка для STM32F103C8T6 (Blue Pill)
Железо:
- ШД NEMA17 + TMC2209 v985 (Step/Dir, аппаратные MS1/MS2)
- ШВП 1204 (4.0 мм/оборот)
- Концевики NC -> GND: Z-min (нижний), Z-max (верхний), активный LOW
- Touch Plate (щуп высоты инструмента), активный LOW при касании
- LCD2004 I2C через PCF8574 (обычно 0x27 или 0x3F), библиотека LiquidCrystal_PCF8574
- Внешняя EEPROM 24LC256 (I2C, 0x50) — работаем через Wire без доп. библиотек
- Шпиндель PWM: PA8 (TIM1 CH1)
- LED DF6113 DIM PWM: PA9 (TIM1 CH2)
- Кнопки: Drill, DrillPCB, Up, Down, ToolChange (INPUT_PULLUP, актив LOW)
- Энкодер: каналы A/B + кнопка; A и кнопка на прерываниях
Логика:
- Полное меню редактирования всех параметров
- Калибровка по концевикам (Z=0 по Z-min; posMax по Z-max; posLimitTop=posMax-12мм)
- Калибровка Touch Plate surface_mm = measured - plateThickness
- Авто: posDrillPCBStart = surface_mm + 2.0 мм
- Защиты: диапазон 0..posLimitTop, стоп по концевикам
- Ручное сверление: удержание Drill ? шаги вниз до ограничения оператора (maxManualDepth)
- Peck Drill: по peckDepth до общей глубины drill_PCBDepth, с подъемом между проходами
- Пункт меню 3.3 «Проверка поверхности» (подъезд к surface и к старту PCB)
- Кнопка "Смена инструмента": вверх до Z-max, затем вниз на 12 мм (3 оборота)
Библиотеки:
- LiquidCrystal_PCF8574 (Mathertel)
- AccelStepper (Mike McCauley)
- Bounce2
Важно:
- Используется HAL для конфигурации TIM1 PWM (PA8/PA9) — требует ядро Arduino STM32 c HAL.
*/
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
#include <AccelStepper.h>
#include <Bounce2.h>
extern "C" {
#include "stm32f1xx_hal.h"
}
/* Пины */
#define PIN_STEP PB0
#define PIN_DIR PB1
#define PIN_ENABLE PB12
#define PIN_MS1 PB10
#define PIN_MS2 PB11
#define PIN_Z_MIN PA0 // NC -> GND, INPUT_PULLUP, активный LOW
#define PIN_Z_MAX PA1 // NC -> GND, INPUT_PULLUP, активный LOW
#define PIN_TOUCH PA2 // активный LOW при касании пластины
#define BTN_DRILL PA3
#define BTN_DRILL_PCB PA4
#define BTN_UP PA5
#define BTN_DOWN PA6
#define BTN_TOOL_CHANGE PA7
#define ENC_A PB13 // прерывание по CHANGE
#define ENC_B PB14
#define ENC_BTN PB15 // прерывание по FALLING
#define PIN_SPINDLE_PWM PA8 // TIM1 CH1
#define PIN_LED_PWM PA9 // TIM1 CH2
Понимаю что проще ЧПУ станок.
Но пока нет ни денег ни возможностей (может и будет но гораздо позже).
Начал с Логики работы такого станка.
Далее начал писать код на arduino.
На данный момент реализовано:
1. Подсветка PWM на DF6113.
2. управление шаговым двигателем Nema17 драйвером TMC2209 и выставление через меню микрошага 1-32.
3. PWM выход для управления скоростью DC мотора.
4 Частично написано меню для LCD 2004 c редактированием и сохранением во внешней EEPPROM параметров.
В чём суть:
Я уже запутался в логике:)
Поругайте и предложите свой вариант.
Самое главное подскажите как реализовать драйвер для 775 мотора с управлением от STM32
Обновлённая логика
1. Аппаратная часть
STM32F103C8T6 (Blue Pill)
TMC2209 в режиме Step/Dir, управление микрошагами по MS1/MS2
ШВП 1204 (4 мм хода за оборот)
NEMA17, 200 шагов/оборот
LCD 2004 + I2C
Поворотный энкодер с кнопкой
Кнопки:
Drill (сверление по Drill)
Drill PCB (сверление Peck Drill)
UP (ручной подъём)
DOWN (ручное опускание)
2. Переменные, хранящиеся в EEPROM
posDrillStart — стартовая позиция Drill (мм от стола)
posDrillPCBStart — стартовая позиция Drill PCB (мм от стола)
pcbThickness — толщина PCB (мм, 0.5–3.0)
drillDepth — глубина сверления Drill (мм)
peckDepth — глубина одного захода Peck Drill (мм)
speedMoveDrill — скорость перемещения для Drill (мм/с)
speedDrillDrill — скорость сверления для Drill (мм/с)
speedMovePeck — скорость перемещения для Peck Drill (мм/с)
speedDrillPeck — скорость сверления для Peck Drill (мм/с)
microsteps — текущий режим микрошагов (1, 2, 4, 8, 16, 32)
3. Вычисления шагов на мм
stepsPerMM = (200 * microsteps) / 4.0
(где 200 — шагов на оборот, 4.0 мм — шаг ШВП 1204)
4. Общий алгоритм сверления
Для обоих режимов:
Вычислить surface_mm = pcbThickness
Стартовая позиция:
start_mm = surface_mm + 2.0
start_steps = start_mm * stepsPerMM
Переместиться в стартовую позицию с speedMove
Drill (одиночное сверление):
Опуститься до:
target_mm = surface_mm - drillDepth
с speedDrill
2. Подняться в start_mm с speedMove
Peck Drill:
Цикл:
currentDepth = peckDepth
while currentDepth < drillDepth:
опуститься до (surface_mm - currentDepth) с speedDrillPeck
подняться до start_mm с speedMovePeck
currentDepth += peckDepth
Последний заход:
Если drillDepth % peckDepth != 0, последняя глубина = drillDepth
Подняться в start_mm после завершения цикла
5. Логика меню
1. Установить позицию Drill (мм)
2. Установить позицию Drill PCB (мм)
3. Установить толщину PCB (мм)
4. Установить глубину сверления Drill
5. Установить глубину захода Peck Drill
6. Настройки скоростей:
6.1 Скорость перемещения Drill
6.2 Скорость сверления Drill
6.3 Скорость перемещения Peck Drill
6.4 Скорость сверления Peck Drill
7. Настройка микрошагов (MS1/MS2)
8. Перейти в позицию Drill
9. Перейти в позицию Drill PCB
6. Логика кнопок
Drill → запускает Drill по текущим настройкам
Drill PCB → запускает Peck Drill
UP → ручной подъём (в прерывании)
DOWN → ручное опускание (в прерывании)
Энкодер → перемещение по меню
Нажатие энкодера → вход в режим редактирования / подтверждение
Начало кода:
/*
drill_z_final_sync.ino
Финальная прошивка для STM32F103C8T6 (Blue Pill)
Железо:
- ШД NEMA17 + TMC2209 v985 (Step/Dir, аппаратные MS1/MS2)
- ШВП 1204 (4.0 мм/оборот)
- Концевики NC -> GND: Z-min (нижний), Z-max (верхний), активный LOW
- Touch Plate (щуп высоты инструмента), активный LOW при касании
- LCD2004 I2C через PCF8574 (обычно 0x27 или 0x3F), библиотека LiquidCrystal_PCF8574
- Внешняя EEPROM 24LC256 (I2C, 0x50) — работаем через Wire без доп. библиотек
- Шпиндель PWM: PA8 (TIM1 CH1)
- LED DF6113 DIM PWM: PA9 (TIM1 CH2)
- Кнопки: Drill, DrillPCB, Up, Down, ToolChange (INPUT_PULLUP, актив LOW)
- Энкодер: каналы A/B + кнопка; A и кнопка на прерываниях
Логика:
- Полное меню редактирования всех параметров
- Калибровка по концевикам (Z=0 по Z-min; posMax по Z-max; posLimitTop=posMax-12мм)
- Калибровка Touch Plate surface_mm = measured - plateThickness
- Авто: posDrillPCBStart = surface_mm + 2.0 мм
- Защиты: диапазон 0..posLimitTop, стоп по концевикам
- Ручное сверление: удержание Drill ? шаги вниз до ограничения оператора (maxManualDepth)
- Peck Drill: по peckDepth до общей глубины drill_PCBDepth, с подъемом между проходами
- Пункт меню 3.3 «Проверка поверхности» (подъезд к surface и к старту PCB)
- Кнопка "Смена инструмента": вверх до Z-max, затем вниз на 12 мм (3 оборота)
Библиотеки:
- LiquidCrystal_PCF8574 (Mathertel)
- AccelStepper (Mike McCauley)
- Bounce2
Важно:
- Используется HAL для конфигурации TIM1 PWM (PA8/PA9) — требует ядро Arduino STM32 c HAL.
*/
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
#include <AccelStepper.h>
#include <Bounce2.h>
extern "C" {
#include "stm32f1xx_hal.h"
}
/* Пины */
#define PIN_STEP PB0
#define PIN_DIR PB1
#define PIN_ENABLE PB12
#define PIN_MS1 PB10
#define PIN_MS2 PB11
#define PIN_Z_MIN PA0 // NC -> GND, INPUT_PULLUP, активный LOW
#define PIN_Z_MAX PA1 // NC -> GND, INPUT_PULLUP, активный LOW
#define PIN_TOUCH PA2 // активный LOW при касании пластины
#define BTN_DRILL PA3
#define BTN_DRILL_PCB PA4
#define BTN_UP PA5
#define BTN_DOWN PA6
#define BTN_TOOL_CHANGE PA7
#define ENC_A PB13 // прерывание по CHANGE
#define ENC_B PB14
#define ENC_BTN PB15 // прерывание по FALLING
#define PIN_SPINDLE_PWM PA8 // TIM1 CH1
#define PIN_LED_PWM PA9 // TIM1 CH2