修复开关控制组控的控制异常问题
修改PB开关状态组控处理,解决后32路的开关状态会复用上前32个回路的数据
This commit is contained in:
159
Source/SYSTEM/eeprom.c
Normal file
159
Source/SYSTEM/eeprom.c
Normal file
@@ -0,0 +1,159 @@
|
||||
#include "includes.h"
|
||||
|
||||
E_PARA_INFO g_eeprom;
|
||||
|
||||
void EEPROM_Init(void){
|
||||
U8_T rev = 0;
|
||||
EnIFCClk; //使能 IFC 时钟
|
||||
IFC->MR |= 0x10002; //高速模式,延迟 2 个周期
|
||||
|
||||
delay_nms(10);
|
||||
|
||||
rev = EEPROM_ReadParaInfo(&g_eeprom);
|
||||
if(rev != 0x00){
|
||||
//读取失败,恢复默认参数
|
||||
EEPROM_Default_ParaInfo(&g_eeprom);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"Para Info Use Default");
|
||||
}
|
||||
|
||||
EEPROM_Validate_ParaInfo(&g_eeprom);
|
||||
}
|
||||
|
||||
|
||||
U8_T EEPROM_ReadParaInfo(E_PARA_INFO *info){
|
||||
U8_T read_info[6];
|
||||
U8_T para_data[EEPROM_DATA_Size_Max];
|
||||
U16_T read_len = 0;
|
||||
|
||||
memset(read_info,0,sizeof(read_info));
|
||||
memset(para_data,0,sizeof(para_data));
|
||||
|
||||
ReadDataArry_U8(EEPROM_ParaInfo_Address,4,read_info);
|
||||
|
||||
if(read_info[0] == EEPROM_SVAE_FLAG){
|
||||
read_len = read_info[2];
|
||||
read_len <<= 8;
|
||||
read_len |= read_info[1];
|
||||
|
||||
if(read_len <= EEPROM_DATA_Size_Max){
|
||||
|
||||
ReadDataArry_U8(EEPROM_ParaInfo_Address+4,read_len,para_data);
|
||||
if(PB_CheckSum(para_data,sizeof(E_PARA_INFO)) == read_info[3]){
|
||||
//校验成功
|
||||
memcpy((uint8_t *)info,para_data,sizeof(E_PARA_INFO));
|
||||
|
||||
return 0x00;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0x01;
|
||||
}
|
||||
|
||||
U8_T EEPROM_WriteParaInfo(E_PARA_INFO *info){
|
||||
U8_T save_data[EEPROM_DATA_Size_Max + 6];
|
||||
U16_T save_len = sizeof(E_PARA_INFO);
|
||||
|
||||
if(save_len >= EEPROM_DATA_Size_Max) save_len = EEPROM_DATA_Size_Max;
|
||||
|
||||
save_data[0] = EEPROM_SVAE_FLAG;
|
||||
save_data[1] = save_len & 0xFF;
|
||||
save_data[2] = (save_len >> 8) & 0xFF;
|
||||
|
||||
memcpy(&save_data[4],(uint8_t *)info,save_len);
|
||||
|
||||
save_data[3] = PB_CheckSum(&save_data[4],save_len);
|
||||
|
||||
save_len+=4;
|
||||
|
||||
Page_ProgramData(EEPROM_ParaInfo_Address,save_len,save_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
U8_T EEPROM_ClearParaInfo(void){
|
||||
U8_T save_data[EEPROM_DATA_Size_Max+10];
|
||||
UINT16 save_len = sizeof(E_PARA_INFO);
|
||||
|
||||
if(save_len >= EEPROM_DATA_Size_Max) save_len = EEPROM_DATA_Size_Max;
|
||||
|
||||
save_len += 4;
|
||||
memset(save_data,0xFF,save_len);
|
||||
|
||||
Page_ProgramData(EEPROM_ParaInfo_Address,save_len,save_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
U8_T EEPROM_Validate_ParaInfo(E_PARA_INFO *info){
|
||||
U8_T i=0;
|
||||
|
||||
//以下为本地参数
|
||||
|
||||
//PowerBus 总线开关 0x01:开启,0x02:关闭
|
||||
if((info->powerbus_enable < 0x01) || (info->powerbus_enable > 0x01) ){
|
||||
info->powerbus_enable = EEPROM_ParaDefault_PowerBusEnable; //默认开启
|
||||
}
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"Para Info powerbus_enable %d",info->powerbus_enable);
|
||||
|
||||
//PowerBus 总线保护电流范围:1~165 单位:0.1A 1V = 5A
|
||||
//因为 BLV_C8_V05 硬件版本目前芯片供电为3.3V,提供给保护阈值电压最高为3.3V,所以保护电流最高为16.5A
|
||||
if((info->save_curr < PB_SaveCurrent_Min) || (info->save_curr > PB_SaveCurrent_Max)){
|
||||
info->save_curr = EEPROM_ParaDefault_SaveCurr; //默认保护电流为10A
|
||||
}
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"Para Info save_curr %d",info->save_curr);
|
||||
|
||||
|
||||
//以下为灯光参数校验
|
||||
|
||||
//全局亮度有效范围:0~100
|
||||
if(info->allBrightness > BRIGHTNESS_MAX){
|
||||
info->allBrightness = BRIGHTNESS_MAX; //全局亮度默认:100
|
||||
}
|
||||
|
||||
//全局亮度可调上限有效范围:0~100
|
||||
if(info->allBrightnessUpLimit > BRIGHTNESS_MAX){
|
||||
info->allBrightnessUpLimit = BRIGHTNESS_MAX; //全局亮度可调上限默认:100
|
||||
}
|
||||
|
||||
//全局亮度可调下限有效范围:0~100
|
||||
if(info->allBrightnessDownLimit > BRIGHTNESS_MAX){
|
||||
info->allBrightnessDownLimit = BRIGHTNESS_MIN; //全局亮度可调下限默认:0
|
||||
}
|
||||
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"Para Info allBrightness %d",info->allBrightness);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"Para Info allBrightnessUpLimit %d",info->allBrightnessUpLimit);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"Para Info allBrightnessDownLimit %d",info->allBrightnessDownLimit);
|
||||
|
||||
for(i=0;i<PWM_OUT_CH_MAX;i++){
|
||||
//回路开关状态范围:0~1
|
||||
if(info->swithcState[i] > 0x01){
|
||||
info->swithcState[i] = 0x01; //回路开关状态默认:0x01
|
||||
}
|
||||
|
||||
//回路亮度:0~100
|
||||
if(info->brightness[i] > BRIGHTNESS_MAX){
|
||||
info->brightness[i] = BRIGHTNESS_MIN; //回路亮度默认:100
|
||||
}
|
||||
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"Para Light Loop%d %d-%d",i,info->swithcState[i],info->brightness[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*恢复默认值*/
|
||||
void EEPROM_Default_ParaInfo(E_PARA_INFO *info){
|
||||
info->powerbus_enable = EEPROM_ParaDefault_PowerBusEnable;
|
||||
info->save_curr = EEPROM_ParaDefault_SaveCurr;
|
||||
info->allBrightness = BRIGHTNESS_MAX; //全局亮度默认:100
|
||||
info->allBrightnessUpLimit = BRIGHTNESS_MAX; //全局亮度可调上限默认:100
|
||||
info->allBrightnessDownLimit = BRIGHTNESS_MIN; //全局亮度可调下限默认:0
|
||||
|
||||
for(U8_T i=0;i<PWM_OUT_CH_MAX;i++){
|
||||
info->swithcState[i] = 0x01; //回路开关状态默认:0x01
|
||||
info->brightness[i] = BRIGHTNESS_MIN; //回路亮度默认:100
|
||||
info->gradialTime[i] = 1000; //回路渐变时间默认:1000
|
||||
}
|
||||
}
|
||||
|
||||
52
Source/SYSTEM/inc/eeprom.h
Normal file
52
Source/SYSTEM/inc/eeprom.h
Normal 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
263
Source/SYSTEM/inc/pb_fun.h
Normal 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
79
Source/SYSTEM/inc/pwm.h
Normal 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
75
Source/SYSTEM/inc/uart.h
Normal 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
|
||||
2196
Source/SYSTEM/pb_fun.c
Normal file
2196
Source/SYSTEM/pb_fun.c
Normal file
File diff suppressed because it is too large
Load Diff
416
Source/SYSTEM/pwm.c
Normal file
416
Source/SYSTEM/pwm.c
Normal file
@@ -0,0 +1,416 @@
|
||||
#include "includes.h"
|
||||
|
||||
PWM_CONTROL_T g_pwm;
|
||||
PWM_AUTO_ADJUST_T g_pwmAutoAdj;
|
||||
|
||||
void PWM_Init(void){
|
||||
U32_T temp_val = 0;
|
||||
memset(&g_pwm,0,sizeof(PWM_CONTROL_T));
|
||||
memset(&g_pwmAutoAdj,0,sizeof(PWM_AUTO_ADJUST_T));
|
||||
|
||||
g_pwm.allBrightness = g_eeprom.allBrightness;
|
||||
g_pwm.switchState[PWM_OUT_CH1] = g_eeprom.swithcState[PWM_OUT_CH1];
|
||||
g_pwm.switchState[PWM_OUT_CH2] = g_eeprom.swithcState[PWM_OUT_CH2];
|
||||
g_pwm.switchState[PWM_OUT_CH3] = g_eeprom.swithcState[PWM_OUT_CH3];
|
||||
g_pwm.switchState[PWM_OUT_CH4] = g_eeprom.swithcState[PWM_OUT_CH4];
|
||||
|
||||
g_pwm.gradualTime[PWM_OUT_CH1] = g_eeprom.gradialTime[PWM_OUT_CH1];
|
||||
g_pwm.gradualTime[PWM_OUT_CH2] = g_eeprom.gradialTime[PWM_OUT_CH2];
|
||||
g_pwm.gradualTime[PWM_OUT_CH3] = g_eeprom.gradialTime[PWM_OUT_CH3];
|
||||
g_pwm.gradualTime[PWM_OUT_CH4] = g_eeprom.gradialTime[PWM_OUT_CH4];
|
||||
|
||||
g_pwm.irqEnable = TRUE;
|
||||
g_pwm.allBrightnessUpLimit = g_eeprom.allBrightnessUpLimit;
|
||||
g_pwm.allBrightnessDownLimit = g_eeprom.allBrightnessDownLimit;
|
||||
temp_val = (U32_T)((PWM_OUT_VAL_MAX * g_pwm.allBrightness * g_pwm.allBrightnessUpLimit))/10000;
|
||||
g_pwm.allPwmUpLimit = temp_val;
|
||||
temp_val = (U32_T)((PWM_OUT_VAL_MAX * g_pwm.allBrightness * g_pwm.allBrightnessDownLimit))/10000;
|
||||
g_pwm.allPwmDownLimit = temp_val;
|
||||
|
||||
PWM_SetOutBrightness(PWM_OUT_CH1,g_eeprom.brightness[PWM_OUT_CH1]);
|
||||
PWM_SetOutBrightness(PWM_OUT_CH2,g_eeprom.brightness[PWM_OUT_CH2]);
|
||||
PWM_SetOutBrightness(PWM_OUT_CH3,g_eeprom.brightness[PWM_OUT_CH3]);
|
||||
PWM_SetOutBrightness(PWM_OUT_CH4,g_eeprom.brightness[PWM_OUT_CH4]);
|
||||
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"allBrightness %d",g_pwm.allBrightness);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"allBrightnessUpLimit %d",g_pwm.allBrightnessUpLimit);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"allBrightnessDownLimit %d",g_pwm.allBrightnessDownLimit);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"allBrightness %d",g_pwm.allBrightness);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"switchState[PWM_OUT_CH1] %d",g_pwm.switchState[PWM_OUT_CH1]);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"switchState[PWM_OUT_CH2] %d",g_pwm.switchState[PWM_OUT_CH2]);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"switchState[PWM_OUT_CH3] %d",g_pwm.switchState[PWM_OUT_CH3]);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"switchState[PWM_OUT_CH4] %d",g_pwm.switchState[PWM_OUT_CH4]);
|
||||
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"gradualTime[PWM_OUT_CH1] %d",g_pwm.gradualTime[PWM_OUT_CH1]);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"gradualTime[PWM_OUT_CH2] %d",g_pwm.gradualTime[PWM_OUT_CH2]);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"gradualTime[PWM_OUT_CH3] %d",g_pwm.gradualTime[PWM_OUT_CH3]);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"gradualTime[PWM_OUT_CH4] %d",g_pwm.gradualTime[PWM_OUT_CH4]);
|
||||
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"brightness[PWM_OUT_CH1] %d",g_eeprom.brightness[PWM_OUT_CH1]);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"brightness[PWM_OUT_CH2] %d",g_eeprom.brightness[PWM_OUT_CH2]);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"brightness[PWM_OUT_CH3] %d",g_eeprom.brightness[PWM_OUT_CH3]);
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS,"brightness[PWM_OUT_CH4] %d",g_eeprom.brightness[PWM_OUT_CH4]);
|
||||
|
||||
//设置指定亮度
|
||||
// g_pwm.pwmValCurr[PWM_OUT_CH1] = 0;
|
||||
// g_pwm.pwmValCurr[PWM_OUT_CH2] = 550;
|
||||
// g_pwm.pwmValCurr[PWM_OUT_CH3] = 600;
|
||||
// g_pwm.pwmValCurr[PWM_OUT_CH4] = 650;
|
||||
//
|
||||
// PWM_SetOutDuty(PWM_OUT_CH1,g_pwm.pwmValCurr[PWM_OUT_CH1]);
|
||||
// PWM_SetOutDuty(PWM_OUT_CH2,g_pwm.pwmValCurr[PWM_OUT_CH2]);
|
||||
// PWM_SetOutDuty(PWM_OUT_CH3,g_pwm.pwmValCurr[PWM_OUT_CH3]);
|
||||
// PWM_SetOutDuty(PWM_OUT_CH4,g_pwm.pwmValCurr[PWM_OUT_CH4]);
|
||||
|
||||
//循环调光测试
|
||||
// PWM_SetAutoAdjust(PWM_OUT_CH1,0x01,0x01,2000);
|
||||
// PWM_SetAutoAdjust(PWM_OUT_CH2,0x01,0x01,4000);
|
||||
// PWM_SetAutoAdjust(PWM_OUT_CH3,0x01,0x01,8000);
|
||||
// PWM_SetAutoAdjust(PWM_OUT_CH4,0x01,0x01,12000);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn PWM_SetOutDuty
|
||||
* @brief 设置PWM通道输出亮度
|
||||
* @para
|
||||
* index: 设置通道 0~3
|
||||
* val: 输出值 PWM_OUT_VAL_MIN ~ PWM_OUT_VAL_MAX
|
||||
*/
|
||||
void PWM_SetOutDuty(U8_T index,U16_T val){
|
||||
U16_T temp_val = 0;
|
||||
if(val > PWM_OUT_VAL_MAX) return;
|
||||
|
||||
//temp_val = PWM_OUT_VAL_MAX - val;
|
||||
temp_val = val;
|
||||
switch(index){
|
||||
case PWM_OUT_CH1:
|
||||
EPT0->CMPA=temp_val;
|
||||
break;
|
||||
case PWM_OUT_CH2:
|
||||
EPT0->CMPB=temp_val;
|
||||
break;
|
||||
case PWM_OUT_CH3:
|
||||
EPT0->CMPC=temp_val;
|
||||
break;
|
||||
case PWM_OUT_CH4:
|
||||
EPT0->CMPD=temp_val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn PWM_SetCHGradualTime
|
||||
* @brief 设置PWM通道渐变时间
|
||||
* @para
|
||||
* index: 设置通道 0~3
|
||||
* val: 渐变时间 单位:ms
|
||||
*/
|
||||
void PWM_SetCHGradualTime(U8_T index, U16_T val){
|
||||
if(index >= PWM_OUT_CH_MAX) return ;
|
||||
|
||||
g_pwm.gradualTime[index] = val;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn PWM_SetDownLimitVal
|
||||
* @brief 设置PWM调光上限
|
||||
* @para
|
||||
* val: 上限百分比 0~100
|
||||
*/
|
||||
void PWM_SetUpLimitVal(U8_T val)
|
||||
{
|
||||
U32_T temp_val = 0;
|
||||
|
||||
g_pwm.allBrightnessUpLimit = val;
|
||||
temp_val = (U32_T)((PWM_OUT_VAL_MAX * g_pwm.allBrightness * g_pwm.allBrightnessUpLimit))/10000;
|
||||
g_pwm.allPwmUpLimit = temp_val;
|
||||
|
||||
PWM_SetOutBrightness(PWM_OUT_CH1, g_pwm.brightnessCurr[PWM_OUT_CH1]);
|
||||
PWM_SetOutBrightness(PWM_OUT_CH2, g_pwm.brightnessCurr[PWM_OUT_CH2]);
|
||||
PWM_SetOutBrightness(PWM_OUT_CH3, g_pwm.brightnessCurr[PWM_OUT_CH3]);
|
||||
PWM_SetOutBrightness(PWM_OUT_CH4, g_pwm.brightnessCurr[PWM_OUT_CH4]);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn PWM_SetDownLimitVal
|
||||
* @brief 设置PWM调光下限
|
||||
* @para
|
||||
* val: 下限百分比 0~100
|
||||
*/
|
||||
void PWM_SetDownLimitVal(U8_T val)
|
||||
{
|
||||
U32_T temp_val = 0;
|
||||
|
||||
g_pwm.allBrightnessDownLimit = val;
|
||||
temp_val = (U32_T)((PWM_OUT_VAL_MAX * g_pwm.allBrightness * g_pwm.allBrightnessDownLimit))/10000;
|
||||
g_pwm.allPwmDownLimit = temp_val;
|
||||
|
||||
PWM_SetOutBrightness(PWM_OUT_CH1, g_pwm.brightnessCurr[PWM_OUT_CH1]);
|
||||
PWM_SetOutBrightness(PWM_OUT_CH2, g_pwm.brightnessCurr[PWM_OUT_CH2]);
|
||||
PWM_SetOutBrightness(PWM_OUT_CH3, g_pwm.brightnessCurr[PWM_OUT_CH3]);
|
||||
PWM_SetOutBrightness(PWM_OUT_CH4, g_pwm.brightnessCurr[PWM_OUT_CH4]);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn Pwm_SetOnOffState
|
||||
* @brief 设置PWM通道开关状态
|
||||
* @para
|
||||
* index: 设置通道 0~3
|
||||
* state: 设置开关状态 0x00:关;0x01:开
|
||||
*/
|
||||
void Pwm_SetOnOffState(U8_T index, U8_T state)
|
||||
{
|
||||
if(index >= PWM_OUT_CH_MAX) return ;
|
||||
|
||||
g_pwm.switchState[index] = state;
|
||||
PWM_SetOutBrightness(index, g_pwm.brightnessCurr[index]);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn Pwm_SetAllBrightness
|
||||
* @brief 设置PWM全局亮度
|
||||
* @para
|
||||
* val: 设置全局亮度 0~100
|
||||
*/
|
||||
void Pwm_SetAllBrightness(U8_T val)
|
||||
{
|
||||
g_pwm.allBrightness = val;
|
||||
PWM_SetOutBrightness(PWM_OUT_CH1, g_pwm.brightnessCurr[PWM_OUT_CH1]);
|
||||
PWM_SetOutBrightness(PWM_OUT_CH2, g_pwm.brightnessCurr[PWM_OUT_CH2]);
|
||||
PWM_SetOutBrightness(PWM_OUT_CH3, g_pwm.brightnessCurr[PWM_OUT_CH3]);
|
||||
PWM_SetOutBrightness(PWM_OUT_CH4, g_pwm.brightnessCurr[PWM_OUT_CH4]);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn PWM_SetOutBrightness
|
||||
* @brief 设置PWM 通道输出亮度
|
||||
* @para
|
||||
* index: 设置通道 0~3
|
||||
* brightness:设置亮度 0~100
|
||||
*/
|
||||
void PWM_SetOutBrightness(U8_T index, U8_T brightness){
|
||||
U32_T tempPwmVal = 0;
|
||||
|
||||
if(brightness != 0x00){
|
||||
if(brightness >= g_pwm.allBrightnessUpLimit) {
|
||||
brightness = g_pwm.allBrightnessUpLimit;
|
||||
}else if(brightness <= g_pwm.allBrightnessDownLimit){
|
||||
brightness = g_pwm.allBrightnessDownLimit;
|
||||
}
|
||||
}
|
||||
|
||||
g_pwm.irqEnable = FALSE;
|
||||
|
||||
g_pwmAutoAdj.enable[index] = FALSE;
|
||||
g_pwm.controlFlag[index] = TRUE;
|
||||
g_pwm.brightnessCurr[index] = brightness;
|
||||
//当前PWM值 = PWM调节最大值 * 全局亮度百分比 * 当前亮度百分比 * 开关状态
|
||||
tempPwmVal = ((PWM_OUT_VAL_MAX * g_pwm.allBrightness * g_pwm.brightnessCurr[index]) * g_pwm.switchState[index])/10000;
|
||||
g_pwm.pwmValTarget[index] = tempPwmVal;
|
||||
|
||||
if(g_pwm.pwmValTarget[index] == g_pwm.pwmValCurr[index]){
|
||||
g_pwm.addOrDecFlag[index] = PWMA_Nochange;
|
||||
}else if(g_pwm.pwmValTarget[index] > g_pwm.pwmValCurr[index]){
|
||||
g_pwm.addOrDecFlag[index] = PWMA_Ascending;
|
||||
|
||||
if(g_pwm.gradualTime[index] != 0x00){
|
||||
tempPwmVal = g_pwm.pwmValTarget[index] - g_pwm.pwmValCurr[index];
|
||||
|
||||
g_pwm.pwmStep[index] = ((float)tempPwmVal*1.0 / g_pwm.gradualTime[index]);
|
||||
|
||||
}else{
|
||||
g_pwm.pwmStep[index] = g_pwm.pwmValTarget[index] - g_pwm.pwmValCurr[index];
|
||||
}
|
||||
|
||||
}else if(g_pwm.pwmValTarget[index] < g_pwm.pwmValCurr[index]){
|
||||
g_pwm.addOrDecFlag[index] = PWMA_Decreasing;
|
||||
|
||||
if(g_pwm.gradualTime[index] != 0x00){
|
||||
|
||||
tempPwmVal = g_pwm.pwmValCurr[index] - g_pwm.pwmValTarget[index];
|
||||
|
||||
g_pwm.pwmStep[index] = ((float)tempPwmVal*1.0 / g_pwm.gradualTime[index]);
|
||||
|
||||
}else {
|
||||
g_pwm.pwmStep[index] = g_pwm.pwmValCurr[index] - g_pwm.pwmValTarget[index];
|
||||
}
|
||||
}
|
||||
//Dbg_Println(DBG_BIT_SYS_STATUS,"PWM%d Step - %f",index,g_pwm.pwmStep[index]);
|
||||
|
||||
g_pwm.irqEnable = TRUE;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* @fn PWM_SetAutoAdjust
|
||||
* @brief 设置PWM自动调光
|
||||
* @para
|
||||
* index: 设置通道 0~3
|
||||
* mode: 自动调光模式 0x00:调节到顶端停止 0x01:循环调节 0x02:停止调节
|
||||
* adj: 调节方向 0x00:递减 0x01:递增 0x02:与上次命令相反
|
||||
* adj_time:调节时间 亮度0~100的调节时间,单位:ms
|
||||
*/
|
||||
void PWM_SetAutoAdjust(U8_T index,U8_T mode,U8_T adj,U16_T adj_time){
|
||||
g_pwm.irqEnable = FALSE;
|
||||
g_pwmAutoAdj.enable[index] = TRUE;
|
||||
|
||||
if(mode == 0x02){
|
||||
g_pwmAutoAdj.enable[index] = FALSE; //停止自动调节
|
||||
|
||||
g_pwm.brightnessCurr[index] = (g_pwm.pwmValCurr[index] * 100) / PWM_OUT_VAL_MAX; //同步一下当前亮度
|
||||
|
||||
if(g_pwm.switchState[index] == 0x00){
|
||||
//如果当前回路状态为关,当前输出PWM也应为0
|
||||
g_pwm.pwmValCurr[index] = 0;
|
||||
g_pwm.pwmFloatValCurr[index] = 0;
|
||||
}
|
||||
}else{
|
||||
g_pwmAutoAdj.adjMode[index] = mode;
|
||||
}
|
||||
|
||||
if(adj == 0x02){
|
||||
if(g_pwmAutoAdj.adjDir[index] == 0x01){
|
||||
g_pwmAutoAdj.adjDir[index] = 0x00;
|
||||
}else{
|
||||
g_pwmAutoAdj.adjDir[index] = 0x01;
|
||||
}
|
||||
}else if(adj < 0x02){
|
||||
g_pwmAutoAdj.adjDir[index] = adj;
|
||||
}else{
|
||||
g_pwmAutoAdj.adjDir[index] = 0x00;
|
||||
}
|
||||
|
||||
if(adj_time != 0x00){
|
||||
g_pwmAutoAdj.pwmStep[index] = (float)(PWM_OUT_VAL_MAX*1.0 / adj_time);
|
||||
}else{
|
||||
//循环调光时间最短为100ms
|
||||
g_pwmAutoAdj.pwmStep[index] = (float)(PWM_OUT_VAL_MAX*1.0 / 100);
|
||||
}
|
||||
|
||||
//Dbg_Println(DBG_BIT_SYS_STATUS,"Adjust PWM%d Step - %f",index,g_pwmAutoAdj.pwmStep[index]);
|
||||
g_pwm.irqEnable = TRUE;
|
||||
}
|
||||
|
||||
void PWM_Timer_Enable(void){
|
||||
g_pwm.irqEnable = TRUE;
|
||||
}
|
||||
|
||||
void PWM_Timer_Disable(void){
|
||||
g_pwm.irqEnable = FALSE;
|
||||
}
|
||||
|
||||
void PWM_Timer_1ms_Task(void){
|
||||
U8_T index = 0;
|
||||
float temp_float_val = 0;
|
||||
|
||||
if(g_pwm.irqEnable == TRUE){
|
||||
for(index = 0;index < PWM_OUT_CH_MAX; index++){
|
||||
if(g_pwmAutoAdj.enable[index] == FALSE){
|
||||
|
||||
//调节至指定亮度
|
||||
if(g_pwm.controlFlag[index] == TRUE){
|
||||
//当前PWM输出通道,需要进行调节
|
||||
if(g_pwm.gradualTime[index] != 0x00){
|
||||
if(g_pwm.addOrDecFlag[index] == PWMA_Ascending){
|
||||
|
||||
//PWM递增 - 防止溢出
|
||||
temp_float_val = g_pwm.pwmFloatValCurr[index] + g_pwm.pwmStep[index];
|
||||
if(temp_float_val <= PWM_OUT_VAL_MAX){
|
||||
g_pwm.pwmFloatValCurr[index] = temp_float_val;
|
||||
}else{
|
||||
g_pwm.pwmFloatValCurr[index] = PWM_OUT_VAL_MAX;
|
||||
}
|
||||
|
||||
g_pwm.pwmValCurr[index] = (U16_T)g_pwm.pwmFloatValCurr[index];
|
||||
//调节至目标值,便停止调节
|
||||
if(g_pwm.pwmValCurr[index] >= g_pwm.pwmValTarget[index]){
|
||||
g_pwm.pwmValCurr[index] = g_pwm.pwmValTarget[index];
|
||||
g_pwm.pwmFloatValCurr[index] = g_pwm.pwmValCurr[index];
|
||||
g_pwm.controlFlag[index] = FALSE;
|
||||
}
|
||||
|
||||
}else if(g_pwm.addOrDecFlag[index] == PWMA_Decreasing){
|
||||
|
||||
//PWM递减 - 防止溢出
|
||||
if(g_pwm.pwmFloatValCurr[index] >= g_pwm.pwmStep[index]){
|
||||
g_pwm.pwmFloatValCurr[index] -= g_pwm.pwmStep[index];
|
||||
}else{
|
||||
g_pwm.pwmFloatValCurr[index] = 0x00;
|
||||
}
|
||||
|
||||
g_pwm.pwmValCurr[index] = (U16_T)g_pwm.pwmFloatValCurr[index];
|
||||
//调节至目标值,便停止调节
|
||||
if(g_pwm.pwmValCurr[index] <= g_pwm.pwmValTarget[index]){
|
||||
g_pwm.pwmValCurr[index] = g_pwm.pwmValTarget[index];
|
||||
g_pwm.pwmFloatValCurr[index] = g_pwm.pwmValCurr[index];
|
||||
g_pwm.controlFlag[index] = FALSE;
|
||||
}
|
||||
}else{
|
||||
g_pwm.controlFlag[index] = FALSE;
|
||||
//Dbg_Println(DBG_BIT_Debug_STATUS,"controlFlag 3 %d ",index);
|
||||
}
|
||||
}else {
|
||||
//渐变时间为0,直接设置当前通道的PWM值
|
||||
g_pwm.pwmValCurr[index] = g_pwm.pwmValTarget[index];
|
||||
g_pwm.pwmFloatValCurr[index] = g_pwm.pwmValCurr[index];
|
||||
g_pwm.controlFlag[index] = FALSE;
|
||||
}
|
||||
|
||||
//Dbg_Println(DBG_BIT_SYS_STATUS,"PWM%d %d %f %f",index,g_pwm.pwmValCurr[index],g_pwm.pwmStep[index],g_pwm.pwmFloatValCurr[index]);
|
||||
//设置通道的PWM输出的值
|
||||
PWM_SetOutDuty(index,g_pwm.pwmValCurr[index]);
|
||||
}
|
||||
}else {
|
||||
|
||||
//自动调光 - 在设置的全局亮度上下限中进行调光
|
||||
if(g_pwmAutoAdj.adjDir[index] == 0x00){
|
||||
//调节方向 - 递减
|
||||
if((g_pwm.pwmFloatValCurr[index] >= g_pwmAutoAdj.pwmStep[index]) && (g_pwm.pwmFloatValCurr[index] >= (float)g_pwm.allPwmDownLimit) ){
|
||||
g_pwm.pwmFloatValCurr[index] -= g_pwmAutoAdj.pwmStep[index];
|
||||
}else{
|
||||
g_pwm.pwmFloatValCurr[index] = (float)g_pwm.allPwmDownLimit;
|
||||
|
||||
if(g_pwmAutoAdj.adjMode[index] == 0x01){
|
||||
//循环调节
|
||||
g_pwmAutoAdj.adjDir[index] = 0x01;
|
||||
}else {
|
||||
g_pwmAutoAdj.enable[index] = FALSE; //自动调节完毕
|
||||
g_pwm.brightnessCurr[index] = g_pwm.allPwmDownLimit; //同步一下当前亮度
|
||||
}
|
||||
}
|
||||
}else if(g_pwmAutoAdj.adjDir[index] == 0x01){
|
||||
temp_float_val = g_pwm.pwmFloatValCurr[index] + g_pwmAutoAdj.pwmStep[index];
|
||||
|
||||
if( (temp_float_val <= PWM_OUT_VAL_MAX) && (g_pwm.pwmFloatValCurr[index] <= (float)g_pwm.allPwmUpLimit) ){
|
||||
g_pwm.pwmFloatValCurr[index] = temp_float_val;
|
||||
}else{
|
||||
g_pwm.pwmFloatValCurr[index] = (float)g_pwm.allPwmUpLimit;
|
||||
if(g_pwmAutoAdj.adjMode[index] == 0x01){
|
||||
//循环调节
|
||||
g_pwmAutoAdj.adjDir[index] = 0x00;
|
||||
}else {
|
||||
g_pwmAutoAdj.enable[index] = FALSE; //自动调节完毕
|
||||
g_pwm.brightnessCurr[index] = g_pwm.allPwmUpLimit; //同步一下当前亮度
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_pwm.pwmValCurr[index] = (U16_T)g_pwm.pwmFloatValCurr[index];
|
||||
|
||||
//设置通道的PWM输出的值
|
||||
if(g_pwm.switchState[index] != 0x00){
|
||||
|
||||
PWM_SetOutDuty(index,g_pwm.pwmValCurr[index]);
|
||||
}else{
|
||||
/*在回路状态为关的情况下,不进行输出控制*/
|
||||
|
||||
}
|
||||
|
||||
//Dbg_Println(DBG_BIT_SYS_STATUS,"PWM%d Adjust %d %f %f %d %d",index,g_pwm.pwmValCurr[index],g_pwm.pwmFloatValCurr[index],g_pwmAutoAdj.pwmStep[index],g_pwm.allPwmUpLimit,g_pwm.allPwmDownLimit);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
196
Source/SYSTEM/uart.c
Normal file
196
Source/SYSTEM/uart.c
Normal file
@@ -0,0 +1,196 @@
|
||||
#include "includes.h"
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
/**
|
||||
* BLV_C8_PB 串口使用情况
|
||||
* UART1 用与RCU进行双向通讯 115200 -> 对应设置 416
|
||||
* UART0 用于PB数据发送,没有接收 9600 -> 对应设置 5000
|
||||
* */
|
||||
|
||||
UART_t g_uart; //目前该项目只使用串口1 进行双向通讯
|
||||
|
||||
void UARTx_Init(UART_IDX uart_id, Uart_prt prt_cf) {
|
||||
switch(uart_id){
|
||||
case UART_0:
|
||||
UART0_DeInit(); //clear all UART Register
|
||||
UART_IO_Init(IO_UART0,0); //use PA0.1->RXD0, PA0.0->TXD0
|
||||
|
||||
UARTInitRxTxIntEn(UART0,10000,UART_PAR_NONE); //baudrate=sysclock 48M/1000=4800,tx rx int enabled
|
||||
UART0_Int_Enable();
|
||||
break;
|
||||
case UART_1:
|
||||
UART1_DeInit(); //clear all UART Register
|
||||
UART_IO_Init(IO_UART1,0); //use PA0.13->RXD1, PB0.0->TXD1
|
||||
|
||||
UARTInitRxTxIntEn(UART1,416,UART_PAR_NONE); //baudrate=sysclock 48M/416=115200 tx rx int enabled
|
||||
UART1_Int_Enable();
|
||||
|
||||
memset(&g_uart,0,sizeof(UART_t));
|
||||
|
||||
g_uart.RecvTimeout = Recv_115200_TimeOut;
|
||||
g_uart.processing_cf = prt_cf;
|
||||
|
||||
break;
|
||||
case UART_2:
|
||||
UART2_DeInit(); //clear all UART Register
|
||||
UART_IO_Init(IO_UART2,1); //use PA0.13->RXD1, PB0.0->TXD1
|
||||
|
||||
UARTInitRxTxIntEn(UART2,98,UART_PAR_NONE); //baudrate=sysclock 48M/416=115200 tx rx int enabled
|
||||
//UART1_Int_Enable();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* Function Name : UART1_RecvINT_Processing
|
||||
* Description : 串口1 接收中断处理函数 - 接收中断调用
|
||||
*******************************************************************************/
|
||||
void UART1_RecvINT_Processing(char data){
|
||||
if((g_uart.RecvLen + 1) >= USART_BUFFER_SIZE) g_uart.RecvLen = 0;
|
||||
g_uart.RecvBuffer[g_uart.RecvLen++] = (U8_T)data;
|
||||
|
||||
g_uart.RecvIdleTiming = SysTick_1ms;
|
||||
g_uart.Receiving = 0x01;
|
||||
}
|
||||
|
||||
|
||||
void UART1_TASK(void){
|
||||
U8_T rev = 0;
|
||||
if(g_uart.Receiving == 0x01){
|
||||
|
||||
if(SysTick_1ms - g_uart.RecvIdleTiming > Recv_115200_TimeOut){
|
||||
g_uart.RecvIdleTiming = SysTick_1ms;
|
||||
|
||||
memcpy(g_uart.DealBuff,g_uart.RecvBuffer,g_uart.RecvLen);
|
||||
g_uart.DealLen = g_uart.RecvLen;
|
||||
g_uart.RecvLen = 0;
|
||||
g_uart.Receiving = 0;
|
||||
|
||||
Dbg_Println(DBG_BIT_SYS_STATUS, "UART recv Len %d", g_uart.DealLen);
|
||||
Dbg_Print_Buff(DBG_BIT_SYS_STATUS,"UART buff",g_uart.DealBuff,g_uart.DealLen);
|
||||
|
||||
if(g_uart.processing_cf != NULL){
|
||||
rev = g_uart.processing_cf(g_uart.DealBuff,g_uart.DealLen);
|
||||
}
|
||||
|
||||
if(rev == 0x01){
|
||||
//Dbg_Print_Buff(DBG_BIT_Debug_STATUS,"error buff ",g_uart.DealBuff,g_uart.DealLen);
|
||||
}
|
||||
|
||||
memset(g_uart.DealBuff,0,USART_BUFFER_SIZE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*调试信息输出接口*/
|
||||
U32_T Dbg_Switch = (DBG_OPT_Debug_STATUS << DBG_BIT_Debug_STATUS)
|
||||
+ (DBG_OPT_DEVICE_STATUS << DBG_BIT_DEVICE_STATUS)
|
||||
+ (DBG_OPT_SYS_STATUS << DBG_BIT_SYS_STATUS);
|
||||
|
||||
#if DBG_LOG_EN
|
||||
|
||||
char Dbg_Buffer[256] = {0};
|
||||
U32_T SysTick_Now = 0, SysTick_Last = 0, SysTick_Diff = 0;
|
||||
|
||||
#endif
|
||||
|
||||
void Dbg_NoTick_Println(int DbgOptBit, const char *cmd, ...){
|
||||
#if DBG_LOG_EN
|
||||
U16_T str_offset = 0;
|
||||
|
||||
if (Dbg_Switch & (1 << DbgOptBit)) {
|
||||
|
||||
va_list args; //定义一个va_list类型的变量,用来储存单个参数
|
||||
va_start(args, cmd); //使args指向可变参数的第一个参数
|
||||
str_offset = vsnprintf(Dbg_Buffer, sizeof(Dbg_Buffer) ,cmd, args); //必须用vprintf等带V的
|
||||
va_end(args); //结束可变参数的获取
|
||||
|
||||
DBG_Printf(Dbg_Buffer,str_offset);
|
||||
|
||||
DBG_Printf("\r\n",2);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void Dbg_Print(int DbgOptBit, const char *cmd, ...){
|
||||
|
||||
#if DBG_LOG_EN
|
||||
U16_T str_offset = 0;
|
||||
|
||||
if (Dbg_Switch & (1 << DbgOptBit)) {
|
||||
SysTick_Now = SysTick_1ms;
|
||||
SysTick_Diff = SysTick_Now - SysTick_Last; //上一次打印时间差
|
||||
SysTick_Last = SysTick_Now;
|
||||
str_offset = snprintf(Dbg_Buffer, sizeof(Dbg_Buffer),"%8d [%6d]: ", SysTick_Now, SysTick_Diff);
|
||||
DBG_Printf(Dbg_Buffer,str_offset);
|
||||
|
||||
va_list args; //定义一个va_list类型的变量,用来储存单个参数
|
||||
va_start(args, cmd); //使args指向可变参数的第一个参数
|
||||
str_offset = vsnprintf(Dbg_Buffer, sizeof(Dbg_Buffer) ,cmd, args); //必须用vprintf等带V的
|
||||
va_end(args); //结束可变参数的获取
|
||||
|
||||
DBG_Printf(Dbg_Buffer,str_offset);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void Dbg_Println(int DbgOptBit, const char *cmd, ...){
|
||||
|
||||
#if DBG_LOG_EN
|
||||
U16_T str_offset = 0;
|
||||
|
||||
if (Dbg_Switch & (1 << DbgOptBit)) {
|
||||
SysTick_Now = SysTick_1ms;
|
||||
SysTick_Diff = SysTick_Now - SysTick_Last; //上一次打印时间差
|
||||
SysTick_Last = SysTick_Now;
|
||||
str_offset = snprintf(Dbg_Buffer, sizeof(Dbg_Buffer) , "%8ld [%6ld]: ", SysTick_Now, SysTick_Diff);
|
||||
DBG_Printf(Dbg_Buffer,str_offset);
|
||||
|
||||
va_list args; //定义一个va_list类型的变量,用来储存单个参数
|
||||
va_start(args, cmd); //使args指向可变参数的第一个参数
|
||||
str_offset = vsnprintf(Dbg_Buffer, sizeof(Dbg_Buffer) ,cmd, args); //必须用vprintf等带V的
|
||||
va_end(args); //结束可变参数的获取
|
||||
|
||||
DBG_Printf(Dbg_Buffer,str_offset);
|
||||
|
||||
DBG_Printf("\r\n",2);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void Dbg_Print_Buff(int DbgOptBit, const char *cmd, U8_T *buff,U16_T len){
|
||||
#if DBG_LOG_EN
|
||||
U16_T str_offset = 0;
|
||||
|
||||
if (Dbg_Switch & (1 << DbgOptBit)) {
|
||||
SysTick_Now = SysTick_1ms;
|
||||
SysTick_Diff = SysTick_Now - SysTick_Last; //上一次打印时间差
|
||||
SysTick_Last = SysTick_Now;
|
||||
str_offset = snprintf(Dbg_Buffer, sizeof(Dbg_Buffer) , "%8ld [%6ld]: %s", SysTick_Now, SysTick_Diff,cmd);
|
||||
DBG_Printf(Dbg_Buffer,str_offset);
|
||||
|
||||
for (uint32_t i = 0; i < len; i++) {
|
||||
str_offset = snprintf(Dbg_Buffer, sizeof(Dbg_Buffer) , "%02X ", buff[i]);
|
||||
DBG_Printf(Dbg_Buffer,str_offset);
|
||||
}
|
||||
|
||||
DBG_Printf("\r\n",2);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user