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.
149 lines
5.2 KiB
149 lines
5.2 KiB
#pragma once
|
|
#if 1
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "../basic/tmc_ic_interface.hpp"
|
|
#include "sdk/hal/zhal.hpp"
|
|
#include "tmc_driver_ic.hpp"
|
|
extern "C" {
|
|
#include "TMC2160\TMC2160.h"
|
|
#include "TMC4361A\TMC4361A.h"
|
|
}
|
|
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;
|
|
|
|
typedef struct {
|
|
SPI_HandleTypeDef *spi;
|
|
|
|
ZGPIO *csgpio;
|
|
ZGPIO *resetPin;
|
|
ZGPIO *fREEZEPin;
|
|
ZGPIO *ennPin;
|
|
|
|
ZGPIO *driverIC_ennPin;
|
|
ZGPIO *driverIC_resetPin;
|
|
} cfg_t;
|
|
|
|
private:
|
|
int32_t shadowRegister[TMC_REGISTER_COUNT];
|
|
const uint8_t *m_registerAccessTable;
|
|
const int32_t *m_defaultRegisterResetState;
|
|
|
|
driver_ic_type_t m_driver_ic_type;
|
|
uint32_t m_lastCallPeriodicJobTick;
|
|
uint8_t m_status;
|
|
|
|
SPI_HandleTypeDef *m_spi;
|
|
|
|
ZGPIO *m_csgpio;
|
|
ZGPIO *m_resetPin;
|
|
ZGPIO *m_fREEZEPin;
|
|
ZGPIO *m_ennPin;
|
|
|
|
ZGPIO *m_driverIC_ennPin;
|
|
ZGPIO *m_driverIC_resetPin;
|
|
|
|
bool m_reachtarget;
|
|
|
|
public:
|
|
TMC4361A(/* args */);
|
|
|
|
/*******************************************************************************
|
|
* 初始化相关方法 *
|
|
*******************************************************************************/
|
|
|
|
/**
|
|
* @brief 静态方法,创建默认的TMC4361A配置参数,使用时只需修改自己需要的参数即可
|
|
*
|
|
* 注意:
|
|
* 1. 该方法内部使用的是一个静态变量,所以每次调用该方法时,返回的都是同一个对象的地址。
|
|
* 2. 该方法返回的数值不需要被释放。
|
|
* @param config
|
|
*/
|
|
|
|
void initialize(cfg_t *cfg);
|
|
void enableIC(bool 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); // 设置最大加速度
|
|
virtual void setDeceleration(float accelerationpps2); // 设置最大减速度
|
|
|
|
/*******************************************************************************
|
|
* 驱动器初始化方法 *
|
|
*******************************************************************************/
|
|
/**
|
|
* @brief 初始化方法
|
|
*
|
|
* @param channel SPI通道号
|
|
* @param driver_ic_type 驱动芯片的类型
|
|
*/
|
|
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();
|
|
|
|
public:
|
|
// only used in tmc4361A.cpp
|
|
void tmc4361AConfigCallback(ConfigState state);
|
|
void readWriteArray(uint8_t *data, size_t length);
|
|
|
|
void setIHOLD_IRUN(uint8_t ihold, uint8_t irun, uint16_t iholddelay) { driverIC_setIHOLD_IRUN(ihold, irun, iholddelay); }
|
|
void setMotorShaft(bool reverse) { driverIC_setMotorShaft(reverse); }
|
|
|
|
private:
|
|
uint32_t haspassedms(uint32_t now, uint32_t last);
|
|
// void callOnEventCallback(StepperMotorEvent event);
|
|
|
|
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
|