Driver TMC2209 - Problème UART en lecture et écriture

Bonjour à tous !

(CONTEXTE) Nous travaillons sur un projet nécessitant de contrôler des moteurs pas à pas de manière numérique (si possible intégralement contrôlable par programmation). Nous avons alors choisi le TMC2209 (driver V1.2), car il offre l'opportunité de contrôler le moteur pas à pas avec l’Uart.

(PROBLEME) Cependant, nous rencontrons un problème lors de la communication Uart entre l’arduino Mega et le TMC2209. Nous n’avons aucune réponse du TMC2209 lors d'une lecture/écriture d'un registre en Uart. Nous avons quand même testé le driver sans Uart pour tester le cablâge, et nous obtenons bien le comportement désiré.

(Tests) Pour nos tests, nous avons essayé la librairie TMC2209 et TMCStepper avec leurs codes d’exemple. Aucune d’elles ne fonctionnent pour l’Uart.

Le voici le câblage effectué :

Nous avons branché MS1 et MS2 à la masse pour l’adresse 0. Nous utilisons l’interface série 1 de l’arduino Mega avec RXD connecté à la pin 19 et TXD à la pin 18.

Le code utilisé dernièrement pour l'essai est celui-ci :

#include <TMCStepper.h>

#define DELAY 1000      
#define DIR_PIN          14           // Direction
#define STEP_PIN         12           // Step
#define SERIAL_PORT Serial1           // HardwareSerial port pins 18 & 19
#define DRIVER_ADDRESS 0b00           // TMC2209 Driver address according to MS1 and MS2
#define R_SENSE 0.11f                 // Match to your driver: SilentStepStick series use 0.11, UltiMachine Einsy and Archim2 boards use 0.2, Panucatt BSD2660 uses 0.1, Watterott TMC5160 uses 0.075
//bool shaft = false;                   
TMC2209Stepper driver(&SERIAL_PORT, R_SENSE, DRIVER_ADDRESS);

void setup() {
  // stepper.connectToPins(STEP_PIN, DIR_PIN);  // INITIALIZE SpeedyStepper
  SERIAL_PORT.begin(115200);                    // INITIALIZE UART TMC2209
  Serial.begin(115200);                         // init baud rate
  delay(500);                                   // attente de 500ms
  Serial.println(F("Serial Initialized"));
  driver.begin();                               // Initialize driver
  driver.toff(5);                               // Enables driver in software
  driver.rms_current(600);                      // Set motor RMS current
  driver.microsteps(2);                         // Set microsteps to ½
  driver.pwm_autoscale(true);                   // Needed for stealthChop

  // driver.en_spreadCycle(true);               // Toggle spreadCycle for smooth & silent operation
}

void loop() {
  uint16_t msread=driver.microsteps(); // envois en uart d'une lecture du registre dédié aux microsteps
  Serial.print(F("Read microsteps via UART to test UART receive : "));    // affichage terminal 
  Serial.println(msread); // affichage de la réponse du driver au terminal 
  delay(DELAY);
}

(Trame émise) Nous avons relevé la trame qui est émise depuis l’arduino à l'aide d'un analyseur logique. Elle se compose d'un octet 0x05 (synchronisation), d'un octet pour l'adresse (0x00) de l'adresse d'un registre à lire (0x6C) et finalement d'un CRC (0xCA). Ce datagramme est répété après 8 milli secondes.

Selon la datasheet ( ADI Trinamic Support | Analog Devices), nous nous attendons à avoir une trame similaire à celle relevée avec 0xFF pour le 2ème octet du datagramme. Aucune trame de ce type n'apparait durant l'analyse. Je n'ai donc aucune réponse du TMC2209.

Nous avons aussi essayé de paramétrer le courant par uart via la librairie TMCStepper tout en contrôlant le moteur par la pin STEP et DIR. Etant équipé d'une alimentation de tension réglable avec un afficheur du courant, nous avons remarqué que celui-ci n'a pas changé, et est resté au alentour de 300mA sur tout le test. L'écriture n'a donc pas l'air de fonctionner également.

Avez-vous une idée du problème ou tests supplémentaires que nous pourrions effectuer ? Toute aide est la bienvenue, nous vous remercions.

Etant nouvel utilisateur, je ne peux partager qu'un seul média.

Vous avez vérifié que cette condition est bien remplie?

The UART line must be logic high during idle state. Therefore, the power down function cannot be assigned by the pin PDN_UART in between of transmissions. In an application using the UART interface, set the desired power down function by register access and set pdn_disable in GCONF to disable the pin function

Bonjour fdufnews,

Cette condition me semble remplie.

je vous joint la trame afin que vous puissiez la voir.

image

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.