#ifndef MOTOR_COMMON_H
#define MOTOR_COMMON_H

#define SYSCLK_FREQUENCY 72000000  // 主时钟频率（72 MHz）

#define STEPMOTOR_ANGLEPERSTEP  1.8  //步进电机步距角
#define STEPMOTOR_FREDIV  32         //步进电机分频系数（细分数）

#define STEPMOTOR_PERDISTANCE 2        //步进电机一转走2mm
#define STEPMOTOR_PULSEPERROUND  ((360/STEPMOTOR_ANGLEPERSTEP)*STEPMOTOR_FREDIV)   //步进电机每转所需要脉冲的脉冲个数
#define STEPMOTOR_PULSEPERDISTANCE  STEPMOTOR_PULSEPERROUND/STEPMOTOR_PERDISTANCE  //步进电机每1mm所需要脉冲的脉冲个数
#define STEPMOTOR_FREQ_ROUNDPERMIN (9375/(STEPMOTOR_FREDIV*2))   //步进电机1r/min需要配置的定时器重载值((72000000*60/STEPMOTOR_PULSEPERROUND)/72)（假设时钟分频为8）   定时时间=60s/(每转需要的脉冲个数)  秒冲个数*2是因为只认高-低
#define STEPMOTOR_MAX_SPEED(psc, arr)  (SYSCLK_FREQUENCY / ((psc + 1) * (arr + 1)) * 60 / STEPMOTOR_PULSEPERROUND)

#include "stdint.h"
#include <stdbool.h>

typedef enum {
    SPEED_NONE,   // 匀速
    SPEED_ACC,    // 加速
    SPEED_DEC,    // 减速
    SPEED_STOP,   // 停止
} SpeedStatus;

typedef enum {
    ABSOLUTE_COUNT,
    RELATIVE_COUNT,
    CIRCULAR_COUNT,
    BIDIRECTIONAL_COUNT,
    INCREMENTAL_COUNT
} StepCountMode;

typedef struct {
    uint32_t stepcount;       // 步数（脉冲数）
    uint8_t direction;        // 方向 (0: 逆时针, 1: 顺时针)
    uint16_t curSpeed;        // 当前速度 (步/秒)
    uint16_t desSpeed;        // 目标速度 (步/秒)
    uint16_t maxSpeed;        // 最大转速
    SpeedStatus speedStatus;  // 速度状态
    uint8_t speedlevel;       // 速度级别 0:正常、1:快速、2:慢速
    StepCountMode stepcountMode;  // 脉冲计数模式
    uint16_t curlocation;     // 当前位置(角度判断)
    uint16_t deslocation;     // 目标位置
    uint16_t acceleration;    // 加速度 (步/秒^2)
    uint16_t deceleration;    // 减速度 (步/秒^2)
    uint16_t psc;             // 预分频器
    uint16_t arr;             // 自动重装载寄存器
} Motor;

#endif // MOTOR_COMMON_H
