191 lines
6.8 KiB
C
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 */
|