sentry_right/modules/motor/DJImotor/dji_motor.h

132 lines
4.4 KiB
C
Raw Permalink Normal View History

2024-04-16 16:49:26 +08:00
/**
* @file dji_motor.h
* @author neozng
* @brief DJI智能电机头文件
* @version 0.2
* @date 2022-11-01
*
* @todo 1. 使
2. M2006和M3508增加开环的零位校准函数,()
* @copyright Copyright (c) 2022 HNU YueLu EC all rights reserved
*
*/
#ifndef DJI_MOTOR_H
#define DJI_MOTOR_H
#include "bsp_can.h"
#include "controller.h"
#include "motor_def.h"
#include "stdint.h"
#include "daemon.h"
#define DJI_MOTOR_CNT 12
/* 滤波系数设置为1的时候即关闭滤波 */
#define SPEED_SMOOTH_COEF 0.85f // 最好大于0.85
#define CURRENT_SMOOTH_COEF 0.9f // 必须大于0.9
#define ECD_ANGLE_COEF_DJI 0.043945f // (360/8192),将编码器值转化为角度制
/* DJI电机CAN反馈信息*/
typedef struct
{
uint16_t last_ecd; // 上一次读取的编码器值
uint16_t ecd; // 0-8191,刻度总共有8192格
float angle_single_round; // 单圈角度
float speed_aps; // 角速度,单位为:度/秒
int16_t real_current; // 实际电流
uint8_t temperature; // 温度 Celsius
float total_angle; // 总角度,注意方向
int32_t total_round; // 总圈数,注意方向
} DJI_Motor_Measure_s;
/**
* @brief DJI intelligent motor typedef
*
*/
typedef struct
{
DJI_Motor_Measure_s measure; // 电机测量值
Motor_Control_Setting_s motor_settings; // 电机设置
Motor_Controller_s motor_controller; // 电机控制器
CANInstance *motor_can_instance; // 电机CAN实例
// 分组发送设置
uint8_t sender_group;
uint8_t message_num;
Motor_Type_e motor_type; // 电机类型
Motor_Control_Type_e motor_control_type; //电机控制方式
Motor_Working_Type_e stop_flag; // 启停标志
DaemonInstance* daemon;
uint32_t feed_cnt;
float dt;
} DJIMotorInstance;
/**
* @brief DJI智能电机,,application初始化的时候调用此函数
* initStructure然后传入此函数.
* recommend: type xxxinitStructure = {.member1=xx,
* .member2=xx,
* ....};
* 线(6),,(500Hz),
* DJIMotorControl().
*
* @attention M3508和M2006的反馈报文都是0x200+id,GM6020的反馈是0x204+id,id不要冲突.
* ,IDcrash_Handler(),debug来判断是否出现冲突.
*
* @param config ,,PID参数设置,CAN设置
*
* @return DJIMotorInstance*
*/
DJIMotorInstance *DJIMotorInit(Motor_Init_Config_s *config);
/**
* @brief application层的应用调用,.
* ,1,
*
* @param motor
* @param ref
*/
void DJIMotorSetRef(DJIMotorInstance *motor, float ref);
/**
* @brief ,IMU()
*
* @param motor
* @param loop
* @param type
*/
void DJIMotorChangeFeed(DJIMotorInstance *motor, Closeloop_Type_e loop, Feedback_Source_e type);
/**
* @brief motor_task调用运行在rtos上,motor_stask内通过osDelay()
*/
void DJIMotorControl();
/**
* @brief ,,
*
*/
void DJIMotorStop(DJIMotorInstance *motor);
/**
* @brief ,
* ,stop_flag的默认值为0
*
*/
void DJIMotorEnable(DJIMotorInstance *motor);
/**
* @brief ()
*
* @param motor
* @param outer_loop
*/
void DJIMotorOuterLoop(DJIMotorInstance *motor, Closeloop_Type_e outer_loop);
#endif // !DJI_MOTOR_H