Files
RCU_BUS485_PLC_MASTER/Source/SYSTEM/pwm.c

417 lines
15 KiB
C
Raw Normal View History

#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~100ms
*/
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);
}
}
}
}