77 lines
2.4 KiB
C
77 lines
2.4 KiB
C
/***
|
|
* @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, float32 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
|