Настройка ограничения тока на TMC2209 через V_ref

В интернете очень много разных “формул” для расчёта напряжения на подстроечном резисторе, задающем ограничение тока RMS, и все они разные. Лучше почитать даташит…

Важно уточнить, что на данный момент я не использую UART протокол в драйверах и все значения регистров внутри драйверов после включения остаются по умолчанию. И вот по умолчанию там сконфигурировано использование Vref для масштабирования ограничения по току и использование внешних Rsense регистров для задания максимально “доступного” тока. Эти резисторы ставятся на BRA(23), BRB(27) пины и их легко найти на плате:

Это фото моего драйвера и на нём жёлтыми рамками выделены Rsa, Rsb резисторы (те самые Rsense). На них написано R110 что равно 110мΩ (0.11Ω). Без этого значения просто не возможно ни чего посчитать. И эти резисторы могут быть какими угодно у разных производителей плат драйверов и каким образом кто-то что-то в интернете может рекомендовать не призывая узнать номинал резисторов – мне не понятно.

Итак, миссия 1 выполнена и значение Rsense узнали. Теперь нужно найти формулу расчёта ограничения RMS тока в даташите:

Осталось только разобраться немного с Vvref. В даташите сказано, что значение (Vvref / 2.5) используется как множитель к ограничению тока, заданному Rsense резисторами. То есть если, например, Vvref == 2.5, то множитель будет == 1.0, а если, например Vvref == 1.0, то множитель будет равен 1.0/2.5 == 0.4. Значение напряжения Vvref выше 2.5 трактуется как 2.5, то есть множитель всегда будет равен 1.0 при Vvref >= 2.5.

Как ранее стало известно, у меня стоят Rsense резисторы на 110мОм, подставим это значение в формулу и упростим её:

I_rms = (325 / (110 + 20)) * (1 / sqrt(2)) * (V_vref / 2.5)
I_rms = 2.5 * 0.7071 * (V_vref / 2.5)

Тут номиналы резисторов Rsense так удобно подобраны, что умножение и деление на 2.5 можно сократить и получим:

I_rms = 0.7071 * V_vref
V_vref = I_rms / 0.7071

И да, на некоторых сайтах такой множитель рекомендуют, но без знания номинала Rsense нельзя быть уверенным, что всё посчитано правильно. И ещё на некоторых сайтах написано, что “Значение (Vref) не должно превышать 1.2 В или драйвер может выйти из строя“. Вот откуда это взялось??? В даташите не только сказано, что диапазон настройки Vvref до 2.5V (а вообще до 5V, но оно “обрежется” до 2.5V при расчёте множителя), так ещё и дополнительно сказано следующее:

то есть ниже 0.5V вообще не надо опускаться, да и лучше больше 1.0V ставить значение, в диапазоне 2-2.4V (но для этого надо правильно подобрать Rsense конечно). И сжечь мой драйвер, выставив Vvref в 2.5V, ни как не получится, ведь если посчитать по формуле максимальный ток: I_rms = 0.707 * 2.5 получим ток 1.767A, что ниже заявленного продолжительного RMS тока:

И ещё один момент: не стоит использовать результат расчёта по формуле “как есть”. Это “идеальное” значение, но номиналы Rsense резисторов могут оказаться не очень точными да и мотор может не держать заявленный ток и потому лучше выставить значение на 10-20% меньше, чем посчитанное по формуле, для безопасности.

FluidNC (и Candle) на Wemos D1 R32 + CNC SHIELD V3 + TMC2209 + SD Card + OLED Display на 4 оси

Понадобилась для квартирного станкостроения возможность управлять шаговыми движками. По советам из гугла купил дешёвые компоненты, собрал, не заработало…

Опуская все промежуточные проблемы от которых знатно подгорело просто запишу сюда что сделал в итоге, чтоб работало как должно.

Глава 1: Питание

CNC SHIELD сделан под Arduino, у которой 5V логика. Wemos же сделан на основе ESP32 и тут логика 3.3V, потому решил запитать CNC SHIELD от 3.3V. Для этого надо:

  1. Удалить ножку 5V на шилде, чтоб на шилд с платы Wemos не поступали 5V в принципе. Я просто откусил кусачками ножку в PLS гребёнке.
  2. В верхнем правом углу на шилде есть 2 пина, стоящие рядом: 3.3V и 5V – их надо соединить между собой перемычкой. Так с шины 3.3V будет подано питание на шину 5V что и нужно.

Глава 2: Распиновка

Если понадобится использовать SD карту (да, понадобится), то не получится сохранить соответствие функций пинов на шилде с их шелгографией. SD карта ну ни как не захотела заводиться на других пинах, кроме IO5, IO18, IO19, IO23 на ванильной прошивке FluidNC и потому необходимо некоторые функции переместить на другие пины.

А ещё на самой плате Wemos не правильные подписи некоторых пинов, как и на изображениях самой платы в интернете. Это жесть. Я всё прозвонил, исправил обозначения на картинке из интернета и подписал функции всех задействованных в проекте пинов:

Глава 3: ESP32 не загружается

На картинках выше я пометил что нужно сделать, а тут напишу зачем это надо делать.

ESP32 не будет загружаться со вставленной платой CNC SHIELD. Виновником оказался IO12 пин. На CNC SHIELD плате это EN пин. Он идёт к драйверам моторов на плате на соответствующие EN ножки. IO12 не обычный пин, это т.н. bootstrap pin и его функция при старте ESP32 это выбор напряжения питания внешней микросхемы FLASH памяти с которой грузится микроконтроллер. По умолчанию при старте ESP32 этот пин подтянут к GND и будет выбрано питание 3.3V, однако на плате CNC SHIELD этот пин подтянут резистором к VDD (+питания) из за чего при старте контроллера выбирается не правильное (1.8V) питание FLASH.

Я удалил этот резистор (указано на картинке выше), тем более он всё равно бесполезен, т.к. на каждом драйвере этот пин всё равно подтянут к питанию 4.7К резисторами. И после его удаления ESP32 стартует успешно, но это только если в shield не вставлены драйверы моторов.

Устанавливаем драйверы моторов в соответсвующие разъёмы и.. снова ESP32 не загружается. Но тут всё легко, т.к. проблема всё та же – IO12 пин. На каждом драйвере установлен свой резистор для подтяжки к питанию пина EN, потому после установки драйверов EN (IO12) снова подтянут к питанию и снова та же проблема с загрузкой. Я решил эту проблему простым костылём, сделав “джампер” с резистором на 2К между EN и GND пинами на CNC SHIELD (указано на картинке 2).

Глава 4: Конфигурация

После установки последней прошивки FluidNC я залил в неё файл конфига через WEB интерфейс и применил его. Моторы крутятся, OLED дисплей работает:

name: "ESP32"
board: "Wemos_CNCShield"
meta: "4axis"

stepping:
  engine: RMT
  idle_ms: 250
  dir_delay_us: 1
  pulse_us: 2
  disable_delay_us: 0

axes:
  shared_stepper_disable_pin: NO_PIN

  x:
    steps_per_mm: 200
    max_rate_mm_per_min: 400
    acceleration_mm_per_sec2: 2
    max_travel_mm: 100
    homing:
      cycle: 2
      mpos_mm: -3.000
      feed_mm_per_min: 400
      positive_direction: false
    
    motor0:
      limit_all_pin: gpio.36:low
      hard_limits: false
      pulloff_mm: 3.000
      stepstick:
        direction_pin: gpio.16
        step_pin: gpio.26

  y:
    steps_per_mm: 200
    max_rate_mm_per_min: 400
    acceleration_mm_per_sec2: 2
    max_travel_mm: 100
    homing:
      cycle: 2
      mpos_mm: -3
      feed_mm_per_min: 400
      positive_direction: false
    
    motor0:
      limit_all_pin: gpio.34:low
      hard_limits: false
      pulloff_mm: 3
      stepstick:
        direction_pin: gpio.27
        step_pin: gpio.25

  z:
    steps_per_mm: 200
    max_rate_mm_per_min: 400
    acceleration_mm_per_sec2: 2
    max_travel_mm: 10
    homing:
      cycle: 1
      mpos_mm: 3
      feed_mm_per_min: 400
      positive_direction: true
    
    motor0:
      limit_all_pin: gpio.35:low
      hard_limits: false
      pulloff_mm: 3
      stepstick:
        direction_pin: gpio.14
        step_pin: gpio.17

  a:
    steps_per_mm: 200
    max_rate_mm_per_min: 400
    acceleration_mm_per_sec2: 2
    max_travel_mm: 360
    
    motor0:
      limit_all_pin: gpio.39:low
      hard_limits: false
      pulloff_mm: 3
      stepstick:
        direction_pin: gpio.32
        step_pin: gpio.33

spi:
  miso_pin: gpio.19
  mosi_pin: gpio.23
  sck_pin: gpio.18

sdcard:
  cs_pin: gpio.5
  card_detect_pin: NO_PIN

coolant:
  flood_pin: gpio.15

probe:
  pin: gpio.13:low:pu

user_outputs:
  digital0_pin: gpio.12

PWM:
  pwm_hz: 5000
  output_pin: gpio.2
  enable_pin: gpio.4
  disable_with_s0: false
  s0_with_disable: true
  speed_map: 0=0% 10000=100%
  
i2c0:
   sda_pin: gpio.21
   scl_pin: gpio.22

oled:
   i2c_num: 0
   i2c_address: 60
   width: 128
   height: 64
   radio_delay_ms: 1000

Глава 5: Candle

Мне лично удобно некоторые задачи выполнять через Candle и потому решил разобраться с тем, как его подключить к FluidNC. На данный момент подключаюсь к нему через виртуальный COM порт, работающий поверх IP сети. Использую программу Tibbo. Настройка там тривиальная – достаточно создать в Tibbo VSP Manager новый COM порт и указать IP адрес FluidNC платы и порт 23, после чего можно использовать этот порт в Candle.