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

📄 irmsvrmsdlg.cpp

📁 ADE7758校正程序,只需根据需要添加通信子程序
💻 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 + -