// Dateiname: Kurz_und_knapp_Jahr_Monat_Tag_lfd Buchstabe // // Arduino UNO SMD R3 und QHV5160 Version 1.0 E (TMC5160) über Spi-Schnittstelle // Letzte Änderung: 11.11.25 22:25 Uhr // Strom fliesst; keine Drehzahl //#include #include // Konstanten definieren // SPI Pins #define sck 13 //SPI clock #define mosi 11 //master transmit out slave receive input #define miso 12 //master receive input slave transmit out const int PIN_CS = 10; // Chip Select const int PIN_EN = 9; // Drive-Enable Lowaktiv // Variablen definieren uint32_t result; // Funktion: 32-Bit Register schreiben void writeTMC5160Register(uint8_t address, uint32_t data) { digitalWrite(PIN_CS, LOW); delay(5); SPI.transfer(address | 0x80); // Write command SPI.transfer((data >> 24) & 0xFF); SPI.transfer((data >> 16) & 0xFF); SPI.transfer((data >> 8) & 0xFF); SPI.transfer(data & 0xFF); digitalWrite(PIN_CS, HIGH); delay(5); } uint32_t tmc5160_readRegister(uint8_t address) { uint8_t response[5]; // 1. Dummy-Write zum Einleiten des Lesevorgangs digitalWrite(PIN_CS, LOW); delayMicroseconds(10); SPI.transfer(address & 0x7F); // MSB = 0 für Read for (int i = 0; i < 4; i++) SPI.transfer(0x00); digitalWrite(PIN_CS, HIGH); // delayMicroseconds(10); // kurze Pause zwischen Transaktionen // 2. Antwort abholen digitalWrite(PIN_CS, LOW); SPI.transfer(address & 0x7F); // gleiche Adresse nochmal senden for (int i = 0; i < 4; i++) { response[i] = SPI.transfer(0x00); } digitalWrite(PIN_CS, HIGH); // 3. Antwort zusammensetzen uint32_t value = ((uint32_t)response[0] << 24) | ((uint32_t)response[1] << 16) | ((uint32_t)response[2] << 8) | (uint32_t)response[3]; return value; } void setup() { Serial.begin(9600); SPI.begin(); pinMode(sck, OUTPUT); //set sck pin as output for spi clock SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE3)); // 0,04 MHz Takt pinMode(PIN_CS, OUTPUT); digitalWrite(PIN_CS, HIGH); pinMode(PIN_EN, OUTPUT); digitalWrite(PIN_EN, HIGH); // Schreiben der Einstellungen // Adressen aufsteigend // ******************************* // Set General Configuration Register writeTMC5160Register(0x00, 0x00000004); // GCONF // Set IHOLD_IRUN Register (W) writeTMC5160Register(0x10, 0x00010101); // IHOLD Bits 0-4, IRUN Bits 8-12, IHOLDDELAY Bits 16-19; // Set TPOWERDOWN (W) writeTMC5160Register(0x11, 0x0000000A); // TPOWERDOWN = 10 Delay before power down in stand still // Set TPWM_THRS (W) writeTMC5160Register(0x13, 0x000001F4); // TPWM_THRS = 500-yields a switching velocity about 35000 ca. 30RPM // Set RAMPMODE (RW) writeTMC5160Register(0x20, 0x00000001); // RAMPMODE = 0 (Positioning Mode) RAMPMODE = 1 (Velocity Mode) // Set Target Velocity writeTMC5160Register(0x22, 0x00005050); // VACTUAL = 50000 (positive velocity) // Set VSTART writeTMC5160Register(0x23, 0x0000000A); // VSTART = 10 // Set A1 writeTMC5160Register(0x24, 0x00000010); // A1 = 1000 First accelaration // Set V1 writeTMC5160Register(0x25, 0x000000ff); // V1 = 50000 // Set AMAX writeTMC5160Register(0x26, 0x00000005); // AMAX = 50 // Set VMAX writeTMC5160Register(0x27, 0x00030D40); // VMAX = 200 000 // Set DMAX writeTMC5160Register(0x28, 0x00000005); // DMAX = 700 Deceleration above V1 // Set D1 writeTMC5160Register(0x2A, 0x00000010); // D1 = 1400 // Set VSTOP writeTMC5160Register(0x2B, 0x00000014); // VSTOP = 10 // Set XTARGET writeTMC5160Register(0x2D, 0x00000000); // XTARGET = 0 // Set Chopper writeTMC5160Register(0x6C, 0x000101D5); // CHOPCONF // Set PWMCONF writeTMC5160Register(0x70, 0x000401C8); // PWMCONF (W) } // Setup Ende! void loop() { digitalWrite(PIN_EN,LOW); // Drive Enable (Low-Aktiv) delay(100); //Für Diagnose und Inbetriebnahme // Lese GCONF Register (0x00) uint32_t gconf_Status = tmc5160_readRegister(0x00); Serial.print("GCONF_STATUS: 0x"); Serial.println(gconf_Status, HEX); // Lese General Motion Control Register Register (0x20) uint32_t gmconf_Status = tmc5160_readRegister(0x20); Serial.print("GMCONF_STATUS: 0x"); Serial.println(gmconf_Status, HEX); // Lese XTARGET (0x2D) uint32_t xtarget_Status = tmc5160_readRegister(0x2D); Serial.print("XTARGET_STATUS: 0x"); Serial.println(xtarget_Status, HEX); // Lese RAMP_STAT (0x35) (R; R+WC) uint32_t RAMP_Status = tmc5160_readRegister(0x35); Serial.print("RAMP_STATUS: 0x"); Serial.println(RAMP_Status, HEX); // Lese DRV_STATUS Register (0x6F;32;R) uint32_t drvStatus = tmc5160_readRegister(0x6F); Serial.print("DRV_STATUS: 0x"); Serial.println(drvStatus, BIN); Serial.println(drvStatus, HEX); Serial.println(""); delay(500); // Pause vor nächstem Auslesen // Set XTARGET writeTMC5160Register(0x2D, 0x00FFFFFF); // XTARGET // writeTMC5160Register(0x21, 0x00000FFF); // XACTUAL (RW) delay(5000); writeTMC5160Register(0x2D, 0x00000000); // XTARGET = 0 } // Loop Ende!