修复开关控制组控的控制异常问题

修改PB开关状态组控处理,解决后32路的开关状态会复用上前32个回路的数据
This commit is contained in:
yanghongfeng
2026-01-19 15:32:11 +08:00
commit f25132cbe3
292 changed files with 44556 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
#ifndef _EEPROM_H_
#define _EEPROM_H_
#include "apt32f102.h"
#define EEPROM_ParaInfo_Address 0x10000020
/* EEPROM 保存数据格式:
* FLAG - 1Byte 保存标志位
* LEN - 2Byte 保存数据长度
* CHECK - 1Byte 保存数据校验
* DATA - nByte 保存数据内容
*
* */
#define EEPROM_Offset_SaveFlag 0x00
#define EEPROM_Offset_Datalen 0x01
#define EEPROM_Offset_Check 0x03
#define EEPROM_Offset_Data 0x04
#define EEPROM_SVAE_FLAG 0xA6
#define EEPROM_DATA_Size_Max 100 //目前保存数据内容最长为100Byte
#define EEPROM_ParaDefault_PowerBusEnable 0x01
#define EEPROM_ParaDefault_SaveCurr 120 //默认保护电流为12A,单位:0.1A
typedef struct{
U8_T powerbus_enable; //PB电源使能状态 0x01:开启0x02:关闭
U8_T save_curr; //保护电流
/*调光参数*/
U8_T allBrightness; //全局调光 0~100
U8_T allBrightnessUpLimit; //全局调光上限百分比
U8_T allBrightnessDownLimit; //全局调光下限百分比
U8_T swithcState[PWM_OUT_CH_MAX]; //开关状态 0x01:开0x00:关
U8_T brightness[PWM_OUT_CH_MAX]; //亮度 0~100
U16_T gradialTime[PWM_OUT_CH_MAX]; //渐变时间 单位ms
}E_PARA_INFO;
extern E_PARA_INFO g_eeprom;
void EEPROM_Init(void);
U8_T EEPROM_ReadParaInfo(E_PARA_INFO *info);
U8_T EEPROM_WriteParaInfo(E_PARA_INFO *info);
U8_T EEPROM_ClearParaInfo(void);
U8_T EEPROM_Validate_ParaInfo(E_PARA_INFO *info);
void EEPROM_Default_ParaInfo(E_PARA_INFO *info);
#endif

263
Source/SYSTEM/inc/pb_fun.h Normal file
View File

@@ -0,0 +1,263 @@
#ifndef _PB_FUN_H_
#define _PB_FUN_H_
#include "apt32f102_gpio.h"
#include "pwm.h"
#define PB_SOFTBOOT_PERIOD 100 //PB软启动一个周期的时间
//PB输出控制使能
#define DRV_PB_ENABLE GPIO_Write_High(GPIOA0,12)
#define DRV_PB_DISABLE GPIO_Write_Low(GPIOA0,12)
#define DRV_PB36V_ON GPIO_Write_High(GPIOB0,4)
#define DRV_PB36V_OFF GPIO_Write_Low(GPIOB0,4)
#define DRV_PS36V_ON GPIO_Write_High(GPIOA0,14)
#define DRV_PS36V_OFF GPIO_Write_Low(GPIOA0,14)
//过流保护中断引脚
#define PB_OVERCURR_PWR_BUS GPIO_Read_Status(GPIOB0,1)
//PowerBus 保护电流
#define PB_SaveCurrent_Min 1
#define PB_SaveCurrent_Max 165
/*PB通讯 RS485协议相关内容 - 开始*/
/*PB通讯 RS485协议 - 格式*/
typedef enum{
PB_FMT_ADDR_TX = 0,
PB_FMT_TYPE,
PB_FMT_DEV_TYPE,
PB_FMT_ADDR_RX,
PB_FMT_LEN,
PB_FMT_CKS,
PB_FMT_CMD,
PB_FMT_PARA,
}PB_FMT_E;
#define PB_DEV_Addr 0x01 //PB设备地址默认0x01 主机地址默认为0x00
//#define PB_DEV_StripAddr 0x01 //PB灯带地址默认0x01
#define PB_DEV_TYPE 0x30 //PB设备类型
#define PB_BUFFER_SIZE 100 //PB缓冲区数据大小
#define PB_BUFFER_NUM 8 //PB缓冲区数据个数
#define PB_INTP_BUFFER_SIZE 200 //PB中断发送 缓冲区数据大小
/*PB20 通讯协议命令*/
#define PB_CMD_GET_STATE 0x20 //查询当前状态
#define PB_CMD_SET_STRIP_BRIGHTNESS 0x21 //设定灯带亮度
#define PB_CMD_SET_STRIP_SWITCH 0x22 //设定灯带开关状态
#define PB_CMD_SET_STRIP_ADJUST 0x23 //设定灯带亮度递增、递减
#define PB_CMD_SET_PIRTIGGLE_LED 0x24 //设定LD PIR触发LED
#define PB_CMD_SET_CurrTiggleStrip 0x25 //PB总线电流触发灯带调光
#define PB_CMD_SET_SaveCurrInfo 0x26 //设定PB总线保护电流
#define PB_CMD_GET_SaveCurrInfo 0x27 //获取PB总线保护电流信息
#define PB_CMD_SET_UniversPara 0x28 //设定整体参数
#define PB_CMD_SET_PowerBus_Enable 0x29 //设定PB 总线输出使能
#define PB_CMD_PassThroug_Data 0x2A //PB透传命令
#define PB_CMD_SET_PB_LEDS_BRIGHTNESS 0x30 //设定PB总线 LED亮度 --按照地址段控制 每个回路可单独设定亮度
#define PB_CMD_SET_PB_LEDS_ADJUST 0x31 //设定PB总线 LED亮度递增递减调节 --按照地址段控制
#define PB_CMD_SET_PB_LEDS_SWITCH 0x32 //设定PB总线 LED开关状态 --按照地址段控制
#define PB_CMD_SET_PB_LEDS_BRIGHT 0x33 //设定PB总线 LED亮度 --按照地址段控制
#define PB_CMD_SET_PB_LED_SWITCH 0x34 //设定PB总线 LED单开关状态 --按照单独回路控制
#define PB_CMD_SET_PB_LED_BRIGHTNESS 0x35 //设定PB总线 LED单回路亮度 --按照单独回路控制
#define PB_CMD_SET_PB_LED_Adjust 0x36 //设定PB总线 LED单回路亮度调节 --按照单独回路控制
#define PB_CMD_SET_PB_ALLLED_Switch 0x37 //设定PB总线 LED全部设备开关状态
#define PB_CMD_SET_PB_STRIPS_BRIGHTNESS 0x40 //设定PB总线 Strip亮度 --按照地址段控制 每个回路可单独设定亮度
#define PB_CMD_SET_PB_STRIPS_ADJUST 0x41 //设定PB总线 Strip亮度递增递减调节 --按照地址段控制
#define PB_CMD_SET_PB_STRIPS_SWITCH 0x42 //设定PB总线 Strip开关状态 --按照地址段控制
#define PB_CMD_SET_PB_ALLSTRIP_Switch 0x43 //设定PB总线 Strip全部设备开关状态
#define PB_CMD_SET_PB_STRIP_SWITCH 0x44 //设定PB总线 Strip单开关状态 --按照单独回路控制
#define PB_CMD_SET_PB_STRIP_BRIGHTNESS 0x45 //设定PB总线 Strip单回路亮度 --按照单独回路控制
#define PB_CMD_SET_PB_STRIP_Adjust 0x46 //设定PB总线 Strip单回路亮度 --按照单独回路控制
#define PB_CMD_SET_PB_STRIP_RELATIVE_GROUP_ADJUST 0x47 //设定PB总线 Strip相对调节 --按照32回路/组
#define PB_CMD_SET_PB_STRIP_RELATIVE_ADJUST 0x48 //设定PB总线 Strip相对调节 --指定回路
#define PB_CMD_SET_PB_RELAYS_SWITCH 0x50 //设定PB总线 继电器开关状态 --按照地址段控制
#define PB_CMD_SET_PB_ALLRELAY_SWITCH 0x51 //设定PB总线 全部继电器开关状态 --按照地址段控制
#define PB_CMD_SET_PB_RELAY_SWITCH 0x52 //设定PB总线 继电器开关状态
#define PB_CMD_SET_PB_RELAY_DELAY_SWITCH 0x53 //设定PB总线 继电器延时开关状态
#define PB_CMD_Reply_Succ 0x00 //PowerBus总线通讯空闲
#define PB_CMD_Reply_CommStateBusy 0x01 //PowerBus总线通讯繁忙
#define PB_CMD_Reply_ParaError 0x02 //参数错误
/*PB通讯 RS485协议相关内容 - 结束*/
/*PB 总线通讯协议 相关内容 - 开始*/
#define POWERBUS_SEND_DELAY 50 //PowerBus 发送延时 50ms
typedef enum
{
PowerBUS_FMT_LEN,
PowerBUS_FMT_SN,
PowerBUS_FMT_CKS,
PowerBUS_FMT_CMD,
PowerBUS_FMT_PARAM,
}PowerBUS_FMT_e;
#define PowerBUS_CMD_SET_LED_BRIGHTNESS 0x01 //设置亮度
#define PowerBUS_CMD_SET_LED_SWITCH 0x02 //设置开关状态
#define PowerBUS_CMD_SET_LED_ADJUST 0x03 //设定调光
#define PowerBUS_CMD_SET_LEDS_BRIGHTNESS 0x04
#define PowerBUS_CMD_SET_LEDS_SWITCH 0x05
#define PowerBUS_CMD_SET_LEDS_ADJUST 0x06
#define PowerBUS_CMD_SET_LEDS_BRIGHT 0x07
#define PowerBUS_CMD_SET_ALLLED_SWITCH 0x08
#define PowerBUS_CMD_SET_PIR_ENABLE 0x09 //设定PIR使能
#define PowerBUS_CMD_SET_STRIP_BRIGHTNESS 0x11 //设置亮度 --指定回路
#define PowerBUS_CMD_SET_STRIP_SWITCH 0x12 //设置开关状态 --指定回路
#define PowerBUS_CMD_SET_STRIP_ADJUST 0x13 //设定调光 --指定回路
#define PowerBUS_CMD_SET_STRIPS_BRIGHTNESS 0x14 //设定亮度 按照组地址控制
#define PowerBUS_CMD_SET_STRIPS_SWITCH 0x15 //设定开关状态 按照组地址控制
#define PowerBUS_CMD_SET_STRIPS_ADJUST 0x16 //设定调光 按照组地址控制
#define PowerBUS_CMD_SET_ALLSTRIP_SWITCH 0x17 //设置LED开关状态 --全部开关状态可单独设置
#define PowerBUS_CMD_SET_STRIP_RELATIVE_GROUP_ADJUST 0x18 //设置灯带相对调节 --按照32回路/组
#define PowerBUS_CMD_SET_STRIP_RELATIVE_ADJUST 0x19 //设置灯带相对调节 --指定回路
#define PowerBUS_CMD_SET_RELAYS_SWITCH 0x21 //设定继电器开关状态 - 组地址控制
#define PowerBUS_CMD_SET_ALLRELAY_SWITCH 0x22 //设定继电器全部开关状态
#define PowerBUS_CMD_SET_RELAY_SWITCH 0x23 //设定继电器开关状态
#define PowerBUS_CMD_SET_RELAY_DELAY_SWITCH 0x24 //设定继电器延时开关控制
#define PowerBUS_CMD_SET_UniversPara 0xF0 //设定整体参数信息 - 调光上下限设定,全局亮度设定
/*PB 总线通讯协议 相关内容 - 结束*/
#define PB_GROUP_NUM 32
#define MEAS_BUFFER_SIZE 20
#define MEAS_Debounce_Num 5
#define MEAS_InputVoltage_Min 10000 //输入电压最低为10V,单位mV
#define MEAS_InputVoltage_Max 38000 //输入电压最高为38V,单位mV
typedef struct{
//输入电源检测与输出电源开关 相关定义
U8_T meas_cnt; //检测BUFF 当前下标
U8_T meas_fill_flag; //检测BUFF 已满标志位
U8_T meas_hv_PB_ONcnt; //
U8_T meas_hv_PS_ONcnt; //
U8_T meas_hv_PB_OFFcnt; //
U8_T meas_hv_PS_OFFcnt; //
U8_T meas_hv_PB_State;
U8_T meas_hv_PS_State;
U8_T last_meas_hv_PB_State;
U8_T last_meas_hv_PS_State;
U8_T meas_hv_curr_ward; //PB负载电流检测 挡位 0x00:低挡位0x01:高挡位
U8_T meas_hv_curr_toggle;
U8_T meas_hv_curr_cnt;
U8_T meas_hv_curr_filter;
U8_T meas_load_current_ONcnt; //PB负载电流 触发灯带计数
U8_T meas_load_current_OFFcnt; //PB负载电流 触发灯带计数
U8_T meas_load_current_state; //PB负载电流 触发状态
//PB 状态变量相关定义
U8_T power_status; //PB 开关状态
U8_T enable; //PB 使能状态
U8_T soft_boot; //PB 软启动
U8_T protect_flag; //PB 电源保护标志位
U8_T protect_curr; //PB 保护电流值
U8_T recv_addr; //接收数据地址
U8_T recv_sn; //接收SN号
U8_T recv_cmd; //接收命令
U8_T ackbuff[PB_BUFFER_SIZE]; //应答数据
U8_T sendSN;
U8_T sendCnt;
U8_T sendReadCnt;
U8_T sendWriteCnt;
U8_T sendbufferlen[PB_BUFFER_NUM];
U8_T sendbuffer[PB_BUFFER_NUM][PB_BUFFER_SIZE];
// U8_T brightnessCurr[PB_GROUP_NUM][8];
// U8_T switchState[PB_GROUP_NUM];
U8_T resendNum; //下发PB数据 - 重发次数
U16_T ackLen; //应答数据长度
U16_T soft_boot_cnt; //软启动占空比
U16_T soft_boot_high; //软启动 - 高电平时间
U16_T soft_boot_low; //软启动 - 低电平时间
U16_T meas_powerbus_volt; //PB电压
U16_T meas_powerstrip_volt; //PS电压
U16_T meas_powerbus_curr; //PB电流
U16_T meas_hv_PB_val[MEAS_BUFFER_SIZE];
U16_T meas_hv_PS_val[MEAS_BUFFER_SIZE];
U16_T meas_hv_CURRPWRx5_val;
U16_T meas_hv_CURRPWRx50_val;
U16_T meas_hv_CURRPWR_Buff[MEAS_Debounce_Num];
//U16_T meas_hv_CURRPWR_FilterBuff[5];
U32_T protect_time; //PB 保护电流过载时间
U32_T soft_boot_tick; //软启动 时间戳
U32_T protect_tick; //电流过载 时间戳
U32_T send_tick; //发送时间戳
}PB_INFO_T;
/*PB 检测电流变化相关变量*/
#define Filter_Coarse_Size 5
#define Filter_Fine_Size 50
typedef struct{
U8_T pb_state; //状态 0x00:未触发0x01:触发0x02:释放
U8_T last_pb_state;
U8_T dead_switch; //功能失效开关 - RCU下发控制时在一定时间内会失效
U8_T fun_enable; //功能使能状态
U8_T strip_relation; //灯带关联
U8_T triggle_strip_bright[PWM_OUT_CH_MAX]; //触发后灯带亮度
U8_T release_strip_bright[PWM_OUT_CH_MAX]; //释放后灯带亮度
U8_T trigger_debounce_cnt; //触发消抖计数
U8_T release_debounce_cnt; //释放消抖计数
U8_T trigger_debounce_num; //触发消抖次数
U8_T release_debounce_num; //释放消抖次数
U16_T strip_gradient_time; //灯带渐变时间,单位ms
U16_T trigger_threshold; //触发阈值 - 单位mW
U16_T release_threshold; //释放阈值 - 单位mW
U16_T coarse_filter_buff[Filter_Coarse_Size+1];
U16_T fine_filter_buff[Filter_Fine_Size+1];
U32_T dead_time; //失效时间
U32_T dead_tick; //失效时间戳
int curr_diff_val; //电流差值
}PB_DETECTION_FILTER_INFO;
extern PB_INFO_T g_PB;
void PB_Init(void);
void PB_Set_SaveCurrent(U8_T val);
U8_T PB_CheckSum(U8_T *buff,U16_T len);
void PB_Send_String_INT(void);
void PB_OVERCURR_PWR_BUS_INT_Processing(void);
void PB_Scan_State_Task(void);
U16_T Get_PB_CURR_VAL(void);
U8_T BLV_PB_Control_Protocol_Processing(U8_T *data,U16_T len);
void PowerBus_FillSendBuff(U8_T resendNum,U8_T *data,U8_T len);
U8_T PowerBUS_GetCommState(void);
void PB_Current_Monitoring_Meas(void);
void Set_PB_CurrMonitoring_Dead(void);
void PB_Task(void);
#endif

79
Source/SYSTEM/inc/pwm.h Normal file
View File

@@ -0,0 +1,79 @@
#ifndef _PWM_H_
#define _PWM_H_
#include "apt32f102.h"
#include "apt32f102_ept.h"
#define PWM_OUT_VAL_MAX 3000
#define PWM_OUT_VAL_MIN 0
#define BRIGHTNESS_MAX 100
#define BRIGHTNESS_MIN 0
#define BRIGHTNESS_UP_LIMIT 100
#define BRIGHTNESS_DOWN_LIMIT 0
typedef enum
{
PWM_OUT_CH1 = 0x00,
PWM_OUT_CH2,
PWM_OUT_CH3,
PWM_OUT_CH4,
PWM_OUT_CH_MAX,
}PWM_CHN_e;
typedef enum{
PWMA_Decreasing = 0, //PWM调节方向 - 递减
PWMA_Ascending, //PWM调节方向 - 递增
PWMA_Nochange, //PWM调节方向 - 不调节
}PWM_ADJUST_ORIENTATION;
typedef struct{
U8_T irqEnable; //PWM控制中断使能状态
U8_T allBrightness; //全局调光
U8_T allBrightnessUpLimit; //全局调光上限百分比
U8_T allBrightnessDownLimit; //全局调光下限百分比
U8_T brightnessCurr[PWM_OUT_CH_MAX]; //当前PWM 百分比亮度
U8_T switchState[PWM_OUT_CH_MAX];
U8_T controlFlag[PWM_OUT_CH_MAX];
U8_T addOrDecFlag[PWM_OUT_CH_MAX];
U16_T allPwmUpLimit; //全局可调上限
U16_T allPwmDownLimit; //全局可调下限
U16_T pwmValCurr[PWM_OUT_CH_MAX]; //当前PWM
U16_T pwmValTarget[PWM_OUT_CH_MAX]; //目标PWM
U16_T gradualTime[PWM_OUT_CH_MAX]; //调节时间 , 单位ms
float pwmStep[PWM_OUT_CH_MAX]; //步进值
float pwmFloatValCurr[PWM_OUT_CH_MAX]; //当前PWM - 浮点类型
}PWM_CONTROL_T;
typedef struct{
U8_T enable[PWM_OUT_CH_MAX]; //自动调节使能状态 0x01:使能0x00:未使能
U8_T adjMode[PWM_OUT_CH_MAX]; //0x00:调节到顶端停止 0x01:循环调节 0x02:停止调节
U8_T adjDir[PWM_OUT_CH_MAX]; //0x00:递减 0x01:递增 0x02:与上次命令相反
float pwmStep[PWM_OUT_CH_MAX]; //PWM步进值
U32_T pwmStepTime[PWM_OUT_CH_MAX]; //步进时间 单位ms
U32_T pwmStepTick[PWM_OUT_CH_MAX]; //步进时间戳 单位ms
}PWM_AUTO_ADJUST_T;
extern PWM_CONTROL_T g_pwm;
extern PWM_AUTO_ADJUST_T g_pwmAutoAdj;
void PWM_Init(void);
void PWM_SetUpLimitVal(U8_T val);
void PWM_SetDownLimitVal(U8_T val);
void Pwm_SetAllBrightness(U8_T val);
void PWM_SetOutDuty(U8_T index,U16_T val);
void PWM_SetCHGradualTime(U8_T index, U16_T val);
void Pwm_SetOnOffState(U8_T index, U8_T state);
void PWM_SetOutBrightness(U8_T index, U8_T brightness);
void PWM_SetAutoAdjust(U8_T index,U8_T mode,U8_T adj,U16_T adj_time);
void PWM_Timer_Enable(void);
void PWM_Timer_Disable(void);
void PWM_Timer_1ms_Task(void);
#endif

75
Source/SYSTEM/inc/uart.h Normal file
View File

@@ -0,0 +1,75 @@
#ifndef _UART_H_
#define _UART_H_
#include "apt32f102.h"
#include "apt32f102_uart.h"
#define Recv_2400_TimeOut 20 //ms
#define Recv_9600_TimeOut 10 //ms
#define Recv_115200_TimeOut 3 //ms
#define USART_BUFFER_NUM 3
#define USART_BUFFER_SIZE 100
#define UART_SEND_BUFFER_NUM 10
#define UART_SEND_BUFFER_SIZE 20
/*调试信息相关定义*/
#ifndef DBG_LOG_EN
#define DBG_LOG_EN 0 //DEBUG LOG 输出总开关
#endif
/*调试信息初始状态*/
#define DBG_OPT_Debug_STATUS 0 //临时调试信息打印开关
#define DBG_OPT_DEVICE_STATUS 0 //设备驱动层打印调试信息打印开关
#define DBG_OPT_SYS_STATUS 0 //系统调试信息打印开关
/*调试信息输出控制位*/
#define DBG_BIT_Debug_STATUS 2
#define DBG_BIT_DEVICE_STATUS 1
#define DBG_BIT_SYS_STATUS 0
#if DBG_LOG_EN
#define DBG_Printf(data,len) UARTTransmit(UART1,data,len)
#else
#define DBG_Printf
#endif
typedef U8_T (*Uart_prt)(U8_T *,U16_T);
typedef enum
{
UART_0,
UART_1,
UART_2,
UART_3,
UART_MAX,
}UART_IDX;
typedef struct{
U8_T RecvBuffer[USART_BUFFER_SIZE];
U8_T DealBuff[USART_BUFFER_SIZE];
U8_T Receiving;
U16_T RecvLen;
U16_T DealLen;
U32_T RecvTimeout;
U32_T RecvIdleTiming;
Uart_prt processing_cf; //处理函数指针
}UART_t;
extern U32_T Dbg_Switch;
void UARTx_Init(UART_IDX uart_id, Uart_prt prt_cf);
void UART1_RecvINT_Processing(char data);
void UART1_TASK(void);
void Dbg_NoTick_Println(int DbgOptBit, const char *cmd, ...);
void Dbg_Print(int DbgOptBit, const char *cmd, ...);
void Dbg_Println(int DbgOptBit, const char *cmd, ...);
void Dbg_Print_Buff(int DbgOptBit, const char *cmd, U8_T *buff,U16_T len);
#endif