修复遥控对码和速度同步

This commit is contained in:
2026-07-27 11:30:34 +08:00
parent ef6a50597b
commit 0add5422ac
6 changed files with 156 additions and 62 deletions
@@ -69,6 +69,9 @@ extern uint8_t Brightness;
#define BRIGHTNESS_MAX_PERCENT 100U #define BRIGHTNESS_MAX_PERCENT 100U
#define BRIGHTNESS_RF_STEP_PERCENT 10U #define BRIGHTNESS_RF_STEP_PERCENT 10U
#define SPEED_MIN_LEVEL 0U
#define SPEED_MAX_LEVEL 9U
#define DEVIATION_FREQ 10 #define DEVIATION_FREQ 10
#define DEVIATION_DUTYCYCLE 10 #define DEVIATION_DUTYCYCLE 10
@@ -4,6 +4,7 @@
#include "xc_drv_uart.h" #include "xc_drv_uart.h"
#include "mode.h" #include "mode.h"
#include "timer.h" #include "timer.h"
#include "light_transition.h"
#include "pwm.h" #include "pwm.h"
union rf433_flag rf_flag = {0}; union rf433_flag rf_flag = {0};
unsigned char high_level_time; unsigned char high_level_time;
@@ -75,6 +76,26 @@ void rf433_gpio_init(){
} }
static uint8_t ssse=0; static uint8_t ssse=0;
static volatile uint16_t rf_frame_sequence;
static uint16_t pair_last_frame_sequence;
static uint32_t pair_candidate_data;
static uint8_t pair_frame_silence_ticks;
static uint8_t pairing_feedback_active;
static uint8_t pairing_feedback_on;
static uint8_t pairing_feedback_transitions;
static uint16_t pairing_feedback_elapsed_ms;
static uint16_t pairing_feedback_interval_ms;
static uint8_t pairing_saved_status;
static uint8_t pairing_saved_mode;
static uint8_t pairing_saved_brightness;
static uint16_t pairing_saved_w;
static uint16_t pairing_saved_c;
static uint16_t pairing_saved_w_duty;
static uint16_t pairing_saved_c_duty;
#define PAIR_HOLD_FRAME_COUNT 8U
#define PAIR_FRAME_SILENCE_TICKS 50U
uint8_t long_flag_s=0; uint8_t long_flag_s=0;
// 在固定大小数组中添加新元素(滑动窗口) // 在固定大小数组中添加新元素(滑动窗口)
@@ -89,16 +110,126 @@ void addToFixedArray(uint8_t arr[], uint8_t newValue) {
arr[0] = newValue; arr[0] = newValue;
} }
static void Pairing_Feedback_Apply(uint8_t on)
{
Mode = mode0;
W_PWM = 100U;
C_PWM = 0U;
Brightness = BRIGHTNESS_MAX_PERCENT;
if(on)
{
Start_PWM();
W_PWM_duty = 100U;
C_PWM_duty = 0U;
}
else
{
W_PWM_duty = 0U;
C_PWM_duty = 0U;
Stop_PWM();
Light_Transition_FadeActive = 0U;
Bridge_Off();
}
}
static void Pairing_Feedback_Restore(void)
{
W_PWM = pairing_saved_w;
C_PWM = pairing_saved_c;
Brightness = pairing_saved_brightness;
Mode = pairing_saved_mode;
W_PWM_duty = pairing_saved_w_duty;
C_PWM_duty = pairing_saved_c_duty;
if(pairing_saved_status == POWERON)
{
Start_PWM();
}
else
{
Stop_PWM();
if(W_PWM_duty == 0U && C_PWM_duty == 0U)
{
Light_Transition_FadeActive = 0U;
Bridge_Off();
}
}
}
static void Pairing_Feedback_Start(uint16_t interval_ms)
{
if(pairing_feedback_active) return;
pairing_saved_status = deviceStatus;
pairing_saved_mode = Mode;
pairing_saved_brightness = Brightness;
pairing_saved_w = W_PWM;
pairing_saved_c = C_PWM;
pairing_saved_w_duty = W_PWM_duty;
pairing_saved_c_duty = C_PWM_duty;
pairing_feedback_active = 1U;
pairing_feedback_on = 1U;
pairing_feedback_transitions = 6U;
pairing_feedback_elapsed_ms = 0U;
pairing_feedback_interval_ms = interval_ms;
Pairing_Feedback_Apply(1U);
}
static void Pairing_Feedback_Task(void)
{
if(!pairing_feedback_active) return;
pairing_feedback_elapsed_ms += 3U;
if(pairing_feedback_elapsed_ms < pairing_feedback_interval_ms) return;
pairing_feedback_elapsed_ms = 0U;
if(pairing_feedback_transitions <= 1U)
{
pairing_feedback_active = 0U;
pairing_feedback_transitions = 0U;
Pairing_Feedback_Restore();
return;
}
pairing_feedback_transitions--;
pairing_feedback_on = pairing_feedback_on ? 0U : 1U;
Pairing_Feedback_Apply(pairing_feedback_on);
}
static void Encoder_key_NoCode(){ static void Encoder_key_NoCode(){
uint8_t i=0,j=0,isok=0,updata=0; uint8_t i=0,j=0,isok=0,updata=0;
uint16_t times_s=0; uint16_t times_s=0;
if((res_data==Brightness_H||res_data==Brightness_L||res_data==B_Brightness_H||res_data==B_Brightness_L||res_data==F_Brightness_10||res_data==F_Brightness_100)&&time_5s<=40000&&ssse==0){ if(rf_frame_sequence == pair_last_frame_sequence){
long_press_cnt++; if(pair_frame_silence_ticks < 0xffU) pair_frame_silence_ticks++;
if(pair_frame_silence_ticks > PAIR_FRAME_SILENCE_TICKS){
long_press_cnt = 0U;
pair_candidate_data = 0U;
}
return;
}
if(long_press_cnt>200){ pair_last_frame_sequence = rf_frame_sequence;
time_5s=40011; pair_frame_silence_ticks = 0U;
if(!((res_data==Brightness_H||res_data==Brightness_L||res_data==B_Brightness_H||res_data==B_Brightness_L||res_data==F_Brightness_10||res_data==F_Brightness_100)&&time_5s<=50000&&ssse==0)){
long_press_cnt = 0U;
pair_candidate_data = 0U;
return;
}
if(pair_candidate_data == receive_data){
long_press_cnt++;
}else{
pair_candidate_data = receive_data;
long_press_cnt = 1U;
}
if(long_press_cnt>=PAIR_HOLD_FRAME_COUNT){
time_5s=50011;
ssse=1; ssse=1;
long_press_cnt=0; long_press_cnt=0;
@@ -146,30 +277,7 @@ static void Encoder_key_NoCode(){
/// EA=0; /// EA=0;
isok=0; isok=0;
if(W_PWM==0&&C_PWM==0){ Pairing_Feedback_Start(times_s);
if(Mode==0){
W_PWM=100;
C_PWM=0;
(void)0;/* transition */
}else {
W_PWM=100;
C_PWM=0;
(void)0;/* transition */
}
}
if(deviceStatus==POWEROFF){
startTimer(&timer1,1);
Start_PWM();
}
for (i=0;i<3;i++){
Start_PWM();
Delay_ms(times_s);
Stop_PWM();
Delay_ms(times_s);
}
Start_PWM();
startTimer(&timer1,1);
} }
@@ -188,37 +296,18 @@ static void Encoder_key_NoCode(){
times_s=200; times_s=200;
match_success = 0; match_success = 0;
if(W_PWM==0&&C_PWM==0){ Pairing_Feedback_Start(times_s);
W_PWM=100;
C_PWM=0;
if(Mode==0){
(void)0;/* transition */
}else {
(void)0;/* transition */
}
}
if(deviceStatus==POWEROFF){
startTimer(&timer1,1);
Start_PWM();
}
for (i=0;i<3;i++){
Start_PWM();
Delay_ms(times_s);
Stop_PWM();
Delay_ms(times_s);
}
Start_PWM();
} }
ssse=1; ssse=1;
set_TaskComps_timer(2,2000); set_TaskComps_timer(2,2000);
} }
}
} }
void Encoder_key(){ void Encoder_key(){
Encoder_key_NoCode(); //一对一 Encoder_key_NoCode(); //一对一
Pairing_Feedback_Task();
} }
@@ -275,6 +364,7 @@ void rf433_receive(void)//rf433
receive_temp = receive_temp << 1; receive_temp = receive_temp << 1;
if (receive_data_cnt == 24)//24位数据接收完成 if (receive_data_cnt == 24)//24位数据接收完成
{ {
rf_frame_sequence++;
//进来这个if需要40ms //进来这个if需要40ms
rf_flag.rf_receive_flag.receive_finish = 1;//24位数据接收完成标志 rf_flag.rf_receive_flag.receive_finish = 1;//24位数据接收完成标志
rf_flag.rf_receive_flag.sync_code = 0; rf_flag.rf_receive_flag.sync_code = 0;
@@ -290,6 +380,7 @@ void rf433_receive(void)//rf433
receive_data_cnt++; receive_data_cnt++;
if (receive_data_cnt == 24) if (receive_data_cnt == 24)
{ {
rf_frame_sequence++;
//进来这个if需要40ms3748f3 //进来这个if需要40ms3748f3
rf_flag.rf_receive_flag.receive_finish = 1;//24位数据接收完成标志 rf_flag.rf_receive_flag.receive_finish = 1;//24位数据接收完成标志
rf_flag.rf_receive_flag.sync_code = 0; rf_flag.rf_receive_flag.sync_code = 0;
@@ -386,7 +477,7 @@ void _433_fun(){
Brightness -= BRIGHTNESS_RF_STEP_PERCENT; Brightness -= BRIGHTNESS_RF_STEP_PERCENT;
} }
}else { }else {
if(Speed<10)Speed++; if(Speed<SPEED_MAX_LEVEL)Speed++;
} }
break; break;
case Brightness_H: case Brightness_H:
@@ -402,7 +493,7 @@ void _433_fun(){
Brightness += BRIGHTNESS_RF_STEP_PERCENT; Brightness += BRIGHTNESS_RF_STEP_PERCENT;
} }
}else{ }else{
if(Speed>1)Speed--; if(Speed>SPEED_MIN_LEVEL)Speed--;
} }
break; break;
default: default:
@@ -21,7 +21,7 @@
*/ */
#define BRIDGE_PWM_SCALE 1000U #define BRIDGE_PWM_SCALE 1000U
#define BRIDGE_PWM_PERIOD 7U #define BRIDGE_PWM_PERIOD 7U
#define BRIDGE_MIX_SCALE 1000U #define BRIDGE_MIX_SCALE 100U
#define BRIDGE_FRAME_US 1000U #define BRIDGE_FRAME_US 1000U
#define BRIDGE_DEADTIME_US 50U #define BRIDGE_DEADTIME_US 50U
#define BRIDGE_DUAL_ACTIVE_US 900U #define BRIDGE_DUAL_ACTIVE_US 900U
@@ -100,6 +100,8 @@ void read_user_data(void)
Brightness = BRIGHTNESS_MAX_PERCENT; Brightness = BRIGHTNESS_MAX_PERCENT;
Speed = r_data[7]; Speed = r_data[7];
if(Speed > SPEED_MAX_LEVEL)
Speed = SPEED_MAX_LEVEL;
deviceStatus = r_data[8]; deviceStatus = r_data[8];
W_PWM = r_data[9]; W_PWM = r_data[9];
@@ -203,4 +205,3 @@ void fmc_spi_read(void)
} }
@@ -4,8 +4,7 @@
volatile uint8_t Light_Transition_FadeActive; volatile uint8_t Light_Transition_FadeActive;
#define LIGHT_OUTPUT_SCALE 10U #define LIGHT_FADE_STEP 1U
#define LIGHT_FADE_STEP 10U
/* /*
* Gamma 1.8, mapping APP levels 1..100 to a stable physical range of * Gamma 1.8, mapping APP levels 1..100 to a stable physical range of
@@ -62,12 +61,10 @@ void Light_Transition_Task(void)
brightness_scale = brightness_gamma_q12[target_brightness - 1U]; brightness_scale = brightness_gamma_q12[target_brightness - 1U];
} }
target_w = (uint16_t) target_w =
(((uint32_t)W_PWM * brightness_scale * LIGHT_OUTPUT_SCALE + 2048U) >> (uint16_t)(((uint32_t)W_PWM * brightness_scale + 2048U) >> 12);
12); target_c =
target_c = (uint16_t) (uint16_t)(((uint32_t)C_PWM * brightness_scale + 2048U) >> 12);
(((uint32_t)C_PWM * brightness_scale * LIGHT_OUTPUT_SCALE + 2048U) >>
12);
W_PWM_duty = approach_target(W_PWM_duty, target_w); W_PWM_duty = approach_target(W_PWM_duty, target_w);
C_PWM_duty = approach_target(C_PWM_duty, target_c); C_PWM_duty = approach_target(C_PWM_duty, target_c);
@@ -143,6 +143,8 @@ void scan_uart(uint8_t *arr)
break; break;
case 5: case 5:
if(POWEROFF==deviceStatus)break; if(POWEROFF==deviceStatus)break;
if(user_rx_buf[1] > SPEED_MAX_LEVEL)
user_rx_buf[1] = SPEED_MAX_LEVEL;
Speed =user_rx_buf[1]; Speed =user_rx_buf[1];
break; break;
case 6: case 6: