diff --git a/M5_TMC2130.ino b/M5_TMC2130.ino index 9105280..de05d60 100644 --- a/M5_TMC2130.ino +++ b/M5_TMC2130.ino @@ -1,125 +1,256 @@ -#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 +// #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 -// bool dir = true; -// #include -// TMC2130Stepper driver = TMC2130Stepper(EN_PIN, DIR_PIN, STEP_PIN, CS_PIN, MOSI_PIN, MISO_PIN, SCK_PIN); +/* + * You can control the rotation speed with + * 0 Stop + * 1 Resume + * + Speed up + * - Slow down + */ -// void setup() { -// Serial.begin(115200); -// 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.stealthChop(1); // Enable extremely quiet stepping -// driver.microsteps(0); -// Serial.println(driver.microsteps()); // shows microsteps setting -// digitalWrite(EN_PIN, LOW); +#define MAX_SPEED 40 // In timer value +#define MIN_SPEED 1000 -// Serial.print("DRV_STATUS=0b"); -// Serial.println(driver.DRV_STATUS(), BIN); -// } +#define STALL_VALUE 0 // [-64..63] -// void loop() { -// digitalWrite(STEP_PIN, HIGH); -// //delayMicroseconds(10); -// delay(50); -// digitalWrite(STEP_PIN, LOW); -// //delayMicroseconds(10); -// delay(50); -// uint32_t ms = millis(); -// static uint32_t last_time = 0; -// if ((ms - last_time) > 3000) { -// if (dir) { -// Serial.println("Dir -> 0"); -// driver.shaft_dir(0); -// } else { -// Serial.println("Dir -> 1"); -// driver.shaft_dir(1); -// } -// dir = !dir; -// last_time = ms; -// } -// } +// 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 -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); +#include +TMC2130Stepper driver = TMC2130Stepper(CS_PIN); + +bool vsense; + +uint16_t rms_current(uint8_t CS, float Rsense = 0.11) +{ + return (float)(CS + 1) / 32.0 * (vsense ? 0.180 : 0.325) / (Rsense + 0.02) / 1.41421 * 1000; +} + 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 + //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); + } + //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); + } + + // Set stepper interrupt + { + cli(); //stop interrupts + TCCR1A = 0; // set entire TCCR1A register to 0 + TCCR1B = 0; // same for TCCR1B + TCNT1 = 0; //initialize counter value to 0 + OCR1A = 256; // = (16*10^6) / (1*1024) - 1 (must be <65536) + // turn on CTC mode + TCCR1B |= (1 << WGM12); + // Set CS11 bits for 8 prescaler + TCCR1B |= (1 << CS11); // | (1 << CS10); + // enable timer compare interrupt + TIMSK1 |= (1 << OCIE1A); + sei(); //allow interrupts + } + + //TMC2130 outputs on (LOW active) digitalWrite(EN_PIN, LOW); - Serial.print("DRV_STATUS=0b"); - Serial.println(driver.DRV_STATUS(), BIN); + vsense = driver.vsense(); } -bool isKilled = false; - +ISR(TIMER1_COMPA_vect) +{ + PORTF |= 1 << 0; + PORTF &= ~(1 << 0); +} void loop() { - if (driver.checkOT()) + static uint32_t last_time = 0; + uint32_t ms = millis(); + + while (Serial.available() > 0) { - if (!isKilled) - { - Serial.print("Overheat flag triggered: "); - Serial.println(driver.getOTPW(), DEC); - driver.TPOWERDOWN(); - isKilled = true; - Serial.println("Program stopped"); - } - else + int8_t read_byte = Serial.read(); + if (read_byte == '0') { - delay(1000); + TIMSK1 &= ~(1 << OCIE1A); + digitalWrite(EN_PIN, HIGH); } + else if (read_byte == '1') + { + 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 ((ms - last_time) > 100) //run every 0.1s { - 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); - dir = !dir; - last_time = ms; - } + last_time = ms; + uint32_t drv_status = driver.DRV_STATUS(); + Serial.print("0 "); + Serial.print((drv_status & SG_RESULT_bm) >> SG_RESULT_bp, DEC); + Serial.print(" "); + Serial.println(rms_current((drv_status & CS_ACTUAL_bm) >> CS_ACTUAL_bp), DEC); } -} \ No newline at end of file +} + +// 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 diff --git a/README.md b/README.md index d30f8e2..ddb396a 100644 --- a/README.md +++ b/README.md @@ -6,63 +6,79 @@ Общее: -Без радиатора будет греться до 75 градусов -С радиатором 65 -Обдув решает все вопросы. Обдув обязателен - +Без радиатора будет греться до 75 градусов
+С радиатором 65
+Обдув решает все вопросы. Обдув обязателен
+Как и в предыдущих версиях драйверов не рекомендуется отключать двигатель при включенном питании драйвера (необзодимо предотвратить самостоятельное отключение)
............................................... - понятная распиновка/соединение для работы по SPI без промежуточных плат между ардуиной и TMC2130 -Первый запуск (Для SPI режима) -Перед запуском необходимо убедится что драйвер не имеет перемычки на контактах SPI -Убедиться что правильно припаяны резисторы на контактах CFG4 (GND), CFG5 (VCC). +
+Первый запуск (Для SPI режима)
+Перед запуском необходимо убедится что драйвер не имеет перемычки на контактах SPI
+Убедиться что правильно припаяны резисторы на контактах CFG4 (GND), CFG5 (VCC).
После этого подстроечный резистор перестает влиять на работу драйвера, ток выставляется в прошивке. +
+В прошивке опытным путем было определено: Лучше использовать программный SPI, так как он учитывает все входы которые в аппаратном SPI необходимо подключить вручную к питанию Vio, GND или выставить необходимый уровень (DIR, STEP, EN) которыми возможно управлять в коде. Индивидуально необходимо рассматривать данные пины при использовании шилда. +
+В файле TMC2130Stepper.h 410 строка необходимо изменить пины: + +
Лучше всего использовать совместно с BIGTREETECH protector Это шилд между драйвером и любой платой управления для защиты драйвера от перегорания при обрыве части контаков двигателя, или ручной прокрутки двигателей. В общем это защита драйвера от токов которые может генерировать мотор. - -Еще лучше использовать готовую плату +
+Еще лучше использовать готовую плату SKR v1.3 которая приходит по умолчанию настроенная на использование данных драйверов -............................................... +..................................
............. - понимание по подстройке ограничителя тока на TMC2130 - +
После перевода в режим SPI подстроечный резистор перестает влиять на работу драйвера, ток выставляется в прошивке. - +
Изначально необходимо знать характеристики мотора (используемого) - -модель: JK42HS34-1334AC -Распиновка: зеленый А+, черный А-, синий В+, красный В-. -угол поворота за один шаг: 1.8 º -НОМИНАЛЬНЫЙ ток на обмотку: 1.33 А -сопротивление обмотки: 2.1 Ом по факту 3 Ом -индуктивность обмотки: 2.5 мГн -крутящий момент удержания: 2.2 кг/см +
+модель: JK42HS34-1334AC
+Распиновка: зеленый А+, черный А-, синий В+, красный В-.
+угол поворота за один шаг: 1.8 º
+НОМИНАЛЬНЫЙ ток на обмотку: 1.33 А
+сопротивление обмотки: 2.1 Ом по факту 3 Ом
+индуктивность обмотки: 2.5 мГн
+крутящий момент удержания: 2.2 кг/см
+

+Верная настройка токов позволяет:
+Избавится от пропуска шагов
+Снизить нагрев двигателей
+Снизить шум двигателей
-Верная настройка токов позволяет: -Избавится от пропуска шагов -Снизить нагрев двигателей -Снизить шум двигателей +
+Как результат надо:
-Как результат надо: +- выбор библиотеки и экземплы по обработке детектов (stallGuard2)
+ +Когда подвижный механизм упирается в препятствие, нагрузка двигателя возрастает, что и обнаруживает stallGuard2
+Схема измерения определяет электрическую энергию, подаваемую в двигатель (EI) и энергию, которая возвращается в источник питания (EB). Разница между этими показателями определяет энергию, которая была передана механической системе (EM). stallGuard2 контролирует значение EB, и, если оно приближается к нулю, это значит, что вся энергия передается в систему и подвижный механизм, скорее всего, уперся в препятствие. + + +

-- выбор библиотеки и экземплы по обработке детектов (stallGuard2) Чтобы можно было отталкиваться от этого для применения где либо и написания прикладного кода. Возможно на основе этого статью сделаем или видео. т.к. В инете похоже мало элементарных how to по этому драйверу, все что попадалось ориентировано на использование в конкретных 3д принтерах. +
- - - +
Ссылки: - -Интересынй пример: https://revspace.nl/TMC2130 -Библиотека: https://github.com/teemuatlut/TMC2130Stepper +
+Интересынй пример: https://revspace.nl/TMC2130
+Библиотека: 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/