Промежуточный
parent
6ba575dfdc
commit
018c4cf2a9
317
M5_TMC2130.ino
317
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
|
||||
|
||||
/*
|
||||
* You can control the rotation speed with
|
||||
* 0 Stop
|
||||
* 1 Resume
|
||||
* + Speed up
|
||||
* - Slow down
|
||||
*/
|
||||
|
||||
#define MAX_SPEED 40 // In timer value
|
||||
#define MIN_SPEED 1000
|
||||
|
||||
#define STALL_VALUE 0 // [-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
|
||||
#define MOSI_PIN 23 // D7
|
||||
#define MISO_PIN 19 // D6
|
||||
#define SCK_PIN 18 // D5
|
||||
|
||||
#include <TMC2130Stepper.h>
|
||||
#include <TMC2130Stepper_REGDEFS.h>
|
||||
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()
|
||||
{
|
||||
//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);
|
||||
|
||||
vsense = driver.vsense();
|
||||
}
|
||||
|
||||
ISR(TIMER1_COMPA_vect)
|
||||
{
|
||||
PORTF |= 1 << 0;
|
||||
PORTF &= ~(1 << 0);
|
||||
}
|
||||
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
if ((ms - last_time) > 100) //run every 0.1s
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
// bool dir = true;
|
||||
|
||||
// #include <TMC2130Stepper.h>
|
||||
// TMC2130Stepper driver = TMC2130Stepper(EN_PIN, DIR_PIN, STEP_PIN, CS_PIN, MOSI_PIN, MISO_PIN, SCK_PIN);
|
||||
// TMC2130Stepper TMC2130 = TMC2130Stepper(EN_PIN, DIR_PIN, STEP_PIN, CS_PIN);
|
||||
|
||||
// void setup() {
|
||||
// Serial.begin(115200);
|
||||
// while(!Serial);
|
||||
// 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 <TMC2130Stepper.h>
|
||||
// // 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
|
||||
// driver.microsteps(0);
|
||||
// Serial.println(driver.microsteps()); // shows microsteps setting
|
||||
|
||||
// digitalWrite(EN_PIN, LOW);
|
||||
|
||||
// Serial.print("DRV_STATUS=0b");
|
||||
// Serial.println(driver.DRV_STATUS(), BIN);
|
||||
// }
|
||||
// bool isKilled = false;
|
||||
|
||||
// void loop() {
|
||||
// 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);
|
||||
// delay(50);
|
||||
// delayMicroseconds(10);
|
||||
// digitalWrite(STEP_PIN, LOW);
|
||||
// //delayMicroseconds(10);
|
||||
// delay(50);
|
||||
// delayMicroseconds(10);
|
||||
|
||||
// uint32_t ms = millis();
|
||||
// static uint32_t last_time = 0;
|
||||
// if ((ms - last_time) > 3000) {
|
||||
// if (dir) {
|
||||
// if ((ms - last_time) > 500)
|
||||
// {
|
||||
// if (dir)
|
||||
// {
|
||||
// Serial.println("Dir -> 0");
|
||||
// driver.shaft_dir(0);
|
||||
// } else {
|
||||
// }
|
||||
// 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;
|
||||
// }
|
||||
// }
|
||||
|
||||
bool dir = true;
|
||||
#define TMC2130DEBUG
|
||||
#include <TMC2130Stepper.h>
|
||||
// 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);
|
||||
dir = !dir;
|
||||
last_time = ms;
|
||||
}
|
||||
}
|
||||
}
|
||||
// }
|
80
README.md
80
README.md
|
@ -6,63 +6,79 @@
|
|||
|
||||
Общее:
|
||||
|
||||
Без радиатора будет греться до 75 градусов
|
||||
С радиатором 65
|
||||
Обдув решает все вопросы. Обдув обязателен
|
||||
|
||||
Без радиатора будет греться до 75 градусов<br/>
|
||||
С радиатором 65<br/>
|
||||
Обдув решает все вопросы. Обдув обязателен<br/>
|
||||
Как и в предыдущих версиях драйверов не рекомендуется отключать двигатель при включенном питании драйвера (необзодимо предотвратить самостоятельное отключение)<br/>
|
||||
|
||||
...............................................
|
||||
<strong>- понятная распиновка/соединение для работы по SPI без промежуточных плат между ардуиной и TMC2130
|
||||
</strong>
|
||||
Первый запуск (Для SPI режима)
|
||||
Перед запуском необходимо убедится что драйвер не имеет перемычки на контактах SPI
|
||||
Убедиться что правильно припаяны резисторы на контактах CFG4 (GND), CFG5 (VCC).
|
||||
<br/>
|
||||
Первый запуск (Для SPI режима)<br/>
|
||||
Перед запуском необходимо убедится что драйвер не имеет перемычки на контактах SPI<br/>
|
||||
Убедиться что правильно припаяны резисторы на контактах CFG4 (GND), CFG5 (VCC).<br/>
|
||||
<strong> После этого подстроечный резистор перестает влиять на работу драйвера, ток выставляется в прошивке. </strong>
|
||||
<br/>
|
||||
В прошивке опытным путем было определено: Лучше использовать программный SPI, так как он учитывает все входы которые в аппаратном SPI необходимо подключить вручную к питанию Vio, GND или выставить необходимый уровень (DIR, STEP, EN) которыми возможно управлять в коде. Индивидуально необходимо рассматривать данные пины при использовании шилда.
|
||||
|
||||
<br/>
|
||||
В файле TMC2130Stepper.h 410 строка необходимо изменить пины:
|
||||
|
||||
<br/>
|
||||
<b>Лучше всего использовать совместно с BIGTREETECH protector
|
||||
Это шилд между драйвером и любой платой управления для защиты драйвера от перегорания при обрыве части контаков двигателя, или ручной прокрутки двигателей. В общем это защита драйвера от токов которые может генерировать мотор.
|
||||
</b>
|
||||
|
||||
<b>Еще лучше использовать готовую плату</b>
|
||||
<br/>
|
||||
<b>Еще лучше использовать готовую плату SKR v1.3 которая приходит по умолчанию настроенная на использование данных драйверов</b>
|
||||
|
||||
|
||||
|
||||
...............................................
|
||||
..................................<br/>.............
|
||||
<strong> - понимание по подстройке ограничителя тока на TMC2130 </strong>
|
||||
|
||||
<br/>
|
||||
<strong> После перевода в режим SPI подстроечный резистор перестает влиять на работу драйвера, ток выставляется в прошивке. </strong>
|
||||
|
||||
<br/>
|
||||
Изначально необходимо знать характеристики мотора (используемого)
|
||||
<br/>
|
||||
модель: JK42HS34-1334AC<br/>
|
||||
Распиновка: зеленый А+, черный А-, синий В+, красный В-.<br/>
|
||||
угол поворота за один шаг: 1.8 º<br/>
|
||||
<b>НОМИНАЛЬНЫЙ ток на обмотку: 1.33 А</b><br/>
|
||||
сопротивление обмотки: 2.1 Ом по факту 3 Ом<br/>
|
||||
индуктивность обмотки: 2.5 мГн<br/>
|
||||
крутящий момент удержания: 2.2 кг/см<br/>
|
||||
<br/><br/>
|
||||
Верная настройка токов позволяет: <br/>
|
||||
Избавится от пропуска шагов<br/>
|
||||
Снизить нагрев двигателей<br/>
|
||||
Снизить шум двигателей<br/>
|
||||
|
||||
модель: JK42HS34-1334AC
|
||||
Распиновка: зеленый А+, черный А-, синий В+, красный В-.
|
||||
угол поворота за один шаг: 1.8 º
|
||||
<b>НОМИНАЛЬНЫЙ ток на обмотку: 1.33 А</b>
|
||||
сопротивление обмотки: 2.1 Ом по факту 3 Ом
|
||||
индуктивность обмотки: 2.5 мГн
|
||||
крутящий момент удержания: 2.2 кг/см
|
||||
|
||||
Верная настройка токов позволяет:
|
||||
Избавится от пропуска шагов
|
||||
Снизить нагрев двигателей
|
||||
Снизить шум двигателей
|
||||
<br/>
|
||||
Как результат надо:<br/>
|
||||
|
||||
|
||||
Как результат надо:
|
||||
- выбор библиотеки и экземплы по обработке детектов (stallGuard2)<br/>
|
||||
|
||||
Когда подвижный механизм упирается в препятствие, нагрузка двигателя возрастает, что и обнаруживает stallGuard2<br/>
|
||||
Схема измерения определяет электрическую энергию, подаваемую в двигатель (EI) и энергию, которая возвращается в источник питания (EB). Разница между этими показателями определяет энергию, которая была передана механической системе (EM). stallGuard2 контролирует значение EB, и, если оно приближается к нулю, это значит, что вся энергия передается в систему и подвижный механизм, скорее всего, уперся в препятствие.
|
||||
|
||||
|
||||
<br/><br/>
|
||||
|
||||
|
||||
- выбор библиотеки и экземплы по обработке детектов (stallGuard2)
|
||||
|
||||
Чтобы можно было отталкиваться от этого для применения где либо и написания прикладного кода.
|
||||
Возможно на основе этого статью сделаем или видео. т.к. В инете похоже мало элементарных how to по этому драйверу, все что попадалось ориентировано на использование в конкретных 3д принтерах.
|
||||
|
||||
<br/>
|
||||
|
||||
|
||||
|
||||
|
||||
<br/>
|
||||
|
||||
Ссылки:
|
||||
|
||||
Интересынй пример: https://revspace.nl/TMC2130
|
||||
Библиотека: https://github.com/teemuatlut/TMC2130Stepper
|
||||
<br/>
|
||||
Интересынй пример: https://revspace.nl/TMC2130<br/>
|
||||
Библиотека: https://github.com/teemuatlut/TMC2130Stepper<br/>
|
||||
https://github.com/teemuatlut/TMC2130Stepper/tree/master/examples <br/>
|
||||
Про StallGuard2: https://3dtoday.ru/blogs/svs0724/tms2130-applied-technology-and-connection-to-ruramps4d-in-the-configur/<br/>
|
||||
|
||||
|
|
Loading…
Reference in New Issue