Files
RCU_BUS485_PLC_MASTER/Source/SYSTEM/pwm.c
yanghongfeng f25132cbe3 修复开关控制组控的控制异常问题
修改PB开关状态组控处理,解决后32路的开关状态会复用上前32个回路的数据
2026-01-19 15:35:56 +08:00

417 lines
15 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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);
}
}
}
}