⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calibration.c

📁 MSP430FE42X复费率电表DEMO(编译器 IAR 3.42A)
💻 C
字号:
void Calibration(void)
{
  float fvalue;
  unsigned int uiFactTemp;
#ifdef TAMPER_DETECTION
	unsigned int uiTemp;
#endif
  WDTCTL = WDT_ARST_1000;
  switch(DM.ucCalibrationMode)
  {
#ifndef TAMPER_DETECTION
  case 1:
    {
      fvalue = ENERGY_CALC/DM.EspRs.lActEnergy1*SM.Cfg.EspPar.uiGainCorr1+0.5;
      fvalue = fvalue*1.0033;
      SM.Cfg.EspPar.uiGainCorr1 = (int) fvalue;
      DM.ucCalibrationMode = 0;
      DM.ulLastActP = 0;
      DM.ulReActP = 0;

      fvalue = (float)V_CAL*VOL_SHOW_TIMES*POW_2_15/(float)DM.EspRs.uiV1Rms+0.5;
      SM.Cfg.EspPar.uiV1Gain = (int) fvalue;

      DM.EspRs.ulIRms = DM.EspRs.ulIRms>>14;
      fvalue = (float)Ib_CAL*CURRENT_SHOW_TIMES*POW_2_18/DM.EspRs.ulIRms+0.5;
      SM.Cfg.EspPar.ulIGain = (unsigned long) fvalue;

      fvalue = (float)STARTCURRENT_INIT*KICOM_10000*POW_2_16/SM.Cfg.EspPar.ulIGain;
      SM.Cfg.EspPar.ulStartCurrent = (unsigned long) fvalue;
      SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;
    }break;
  case 2:
    {
      //fvalue = (float)((((float)DM.EspRs.lActEnergy1)/ENERGY_CALC_Phi));
      //fvalue = fvalue/2;

      uiFactTemp = (float)POWERFCT;
      
      if(uiFactTemp>0x8000)
        {
          if(uiFactTemp>0xC000)
          {
            uiFactTemp=0xFFFF-uiFactTemp+1;
          }
          else
          {
            uiFactTemp = uiFactTemp-0x8000;
          }
        }
        else
        {
          if(uiFactTemp>0x4000)
          {
            uiFactTemp=0x8000-uiFactTemp;
          }
        }
            
      fvalue = (float)((((float)uiFactTemp)/POW_2_14));

      fvalue = acos(fvalue);
      fvalue = fvalue*180/__PI;
      fvalue = defCalPhi + fvalue;
      fvalue = fvalue * (POW_2_20 / (360ul * defCalFreq));

      SM.Cfg.EspPar.iPhaseCorr1= SM.Cfg.EspPar.iPhaseCorr1 - (int) fvalue;
      _NOP();
      DM.ucCalibrationMode = 0;
      SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;
    }break;
  case 3:
    {
      DM.lI1HImeas = DM.EspRs.lActEnergy1;
      DM.ucCalibrationMode = 0;

    }break;
  case 4:
    {
      DM.lI1LOmeas = DM.EspRs.lActEnergy1;
      fvalue = (nHIcalc - nLOcalc)/(float)((DM.lI1HImeas - DM.lI1LOmeas))*SM.Cfg.EspPar.uiGainCorr1;
      SM.Cfg.EspPar.uiGainCorr1 = (int) fvalue;
      fvalue = ((float)DM.lI1HImeas*nLOcalc - (float)DM.lI1LOmeas*nHIcalc)/((float)DM.lI1HImeas-(float)DM.lI1LOmeas);
      SM.Cfg.EspPar.lPowerOffset1 = (long)fvalue;
      DM.ucCalibrationMode = 0;
      SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;
    }break;
  case 5:
    {
      fvalue = (float)V_CAL*VOL_SHOW_TIMES*POW_2_15/(float)DM.EspRs.uiV1Rms+0.5;
      SM.Cfg.EspPar.uiV1Gain = (int) fvalue;

      DM.EspRs.ulIRms = DM.EspRs.ulIRms>>14;
      fvalue = (float)Ib_CAL*CURRENT_SHOW_TIMES*POW_2_18/DM.EspRs.ulIRms+0.5;
      SM.Cfg.EspPar.ulIGain = (unsigned long) fvalue;

      //fvalue = (float)defSET_STARTCURR*CURRENT_SHOW_TIMES*POW_2_16*POW_2_16/SM.Cfg.EspPar.ulIGain;
      fvalue = (float)STARTCURRENT_INIT*KICOM_10000*POW_2_16/SM.Cfg.EspPar.ulIGain;
      SM.Cfg.EspPar.ulStartCurrent = (unsigned long) fvalue;

      
      uiFactTemp = (float)POWERFCT;
      
      if(uiFactTemp>0x8000)
        {
          if(uiFactTemp>0xC000)
          {
            uiFactTemp=0xFFFF-uiFactTemp+1;
          }
          else
          {
            uiFactTemp = uiFactTemp-0x8000;
          }
        }
        else
        {
          if(uiFactTemp>0x4000)
          {
            uiFactTemp=0x8000-uiFactTemp;
          }
        }
            
      fvalue = (float)((((float)uiFactTemp)/POW_2_14));
      
      
      
      //fvalue = (float)((((float)POWERFCT)/POW_2_14));

      fvalue = acos(fvalue);
      fvalue = fvalue*180/__PI;
      fvalue = defCalPhi + fvalue;
      fvalue = fvalue * (POW_2_19 / (360ul * defCalFreq));

      SM.Cfg.EspPar.iPhaseCorr1= SM.Cfg.EspPar.iPhaseCorr1 - (int) fvalue;
      _NOP();
      DM.ucCalibrationMode = 0;
      SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;
    }break;
#else
  case 1:
    {
      if(DM.EspRs.lActEnergy1<DM.EspRs.lActEnergy2)
      {
        SM.Cfg.EspPar.uiAdaptI1
          =(unsigned long long)SM.Cfg.EspPar.uiAdaptI1*DM.EspRs.lActEnergy2/DM.EspRs.lActEnergy1;
      }
      else
      {

        uiTemp =(unsigned long long)SM.Cfg.EspPar.uiAdaptI2*DM.EspRs.lActEnergy1/DM.EspRs.lActEnergy2;
				if(uiTemp<0x7FFF)
				{
					SM.Cfg.EspPar.uiAdaptI2 = uiTemp;	
				}
				else
				{
					SM.Cfg.EspPar.uiAdaptI1
          =(unsigned long long)SM.Cfg.EspPar.uiAdaptI1*DM.EspRs.lActEnergy2/DM.EspRs.lActEnergy1;	
				}
      }
      DM.ucCalibrationMode = 0;
      SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;
    }break;
  case 2:
    {
      DM.lI1HImeas = DM.EspRs.lActEnergy1;
      DM.lI2HImeas = DM.EspRs.lActEnergy2;
      DM.ucCalibrationMode = 0;
    }break;
  case 3:
    {
      DM.lI1LOmeas = DM.EspRs.lActEnergy1;
      DM.lI2LOmeas = DM.EspRs.lActEnergy2;
      //fvalue = (nHIcalc - nLOcalc)/(float)((DM.lI1HImeas - DM.lI1LOmeas))*SM.Cfg.EspPar.uiGainCorr1;
      //SM.Cfg.EspPar.uiGainCorr1 = (int) fvalue;
      //fvalue = ((float)DM.lI1HImeas*nLOcalc - (float)DM.lI1LOmeas*nHIcalc)/((float)DM.lI1HImeas-(float)DM.lI1LOmeas);
      //SM.Cfg.EspPar.lPowerOffset1 = (long)fvalue;
      fvalue = nHIcalc/DM.lI1HImeas*SM.Cfg.EspPar.uiGainCorr1+0.5;
      SM.Cfg.EspPar.uiGainCorr1 = (int) fvalue; //根据设定的能量校正值和读出的有功电能原值及功率通道的增益修正值得到新的增益修正值

      fvalue = (nHIcalc - nLOcalc)/(float)((DM.lI2HImeas - DM.lI2LOmeas))*SM.Cfg.EspPar.uiGainCorr2;
      SM.Cfg.EspPar.uiGainCorr2 = (int) fvalue;
      fvalue = ((float)DM.lI2HImeas*nLOcalc - (float)DM.lI2LOmeas*nHIcalc)/((float)DM.lI2HImeas-(float)DM.lI2LOmeas);
      SM.Cfg.EspPar.lPowerOffset2 = (long)fvalue;

      DM.ucCalibrationMode = 0;
      SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;

    }break;
  case 4:
    {
      fvalue = (float)V_CAL*VOL_SHOW_TIMES*POW_2_15/(float)DM.EspRs.uiV1Rms+0.5;
      SM.Cfg.EspPar.uiV1Gain = (int) fvalue;

      DM.EspRs.ulIRms = DM.EspRs.ulIRms>>14;
      fvalue = (float)Ib_CAL*CURRENT_SHOW_TIMES*POW_2_18/DM.EspRs.ulIRms+0.5;
      SM.Cfg.EspPar.ulIGain = (unsigned long) fvalue;

      //fvalue = (float)defSET_STARTCURR*CURRENT_SHOW_TIMES*POW_2_16*POW_2_16/SM.Cfg.EspPar.ulIGain;
      fvalue = (float)STARTCURRENT_INIT*KICOM_10000*POW_2_16/SM.Cfg.EspPar.ulIGain;
      SM.Cfg.EspPar.ulStartCurrent = (unsigned long) fvalue;

      //fvalue = (float)((((float)POWERFCT)/POW_2_14));

      //fvalue = acos(fvalue);
      //fvalue = fvalue*180/__PI;
      //fvalue = defCalPhi + fvalue;
      //fvalue = fvalue * (POW_2_19 / (360ul * defCalFreq));

      //SM.Cfg.EspPar.iPhaseCorr1= SM.Cfg.EspPar.iPhaseCorr1 - (int) fvalue;
      fvalue = (float)DM.EspRs.lActEnergy1/ENERGY_CALC;
      fvalue = acos(fvalue);
      fvalue = fvalue*180/__PI;
      fvalue = defCalPhi + fvalue;
      fvalue = fvalue * (POW_2_20 / (360ul * defCalFreq));

      SM.Cfg.EspPar.iPhaseCorr1= SM.Cfg.EspPar.iPhaseCorr1 - (int) fvalue;

      fvalue = (float)DM.EspRs.lActEnergy2/ENERGY_CALC;
      fvalue = acos(fvalue);
      fvalue = fvalue*180/__PI;
      fvalue = defCalPhi + fvalue;
      fvalue = fvalue * (POW_2_20 / (360ul * defCalFreq));

      SM.Cfg.EspPar.iPhaseCorr2= SM.Cfg.EspPar.iPhaseCorr2 - (int) fvalue;

      _NOP();
      DM.ucCalibrationMode = 0;
      SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;
    }break;
		
		
	case 5:
	  {
			fvalue = ENERGY_CALC/DM.EspRs.lActEnergy1*SM.Cfg.EspPar.uiGainCorr1+0.5;
      SM.Cfg.EspPar.uiGainCorr1 = (int) fvalue;
      DM.ucCalibrationMode = 0;
      DM.ulLastActP = 0;
      DM.ulReActP = 0;

      fvalue = (float)V_CAL*VOL_SHOW_TIMES*POW_2_15/(float)DM.EspRs.uiV1Rms+0.5;
      SM.Cfg.EspPar.uiV1Gain = (int) fvalue;

      DM.EspRs.ulIRms = DM.EspRs.ulIRms>>14;
      fvalue = (float)Ib_CAL*CURRENT_SHOW_TIMES*POW_2_18/DM.EspRs.ulIRms+0.5;
      SM.Cfg.EspPar.ulIGain = (unsigned long) fvalue;

      //fvalue = (float)defSET_STARTCURR*CURRENT_SHOW_TIMES*POW_2_16*POW_2_16/SM.Cfg.EspPar.ulIGain;
      fvalue = (float)STARTCURRENT_INIT*KICOM_10000*POW_2_16/SM.Cfg.EspPar.ulIGain;
      SM.Cfg.EspPar.ulStartCurrent = (unsigned long) fvalue;
      SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;	
				
		}break;
  case 6:
	  {
			//fvalue = (float)DM.EspRs.lActEnergy1/ENERGY_CALC;
      //fvalue = (float)((((float)DM.EspRs.lActEnergy1)/ENERGY_CALC));
      
      uiFactTemp = (float)POWERFCT;
      
      if(uiFactTemp>0x8000)
        {
          if(uiFactTemp>0xC000)
          {
            uiFactTemp=0xFFFF-uiFactTemp+1;
          }
          else
          {
            uiFactTemp = uiFactTemp-0x8000;
          }
        }
        else
        {
          if(uiFactTemp>0x4000)
          {
            uiFactTemp=0x8000-uiFactTemp;
          }
        }
            
      fvalue = (float)((((float)uiFactTemp)/POW_2_14));

      
      
      fvalue = acos(fvalue);
      fvalue = fvalue*180/__PI;
      fvalue = defCalPhi + fvalue;
      fvalue = fvalue * (POW_2_20 / (360ul * defCalFreq));

      SM.Cfg.EspPar.iPhaseCorr1= SM.Cfg.EspPar.iPhaseCorr1 - (int) fvalue;
	
      DM.ucCalibrationMode = 0;
      SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;
				
		}break;
  case 7:
	  {
			DM.lI2HImeas = DM.EspRs.lActEnergy2;
      DM.ucCalibrationMode = 0;	
				
		}break;
  case 8:
	  {
			DM.lI2LOmeas = DM.EspRs.lActEnergy2;	
			fvalue = (nHIcalc - nLOcalc)/(float)((DM.lI2HImeas - DM.lI2LOmeas))*SM.Cfg.EspPar.uiGainCorr2;
      SM.Cfg.EspPar.uiGainCorr2 = (int) fvalue;
      fvalue = ((float)DM.lI2HImeas*nLOcalc - (float)DM.lI2LOmeas*nHIcalc)/((float)DM.lI2HImeas-(float)DM.lI2LOmeas);
      SM.Cfg.EspPar.lPowerOffset2 = (long)fvalue;	
			DM.ucCalibrationMode = 0;
      SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;

		}break;
  case 9:
	  {
			fvalue = (float)DM.EspRs.lActEnergy2/ENERGY_CALC;
      fvalue = acos(fvalue);
      fvalue = fvalue*180/__PI;
      fvalue = defCalPhi + fvalue;
      fvalue = fvalue * (POW_2_20 / (360ul * defCalFreq));

      SM.Cfg.EspPar.iPhaseCorr2= SM.Cfg.EspPar.iPhaseCorr2 - (int) fvalue;	
			DM.ucCalibrationMode = 0;
      SystemEventFlag |= SYSTEM_ESPPARAM_FLAG;
				
		}break;

#endif

  }

  //Set_IdleMode();
  //Init_ESP_Parameter();
  //Start_Measurement();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -