📄 irmsvrmsdlg.cpp
字号:
// IrmsVrmsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Calibration.h"
#include "IrmsVrmsDlg.h"
#include "calcomp.h"
#include "interface.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CIrmsVrmsDlg property page
IMPLEMENT_DYNCREATE(CIrmsVrmsDlg, CPropertyPage)
CIrmsVrmsDlg::CIrmsVrmsDlg() : CPropertyPage(CIrmsVrmsDlg::IDD)
{
//{{AFX_DATA_INIT(CIrmsVrmsDlg)
m_nSampleN = 1;
m_nxIRMS1 = 0;
m_nxIRMS2 = 0;
m_nxIRMS3 = 0;
m_nxVRMS1 = 0;
m_nxVRMS2 = 0;
m_nxVRMS3 = 0;
m_nPhase = 0;
m_dImax = 100.0;
m_dItest = 10.0;
m_dVnom = 220.0;
m_nxIRMSOS = 0;
m_nxVRMSOS = 0;
//}}AFX_DATA_INIT
#ifdef _DEBUG
m_nxIRMS1 = 415;
m_nxIRMS2 = 213606;
m_nxIRMS3 = 213606;
m_nxVRMS1 = 1093795;
m_nxVRMS2 = 1093795;
m_nxVRMS3 = 54875;
#endif
#ifdef _DEBUG
nIRMS_C1[0] = 415; nIRMS_C1[1] = 415; nIRMS_C1[2] = 415;
nIRMS_C2[0] = 214606; nIRMS_C2[1] = 214606; nIRMS_C2[2] = 214606;
nIRMS_C3[0] = 214606; nIRMS_C3[1] = 214606; nIRMS_C3[2] = 214606;
nVRMS_C1[0] = 1093795; nVRMS_C1[1] = 1093795; nVRMS_C1[2] = 1093795;
nVRMS_C2[0] = 1093795; nVRMS_C2[1] = 1093795; nVRMS_C2[2] = 1093795;
nVRMS_C3[0] = 54875; nVRMS_C3[1] = 54875; nVRMS_C3[2] = 54875;
#else
for (int i=0;i<3;i++)
{
nIRMS_C1[i] = nIRMS_C2[i] = nIRMS_C3[i] = 0;
nVRMS_C1[i] = nVRMS_C2[i] = nVRMS_C3[i] = 0;
}
#endif
nIRMSOS[0] = 0; nIRMSOS[1] = 0; nIRMSOS[2] = 0;
nVRMSOS[0] = 0; nVRMSOS[1] = 0; nVRMSOS[2] = 0;
}
CIrmsVrmsDlg::~CIrmsVrmsDlg()
{
}
void CIrmsVrmsDlg::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CIrmsVrmsDlg)
DDX_Text(pDX, IDC_SAMPLEN, m_nSampleN);
DDX_Text(pDX, IDC_EDIT_xIRMS1, m_nxIRMS1);
DDX_Text(pDX, IDC_EDIT_xIRMS2, m_nxIRMS2);
DDX_Text(pDX, IDC_EDIT_xIRMS3, m_nxIRMS3);
DDX_Text(pDX, IDC_EDIT_xVRMS1, m_nxVRMS1);
DDX_Text(pDX, IDC_EDIT_xVRMS2, m_nxVRMS2);
DDX_Text(pDX, IDC_EDIT_xVRMS3, m_nxVRMS3);
DDX_CBIndex(pDX, IDC_COMBO_PHASE, m_nPhase);
DDX_Text(pDX, IDC_EDIT_IMAX, m_dImax);
DDX_Text(pDX, IDC_EDIT_ITEST, m_dItest);
DDX_Text(pDX, IDC_EDIT_VNOM, m_dVnom);
DDX_Text(pDX, IDC_EDIT8, m_nxIRMSOS);
DDX_Text(pDX, IDC_EDIT9, m_nxVRMSOS);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CIrmsVrmsDlg, CPropertyPage)
//{{AFX_MSG_MAP(CIrmsVrmsDlg)
ON_BN_CLICKED(IDC_BUTTON_CAL, OnButtonCal)
ON_BN_CLICKED(IDC_BUTTON_WRITE, OnButtonWrite)
ON_CBN_SELCHANGE(IDC_COMBO_PHASE, OnSelchangeComboPhase)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CIrmsVrmsDlg message handlers
BOOL CIrmsVrmsDlg::OnSetActive()
{
CPropertySheet* pSheet = (CPropertySheet*)GetParent();
ASSERT_KINDOF(CPropertySheet, pSheet);
pSheet->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
void CIrmsVrmsDlg::OnButtonCal()
{
UpdateData(TRUE);
Calibrate();
}
/*
* 函数Calibrate()对三种情况下进行校正,
* 完成ADE7758中Figure 87中Step1 - Step5的过程
*/
void CIrmsVrmsDlg::Calibrate()
{
// Step 1 - 2: Set configuration registers for zero crossings
// Set interrupt mask register for zero-crossing detection on all phases
InitIVRMSOffsetCalibration(); // 初始化校正IRMS和VRMS Offset
// 第一种测试条件: Imax/500, Vnomv
// Step 3: Set up the calibration system
SetupSystem(m_dImax/500, m_dVnom, 1); // 对第一种测试条件进行设置 (Setup System for Imax/500, Vnom)
// Step 4: Read the rms registers after the zero-crossing interrupt and take an average of N samples
ReadRegistersIVRMS(nIRMS_C1, nVRMS_C2, m_nSampleN); // 读取第一种测试条件下,IRMS,VRMS寄存器的实际测量值
// 第二种测试条件: Itest, Vnom
// Step 3: Set up the calibration system
SetupSystem(m_dItest, m_dVnom, 1); // 对第二种测试条件进行设置 (Setup System for Itest, Vnom)
// Step 4: Read the rms registers after the zero-crossing interrupt and take an average of N samples
ReadRegistersIVRMS(nIRMS_C2, nVRMS_C2, m_nSampleN); // 读取第二种测试条件下,IRMS,VRMS寄存器的实际测量值
// 第三种测试条件: Itest, Vnom/20
// Step 3: Set up the calibration system
SetupSystem(m_dItest, m_dVnom/20, 1); // 对第三种测试条件进行设置 (Setup System for Itest, Vnom/20)
// Step 4: Read the rms registers after the zero-crossing interrupt and take an average of N samples
ReadRegistersIVRMS(nIRMS_C3, nVRMS_C3, m_nSampleN); // 读取第三种测试条件下,IRMS,VRMS寄存器的实际测量值
// Step 5: Calculate and write to the xVRMSOS and xIRMSOS registers
CalculateAndWrite();
}
/*
* 计算校正寄存器的值
*/
void CIrmsVrmsDlg::CalculateAndWrite()
{
// 计算A相(Phase A)IRMS Offset的校正值AIRMSOS
nIRMSOS[0] = ios_cal (m_dItest, nIRMS_C2[0], m_dImax/500, nIRMS_C1[0]);
// 计算B相(Phase B)IRMS Offset的校正值BIRMSOS
nIRMSOS[1] = ios_cal (m_dItest, nIRMS_C2[1], m_dImax/500, nIRMS_C1[1]);
// 计算C相(Phase C)IRMS Offset的校正值CIRMSOS
nIRMSOS[2] = ios_cal (m_dItest, nIRMS_C2[2], m_dImax/500, nIRMS_C1[2]);
// 计算A相(Phase A)VRMS Offset的校正值AVRMSOS
nVRMSOS[0] = vos_cal (m_dVnom, nVRMS_C2[0], m_dVnom/20, nVRMS_C3[0]);
// 计算B相(Phase B)VRMS Offset的校正值BVRMSOS
nVRMSOS[1] = vos_cal (m_dVnom, nVRMS_C2[1], m_dVnom/20, nVRMS_C3[1]);
// 计算C相(Phase C)VRMS Offset的校正值CVRMSOS
nVRMSOS[2] = vos_cal (m_dVnom, nVRMS_C2[2], m_dVnom/20, nVRMS_C3[2]);
// 显示校正的结果
m_nxIRMSOS = nIRMSOS[m_nPhase];
m_nxVRMSOS = nVRMSOS[m_nPhase];
UpdateData(FALSE);
// 将校正结果写入寄存器
WriteRegistersIVRMS(nIRMSOS, nVRMSOS);
}
void CIrmsVrmsDlg::OnButtonWrite()
{
UpdateData(TRUE);
// 根据三相选择的值m_nPhase,将用户输入的数据存储到相应的位置
nIRMS_C1[m_nPhase] = m_nxIRMS1;
nIRMS_C2[m_nPhase] = m_nxIRMS2;
nIRMS_C3[m_nPhase] = m_nxIRMS3;
nVRMS_C1[m_nPhase] = m_nxVRMS1;
nVRMS_C2[m_nPhase] = m_nxVRMS2;
nVRMS_C3[m_nPhase] = m_nxVRMS3;
}
/*
* 在相位选择发生变化时,更新显示
*/
void CIrmsVrmsDlg::OnSelchangeComboPhase()
{
UpdateData(TRUE);
m_nxIRMS1 = nIRMS_C1[m_nPhase];
m_nxIRMS2 = nIRMS_C2[m_nPhase];
m_nxIRMS3 = nIRMS_C3[m_nPhase];
m_nxVRMS1 = nVRMS_C1[m_nPhase];
m_nxVRMS2 = nVRMS_C2[m_nPhase];
m_nxVRMS3 = nVRMS_C3[m_nPhase];
m_nxIRMSOS = nIRMSOS[m_nPhase];
m_nxVRMSOS = nVRMSOS[m_nPhase];
UpdateData(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -