/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2023 Kicad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
// Based on IEC60664-1 : 2020-05
#ifndef IEC_60664_H
#define IEC_60664_H
#include
#include
class IEC60664
{
public:
IEC60664(){};
~IEC60664(){};
enum class POLLUTION_DEGREE
{
PD1 = 1,
PD2,
PD3,
PD4
};
enum class OV_CATEGORY
{
OV_I = 1,
OV_II,
OV_III,
OV_IV
};
enum class MATERIAL_GROUP
{
MG_I = 1,
MG_II,
MG_IIIa,
MG_IIIb,
NOT_INSULATING
};
enum class INSULATION_TYPE
{
FUNCTIONAL = 1,
BASIC,
REINFORCED
};
enum class FIELD
{
INHOMOGENEOUS = 1,
HOMOGENEOUS
};
enum class WAVEFORM
{
AC_50_OR_60HZ = 1,
IMPULSE_1_2_50
};
void SetAltitude( const double aAltitude ) { m_altitude = aAltitude; };
void SetPollutionDegree( const POLLUTION_DEGREE aPD ) { m_pollutionDegree = aPD; };
void SetPCBMaterial( const bool aPCB ) { m_pcbMaterial = aPCB; };
void SetMaterialGroup( const MATERIAL_GROUP aMG ) { m_materialGroup = aMG; };
void SetFrequency( const double aF ) { m_frequency = aF; };
void SetInsulationType( const INSULATION_TYPE aIns ) { m_insulationType = aIns; };
void SetOvervoltageCategory( const OV_CATEGORY aOV ) { m_overvoltageCat = aOV; };
void SetField( const FIELD aField ) { m_field = aField; };
void SetRatedVoltage( const double aV ) { m_ratedVoltage = aV; };
void SetRMSVoltage( const double aV ) { m_RMSvoltage = aV; };
void SetPeakVoltage( const double aV ) { m_peakVoltage = aV; };
void SetTransientVoltage( const double aV ) { m_transientVoltage = aV; };
bool Compute();
double GetMinGrooveWidth() { return m_minGrooveWidth; };
double GetClearanceDistance() { return m_clearance; };
double GetCreepageDistance() { return m_creepage; };
double GetRatedImpulseWithstandVoltage();
private:
double m_ratedVoltage = 100e3;
double m_frequency = 50;
bool m_coated = false;
bool m_pcbMaterial = false;
double m_RMSvoltage = 100e3;
double m_peakVoltage = 100e3;
double m_transientVoltage = 100e3;
double m_altitude = 100e3;
double m_clearance = -1;
double m_creepage = -1;
double m_minGrooveWidth = -1;
FIELD m_field = FIELD::INHOMOGENEOUS;
OV_CATEGORY m_overvoltageCat = OV_CATEGORY::OV_IV;
MATERIAL_GROUP m_materialGroup = MATERIAL_GROUP::NOT_INSULATING;
POLLUTION_DEGREE m_pollutionDegree = POLLUTION_DEGREE::PD3;
INSULATION_TYPE m_insulationType = INSULATION_TYPE::REINFORCED;
double GetMinGrooveWidth( const POLLUTION_DEGREE aPD, const double aDistIso = 100 );
double GetClearanceAltitudeCorrectionFactor( const double aAltitude );
double GetClearanceForRMSVoltage( const double aVRMS,
const FIELD aField = FIELD::INHOMOGENEOUS );
MATERIAL_GROUP GetMaterialGroupFromCTI( const double aCTI );
double GetClearanceToWithstandTransientVoltage( const double aVoltage,
const POLLUTION_DEGREE aPD,
const FIELD aField );
double GetClearanceToWithstandPeaks( const double aVoltage, const FIELD aField );
double GetBasicCreepageDistance( const double aVoltage, const POLLUTION_DEGREE aPD,
const MATERIAL_GROUP aMG );
double ComputeClearanceDistance( const POLLUTION_DEGREE aPD, const FIELD aField,
const double aAltitude );
double ComputeCreepageDistance( const POLLUTION_DEGREE aPD, const MATERIAL_GROUP aMG );
};
#endif