You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

166 lines
6.6 KiB

2 years ago
  1. #include "ztmc5130.hpp"
  2. using namespace iflytop;
  3. /**
  4. * @brief TMC5130配置参数,使
  5. *
  6. * :
  7. * 1. 使
  8. * 2.
  9. * @param config
  10. */
  11. #define PRV_FIELD_WRITE(address, mask, shift, value) (writeInt(address, FIELD_SET(readInt(address), mask, shift, value)))
  12. #define PRV_FIELD_READ(address, mask, shift) FIELD_GET(readInt(address), mask, shift)
  13. TMC5130::TMC5130(/* args */) {}
  14. void TMC5130::createDeafultTMC5130Config(TMC5130Config_t *config, TMC5130Port *m_port) {
  15. config->m_port = m_port;
  16. config->autoReadEventRegisterInterval = 10;
  17. config->autoReadEventRegister = true;
  18. }
  19. void TMC5130::initialize(uint8_t channel, TMC5130Config_t *config) {
  20. m_channel = channel;
  21. m_config = config;
  22. m_port = config->m_port;
  23. m_registerAccessTable = &tmc5130_defaultRegisterAccess[0];
  24. m_defaultRegisterResetState = &tmc5130_defaultRegisterResetState[0];
  25. enableIC(false);
  26. // tmc5130_init(&m_TMC5130, channel, &m_tmc_api_config, &tmc5130_defaultRegisterResetState[0]);
  27. // tmc5130_setCallback(&m_TMC5130, pri_tmc4361A_callback);
  28. reset();
  29. writeInt(TMC5130_PWMCONF, 0x000500C8);
  30. // writeInt( TMC5130_GCONF, 0x00000004);
  31. writeInt(TMC5130_CHOPCONF, 0x000100c3);
  32. writeInt(TMC5130_IHOLD_IRUN, 0x00051A00);
  33. writeInt(TMC5130_PWMCONF, 0x000401c8);
  34. writeInt(TMC5130_XTARGET, 0);
  35. writeInt(TMC5130_XACTUAL, 0x00000000);
  36. writeInt(TMC5130_VACTUAL, 0x00000000);
  37. writeInt(TMC5130_VSTART, 5);
  38. writeInt(TMC5130_A1, 1000);
  39. writeInt(TMC5130_V1, 0);
  40. writeInt(TMC5130_D1, 1000);
  41. writeInt(TMC5130_VSTOP, 10);
  42. writeInt(TMC5130_TZEROWAIT, 1000);
  43. setAcceleration(100000);
  44. setDeceleration(100000);
  45. setIHOLD_IRUN(2, 10, 1);
  46. enableIC(true);
  47. }
  48. void TMC5130::enableIC(bool enable) { m_port->TMC5130Port_setENNPinState(m_channel, !enable); }
  49. uint8_t TMC5130::reset() {
  50. stop();
  51. m_port->TMC5130Port_setResetNPinState(m_channel, false);
  52. m_port->TMC5130Port_sleepus(1000);
  53. m_port->TMC5130Port_setResetNPinState(m_channel, true);
  54. for (uint32_t add = 0; add < TMC5130_REGISTER_COUNT; add++) {
  55. if (!TMC_IS_RESETTABLE(m_registerAccessTable[add])) {
  56. continue;
  57. }
  58. writeInt(add, m_defaultRegisterResetState[add]);
  59. }
  60. return 0;
  61. }
  62. int32_t TMC5130::getXACTUAL() { return readInt(TMC5130_XACTUAL); }
  63. void TMC5130::setXACTUAL(int32_t value) { writeInt(TMC5130_XACTUAL, value); }
  64. int32_t TMC5130::getVACTUAL() { return readInt(TMC5130_VACTUAL); }
  65. void TMC5130::setAcceleration(float accelerationpps2) { writeInt(TMC5130_AMAX, (int32_t)(accelerationpps2)); } // 设置最大加速度
  66. void TMC5130::setDeceleration(float accelerationpps2) { writeInt(TMC5130_DMAX, (int32_t)(accelerationpps2)); } // 设置最大减速度
  67. void TMC5130::setMotorShaft(bool reverse) { PRV_FIELD_WRITE(TMC5130_GCONF, TMC5130_SHAFT_MASK, TMC5130_SHAFT_SHIFT, reverse); }
  68. void TMC5130::setIHOLD_IRUN(uint8_t ihold, uint8_t irun, uint16_t iholddelay) {
  69. writeInt(TMC5130_IHOLD_IRUN, (iholddelay << TMC5130_IHOLDDELAY_SHIFT) | (irun << TMC5130_IRUN_SHIFT) | (ihold << TMC5130_IHOLD_SHIFT));
  70. }
  71. uint32_t TMC5130::readChipVERSION() {
  72. uint32_t chipID = PRV_FIELD_READ(TMC5130_IOIN, TMC5130_VERSION_MASK, TMC5130_VERSION_SHIFT);
  73. return chipID;
  74. }
  75. uint32_t TMC5130::getTMC5130_RAMPSTAT() { return readInt(TMC5130_RAMPSTAT); }
  76. Tmc5130RampStat TMC5130::getTMC5130_RAMPSTAT2() {
  77. uint32_t value = getTMC5130_RAMPSTAT();
  78. return Tmc5130RampStat(value);
  79. }
  80. void TMC5130::stop() { rotate(0); }
  81. void TMC5130::rotate(int32_t velocity) {
  82. writeInt(TMC5130_VMAX, abs(velocity));
  83. writeInt(TMC5130_RAMPMODE, (velocity >= 0) ? TMC5130_MODE_VELPOS : TMC5130_MODE_VELNEG);
  84. }
  85. void TMC5130::right(int32_t velocity) { rotate(velocity); }
  86. void TMC5130::left(int32_t velocity) { rotate(-velocity); }
  87. void TMC5130::moveTo(int32_t position, uint32_t velocityMax) {
  88. writeInt(TMC5130_RAMPMODE, TMC5130_MODE_POSITION);
  89. writeInt(TMC5130_VMAX, velocityMax);
  90. writeInt(TMC5130_XTARGET, position);
  91. }
  92. void TMC5130::moveBy(int32_t relativePosition, uint32_t velocityMax) { // determine actual position and add numbers of ticks to move
  93. relativePosition += readInt(TMC5130_XACTUAL);
  94. moveTo(relativePosition, velocityMax);
  95. }
  96. uint32_t TMC5130::readXTARGET() { return readInt(TMC5130_XTARGET); }
  97. uint32_t TMC5130::haspassedms(uint32_t now, uint32_t last) {
  98. if (now >= last) {
  99. return now - last;
  100. } else {
  101. return 0xFFFFFFFF - last + now;
  102. }
  103. }
  104. bool TMC5130::isReachTarget() {
  105. uint32_t state = getTMC5130_RAMPSTAT();
  106. Tmc5130RampStat event = Tmc5130RampStat(state);
  107. if (event.isSetted(Tmc5130RampStat::ktmc5130_rs_posreached)) {
  108. return true;
  109. }
  110. return false;
  111. }
  112. void TMC5130::periodicJob(uint32_t now) {}
  113. /*******************************************************************************
  114. * basic *
  115. *******************************************************************************/
  116. void TMC5130::writeSubRegister(uint8_t address, uint32_t mask, uint32_t shift, uint32_t value) {
  117. CriticalContext cc;
  118. writeInt(address, readInt(address) & ~mask | value << shift);
  119. }
  120. void TMC5130::readWriteArray(uint8_t *data, size_t length) {
  121. CriticalContext cc;
  122. m_port->TMC5130Port_readWriteArray(m_channel, data, length);
  123. }
  124. void TMC5130::writeDatagram(uint8_t address, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4) {
  125. CriticalContext cc;
  126. uint8_t data[5] = {static_cast<uint8_t>(address | static_cast<uint8_t>(TMC5130_WRITE_BIT)), x1, x2, x3, x4};
  127. readWriteArray(&data[0], 5);
  128. int32_t value = ((uint32_t)x1 << 24) | ((uint32_t)x2 << 16) | (x3 << 8) | x4;
  129. // Write to the shadow register and mark the register dirty
  130. address = TMC_ADDRESS(address);
  131. m_shadowRegister[address] = value;
  132. }
  133. void TMC5130::writeInt(uint8_t address, int32_t value) {
  134. CriticalContext cc;
  135. writeDatagram(address, BYTE(value, 3), BYTE(value, 2), BYTE(value, 1), BYTE(value, 0));
  136. }
  137. int32_t TMC5130::readInt(uint8_t address) {
  138. CriticalContext cc;
  139. address = TMC_ADDRESS(address);
  140. // register not readable -> shadow register copy
  141. if (!TMC_IS_READABLE(tmc5130_defaultRegisterAccess[address])) return m_shadowRegister[address];
  142. uint8_t data[5] = {0, 0, 0, 0, 0};
  143. data[0] = address;
  144. readWriteArray(&data[0], 5);
  145. data[0] = address;
  146. readWriteArray(&data[0], 5);
  147. return ((uint32_t)data[1] << 24) | ((uint32_t)data[2] << 16) | (data[3] << 8) | data[4];
  148. }