MGE_Hal.h 4.4 KB
#ifndef __MGE_HAL_H_
#define __MGE_HAL_H_

#include "TLE5012B_spi.h"

#include "MOT_Dev_Config.h"

//  /$$      /$$  /$$$$$$  /$$$$$$$$        /$$   /$$  /$$$$$$  /$$      
// | $$$    /$$$ /$$__  $$| $$_____/       | $$  | $$ /$$__  $$| $$      
// | $$$$  /$$$$| $$  \__/| $$             | $$  | $$| $$  \ $$| $$      
// | $$ $$/$$ $$| $$ /$$$$| $$$$$          | $$$$$$$$| $$$$$$$$| $$      
// | $$  $$$| $$| $$|_  $$| $$__/          | $$__  $$| $$__  $$| $$      
// | $$\  $ | $$| $$  \ $$| $$             | $$  | $$| $$  | $$| $$      
// | $$ \/  | $$|  $$$$$$/| $$$$$$$$       | $$  | $$| $$  | $$| $$$$$$$$
// |__/     |__/ \______/ |________/       |__/  |__/|__/  |__/|________/
//                               
//  Magnetic encoder hardware abstraction layer                                                              

//  +--------------------------------+
//  |                                |
//  | MGE hardware abstraction layer |
//  |                                |
//  +----------------+---------------+
//                   |
//                   |
//                   |
//      +------------+-----------+
//      |                F4      |
//      |  TLE5012 BSP           |
//      |                F1      |
//      +------------------------+


#if TLE5012B_SPI_CONFIG_USE_IQ

#include "IQmathLib.h"

#define MGE_BSP_ANGE_GET(x)     tle5012b_read_angle_iq(x)
#define MGE_BSP_INIT(x)         tle5012b_spi_init(x)
#define MGE_BSP_iq              _iq14
#define MGE_BSP_IQ(x)           _IQ14(x)

#define MGE_HAL_iq              _iq20
#define MGE_HAL_IQ(x)           _IQ20(x)

#define MGE_HAL_IQ_DIV(x,y)    _IQ20div(x,y)
#define MGE_HAL_IQToF(x)       _IQ20toF(x)

#else

//HAL & BSP API Mapping

// #define MGE_BSP_ANGEABS_GET(x)  tle5012b_read_angleAbs_f(x)
// #define MGE_BSP_ANGEABS_GET(x)  tle5012b_read_angleAbs_AvgF_f(x)   
// #define MGE_BSP_ANGEABS_GET(x)  tle5012b_read_angleAbs_FAvgf(x)
// #define MGE_BSP_ANGEABS_GET(x)  tle5012b_read_angleAbs_InterF_f(x)
// #define MGE_BSP_ANGEABS_GET_WITH_FILTER(x)  tle5012b_read_angle_RecAVGF_f(x)

/**
 * @brief MGE BSP Get absolute angle ( From 0 - 2pi )
 * @param  void - Nothing need to input
 */
#define MGE_BSP_ANGEABS_GET(x)  tle5012b_read_angleAbs_f(x)

/**
 * @brief MGE BSP Get absolute angle ( From 0 - 2pi ) - with BSP Filter
 * @param  void - Nothing need to input
 */
#define MGE_BSP_ANGEABS_GET_WITH_FILTER(x)  tle5012b_read_angleAbs_InterF_f(x)

/**
 * @brief MGE BSP Get FULL angle (Record Loop)
 * @param  void - Nothing need to input
 */
#define MGE_BSP_ANGE_GET(x)     tle5012b_read_angle_f(x)

/**
 * @brief MGE BSP Get BSP RAW angle (Depends on the BSP)
 *        #For Debug#
 * @param  void - Nothing need to input
 */
#define MGE_BSP_ANGEBSPRAW_GET(x)  tle5012b_read_angleRAW(x)

/**
 * @brief MGE BSP Init (Sensor underlying initialization)
 * @param  void - Nothing need to input
 */
#define MGE_BSP_INIT(x)         tle5012b_spi_init(x)

#endif

typedef enum
{
    MGE_DIRECTION_CW      = 1,  //clockwise
    MGE_DIRECTION_CCW     = -1, // counter clockwise
    MGE_DIRECTION_UNKNOWN = 0   //not yet known or invalid state
} MGE_DIRECTION;

typedef struct 
{
    int8_t mge_direction;
    float staticAngleOffset;
} MGE_PARA;


typedef uint16_t mgeBsp_t;

void mge_hal_Init(void);


//CUT##     MGE 参数设置

int8_t mge_Get_direction(void);

/// @brief 设置磁编码器的方向,输入的是一个枚举,需要为 MGE_DIRECTION_CW 或者 MGE_DIRECTION_CCW ,其他的输入会让方向置为UNKNOW
/// @param dir MGE_DIRECTION枚举
/// @return 返回操作结果 , 0 - 成功 , -1 - 失败(输入非法)
int mge_Set_direction(MGE_DIRECTION dir);

float mge_Get_abOffset(void);

/// @brief 设置磁编码器的偏移,需要为[-2PI ~ 2PI]之间,如果超出这个范围,会返回(-1),且设置不会被应用
/// @param offset 弧度制的角度,范围为[-2PI ~ 2PI]
/// @return 返回操作结果 , 0 - 成功 , -1 - 失败(输入非法)
int mge_Set_abOffset(float offset);



//CUT##     MGE 角度获取
float mge_hal_GetAngle(void);
float mge_hal_GetRawAngle(void);
float mge_hal_GetAbsAngle(void);
float mge_hal_GetAbsAngle_withFilter(void);

// float mge_hal_getElectricalAngleABS(void);
// float mge_hal_getElectricalAngleABS_LP(void);
// float mge_hal_getElectricalAngleLoop(void);

float mge_hal_GetVel(void);
float mge_hal_GetVel_ExtAngle(float angle);

float mge_hal_calculateArcMidpointAngleBTP(float angle1, float angle2);

#endif