增加重启以及修改接收BOOT ID为0x21

This commit is contained in:
2026-05-02 07:27:52 +08:00
parent 2153bfcd1b
commit 2f94a8ecae
5 changed files with 145 additions and 164 deletions

209
User.c
View File

@@ -1,43 +1,45 @@
#include "MAIN.H"
//can<EFBFBD><EFBFBD>Ϣ
//can消息
UnInfCan UnInfCan_1 = {0};
UnSwSample UnSwSample_1 = {0};
UnSwOut UnSwOut_1 = {0};
UnRemoteControlOutput UnRemoteControlOutput_1 = {0,0,0,0,0,0,0,0};//ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD>
UnRemoteControlOutput UnRemoteControlOutput_2 = {0,0,0,0,0,0,0,0};//ң<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD>
UnRemoteControlOutput UnRemoteControlOutput_1 = {0,0,0,0,0,0,0,0};//遥控器数据发送
UnRemoteControlOutput UnRemoteControlOutput_2 = {0,0,0,0,0,0,0,0};//遥控器数据发送
SBusData sbus_data;
//CAN<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//CAN发送计数
uword CntCan_1 = 0;
bit FlgCan_1 = 0;
//<EFBFBD><EFBFBD>һ<EFBFBD>βɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָʾ
//第一次采集数据有效标志
bit FlgOneTime = 0;
ubyte uart2RxFlag = 0;
uword RgCanPerid = 50;
ubyte can_error_cnt = 0;
ubyte can_error_flg = 0;
ubyte RestartDataFlg1 _at_ 0xF5E7;
ubyte RestartDataFlg2 _at_ 0xF600;
//PWM 20181227
ubyte PwmH[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//-----------------------------------------------------------------------
//RTC<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
//RTC定时器
//-----------------------------------------------------------------------
void RTCProcess(void)
{
//************************************************************************
//////CAN<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//////CAN发送计数
if(FlgCan_1){CntCan_1++;if(CntCan_1 >= RgCanPerid){FlgCan_1=0; CntCan_1=0;}}else{CntCan_1=0;}
//************************************************************************
}
// SBus <EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// SBus 数据解析函数
SBusData* parseSBusData(const uint8_t *input_data)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>16<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ÿ<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>Ϊ11λ
// 解析16个通道的数据每个通道为11
sbus_data.channels[0] = (input_data[1] | input_data[2] << 8) & 0x07FF;
sbus_data.channels[1] = (input_data[2] >> 3 | input_data[3] << 5) & 0x07FF;
sbus_data.channels[2] = (input_data[3] >> 6 | input_data[4] << 2 | input_data[5] << 10) & 0x07FF;
@@ -56,20 +58,14 @@ SBusData* parseSBusData(const uint8_t *input_data)
sbus_data.channels[14] = (input_data[20] >> 2 | input_data[21] << 6) & 0x07FF;
sbus_data.channels[15] = (input_data[21] >> 5 | input_data[22] << 3) & 0x07FF;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ֽ<EFBFBD>
// 解析标志字节
sbus_data.flags = input_data[23];
uart2RxFlag = 1;
// for(ubyte i=0;i<8;i++)
// {
// printf( "%d ",i);
// printf( "%04x\r\n",sbus_data.channels[i]);
// }
// printf("%d\r\n",sbus_data.channels[0]);
return &sbus_data;
}
//can<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//can错误处理
void CanErrorProcess(void)
{
ubyte ubNSRL;
@@ -119,37 +115,37 @@ void CanTransmit(ubyte index,ubyte *buf)
CanTransmitbuf[4] = buf[6];
CanTransmitbuf[5] = buf[7];
CAN_waitTransmit(index);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>һ֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᶪ֡
CAN_vLoadData(index, (ulong *)CanTransmitbuf);// װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CAN_waitTransmit(index);//发送前等待上一帧发送完,不然会丢帧
CAN_vLoadData(index, (ulong *)CanTransmitbuf);// 装载数据
CAN_vTransmit(index);
}
typedef enum {
STT_INIT_LIGHT, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ״̬
STT_STABLE, // <EFBFBD>ȶ<EFBFBD>̬
STT_BLINK_CHECK, // <EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
STT_BLINKING // <EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
STT_INIT_LIGHT, // 进入保持的初始状态
STT_STABLE, // 稳定态
STT_BLINK_CHECK, // 闪烁检测
STT_BLINKING // 闪烁确认
} BlinkState;
typedef struct {
BlinkState current_state;
uint8_t last_input;
uint16_t unified_timer; // ͳһ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>[7](@ref)
uint8_t trans_count; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t unified_timer; // 统一定时器
uint8_t trans_count; // 翻转次数需要记录
uint8_t stable_type;
} BlinkDetector;
BlinkDetector blink_detector = {0};
/* LED״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳһ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ctx - ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>豣֤<EFBFBD>ǿգ<EFBFBD>
* current_input- <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD>0:<3A><> 1:<3A><><EFBFBD><EFBFBD>
* output - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״ָ̬<EFBFBD>루0:<3A><>Ч 1:<3A>ȶ<EFBFBD><C8B6><EFBFBD> 2:<3A>ȶ<EFBFBD><C8B6><EFBFBD> 3:<3A><>˸<EFBFBD><CBB8>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 1. <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>[8](@ref)
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[1](@ref)
* 3. ״̬Ǩ<EFBFBD><EFBFBD>ԭ<EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD>[9](@ref)
/* LED状态检测函数(状态机+统一定时器优化版)
* 参数:
* ctx - 状态机上下文指针(需保证非空)
* current_input- 当前输入电平0:低 1:高)
* output - 输出状态指示0:无效 1:稳定高 2:稳定低 3:闪烁)
* 原理:
* 1. 统一定时器替代原多计时器
* 2. 简化状态转移逻辑
* 3. 状态迁移原子操作
*/
void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output)
{
@@ -157,13 +153,13 @@ void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output)
switch(ctx->current_state)
{
/* <EFBFBD>ؼ<EFBFBD><EFBFBD><EFBFBD>ʼ״̬<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* 关键初始状态:确保首次状态正确建立 */
case STT_INIT_LIGHT:
{
ctx->last_input = current_input; // ǿ<EFBFBD>Ƽ<EFBFBD>¼<EFBFBD><EFBFBD>ʼֵ
ctx->last_input = current_input; // 强制记录初始值
ctx->stable_type = current_input ? 1 : 2;
ctx->current_state = STT_STABLE; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>̬
ctx->unified_timer = 0; // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
ctx->current_state = STT_STABLE; // 进入稳定状态
ctx->unified_timer = 0; // 初始化计时器
*output = 0;
break;
}
@@ -176,13 +172,13 @@ void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output)
ctx->trans_count = 1;
ctx->unified_timer = 0;
ctx->last_input = current_input;
ctx->stable_type = current_input ? 1 : 2; // ͬ<EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>[4](@ref)
ctx->stable_type = current_input ? 1 : 2; // 同步状态变量
}
else if(ctx->unified_timer >= STABLE_CONFIRM_TIME)
{
*output = ctx->stable_type;
ctx->unified_timer = 0;
ctx->stable_type = current_input ? 1 : 2; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>[10](@ref)
ctx->stable_type = current_input ? 1 : 2; // 确认状态
}
else
{
@@ -191,54 +187,54 @@ void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output)
}
break;
}
/* <EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>Ƶ<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* 闪烁状态:时间窗口内统计电平翻转次数 */
case STT_BLINK_CHECK:
{
if(ctx->unified_timer >= BLINK_WINDOW) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>[8](@ref)
if(ctx->unified_timer >= BLINK_WINDOW) // 到达检测窗口时间
{
if(ctx->trans_count >= MIN_BLINKS) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(ctx->trans_count >= MIN_BLINKS) // 达到最小闪烁次数
{
ctx->current_state = STT_BLINKING;// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬
ctx->unified_timer = 0; // <EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
ctx->current_state = STT_BLINKING;// 进入闪烁确认状态
ctx->unified_timer = 0; // 重置超时计时
}
else // δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD>ֵ
else // 未达闪烁阈值
{
ctx->current_state = STT_STABLE; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>̬
ctx->unified_timer = 0; // <EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><EFBFBD>
ctx->current_state = STT_STABLE; // 返回稳定状态
ctx->unified_timer = 0; // 重置状态计时器
}
}
else // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>
else // 检测期内
{
ctx->unified_timer++; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD>ʱ<EFBFBD>ۼ<EFBFBD>
ctx->unified_timer++; // 统一计时累计
if(current_input != ctx->last_input)
{
ctx->trans_count++; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>
ctx->last_input = current_input; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
ctx->trans_count++; // 翻转次数累计
ctx->last_input = current_input; // 更新最后检测值
}
}
break;
}
/* <EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* 闪烁确认状态:维持闪烁活动判断 */
case STT_BLINKING:
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 检测电平变化计数
if(current_input != ctx->last_input)
{
ctx->unified_timer = 0; // <EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
ctx->unified_timer = 0; // 重置超时计时
ctx->last_input = current_input;
*output = 3; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸״̬
*output = 3; // 输出当前闪烁状态
}
else if(ctx->unified_timer >= BLINK_TIMEOUT)
{
ctx->current_state = STT_STABLE;
ctx->stable_type = current_input ? 1 : 2; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[4](@ref)
ctx->stable_type = current_input ? 1 : 2; // 更新当前稳定状态变量
ctx->unified_timer = 0;
}
else
{
ctx->unified_timer ++; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD>ʱ<EFBFBD>ۼƼ<EFBFBD>ʱ
*output = 3; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸״̬
ctx->unified_timer ++; // 维持当前稳定时间累计计时
*output = 3; // 输出当前闪烁状态
}
break;
}
@@ -247,7 +243,7 @@ void detectLedState(BlinkDetector* ctx, uint8_t current_input, uint8_t* output)
}
}
//SBUS<EFBFBD><EFBFBD>CAN<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>
//SBUSCAN数据解析
void sbusCanDecode(void)
{
float SBUS2CANdecodeTemp = 0.0;
@@ -257,36 +253,18 @@ void sbusCanDecode(void)
{
uart2RxFlag = 0;
//ת<EFBFBD><EFBFBD>
SBUS2CANdecodeTemp = (float)(sbus_data.channels[0]);
SBUS2CANdecodeTemp = (DF_ZeroValue - SBUS2CANdecodeTemp)*23;//<2F><>Ҫ<EFBFBD>һ<E4BBBB>·<EFBFBD><C2B7>ţ<EFBFBD><C5A3><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DF_Curvature = (int16_t)SBUS2CANdecodeTemp;//<2F><><EFBFBD><EFBFBD>
if( (DF_Curvature > (-50)) && (DF_Curvature < 50) ) //<2F><><EFBFBD>ӻ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
DF_Curvature = 0;
}
//通道0 - 直接发送原始值
DF_Curvature = (int16_t)sbus_data.channels[0];
//ת<EFBFBD><EFBFBD>
SBUS2CANdecodeTemp = (float)(sbus_data.channels[1]);
SBUS2CANdecodeTemp = (DF_ZeroValue - SBUS2CANdecodeTemp)*2.3;//<2F><>Ҫ<EFBFBD>һ<E4BBBB>·<EFBFBD><C2B7>ţ<EFBFBD><C5A3><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DF_Speed = (int16_t)SBUS2CANdecodeTemp;//ת<><D7AA>
if( (DF_Speed > (-50)) && (DF_Speed < 50) ) //<2F><><EFBFBD>ӻ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
DF_Speed = 0;
}
//通道1 - 直接发送原始值
DF_Speed = (int16_t)sbus_data.channels[1];
//<2F><><EFBFBD><EFBFBD>
SBUS2CANdecodeTemp = (float)(sbus_data.channels[7]);
SBUS2CANdecodeTemp = (DF_ZeroValue - SBUS2CANdecodeTemp);//<2F><>Ҫ<EFBFBD>һ<E4BBBB>·<EFBFBD><C2B7>ţ<EFBFBD><C5A3><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DF_Reserve = (int16_t)SBUS2CANdecodeTemp;//ת<><D7AA>
if( (DF_Reserve > (-50)) && (DF_Reserve < 50) ) //<2F><><EFBFBD>ӻ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
DF_Reserve = 0;
}
//通道7 - 直接发送原始值
DF_Reserve = (int16_t)sbus_data.channels[7];
//SwA
if(sbus_data.channels[1] >= 1700)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(sbus_data.channels[1] >= 1700)//高位
{
DF_SwA = 1;
}
@@ -296,35 +274,35 @@ void sbusCanDecode(void)
}
//SwB
if(sbus_data.channels[6] >= 1700)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(sbus_data.channels[6] >= 1700)//第三档
{
DF_SwB = 2;
}
else if(sbus_data.channels[6] <= 250)//<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>
else if(sbus_data.channels[6] <= 250)//第二档
{
DF_SwB = 0;
}
else//<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
else//第一档
{
DF_SwB = 1;
}
//SwC
if(sbus_data.channels[4] >= 1700)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(sbus_data.channels[4] >= 1700)//第三档
{
DF_SwC = 2;
}
else if(sbus_data.channels[4] <= 250)//<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>
else if(sbus_data.channels[4] <= 250)//第二档
{
DF_SwC = 0;
}
else//<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
else//第一档
{
DF_SwC = 1;
}
//SwD
if(sbus_data.channels[5] >= 1700)//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(sbus_data.channels[5] >= 1700)//高位
{
DF_SwD = 1;
}
@@ -333,20 +311,20 @@ void sbusCanDecode(void)
DF_SwD = 0;
}
if(0 == sbus_data.flags)//23ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ϊ0<CEAA><30>־<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(0 == sbus_data.flags)//23通道状态 为0标志位表示遥控器
{
DF_RCHSta = 1;//<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DF_RCHSta = 1;//遥控器在线
}
else
{
DF_RCHSta = 0;//<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DF_RCHSta = 0;//遥控器离线
}
SBUS2CANdecodeTemp = (float)(sbus_data.channels[2]);
UnRemoteControlOutput_2.bit_data.speed = (int16_t)SBUS2CANdecodeTemp;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UnRemoteControlOutput_2.bit_data.speed = (int16_t)SBUS2CANdecodeTemp;//数据
SBUS2CANdecodeTemp = (float)(sbus_data.channels[3]);
UnRemoteControlOutput_2.bit_data.curvature = (int16_t)SBUS2CANdecodeTemp;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UnRemoteControlOutput_2.bit_data.curvature = (int16_t)SBUS2CANdecodeTemp;//数据
}
@@ -355,7 +333,7 @@ void sbusCanDecode(void)
}
//CAN<EFBFBD><EFBFBD><EFBFBD>ͽ<EFBFBD><EFBFBD><EFBFBD>
//CAN发送接收
void CanRXTX(void)
{
stCAN_SWObj StrCanRx = {0};
@@ -397,7 +375,7 @@ void CanRXTX(void)
// UnInfCan_1.ArrData.ArrRX[1][5] = StrCanRx.ulDATAH.ubDB[3];
// CAN_vReleaseObj(DF_SwRxPwm);
//// //<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><EFBFBD>浽PWM<EFBFBD><EFBFBD><EFBFBD>ݽṹ<EFBFBD><EFBFBD>20181227
//// //接收到的数据保存到PWM数据结构体20181227
//// PwmH[0 ] = (ubyte)UnInfCan_1.BitData.Pwm_01;
//// PwmH[1 ] = (ubyte)UnInfCan_1.BitData.Pwm_02;
//// PwmH[2 ] = (ubyte)UnInfCan_1.BitData.Pwm_03;
@@ -417,7 +395,7 @@ void CanRXTX(void)
}
//50ms<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ֡
//50ms发送一帧
if(!FlgCan_1)
{
FlgCan_1 = 1;
@@ -430,9 +408,9 @@ void CanRXTX(void)
// UnRemoteControlOutput_2.bit_data.reserve1 = sbus_temp[1];
if( (MATCH_CMD == UnInfCan_1.ArrData.ArrRX[0][0]) || (CHANGE_CMD == UnInfCan_1.ArrData.ArrRX[0][0]) )//<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>
if( (MATCH_CMD == UnInfCan_1.ArrData.ArrRX[0][0]) || (CHANGE_CMD == UnInfCan_1.ArrData.ArrRX[0][0]) )//对频命令或切换
{
if(MATCH_CMD == UnInfCan_1.ArrData.ArrRX[0][0])//<EFBFBD><EFBFBD>Ƶ
if(MATCH_CMD == UnInfCan_1.ArrData.ArrRX[0][0])//对频
{
match_freq_time = MATCH_TIME;
}
@@ -444,15 +422,15 @@ void CanRXTX(void)
switch(match_freq_sta)
{
case 0:
if(match_freq_cnt >= match_freq_time)//ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>
if(match_freq_cnt >= match_freq_time)//时间到了就发送确认
{
SwOut01 = 0;//ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ
SwOut01 = 0;//取消对频
match_freq_sta = 1;
match_freq_cnt = 0;
}
else
{
SwOut01 = 1;//<EFBFBD><EFBFBD>Ƶָ<EFBFBD><EFBFBD>
SwOut01 = 1;//对频指令
match_freq_sta = 0;
match_freq_cnt ++;
}
@@ -461,14 +439,14 @@ void CanRXTX(void)
case 1:
if(match_freq_cnt >= MATCH_WAIT_TIME)//
{
SwOut01 = 0;//ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ
SwOut01 = 0;//取消对频
match_freq_sta = 0;
match_freq_cnt = 0;
UnInfCan_1.ArrData.ArrRX[0][0] = 0;
}
else
{
SwOut01 = 0;//<EFBFBD><EFBFBD>Ƶָ<EFBFBD><EFBFBD>
SwOut01 = 0;//对频指令
match_freq_sta = 1;
match_freq_cnt ++;
}
@@ -481,7 +459,7 @@ void CanRXTX(void)
CanTransmit(DF_SwTx1,(ubyte *)&UnRemoteControlOutput_2.arr[0]);
}
if( (0x40 == can_error_cnt) || (0x80 == can_error_cnt) )//20250625<EFBFBD>ж<EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><EFBFBD><EFBFBD>
if( (0x40 == can_error_cnt) || (0x80 == can_error_cnt) )//20250625判断是否发生总线错误
{
can_error_flg = can_error_cnt;
CAN_vInit();
@@ -491,18 +469,3 @@ void CanRXTX(void)
}