Files
kunlun/plc/cvg/common/inc/cvg_zc.h
2024-09-28 14:24:04 +08:00

191 lines
6.8 KiB
C

/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#ifndef CVG_ZC_H
#define CVG_ZC_H
/* common includes */
#include "os_types.h"
#include "iot_errno.h"
#include "iot_config.h"
#include "cvg.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
cvg_zc_power_freq_invalid = 0,
cvg_zc_power_freq_50hz,
cvg_zc_power_freq_60hz,
cvg_zc_power_freq_max,
} cvg_vdev_power_freq_t;
/* zc ntb data */
typedef struct cvg_zc_ntb_data {
/* zero-cross ntb */
uint32_t ntb;
/* power line period, unit is ntb */
float period;
/* valid flag */
uint8_t valid;
} cvg_zc_ntb_data_t;
/* negative delay is used to calibrate the zero-crossing deviation
* of different manufacturers, unit is 1 NTB.
*/
#define CVG_ZC_NTB_NEGATIVE_DELAY (12500)
#define CVG_ZC_INVALID_SIGNED_DATA (INT32_MAX)
#if (PLC_SUPPORT_PHY_PHASE_IDENT)
/*
* @brief cvg_zc_data_slr_process() - continuous ZC NTB data is processed
* by simple linear regression algorithm.
* @param ntb: continuous NTB array
* @param ntb_cnt: array size
* @param calc_ntb: calculated initial ntb
* @param calc_period: calculated period
* @param allowed_diff: allowed ntb diffience between calculated and actual
* values. if the limit is exceeded, the original data is
* considered invalid. NULL means use default value.
* @param allowed_diff_cnt: maximum number of exceeded the allowable value, if
* the limit is exceeded, the original data is considered
* invalid. NULL means use default value.
*
* return:
* 0 -- for success case
* othersie -- error code
*/
uint32_t cvg_zc_data_slr_process(uint32_t ntb[],
uint32_t ntb_cnt, uint32_t *calc_ntb, float *calc_period,
uint32_t *allowed_diff, uint32_t *allowed_diff_cnt);
/*
* @brief cvg_zc_ntb_phase_matching() - calculate the physical phase of sta,
* based on the zc ntb difference between CCO and STA
* @param compensate_flag: flag to mark if need compensation zc NTB
* @param allow_phase_diff: allowed phase ntb diffience between cco and sta, if
* the phase difference is within this range, the
* matching phase is considered. NULL means use default
* value.
* @param cco_ntb: zc data of CCO
* @param sta_ntb: zc data of STA
* @param opposite_phase: flag to mark if L/N reversed in Single-phase power
* meter or phase sequence reversed in Three-phase
* power meter
* @return: calculated physical phase
*/
uint8_t cvg_zc_ntb_phase_matching(uint8_t compensate_flag,
uint32_t *allow_phase_diff, cvg_zc_ntb_data_t cco_ntb[], uint32_t sta_ntb,
uint8_t *opposite_phase);
/*
* @brief cvg_zc_kick_invalid_delta() - kick invalid zc delta data.
* @param data: continuous data array
* @param cnt: array size
* @param allow_diff: allowed delta difference threshold value
* @return: invalid number of data.
*/
uint32_t cvg_zc_kick_invalid_delta(int32_t data[], uint32_t cnt,
uint32_t allow_diff);
/*
* @brief cvg_zc_delta_mean_calc() - calculate the mean of the array
* @param data: continuous data array
* @param cnt: array size
* @param average: calculated average
* @param variance: calculated variance
*/
void cvg_zc_delta_mean_calc(int32_t data[], uint32_t cnt, int32_t *average,
uint32_t *variance);
/*
* @brief cvg_zc_kick_invalid_data_v2() - kick invalid zc data.
* @param data: continuous data array
* @param cnt: array size
* @param min: allowed minimum threshold value
* @param min: allowed maximum threshold value
*/
void cvg_zc_kick_invalid_data_v2(int32_t data[], uint32_t cnt, int32_t min,
int32_t max);
#else /* PLC_SUPPORT_PHY_PHASE_IDENT */
#define cvg_zc_data_slr_process(ntb, ntb_cnt, calc_ntb, calc_period, \
allowed_diff, allowed_diff_cnt) (ERR_NOSUPP)
#define cvg_zc_ntb_phase_matching(compensate_flag, allow_phase_diff, cco_ntb, \
sta_ntb, opposite_phase) (0)
#define cvg_zc_kick_invalid_delta(data, cnt, allow_diff) (0)
#define cvg_zc_delta_mean_calc(data, cnt, average, variance)
#define cvg_zc_kick_invalid_data_v2(data, cnt, min, max)
#endif /* PLC_SUPPORT_PHY_PHASE_IDENT */
/*
* @brief cvg_zc_3p_meter_opposite_check() - if live wire and neutral wire
* reversed in three phase power meter, the opposite phase has 30 degrees phase
* position difference with other two phases, and the other two phase has 300
* degrees phase position difference. using the phase position difference, we
* can distinguish the opposite connecting.
* @param sta_ntb: zc data of STA
* @param opposite_phase: the reversed phase
* @return:
* 0 - not reversed
* otherwise - the live wire and neutral wire reversed
*/
uint8_t cvg_zc_3p_meter_opposite_check(cvg_zc_ntb_data_t sta_ntb[], uint8_t
*opposite_phase);
/*
* @brief start zero-cross ntb collection, and judge power frequency
* @param pdev_id: which pdev to be collected
* @param vdev: which vdev to be collected
* @param pkt: pointer to an iot_pkt_t pointer that holds zc ntb raw data
* @param cnt: number of consecutive zero-cross ntb to be collected.
* @param is_full_period: flag to mark if it is collecting full period.
* @param nid: target network id, 0: means local network id
* @param ntb_ptr: pointer to target historical zc ntb that needs to be
* collected, NULL: means collecting real-time zc ntb.
*
* @retval: 0 - for success case
* otherwise - error code
*/
uint32_t cvg_zc_ntb_collect(uint8_t pdev_id, cvg_vdev_t *vdev, iot_pkt_t **pkt,
uint16_t cnt, uint8_t is_full_period, uint32_t nid, uint32_t *ntb_ptr);
/**
* @brief get the ntb of one period
* @return: the value of ntb
*/
uint32_t cvg_zc_get_period_ntb();
/**
* @brief get current ntb value
* @return: current ntb value
*/
uint32_t cvg_zc_get_cur_ntb();
#ifdef __cplusplus
}
#endif
#endif /* CVG_ZC_H */