/*** * @Author: shenghao.xu * @Date: 2023-06-13 16:58:57 * @LastEditors: shenghao.xu * @LastEditTime: 2023-06-13 16:59:13 * @Description:电机驱动模块 * @email:545403892@qq.com * @Copyright (c) 2023 by shenghao.xu, All Rights Reserved. */ #ifndef __MOTOR_H #define __MOTOR_H #include "main.h" typedef struct MOTOR motor_t; typedef enum { DIR_CCW = 0, /* 逆时针旋转 */ DIR_CW, /* 顺时针旋转 */ } dir_e; typedef enum { DIRECT_CURRENT_MOTOR, // 直流电机 STEP_MOTOR, // 步进电机 SERVO_MOTOR, // 舵机 } motor_type_e; // 电机类型枚举定义 typedef struct { gpio_t *dir; // 方向 gpio_t *en; // 使能 } motor_gpio_t; // 步进接口定义 typedef struct { void (*init)(motor_t *motor, gpio_t dir, gpio_t en, float32 min_step_angle, TIM_TypeDef *pwm_timer, uint32_t pwm_channel); // 初始化 void (*run)(motor_t *motor, dir_e dir); // 运行 void (*stop)(motor_t *motor); // 停止 void (*set_angle)(motor_t *motor, uint32_t angle, dir_e dir); // 将角度转换成脉冲个数并运行 void (*stop_cb)(motor_t *motor); // 停止回调函数,在stop中执行 void (*set_speed)(motor_t *motor, uint32_t psc); } step_motor_interface_t; typedef struct { float32 min_step_angle; /* 最小步距角 */ int angle; /* 设置需要旋转的角度 */ dir_e dir; /* 方向 */ uint8_t en; /* 使能 */ __IO uint32_t pulse_count; /* 脉冲个数记录 */ __IO int add_pulse_count; /* 脉冲个数累计 */ __IO uint32_t step_angle; /* 步距 */ } step_motor_attribute_t; typedef struct { motor_gpio_t gpios; TIM_TypeDef *pwm_timer; /* pwm定时器 */ uint32_t pwm_channel; /* pwm通道 */ step_motor_attribute_t attribute; /* 步进电机属性 */ step_motor_interface_t interface; /* 步进电机接口 */ } step_motor_t; struct MOTOR { motor_type_e type; union { step_motor_t step_motor; } handle; }; extern motor_t *motor_create(motor_type_e motor_type); extern void step_motor_update(motor_t *motor); #endif