CubeMars AK系列电机驱动
https://www.cubemars.com/goods-1151-AK80-8.html
https://www.cubemars.com/images/file/20240611/1718084209493165.pdf
代码以及文档中的运控模式即MIT,伺服模式即Servo
依赖
cancan_listutils/buffer_append
使用
- 将头文件复制到
User/Bsp/Inc/中,源文件复制到User/Bsp/Src中 - 将
ak_motor.c添加到工程的Bsp分组中 - 在
bsp.h中包含ak_motor.h
API
结构体对象
ak_motor_handle_t是电机对象句柄,CAN接收回调后会更新。包含以下内容:
/**
* @brief AK电机句柄
*/
typedef struct {
can_selected_t can_select; /*!< 选择 CAN */
uint32_t id; /*!< CAN ID */
ak_mode_t mode; /*!< 电机模式 */
ak_motor_model_t model; /*!< 电机型号 */
float posi; /*!< 电机位置 */
float spd; /*!< 电机速度 */
float current_troq; /*!< 电机电流,运控模式为扭矩 */
int8_t motor_temperature; /*!< 电机温度 */
ak_motor_error_t error_code; /*!< 电机错误码 */
} ak_motor_handle_t;
ak_motor_error_t枚举来进行相应的处理。 函数方法
ak_motor_init初始化电机motor电机句柄id电机的IDmodel电机型号mode电机模式can_select选择CAN1或CAN2
ak_motor_deinit反初始化电机
初始化电机后使用下面的方法控制电机:
Servo模式
void ak_servo_set_duty(ak_motor_handle_t *motor, float duty);
void ak_servo_set_current(ak_motor_handle_t *motor, float current);
void ak_servo_set_cb(ak_motor_handle_t *motor, float current);
void ak_servo_set_rpm(ak_motor_handle_t *motor, float rpm);
void ak_servo_set_pos(ak_motor_handle_t *motor, float pos);
void ak_servo_set_origin(ak_motor_handle_t *motor,
ak_origin_mode_t set_origin_mode);
void ak_servo_set_pos_spd(ak_motor_handle_t *motor, float pos, float spd,
float rpa);
MIT模式
void ak_mit_enter_motor(ak_motor_handle_t *motor);
void ak_mit_set_origin(ak_motor_handle_t *motor);
void ak_mit_send_data(ak_motor_handle_t *motor, float pos, float spd, float kp,
float kd, float torque);
void ak_mit_exit_motor(ak_motor_handle_t *motor);
代码注释和文档都有详尽的解释,这里就不多赘述。
示例
/**
* @brief 伺服模式示例
*
*/
void servo_demo(void) {
ak_motor_handle_t ak80_demo;
ak_motor_init(&ak80_demo, 104, AK80_8, can1_selected);
/* 设置速度 */
ak_servo_set_rpm(&ak80_demo, 1000.0f);
/* 设置位置 */
ak_servo_set_pos(&ak80_demo, 100.0f);
/* 设置电流 */
ak_servo_set_current(&ak80_demo, 1000.0);
}
/**
* @brief 运控模式示例
*
*/
void mit_demo(void) {
ak_motor_handle_t ak80_demo;
ak_motor_init(&ak80_demo, 104, AK80_8, can1_selected);
/* 首先需要进入控制模式 */
ak_mit_enter_motor(&ak80_demo);
ak_mit_send_data(&ak80_demo, 100.0f, 200.0f, 10.0f, 0.1f, 5.0f);
/* 退出控制 */
ak_mit_exit_motor(&ak80_demo);
}