This commit is contained in:
2025-07-22 22:23:55 +08:00
commit 6e407c8c88
142 changed files with 130764 additions and 0 deletions

97
Driver/ESHL_protocol.h Normal file
View File

@@ -0,0 +1,97 @@
//
// Created by E_LJF on 25-7-17.
//
/*电调在通信过程中始终作为从机
构成:
帧头[0]+电调地址[1]+数据包长[3]+命令码[4]+数据[5]+整包CRC16校验码
帧头:
主机→电调: 0XEC
电调→主机: 0XCE
地址:
默认 EC00(可更改)
广播地址 AAAA
命令码:
0XC1:油门命令,表示数据包传输油门百分比,float类型4字节
0XC2:关闭电调,电调数据0XD0表示电调成功关闭,主机不发送数据,填0,uint8_t,类型,1字节
0XC3:启动电调,数据0XA1表示顺时针启动,0XA2表示逆时针启动,uint8_t类型,1字节
0XC4:电调刹车,电调数据0XA3表示刹车完毕,主机不发送数据,填0,uint8_t,类型,1字节
0XC5:更改电调运行电流限制ADC值,uint16_t类型
0XC6:电调异常,表示数据包传输电调异常代码uint8_t类型1字节
0XC7:更改电调地址,主机用广播地址发送此命令,更改地址时,所有已连接的电调地址都需要重新设置
地址设置方法: 快速旋转已经连接上电调的电机,此时电调将自动将自身地址设为EC00
同时电调状态指示灯会闪烁,闪烁次数代表电调地址
此时旋转第二个电调的电机,此时电调将自动将自身地址设为EC01,以此类推,直到所有电调地址设置完毕
电调设置地址后需要重新上电才能使用
设置地址主机不发送数据,电调广播自身地址表示该地址已被占用
电调异常代码:
0XE0:MOS异常
0XE1:电流异常
0XE2:电调开环启动达到最大重启次数,开环启动失败
0XE3:电机运行过程中意外停转
0XE4:电池电压异常*/
#ifndef ESHL_PROTOCOL_H
#define ESHL_PROTOCOL_H
#include "main.h"
#define ESHL_PROTOCOL_HEAD_ESC_TO_HOST 0xCE //数据从电调发往主机帧头
#define ESHL_PROTOCOL_HEAD_HOST_TO_ESC 0xEC //数据从电调发往主机帧头
#define ESHL_PROTOCOL_BROADCAST_ADDR 0xAAAA //ESHL协仪广播地址
#define ESHL_PROTOCOL_CMD_THR 0xC1 //油门命令,表示数据包传输油门百分比,float类型4字节
#define ESHL_PROTOCOL_CMD_ESC_OFF 0xC2 //关闭电调,电调数据0XD0表示电调成功关闭,主机不发送数据,填0,uint8_t,类型,1字节
#define ESHL_PROTOCOL_CMD_ESC_ON 0xC3 //启动电调,数据0XA1表示顺时针启动,0XA2表示逆时针启动,uint8_t类型,1字节
#define ESHL_PROTOCOL_CMD_BREAK 0xC4 //电调刹车,电调数据0XA3表示刹车完毕,主机不发送数据,填0,uint8_t,类型,1字节
#define ESHL_PROTOCOL_CMD_CURRENT_LIMIT 0xC5 //更改电调运行电流限制ADC值,uint16_t类型
#define ESHL_PROTOCOL_CMD_ERROR 0xC6 //电调异常,表示数据包传输电调异常代码uint8_t类型1字节
#define ESHL_PROTOCOL_CMD_CHANGE_ADDR 0xC7 //更改电调地址,主机用广播地址发送此命令,更改地址时,所有已连接的电调地址都需要重新设置
#define ESHL_PROTOCOL_ERROR_CODE_MOS 0xE0 //MOS异常
#define ESHL_PROTOCOL_ERROR_CODE_CURRENT 0xE1 //电流异常
#define ESHL_PROTOCOL_ERROR_CODE_START_FAIL 0xE2 //电调开环启动达到最大重启次数,开环启动失败
#define ESHL_PROTOCOL_ERROR_CODE_RUNING_STOP 0xE3 //电机运行过程中意外停转
typedef enum{
ESHL_DATA_ESC_TO_HOST,//数据从电调发往主机
ESHL_DATA_HOST_TO_ESC,//数据从主机发往电调
}ESHL_PROTOCOL_ENUM;//ESHL协议枚举
typedef struct ESHL_PROTOCOL_PACK_ANALYSIS_T
{
uint8_t head;//数据包帧头
uint16_t addr;//数据包地址
uint8_t len;//数据包大小
uint8_t cmd;//数据包命令码
uint8_t data;//发送或接收的数据
uint16_t addr_dat;//发送或接收地址
uint16_t current_limit;//发送或接收电调运行电流限制
float throttle;//发送或接收油门百分比
}ESHL_PROTOCOL_PACK_ANALYSIS_T;
void float_to_uint8(float f,uint8_t* u8);
void uint8_to_float(const uint8_t* u8,float* f);
void ESHL_ProtocolPackMake(uint8_t* pack,ESHL_PROTOCOL_PACK_ANALYSIS_T* dat_str,ESHL_PROTOCOL_ENUM dat_direction);
uint8_t ESHL_ProtocolAnalysisAddr(uint8_t* pack,ESHL_PROTOCOL_PACK_ANALYSIS_T* analysis_str);
void ESHL_ProtocolAnalysisData(uint8_t* pack,ESHL_PROTOCOL_PACK_ANALYSIS_T* analysis_str);
void ESHL_ProtocolPackAnalysis(uint8_t* pack,ESHL_PROTOCOL_PACK_ANALYSIS_T* analysis_str);
#endif //ESHL_PROTOCOL_H