Промежуточный

master
smartUA 2020-12-01 11:35:09 +02:00
parent 6ba575dfdc
commit 018c4cf2a9
2 changed files with 282 additions and 135 deletions

View File

@ -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.h>
// 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 <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);
#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()
{
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);
}
}
}
// bool dir = true;
// #include <TMC2130Stepper.h>
// 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 <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);
// Serial.println("---");
// //Serial.println(driver.checkStatus());
// //driver.checkStatus();
// dir = !dir;
// last_time = ms;
// }
// }
// }

View File

@ -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/>
Изначально необходимо знать характеристики мотора (используемого)
модель: JK42HS34-1334AC
Распиновка: зеленый А+, черный А-, синий В+, красный В-.
угол поворота за один шаг: 1.8 º
<b>НОМИНАЛЬНЫЙ ток на обмотку: 1.33 А</b>
сопротивление обмотки: 2.1 Ом по факту 3 Ом
индуктивность обмотки: 2.5 мГн
крутящий момент удержания: 2.2 кг/см
<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/>
Верная настройка токов позволяет:
Избавится от пропуска шагов
Снизить нагрев двигателей
Снизить шум двигателей
<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/>