#ifndef _MOTOR_H__ #define _MOTOR_H__ #include "os/os_types.h" #include "foc/core/PMSM_FOC_Core.h" #include "foc/motor/hall.h" #include "foc/motor/encoder.h" #include "app/nv_storage.h" typedef struct { bool running; u32 start_ts; u32 det_ts; u32 rpm; bool error; }fan_t; typedef struct { bool b_start; float throttle; bool b_ignor_throttle; bool b_calibrate; bool b_force_run; bool b_runStall; //是否堵转 bool b_lock_motor; bool b_auto_hold; bool b_break; bool b_epm; EPM_Dir_t epm_dir; bool b_epm_cmd_move; u32 runStall_time; float runStall_pos; u8 u_throttle_ration; s8 s_direction; u32 n_brake_errors; u32 n_CritiCalErrMask; u8 mode; bool b_is96Mode; u8 n_gear; mc_gear_t *gear_cfg; u32 n_autohold_time; bool b_wait_brk_release; bool b_updated; fan_t fan[2]; }motor_t; motor_t * mc_params(void); void mc_init(void); bool mc_start(u8 mode); bool mc_stop(void); void mc_encoder_off_calibrate(s16 vd); bool mc_throttle_released(void); bool mc_lock_motor(bool lock); bool mc_auto_hold(bool hold); void mc_set_throttle_r(u8 r); void mc_use_throttle(void); bool mc_current_sensor_calibrate(float current); bool mc_encoder_zero_calibrate(s16 vd); bool mc_set_foc_mode(u8 mode); bool mc_is_epm(void); bool mc_start_epm(bool epm); bool mc_start_epm_move(EPM_Dir_t dir, bool is_command); void mc_get_running_status(u8 *data); bool mc_command_epm_move(EPM_Dir_t dir); bool mc_throttle_epm_move(EPM_Dir_t dir); void mc_need_update(void); bool mc_is_start(void); bool mc_set_gear(u8 gear); u8 mc_get_gear(void); void mc_set_critical_error(u8 err); void mc_clr_critical_error(u8 err); u32 mc_get_critical_error(void); void mc_set_fan_duty(u8 duty); void mc_force_run_open(s16 vd, s16 vq); static __INLINE float motor_encoder_get_angle(void) { #ifdef USE_ENCODER_HALL return hall_sensor_get_theta(); #elif defined (USE_ENCODER_ABI) return encoder_get_theta(); #else #error "Postion sensor ERROR" #endif } static __INLINE void motor_encoder_update(void) { #ifdef USE_ENCODER_HALL hall_sensor_get_theta(); #elif defined (USE_ENCODER_ABI) encoder_get_theta(); #else #error "Postion sensor ERROR" #endif } static __INLINE float motor_encoder_get_speed(void) { #ifdef USE_ENCODER_HALL return hall_sensor_get_speed(); #elif defined (USE_ENCODER_ABI) return encoder_get_speed(); #else #error "Postion sensor ERROR" #endif } static __INLINE float motor_encoder_get_vel_count(void) { #ifdef USE_ENCODER_HALL return 0; #elif defined (USE_ENCODER_ABI) return encoder_get_vel_count(); #else #error "Postion sensor ERROR" #endif } static __INLINE float motor_encoder_get_position(void) { #ifdef USE_ENCODER_HALL return 0; #elif defined (USE_ENCODER_ABI) return encoder_get_position(); #else #error "Postion sensor ERROR" #endif } static __INLINE void motor_encoder_init(void) { #ifdef USE_ENCODER_HALL hall_sensor_init(); #elif defined (USE_ENCODER_ABI) encoder_init(); #else #error "Postion sensor ERROR" #endif } static __INLINE void motor_encoder_start(bool start) { #ifdef USE_ENCODER_HALL hall_sensor_clear(direction); #elif defined (USE_ENCODER_ABI) encoder_init_clear(); #else #error "Postion sensor ERROR" #endif } static __INLINE void motor_encoder_offset(float angle) { #ifdef USE_ENCODER_HALL hall_detect_offset(angle); #elif defined (USE_ENCODER_ABI) encoder_detect_offset(angle); #else #error "Postion sensor ERROR" #endif } static __INLINE void motor_encoder_offset_finish(void) { #ifdef USE_ENCODER_HALL hall_detect_offset_finish(); #elif defined (USE_ENCODER_ABI) encoder_detect_finish(); #else #error "Postion sensor ERROR" #endif } static __INLINE bool motor_encoder_offset_is_finish(void) { #ifdef USE_ENCODER_HALL return false; #elif defined (USE_ENCODER_ABI) return encoder_detect_finish(); #else #error "Postion sensor ERROR" #endif } static __INLINE void motor_encoder_data_upload(void) { #ifdef USE_ENCODER_HALL #elif defined (USE_ENCODER_ABI) encoder_detect_upload(); #else #error "Postion sensor ERROR" #endif } static __INLINE float motor_encoder_zero_phase_detect(float *enc_off){ #ifdef USE_ENCODER_HALL return 0.0f; #elif defined (USE_ENCODER_ABI) return encoder_zero_phase_detect(enc_off); #else #error "Postion sensor ERROR" #endif } static __INLINE void motor_encoder_set_direction(s8 dir) { #ifdef USE_ENCODER_HALL hall_set_direction(dir); #elif defined (USE_ENCODER_ABI) encoder_set_direction(dir); #else #error "Postion sensor ERROR" #endif } static __INLINE void motor_encoder_lock_pos(bool lock) { #ifdef USE_ENCODER_HALL #elif defined (USE_ENCODER_ABI) encoder_lock_position(lock); #else #error "Postion sensor ERROR" #endif } #endif /* _MOTOR_H__ */