|
|
#pragma once
#if 1
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "../basic/tmc_ic_interface.hpp"
#include "sdk/os/zos.hpp"
#include "tmc_driver_ic.hpp"
extern "C" { #include "TMC2160\TMC2160.h"
#include "TMC4361A\TMC4361A.h"
} #ifdef HAL_SPI_MODULE_ENABLED
namespace iflytop { #define TMC4361A_LISTENER_MAX 5
class TMC4361A : public IStepperMotor { public: typedef enum { IC_TMC2130 = 0, //
IC_TMC2160, IC_TMC2660, } driver_ic_type_t;
#if 0
typedef struct { SPI_HandleTypeDef *spi; //
ZGPIO *csgpio; //
ZGPIO *resetPin; //
ZGPIO *fREEZEPin; //
ZGPIO *ennPin; //
ZGPIO *driverIC_ennPin; //
ZGPIO *driverIC_resetPin; //
} cfg_t; #endif
class cfg_t { public: SPI_HandleTypeDef *spi = nullptr; //
Pin_t csgpio = PinNull; //
Pin_t resetPin = PinNull; //
Pin_t fREEZEPin = PinNull; //
Pin_t ennPin = PinNull; //
Pin_t driverIC_ennPin = PinNull; //
Pin_t driverIC_resetPin = PinNull; //
};
typedef enum { kvelmode, kposmode, } motor_mode_t;
private: int32_t shadowRegister[TMC_REGISTER_COUNT]; const uint8_t *m_registerAccessTable = nullptr; const int32_t *m_defaultRegisterResetState = nullptr;
driver_ic_type_t m_driver_ic_type; uint32_t m_lastCallPeriodicJobTick; uint8_t m_status;
SPI_HandleTypeDef *m_spi = nullptr;
ZGPIO *m_csgpio = nullptr; ZGPIO *m_resetPin = nullptr; ZGPIO *m_fREEZEPin = nullptr; ZGPIO *m_ennPin = nullptr;
ZGPIO *m_driverIC_ennPin = nullptr; ZGPIO *m_driverIC_resetPin = nullptr;
motor_mode_t m_motor_mode = kvelmode;
float m_distanceK = 1.0;
public: TMC4361A(/* args */);
/*******************************************************************************
* ��ʼ�����ط� * *******************************************************************************/
/**
* @brief ��̬����������Ĭ�ϵ�TMC4361A���ò���,ʹ��ʱֻ�����Լ���Ҫ�IJ������� * * ע��: * 1. �÷����ڲ�ʹ�õ���һ����̬����������ÿ�ε��ø÷���ʱ�����صĶ���ͬһ�������ĵ�ַ * 2. �÷������ص���ֵ����Ҫ���ͷ� * @param config */
void initialize(cfg_t *cfg); void enableIC(bool enable); virtual void enable(bool enable) { enableIC(enable); }
/*******************************************************************************
* IStepperMotor impl * *******************************************************************************/ // virtual void registerListener(MotorEventListener *listener);
virtual void rotate(int32_t velocity); virtual void moveTo(int32_t position, uint32_t velocityMax); virtual void moveBy(int32_t relativePosition, uint32_t velocityMax); virtual void stop(); virtual int32_t getXACTUAL(); virtual int32_t getXTARGET(); virtual void setXACTUAL(int32_t value); virtual int32_t getVACTUAL(); virtual int32_t getENC_POS(); virtual void setENC_POS(int32_t value); virtual void setAcceleration(float accelerationpps2); // �����������ٶ�,����ֵ4000000
virtual void setDeceleration(float accelerationpps2); // �����������ٶ�,����ֵ4000000
virtual void setIHOLD_IRUN(uint8_t ihold, uint8_t irun, uint16_t iholddelay) { driverIC_setIHOLD_IRUN(ihold, irun, iholddelay); } virtual void setMotorShaft(bool reverse) { driverIC_setMotorShaft(reverse); }
virtual void setDistanceK(float distanceK);
/*******************************************************************************
* ��������ʼ������ * *******************************************************************************/ /**
* @brief ��ʼ���� * * @param channel SPIͨ�� * @param driver_ic_type ����оƬ���� * * TMC4361A:0x2 DriverIC:0x30 */ int32_t readICVersion(); uint8_t reset(); uint8_t restore(); /*******************************************************************************
* �������Ĵ�����д���� * *******************************************************************************/ void writeDatagram(uint8_t address, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4); void writeInt(uint8_t address, int32_t value); int32_t readInt(uint8_t address); void readWriteCover(uint8_t *data, size_t length); void writeSubRegister(uint8_t address, uint32_t mask, uint32_t shift, uint32_t value);
int32_t getENC_POS_DEV(); // ENC_POS��XACTUAL��ƫ��
uint32_t readEVENTS(); // ��ȡ�¼��Ĵ�
/*******************************************************
* driverIc function * *******************************************************/ int32_t readSubICVersion(); virtual bool isReachTarget(); virtual bool isStoped() { return isReachTarget(); }
public: // only used in tmc4361A.cpp
void tmc4361AConfigCallback(ConfigState state); void readWriteArray(uint8_t *data, size_t length);
private: uint32_t haspassedms(uint32_t now, uint32_t last);
void driverIC_reset(); void driverIC_enableIC(bool enable); void driverIC_setIHOLD_IRUN(uint8_t ihold, uint8_t irun, uint16_t iholddelay); void driverIC_writeDatagram(uint8_t address, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4); void driverIC_writeInt(uint8_t address, int32_t value); int32_t driverIC_readInt(uint8_t address); void driverIC_setMotorShaft(bool reverse); uint32_t driverIC_readICVersion(); }; } // namespace iflytop
#endif
#endif
|