This repository has been archived on 2025-01-02. You can view files and clone it, but cannot push or open issues or pull requests.
torsion/User/board/motor.h

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, 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