diff --git a/M5_TMC2130.ino b/M5_TMC2130.ino index de05d60..bc8e100 100644 --- a/M5_TMC2130.ino +++ b/M5_TMC2130.ino @@ -1,80 +1,133 @@ -// #define EN_PIN 17 // D1 -// #define DIR_PIN 3 // D2 -// #define STEP_PIN 1 // D3 -// #define CS_PIN 16 // D8 -// #define MOSI_PIN 23 // D7 -// #define MISO_PIN 19 // D6 -// #define SCK_PIN 18 // D5 +/* Отрисовка графика значений в плоттере -/* - * You can control the rotation speed with - * 0 Stop - * 1 Resume - * + Speed up - * - Slow down +* Вы можете точно настроить показания, изменив STALL_VALUE. + * Это позволит вам контролировать, при какой нагрузке значение будет равно 0 + * и сработает флаг остановки. Это также установит высокий уровень на выводе DIAG1. + * Более высокое значение STALL_VALUE сделает чтение менее чувствительным и + * меньшее значение STALL_VALUE сделает его более чувствительным. + * + * Если отправить 0 в консоль - остановка + * 1 - движение + * + увеличить скорость / При слишком большой скорости шаги будут проскакивать. + * - Уменьшить скорость */ -#define MAX_SPEED 40 // In timer value +#include + +#define MAX_SPEED 40 // Значение таймера в Millis для скорости #define MIN_SPEED 1000 -#define STALL_VALUE 0 // [-64..63] +#define STALL_VALUE 15 // [-64..63] -// Note: You also have to connect GND, 5V and VM. -// A connection diagram can be found in the schematics. -#define EN_PIN 17 // D1 -#define DIR_PIN 3 // D2 -#define STEP_PIN 1 // D3 -#define CS_PIN 16 // D8 +/* +Меньшее значение дает более высокую чувствительность. Нуль +начальное значение, которое работает с большинством двигателей. +От -64 до +63: чем выше значение, тем меньше stallGuard2. +чувствителен и требует большего крутящего момента для +определения остановки (залипания). +*/ -#include -#include -TMC2130Stepper driver = TMC2130Stepper(CS_PIN); +//Настройка пинов для Software SPI. На Arduino Mega все пины кроме Аналоговых -bool vsense; +#define EN_PIN 46 // Enable +#define DIR_PIN 24 // Direction +#define STEP_PIN 26 // Step +#define CS_PIN 30 // Chip select +#define SW_MOSI 34 // Software Master Out Slave In (MOSI) +#define SW_MISO 28 // Software Master In Slave Out (MISO) +#define SW_SCK 32 // Software Slave Clock (SCK) -uint16_t rms_current(uint8_t CS, float Rsense = 0.11) +#define R_SENSE 0.11f // Резистор с которого будет делаться замер на драйвере - уточнить. \ + // SilentStepStick series use 0.11 - выбрать данный параметр \ + // UltiMachine Einsy and Archim2 boards use 0.2 \ + // Panucatt BSD2660 uses 0.1 \ + // Watterott TMC5160 uses 0.075 + +//Silent-Step-Stick 0.11 - это плата драйвера шагового двигателя для двухфазных двигателей, +//основанная на драйверах Trinamic: TMC 2100 / TMC 2130 / TMC 2208 / TMC 2209 / TMC 5160 / TMC 5161. + +// Тип подключения +//TMC2130Stepper driver(CS_PIN, R_SENSE); // Hardware SPI будут использоваться стандратные пины +TMC2130Stepper driver(CS_PIN, R_SENSE, SW_MOSI, SW_MISO, SW_SCK); // Software SPI + +using namespace TMC2130_n; + +// Using direct register manipulation can reach faster stepping times +#define STEP_PORT PORTF // Match with STEP_PIN +#define STEP_BIT_POS 0 // Match with STEP_PIN + +ISR(TIMER1_COMPA_vect) { - return (float)(CS + 1) / 32.0 * (vsense ? 0.180 : 0.325) / (Rsense + 0.02) / 1.41421 * 1000; + //STEP_PORT ^= 1 << STEP_BIT_POS; + digitalWrite(STEP_PIN, !digitalRead(STEP_PIN)); } void setup() { - //init serial port - { - Serial.begin(250000); //init serial port and set baudrate - while (!Serial) - ; //wait for serial port to connect (needed for Leonardo only) - Serial.println("\nStart..."); - pinMode(EN_PIN, OUTPUT); - pinMode(DIR_PIN, OUTPUT); - pinMode(STEP_PIN, OUTPUT); - pinMode(CS_PIN, OUTPUT); - digitalWrite(EN_PIN, HIGH); //deactivate driver (LOW active) - digitalWrite(DIR_PIN, LOW); //LOW or HIGH - digitalWrite(STEP_PIN, LOW); - digitalWrite(CS_PIN, HIGH); - SPI.begin(); - pinMode(MISO, INPUT_PULLUP); - } + SPI.begin(); + Serial.begin(115200); - //set TMC2130 config - { - driver.push(); - driver.toff(3); - driver.tbl(1); - driver.hysteresis_start(4); - driver.hysteresis_end(-2); - driver.rms_current(600); // mA - driver.microsteps(16); - driver.diag1_stall(1); - driver.diag1_active_high(1); - driver.coolstep_min_speed(0xFFFFF); // 20bit max - driver.THIGH(0); - driver.semin(5); - driver.semax(2); - driver.sedn(0b01); - driver.sg_stall_value(STALL_VALUE); - } + //Установка пинов как выходов и состояний + pinMode(EN_PIN, OUTPUT); + pinMode(STEP_PIN, OUTPUT); + pinMode(CS_PIN, OUTPUT); + pinMode(DIR_PIN, OUTPUT); + pinMode(MISO, INPUT_PULLUP); + digitalWrite(EN_PIN, LOW); + + driver.begin(); + driver.toff(4); //Общее разрешение для управления двигателем 0 Драйвер выключен / 1… 15 Драйвер включен. значение не влияет на stealthChop + driver.blank_time(24); //16 tCLK 1 24 tCLK 2 36 tCLK 3 54 tCLK + /* Время холостого хода компаратора.Нужно безопасно + охватить событие переключения и продолжительность + звон на сенсорном резисторе. Выберите настройку + 1 или 2 для типичных приложений. Для больших + емкостных нагрузок, может потребоваться 3. Нижние + настройки позволяют StealthChop регулировать до + более низкие значения тока катушки + */ + + driver.rms_current(1000); // mA + driver.microsteps(16); //Микрошагов за шаг 128, 64, 32, 16, 8, 4, 2, FULLSTEP + driver.en_pwm_mode(true); //Разрешение работы со скоростями + driver.pwm_autoscale(true); + /* + Автоматический режим с использованием обратной связи по току (pwm_autoscale = 1) и подачи + режим управления скоростью поступательного движения (pwm_autoscale = 0). Режим управления скоростью прямой связи не + реагирует на изменение напряжения питания или на такие события, как остановка двигателя, но обеспечивает очень стабильную работу + амплитуда. + */ + driver.TCOOLTHRS(0xFFFFF); // 20bit max 0 … 1048575 + /* + Определяет верхнюю скорость для работы в + StealthChop по напряжению в режиме ШИМ. + */ + + driver.THIGH(0); //0…1048575 + /* + Настройка для управления + верхний порог для + работы с coolStep + и stallGuard - уточнить. + */ + driver.semin(5); //0- выкл / 1..15 + /* + 4-битовое целое число без знака, задающее нижний порог. + Если SG опускается ниже этого порога, coolStep + увеличивает ток на обе катушки. 4-битный + Значение SEMIN масштабируется на 32, чтобы покрыть нижнюю + половина диапазона 10-битового значения SG. StallGuard + + */ + driver.semax(2); //0...15 + driver.sedn(0b01); // 0,1,2,3 + /* + Устанавливает количество показаний stallGuard2 над + верхний порог, необходимый для каждого тока + уменьшение тока двигателя. number of stallGuard2 measurements per decrement: 32, 8, 2, 1 + */ + + driver.sgt(STALL_VALUE); //Установка StallGuard // Set stepper interrupt { @@ -91,17 +144,6 @@ void setup() TIMSK1 |= (1 << OCIE1A); sei(); //allow interrupts } - - //TMC2130 outputs on (LOW active) - digitalWrite(EN_PIN, LOW); - - vsense = driver.vsense(); -} - -ISR(TIMER1_COMPA_vect) -{ - PORTF |= 1 << 0; - PORTF &= ~(1 << 0); } void loop() @@ -109,9 +151,11 @@ void loop() static uint32_t last_time = 0; uint32_t ms = millis(); + //При получении определенного символа из консоли происходит прерывание и установка параметров while (Serial.available() > 0) { int8_t read_byte = Serial.read(); + if (read_byte == '0') { TIMSK1 &= ~(1 << OCIE1A); @@ -122,135 +166,34 @@ void loop() TIMSK1 |= (1 << OCIE1A); digitalWrite(EN_PIN, LOW); } + else if (read_byte == '+') + { if (OCR1A > MAX_SPEED) OCR1A -= 20; - else if (read_byte == '-') - if (OCR1A < MIN_SPEED) - OCR1A += 20; + } + else if (read_byte == '-') + { + if (OCR1A < MIN_SPEED) + OCR1A += 20; + } } - if ((ms - last_time) > 100) //run every 0.1s + //Каждые 101 милисекунду опрашиваем статус драйвера + if ((ms - last_time) > 100) { last_time = ms; - uint32_t drv_status = driver.DRV_STATUS(); - Serial.print("0 "); - Serial.print((drv_status & SG_RESULT_bm) >> SG_RESULT_bp, DEC); + + DRV_STATUS_t drv_status{0}; + + //Данная функция возвращает статус всего драйвера. Из данного результата возможно взять 1 или 0 для состояния StallGuard. Сработал или нет + //Описание регистра с флагами в файле TMC2130_datasheet.pdf на 38й странице. DRV_STATUS – stallGuard2 Value and Driver Error Flags + drv_status.sr = driver.DRV_STATUS(); + + // Serial.println(drv_status.sr); + + Serial.print(drv_status.sg_result, DEC); //Результат 1 или 0. Смена состояния при превышении установленного значения StallGuard Serial.print(" "); - Serial.println(rms_current((drv_status & CS_ACTUAL_bm) >> CS_ACTUAL_bp), DEC); + Serial.println(driver.cs2rms(drv_status.cs_actual), DEC); //Текущее состояние StallGuard } -} - -// bool dir = true; - -// #include -// TMC2130Stepper TMC2130 = TMC2130Stepper(EN_PIN, DIR_PIN, STEP_PIN, CS_PIN); - -// void setup() { -// Serial.begin(9600); -// TMC2130.begin(); // Initiate pins and registeries -// TMC2130.SilentStepStick2130(600); // Set stepper current to 600mA -// TMC2130.stealthChop(1); // Enable extremely quiet stepping - -// digitalWrite(EN_PIN, LOW); -// } - -// void loop() { -// digitalWrite(STEP_PIN, HIGH); -// delayMicroseconds(10); -// digitalWrite(STEP_PIN, LOW); -// delayMicroseconds(10); -// uint32_t ms = millis(); -// static uint32_t last_time = 0; -// if ((ms - last_time) > 2000) { -// if (dir) { -// Serial.println("Dir -> 0"); -// TMC2130.shaft_dir(0); -// } else { -// Serial.println("Dir -> 1"); -// TMC2130.shaft_dir(1); -// } -// dir = !dir; -// Serial.println(TMC2130.GCONF(), BIN); -// last_time = ms; -// } -// } - -// bool dir = true; -// #define TMC2130DEBUG -// #include -// // Soft SPI -// TMC2130Stepper driver = TMC2130Stepper(EN_PIN, DIR_PIN, STEP_PIN, CS_PIN, MOSI_PIN, MISO_PIN, SCK_PIN); -// // Hard SPI -// //TMC2130Stepper driver = TMC2130Stepper(EN_PIN, DIR_PIN, STEP_PIN, CS_PIN); -// void setup() -// { -// Serial.begin(9600); -// while (!Serial) -// ; -// Serial.println("Start..."); -// driver.begin(); // Initiate pins and registeries -// driver.rms_current(1200); // Set stepper current to 600mA. The command is the same as command TMC2130.setCurrent(600, 0.11, 0.5); -// driver.microsteps(16); -// driver.stealthChop(1); // Enable extremely quiet stepping - -// digitalWrite(EN_PIN, LOW); - -// Serial.print("DRV_STATUS=0b"); -// Serial.println(driver.DRV_STATUS(), BIN); -// } -// bool isKilled = false; - -// void loop() -// { -// if (driver.checkOT()) -// { -// if (!isKilled) -// { -// Serial.print("Overheat flag triggered: "); -// Serial.println(driver.getOTPW(), DEC); -// driver.TPOWERDOWN(); -// isKilled = true; -// Serial.println("Program stopped"); -// } -// else -// { -// delay(1000); -// } -// } -// else -// { -// digitalWrite(STEP_PIN, HIGH); -// delayMicroseconds(10); -// digitalWrite(STEP_PIN, LOW); -// delayMicroseconds(10); - -// uint32_t ms = millis(); -// static uint32_t last_time = 0; -// if ((ms - last_time) > 500) -// { -// if (dir) -// { -// Serial.println("Dir -> 0"); -// driver.shaft_dir(0); -// } -// else -// { -// Serial.println("Dir -> 1"); -// driver.shaft_dir(1); -// } -// Serial.print("OverTemperature: "); -// Serial.print(driver.getOTPW(), DEC); -// Serial.print(" MSTEP: "); -// Serial.print(driver.microsteps(), DEC); -// Serial.print(" DIR: "); -// Serial.println(driver.dir(), DEC); -// Serial.println("---"); -// //Serial.println(driver.checkStatus()); -// //driver.checkStatus(); - -// dir = !dir; -// last_time = ms; -// } -// } -// } \ No newline at end of file +} \ No newline at end of file diff --git a/README.md b/README.md index 47b8595..1a080c9 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,16 @@ Обдув решает все вопросы. Обдув обязателен
Как и в предыдущих версиях драйверов не рекомендуется отключать двигатель при включенном питании драйвера (необзодимо предотвратить самостоятельное отключение)
-Лучше всего использовать совместно с BIGTREETECH protector ( https://www.gearbest.com/printer-parts/pp_3005227053225004.html ) +Файл: +
M5_TMC2130.ino - содержит пример кода с комментариями +
Папка pdf - документация к драйверу (Полный и понятный документ pdf/TMC2130_datasheet.pdf) +
Папка img - рисунку распиновка фото + + + +
Лучше всего использовать совместно с BIGTREETECH protector ( https://www.gearbest.com/printer-parts/pp_3005227053225004.html ) Это шилд между драйвером и любой платой управления для защиты драйвера от перегорания при обрыве части контаков двигателя, или ручной прокрутки двигателей. В общем это защита драйвера от токов которые может генерировать мотор, или от обрывов проводов. -
+
Еще лучше использовать готовую плату SKR v1.3 которая приходит по умолчанию настроенная на использование данных драйверов --------------------------------------- @@ -29,18 +36,18 @@
В прошивке опытным путем было определено: Лучше использовать программный SPI, так как он учитывает все входы которые в аппаратном SPI необходимо подключить вручную к питанию Vio, GND или выставить необходимый уровень (DIR, STEP, EN) которыми возможно управлять в коде. Индивидуально необходимо рассматривать данные пины при использовании шилда. -Пример соединения драйвера с Arduino Mega (Фото добавленно в папку IMG) +Пример соединения драйвера с Arduino Mega (Фото добавленно в папку IMG)
+Стоит позаботится о качественном контакте пинов. Так как мотор может крутиться медленно из за плохого контакта STEP/DIR -#define EN_PIN 46 // Enable -#define DIR_PIN 24 // Direction -#define STEP_PIN 26 // Step -#define CS_PIN 30 // Chip Select -#define SW_MOSI 34 // Software Master Out Slave In (MOSI) -#define SW_MISO 28 // Software Master In Slave Out (MISO) -#define SW_SCK 32 // Software Slave Clock (SCK) +#define EN_PIN 46 // Enable
+#define DIR_PIN 24 // Direction
+#define STEP_PIN 26 // Step
+#define CS_PIN 30 // Chip Select
+#define SW_MOSI 34 // Software Master Out Slave In (MOSI)
+#define SW_MISO 28 // Software Master In Slave Out (MISO)
+#define SW_SCK 32 // Software Slave Clock (SCK)

- --------------------------------------- - понимание по подстройке ограничителя тока на TMC2130 @@ -48,7 +55,6 @@ После перевода в режим SPI подстроечный резистор перестает влиять на работу драйвера, ток выставляется в прошивке.
- Установка тока происходит путем вызофа функции rms_current(); для обьекта класса TMC2130Stepper Пример: driver.rms_current(1000); 1000 - ток устанавливаемый в милиамперах @@ -58,34 +64,32 @@
модель: JK42HS34-1334AC
Распиновка: зеленый А+, черный А-, синий В+, красный В-.
-угол поворота за один шаг: 1.8 º
НОМИНАЛЬНЫЙ ток на обмотку: 1.33 А
-сопротивление обмотки: 2.1 Ом по факту 3 Ом
-индуктивность обмотки: 2.5 мГн
-крутящий момент удержания: 2.2 кг/см
-

+
Верная настройка токов позволяет:
Избавится от пропуска шагов
Снизить нагрев двигателей
Снизить шум двигателей
-
- - выбор библиотеки и экземплы по обработке детектов (stallGuard2)
+Пример использования библиотеки с определением текущего состояния параметра StallGuard находится в файле M5_TMC2130.ino + +Cуществует старая версия библиотки: https://github.com/teemuatlut/TMC2130Stepper ,но она 3х летней давности +Необходимо скачать и установить библиотеку: https://github.com/teemuatlut/TMCStepper (обновляемая и поддерживаем большее количество драйверов) + +Про stallGuard2:
Когда подвижный механизм упирается в препятствие, нагрузка двигателя возрастает, что и обнаруживает stallGuard2
Схема измерения определяет электрическую энергию, подаваемую в двигатель (EI) и энергию, которая возвращается в источник питания (EB). Разница между этими показателями определяет энергию, которая была передана механической системе (EM). stallGuard2 контролирует значение EB, и, если оно приближается к нулю, это значит, что вся энергия передается в систему и подвижный механизм, скорее всего, уперся в препятствие. +
+Видео с примером и принципом работы: https://youtu.be/UrRlFIkvNxc +
-

- -ПРЕДУПРЕЖДЕНИЕ: библиотека TMC2130Stepper-master должна запускаться на архитектурах avr, sam и может быть несовместима с вашей платой на архитектуре esp32. - -если кто-то собирается использовать библиотеку TMCStepper вместе с ESP32, как я, вам необходимо использовать HardwareSerial из-за проблем с совместимостью. - - +Цитата с форума:
+Eсли кто-то собирается использовать библиотеку TMCStepper вместе с ESP32, как я, вам необходимо использовать HardwareSerial из-за проблем с совместимостью.
Ссылки: @@ -94,5 +98,4 @@ Библиотека: https://github.com/teemuatlut/TMC2130Stepper
https://github.com/teemuatlut/TMC2130Stepper/tree/master/examples
Про StallGuard2: https://3dtoday.ru/blogs/svs0724/tms2130-applied-technology-and-connection-to-ruramps4d-in-the-configur/
- Решение от автора: https://gist.github.com/teemuatlut/2bc6d85732311087e3e5285e04c36cb5 diff --git a/img/13f7ddc300a3e1a21d8b43a196c23779.jpg b/img/13f7ddc300a3e1a21d8b43a196c23779.jpg new file mode 100644 index 0000000..1c6a0ee Binary files /dev/null and b/img/13f7ddc300a3e1a21d8b43a196c23779.jpg differ diff --git a/img/photo_2021-01-13_14-55-05.jpg b/img/photo_2021-01-13_14-55-05.jpg new file mode 100644 index 0000000..c893253 Binary files /dev/null and b/img/photo_2021-01-13_14-55-05.jpg differ diff --git a/img/photo_2021-01-13_17-19-21.jpg b/img/photo_2021-01-13_17-19-21.jpg new file mode 100644 index 0000000..109b787 Binary files /dev/null and b/img/photo_2021-01-13_17-19-21.jpg differ diff --git a/img/photo_2021-01-13_17-20-10.jpg b/img/photo_2021-01-13_17-20-10.jpg new file mode 100644 index 0000000..472833b Binary files /dev/null and b/img/photo_2021-01-13_17-20-10.jpg differ diff --git a/img/photo_2021-01-13_17-20-17.jpg b/img/photo_2021-01-13_17-20-17.jpg new file mode 100644 index 0000000..f87a7ed Binary files /dev/null and b/img/photo_2021-01-13_17-20-17.jpg differ diff --git a/img/zNM0BEAMyp8SGekSKmC08Gh0bTfjqkIbBdBAFm7J.png b/img/zNM0BEAMyp8SGekSKmC08Gh0bTfjqkIbBdBAFm7J.png new file mode 100644 index 0000000..0854ce1 Binary files /dev/null and b/img/zNM0BEAMyp8SGekSKmC08Gh0bTfjqkIbBdBAFm7J.png differ diff --git a/pdf/TMC2130-01.png b/pdf/TMC2130-01.png deleted file mode 100644 index 6535861..0000000 Binary files a/pdf/TMC2130-01.png and /dev/null differ