704 lines
25 KiB
C
Executable File
704 lines
25 KiB
C
Executable File
/****************************************************************************
|
|
|
|
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 IOT_ENERGE_METER_API_V2_H
|
|
#define IOT_ENERGE_METER_API_V2_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "os_types_api.h"
|
|
|
|
/* Chip type: kunlun1. */
|
|
#define IOT_EM_WQ3011 (1)
|
|
/* Chip type: kunlun2. */
|
|
#define IOT_EM_WQ3021 (2)
|
|
/* Times of harmonic analysis. */
|
|
#define IOT_EM_HARMONIC_ANALYSIS_TIMES (21)
|
|
|
|
/**
|
|
* @brief Chip info that custom can get when using energy meter module.
|
|
*/
|
|
typedef struct _iot_em_chip_info_t {
|
|
/* Type of chip, kunlun1/kunlun2, read only, can not set. */
|
|
uint8_t chip_type;
|
|
} iot_em_chip_info_t;
|
|
|
|
/**
|
|
* @brief Standard level data stored in each phase.
|
|
* The metering function is divided into three different API levels:
|
|
* 1.Standard level API:
|
|
* Only return energy number.
|
|
* 2.Professional level API:
|
|
* Increase the amplitude of harmonic analysis,
|
|
* and assist function to judge harmonic amplitude changes.
|
|
* 3.Industrial grade API:
|
|
* Increase the angle of harmonic analysis, namely vector signal.
|
|
* When naming functions, structs, using different suffixes to distinguish their level.
|
|
* Standard level API: xxx_st;
|
|
* Professional level API: xxx_pro;
|
|
* Industrial grade API: xxx_ind;
|
|
* If a standard chip is purchased and an industrial-grade API is invoked,
|
|
* the software returns the status word - unauthorized.
|
|
*/
|
|
typedef struct _iot_em_phase_data_std_t {
|
|
/* Signal frequency, unit is 0.01Hz. */
|
|
uint32_t signal_freq_perc;
|
|
/* Current value, mA. */
|
|
int32_t current_ma;
|
|
/* Slide current value, mA. */
|
|
int32_t slide_current_ma;
|
|
/* Voltage value, mV. */
|
|
int32_t voltage_mv;
|
|
/* Slide voltage value, mA. */
|
|
int32_t slide_voltage_mv;
|
|
/* Power value, mW. */
|
|
int32_t power_mw;
|
|
/* Slide power value, mW. */
|
|
int32_t slide_power_mw;
|
|
/* Apparent power value, mW. */
|
|
int32_t apparent_pwr_mw;
|
|
/* Power factor value, 0.01. */
|
|
int32_t factor_perc;
|
|
/* The energy increment in a certain period of time, unit is 1mWs=1mW*1s,
|
|
* since unit of energy in SI is Joule, 1J=1W*1s, so developer need store
|
|
* and convert the energy increment to the total energy value wanted.
|
|
* Convert method: 1mWs=1mW*1s=0.001J, 1KWH=1000W*3600s=3600000J.
|
|
*/
|
|
int32_t energy_inc_mws;
|
|
} iot_em_phase_data_std_t;
|
|
|
|
/**
|
|
* @brief Professional level data stored in each phase.
|
|
*/
|
|
typedef struct _iot_em_phase_data_pro_t {
|
|
/* Harmonic analysis amplitude variation threshold. */
|
|
int32_t harmonic_ampl_thr;
|
|
/* Harmonic analysis amplitude of all times harmonics in each phase. */
|
|
int32_t harmonic_ampl[IOT_EM_HARMONIC_ANALYSIS_TIMES];
|
|
} iot_em_phase_data_pro_t;
|
|
|
|
/**
|
|
* @brief Industrial grade data stored in each phase.
|
|
*/
|
|
typedef struct _iot_em_phase_data_ind_t {
|
|
/* Harmonic analysis angle of all times harmonics in each phase. */
|
|
int32_t harmonic_angle[IOT_EM_HARMONIC_ANALYSIS_TIMES];
|
|
} iot_em_phase_data_ind_t;
|
|
|
|
/**
|
|
* @brief Get Standard level data of each phase callback function.
|
|
*/
|
|
typedef void (*iot_em_phase_get_data_std_cb)(iot_em_phase_data_std_t *p_phase_data);
|
|
/**
|
|
* @brief Get Professional level data of each phase callback function.
|
|
*/
|
|
typedef void (*iot_em_phase_get_data_pro_cb)(iot_em_phase_data_pro_t *p_phase_data);
|
|
/**
|
|
* @brief Get Industrial grade data of each phase callback function.
|
|
*/
|
|
typedef void (*iot_em_phase_get_data_ind_cb)(iot_em_phase_data_ind_t *p_phase_data);
|
|
|
|
/**
|
|
* @brief Energy meter ADC pin, per adc internal channel connects to chip pin directly.
|
|
* So, developer can take pin same as internal channel. Here has two ADC modules in
|
|
* kunlun2, include ADC0 and ADC1, ADC0 has 8 channels: 0~7, ADC1 has 7 channels: 0~6.
|
|
* The number of encapsulated pin is different in different versions of packaging.
|
|
* Please confirm the information of the encapsulated pin before specific application.
|
|
* Ex, current packaging version chip pin used for ADC0 has 8 pins:AD0_CH1~AD7_CH1;
|
|
* ADC1 has 5 pins: AD0_CH2~AD4_CH2. Their channel, pin, phase need to be used separately.
|
|
* ADC0 channel can only use pin and phase for ADC0.
|
|
* When using differential channel-pin, the two channel-pins act as one
|
|
* differential pair input, it only uses one phase to sample and store.
|
|
* Ex, when using ADC1 channel 3 and channel 2 as one differential pair input,
|
|
* developer need to config the adc pin filed as EM_ADC_PIN_DIFF_CH2_32.
|
|
*/
|
|
typedef enum {
|
|
/* PIN for ADC0 single ended channel-pin. */
|
|
EM_ADC_PIN_SING_CH1_0 = 0,
|
|
EM_ADC_PIN_SING_CH1_1 = 1,
|
|
EM_ADC_PIN_SING_CH1_2 = 2,
|
|
EM_ADC_PIN_SING_CH1_3 = 3,
|
|
EM_ADC_PIN_SING_CH1_4 = 4,
|
|
EM_ADC_PIN_SING_CH1_5 = 5,
|
|
EM_ADC_PIN_SING_CH1_6 = 6,
|
|
EM_ADC_PIN_SING_CH1_7 = 7,
|
|
/* PIN for ADC0 differential channel-pin. */
|
|
EM_ADC_PIN_DIFF_CH1_10 = 8,
|
|
EM_ADC_PIN_DIFF_CH1_32 = 9,
|
|
EM_ADC_PIN_DIFF_CH1_54 = 10,
|
|
EM_ADC_PIN_DIFF_CH1_76 = 11,
|
|
/* PIN for ADC1 single ended channel-pin. */
|
|
EM_ADC_PIN_SING_CH2_0 = 12,
|
|
EM_ADC_PIN_SING_CH2_1 = 13,
|
|
EM_ADC_PIN_SING_CH2_2 = 14,
|
|
EM_ADC_PIN_SING_CH2_3 = 15,
|
|
EM_ADC_PIN_SING_CH2_4 = 16,
|
|
EM_ADC_PIN_SING_CH2_5 = 17,
|
|
EM_ADC_PIN_SING_CH2_6 = 18,
|
|
/* PIN for ADC1 differential channel-pin. */
|
|
EM_ADC_PIN_DIFF_CH2_10 = 19,
|
|
EM_ADC_PIN_DIFF_CH2_32 = 20,
|
|
EM_ADC_PIN_DIFF_CH2_54 = 21,
|
|
/* Special configured channel-pin. */
|
|
EM_ADC_PIN_SING_CH1_UNUSED = 22,
|
|
EM_ADC_PIN_SING_CH2_UNUSED = 23,
|
|
EM_ADC_PIN_VCM_VCM = 24,
|
|
} iot_em_adc_pin_e;
|
|
|
|
/**
|
|
* @brief Energy meter DMA phase, each ADC module has 7 phases: 0, 1, 2,
|
|
* 3.0, 3.1, 3.2, 3.3, max number of all ADC module's phases is 7 + 7 = 14.
|
|
* ADC0 and ADC1 phase need to be used separately. Phase is used to store adc
|
|
* channel data, one channel data can be stored in one phase or multiple phases.
|
|
* Developer need to specify the phase and channel correspondence.
|
|
*/
|
|
typedef enum {
|
|
/* ADC0 DMA phase 0. */
|
|
EM_ADC0_DMA_PHASE_0 = 0,
|
|
EM_ADC0_DMA_PHASE_1 = 1,
|
|
EM_ADC0_DMA_PHASE_2 = 2,
|
|
/* ADC0 DMA phase 3.0. */
|
|
EM_ADC0_DMA_PHASE_3_0 = 3,
|
|
EM_ADC0_DMA_PHASE_3_1 = 4,
|
|
EM_ADC0_DMA_PHASE_3_2 = 5,
|
|
EM_ADC0_DMA_PHASE_3_3 = 6,
|
|
/* ADC1 DMA phase 0. */
|
|
EM_ADC1_DMA_PHASE_0 = 7,
|
|
EM_ADC1_DMA_PHASE_1 = 8,
|
|
EM_ADC1_DMA_PHASE_2 = 9,
|
|
/* ADC1 DMA phase 3.0. */
|
|
EM_ADC1_DMA_PHASE_3_0 = 10,
|
|
EM_ADC1_DMA_PHASE_3_1 = 11,
|
|
EM_ADC1_DMA_PHASE_3_2 = 12,
|
|
EM_ADC1_DMA_PHASE_3_3 = 13,
|
|
EM_ADC_DMA_PHASE_MAX_NUM = 14,
|
|
} iot_em_dma_phase_e;
|
|
|
|
/**
|
|
* @brief Energy meter ADC pin signal type.
|
|
*/
|
|
typedef enum {
|
|
EM_ADC_PIN_SIGNAL_SINGLE_ENDED = 0,
|
|
EM_ADC_PIN_SIGNAL_DIFFERENTIAL = 1,
|
|
} iot_em_adc_pin_signal_type;
|
|
|
|
/**
|
|
* @brief Energy meter ADC sample wave type.
|
|
*/
|
|
typedef enum {
|
|
EM_ADC_SAMP_WAVE_AC_SINE = 0,
|
|
EM_ADC_SAMP_WAVE_DC = 1,
|
|
EM_ADC_SAMP_WAVE_PULSE = 2,
|
|
EM_ADC_SAMP_WAVE_RAMP = 3,
|
|
EM_ADC_SAMP_WAVE_SQUARE = 4,
|
|
} iot_em_adc_sample_wave_type;
|
|
|
|
/**
|
|
* @brief Energy meter ADC sample meter type.
|
|
*/
|
|
typedef enum {
|
|
/* Meter voltage. */
|
|
EM_ADC_SAMP_METER_VOLTAGE = 0,
|
|
/* Meter current. */
|
|
EM_ADC_SAMP_METER_CURRENT = 1,
|
|
/* Meter leak current. */
|
|
EM_ADC_SAMP_METER_LEAK_CURRENT = 2,
|
|
} iot_em_adc_sample_meter_type;
|
|
|
|
/**
|
|
* @brief Energy meter ADC sample wire id, when calculate power, need
|
|
* ensure volate and current is on the same wire. The wire id is used for
|
|
* mark whether the phase sample voltage and the phase sample current is
|
|
* on the same wire. If the two phase use same wire id, it indicates the
|
|
* two phase is on the same wire, the calculated power makes sense.
|
|
* All ADC module's phases is 14, only supports 7 pairs of voltage and current.
|
|
*/
|
|
typedef enum {
|
|
EM_ADC_SAMP_WIRE_ID_0 = 0,
|
|
EM_ADC_SAMP_WIRE_ID_1 = 1,
|
|
EM_ADC_SAMP_WIRE_ID_2 = 2,
|
|
EM_ADC_SAMP_WIRE_ID_3 = 3,
|
|
EM_ADC_SAMP_WIRE_ID_4 = 4,
|
|
EM_ADC_SAMP_WIRE_ID_5 = 5,
|
|
EM_ADC_SAMP_WIRE_ID_6 = 6,
|
|
EM_ADC_SAMP_WIRE_ID_MAX = 7,
|
|
EM_ADC_SAMP_WIRE_ID_UNUSE = 8,
|
|
} iot_em_adc_sample_wire_id_e;
|
|
|
|
/**
|
|
* @brief Energy meter ADC sample frequency.
|
|
*/
|
|
typedef enum {
|
|
/* The clock of the chip ADC is 12.5MHz, after the reduction of sampling,
|
|
* filter and other processing, the value 2232Hz is obtained.
|
|
* Suitable for phase 0,1,2.
|
|
*/
|
|
EM_ADC_SAMPLE_FREQ_2232HZ = 0,
|
|
/* Suitable for phase 3.0,3.1,3.2,3.3. */
|
|
EM_ADC_SAMPLE_FREQ_558HZ = 1,
|
|
} iot_em_adc_sample_freq_e;
|
|
|
|
/**
|
|
* @brief Energy meter phase data analysis method type.
|
|
*/
|
|
typedef enum {
|
|
EM_PHASE_ANALY_TIME_DOMAIN = 0,
|
|
EM_PHASE_ANALY_FREQ_DOMAIN = 1,
|
|
} iot_em_phase_analy_method_type;
|
|
|
|
/**
|
|
* @brief Energy meter phase data time domain analysis method type.
|
|
*/
|
|
typedef enum {
|
|
/* Using frequency domain method, ignore time domain method config. */
|
|
EM_PHASE_ANALY_TD_INVALID = 0,
|
|
EM_PHASE_ANALY_TD_PP = 1,
|
|
EM_PHASE_ANALY_TD_RMS = 2,
|
|
} iot_em_phase_td_analy_method_type;
|
|
|
|
/**
|
|
* @brief Softdware calibration param of each phase.
|
|
*/
|
|
typedef struct _iot_em_phase_sw_calibration_t {
|
|
/* Scale liner. */
|
|
int32_t scale_liner;
|
|
/* Scale offset. */
|
|
int32_t scale_offset;
|
|
/* Scale multiple, should not be set to 0. */
|
|
int32_t scale_mul;
|
|
} iot_em_phase_sw_cali_t;
|
|
|
|
/**
|
|
* @brief Sample source threshold of each phase, using for take actions.
|
|
* Ex, when sampling leak current, if value over 30mA -> close relay,
|
|
* developer can set max=30, ingore min.
|
|
*/
|
|
typedef struct _iot_em_sample_source_threshold_t {
|
|
/* Sampling meter current/leak current, uint is mA; for meter voltage is mV. */
|
|
uint32_t max;
|
|
uint32_t min;
|
|
} iot_em_sample_source_threshold_t;
|
|
|
|
/**
|
|
* @brief Led pulse config of each phase.
|
|
*/
|
|
typedef struct _iot_em_phase_led_pulse_cfg_t {
|
|
/* Mark whether the pahse led pulse is working. */
|
|
bool_t pulse_on;
|
|
/* Config GPIO for led pulse. */
|
|
uint8_t gpio;
|
|
/* Frequency of pulse per second, uint is Hz. */
|
|
uint32_t freq_hz;
|
|
} iot_em_phase_led_pulse_cfg_t;
|
|
|
|
/**
|
|
* @brief Hardware config of each phase.
|
|
*/
|
|
typedef struct _iot_em_phase_hw_cfg_t {
|
|
/* ADC pin select. */
|
|
iot_em_adc_pin_e pin_sel;
|
|
/* ADC pin signal type. */
|
|
iot_em_adc_pin_signal_type signal_type;
|
|
/* ADC sample meter type.*/
|
|
iot_em_adc_sample_meter_type meter_type;
|
|
/* ADC sample wire id. */
|
|
iot_em_adc_sample_wire_id_e wire_id;
|
|
/* Paired phase used for calculate power, calc power need a pair of phase
|
|
* that meter type is current and voltage.
|
|
* If one phase meter type is current,
|
|
* here need the other one phase which meter type is voltage to paired.
|
|
* If this phase no need to calculate power,
|
|
* please choose the max phase num: EM_ADC_DMA_PHASE_MAX_NUM.
|
|
*/
|
|
iot_em_dma_phase_e paired_phase;
|
|
/* ADC sample wave type.*/
|
|
iot_em_adc_sample_wave_type wave_type;
|
|
/* Scale of divider resistance.
|
|
* Ex, when measure voltage, may use 3 resistors with 360K ohm
|
|
* and one resistor with 510ohm, the scale = (3*360*1000+510)/510,
|
|
* Times this scale, the unit of voltage is V.
|
|
* The numerator: (3*360*1000+510); denominator: 510.
|
|
* When measure current, may use 1 resistors with 50mohm,
|
|
* the scale = 1/(50/1000) = 20, times this scale, the unit of current is A.
|
|
* The numerator is 20 , denominator is 1.
|
|
*/
|
|
uint32_t scale_div_res_numer;
|
|
uint32_t scale_div_res_denom;
|
|
/* Min voltage on ADC pin, used for calculate adc gain, enlarge
|
|
* or reduce the input signal to the adc reference voltage range.
|
|
* Ex, reference voltage:0.35V, adc resolution was 0.1483mV.
|
|
* When measure voltage, min voltage on ADC pin:0.2659mV,
|
|
* 0.2659mV calculate method: 1V times scale of divider resistance,
|
|
* 1V * 50 / (4*47*1000+50).
|
|
* we should select the gain suitable for 0.2659mV voltage,
|
|
* choose gain 1 is ok.
|
|
*
|
|
* When measure current, min voltage on ADC pin:0.01mV,
|
|
* 0.01mV calculate method: current is 10mA, divider resistance is 1mohm,
|
|
* 10mA * 1mohm = 10uV = 0.01mV,
|
|
* so, should select the gain suitable for 0.01mV voltage,
|
|
* choose gain 32 is ok.
|
|
* In order to avoid using float data, V times 1000000, now unit is uV.
|
|
*/
|
|
uint32_t pin_min_volt_uv;
|
|
/* Sample frequency. */
|
|
iot_em_adc_sample_freq_e sample_freq;
|
|
} iot_em_phase_hw_cfg_t;
|
|
|
|
/**
|
|
* @brief Softdware config of each phase.
|
|
*/
|
|
typedef struct _iot_em_phase_sw_cfg_t {
|
|
/* Phase data analysis method type. */
|
|
iot_em_phase_analy_method_type analy_method_type;
|
|
/* Phase data time domain analysis method type. */
|
|
iot_em_phase_td_analy_method_type td_analy_method_type;
|
|
/* Harmonic analysis amplitude threshold. */
|
|
int32_t harmonic_ampl_thr;
|
|
/* Softdware calibration param. */
|
|
iot_em_phase_sw_cali_t cali_param;
|
|
/* Power softdware calibration param, when using current phase, must be
|
|
configured, otherwise will not be used. */
|
|
iot_em_phase_sw_cali_t power_cali_param;
|
|
/* Sample source threshold. */
|
|
iot_em_sample_source_threshold_t samp_src_thr;
|
|
/* Led pulse config. */
|
|
iot_em_phase_led_pulse_cfg_t led_pulse;
|
|
/* Get Standard level data callback function. */
|
|
iot_em_phase_get_data_std_cb data_std_cb;
|
|
/* Get Professional level data callback function. */
|
|
iot_em_phase_get_data_pro_cb data_pro_cb;
|
|
/* Get Industrial grade data callback function. */
|
|
iot_em_phase_get_data_ind_cb data_ind_cb;
|
|
} iot_em_phase_sw_cfg_t;
|
|
|
|
/**
|
|
* @brief Profile information of each phase.
|
|
*/
|
|
typedef struct _iot_em_phase_profile_info_t {
|
|
/* Mark whether the pahse is working. */
|
|
bool_t phase_on;
|
|
/* Mark whether the pahse's config is valid. */
|
|
bool_t phase_valid;
|
|
/* Hardware config of phase. */
|
|
iot_em_phase_hw_cfg_t hw_cfg;
|
|
/* Software config of phase. */
|
|
iot_em_phase_sw_cfg_t sw_cfg;
|
|
} iot_em_phase_profile_info_t;
|
|
|
|
/**
|
|
* @brief Customer id type.
|
|
* 1.one-phase meter;
|
|
* 2.three-phase meter;
|
|
* 3.charing pile.
|
|
*/
|
|
typedef enum {
|
|
CUST_CHARGE_PILE = 0,
|
|
CUST_ONE_PHASE_METER = 1,
|
|
CUST_THREE_PHASE_METER = 2,
|
|
CUST_NUM_MAX = 3,
|
|
} iot_em_cust_id_type;
|
|
|
|
/**
|
|
* @brief Control information of each customer info.
|
|
*/
|
|
typedef struct _iot_em_cust_ctrl_info_t {
|
|
/* Customer id type. */
|
|
iot_em_cust_id_type cust_id;
|
|
/* Mark whether the customer's config is valid.
|
|
* Only one customer information is allowed to be config valid by app.
|
|
*/
|
|
bool_t cust_valid;
|
|
} iot_em_cust_ctrl_info_t;
|
|
|
|
/* Customer info used for config energy meter module. */
|
|
typedef struct _iot_em_customer_info_t {
|
|
/* Chip info. */
|
|
iot_em_chip_info_t chip_info;
|
|
/* Control info. */
|
|
iot_em_cust_ctrl_info_t ctrl_info;
|
|
/* Profile information of each phase. */
|
|
iot_em_phase_profile_info_t phase_cfg[EM_ADC_DMA_PHASE_MAX_NUM];
|
|
/* Standard level data stored in each phase. */
|
|
iot_em_phase_data_std_t phase_data_std[EM_ADC_DMA_PHASE_MAX_NUM];
|
|
/* Professional level data stored in each phase. */
|
|
iot_em_phase_data_pro_t phase_data_pro[EM_ADC_DMA_PHASE_MAX_NUM];
|
|
/* Industrial grade data stored in each phase. */
|
|
iot_em_phase_data_ind_t phase_data_ind[EM_ADC_DMA_PHASE_MAX_NUM];
|
|
} iot_em_cust_info_t;
|
|
|
|
#if 0
|
|
/* Max number of customer info.
|
|
* 1.one-phase;
|
|
* 2.three-phase;
|
|
* 3.charing pile.
|
|
*/
|
|
#define IOT_EM_CUST_INFO_MAX_NUM (3)
|
|
iot_em_cust_info_t g_em_cust_info[IOT_EM_CUST_INFO_MAX_NUM] = {
|
|
/*************************************************************************/
|
|
/* Charging pile customer info.
|
|
* ADC0 and ADC1 module's channel-pin and phase table:
|
|
* -----------------------------------------------------------------
|
|
* | module | channel-pin | phase | function | description |
|
|
* | ADC0 | AD0_CH1 | phase0 | I0 | meter current |
|
|
* | ADC0 | AD1_CH1 | phase1 | I1 | meter current |
|
|
* | ADC0 | AD2_CH1 | unused | unused | unused |
|
|
* | ADC0 | AD3_CH1 | phase3.0 | U0 | switch voltage |
|
|
* | ADC0 | AD4_CH1 | phase3.1 | U1 | switch voltage |
|
|
* | ADC0 | AD5_CH1 | phase3.2 | U2 | switch voltage |
|
|
* | ADC0 | AD6_CH1 | phase3.3 | U3 | switch voltage |
|
|
* | ADC0 | AD7_CH1 | phase2 | I2 | meter current |
|
|
* | ADC1 | AD0_CH2 | phase0 | I3 | meter current |
|
|
* | ADC1 | AD1_CH2 | phase1 | Up | meter voltage |
|
|
* | ADC1 | AD2_CH2 | phase2 | I1 | leak current |
|
|
* | ADC1 | AD3_CH2 | phase2 | I1 | leak current |
|
|
* | ADC1 | AD4_CH2 | phase3.0 | GND | switch voltage |
|
|
* | ADC1 | AD4_CH2 | phase3.1 | GND | gnd |
|
|
* | ADC1 | AD4_CH2 | phase3.2 | GND | gnd |
|
|
* | ADC1 | AD4_CH2 | phase3.3 | GND | gnd |
|
|
* -----------------------------------------------------------------
|
|
*/
|
|
{
|
|
/* Chip info. */
|
|
.chip_info.chip_type = IOT_EM_WQ30x2,
|
|
/***********************************************************/
|
|
/* Profile information of adc0 phase0. */
|
|
/* Mark whether the pahse is working. */
|
|
.phase_cfg[0].phase_on = false,
|
|
/* Mark whether the pahse's config is valid. */
|
|
.phase_cfg[0].phase_valid = false,
|
|
/*************************************************/
|
|
/* Hardware config of phase. */
|
|
/* ADC pin select. */
|
|
.phase_cfg[0].hw_cfg.pin_sel = EM_ADC_PIN_SING_CH1_0,
|
|
/* ADC pin signal type. */
|
|
.phase_cfg[0].hw_cfg.signal_type = EM_ADC_PIN_SIGNAL_SINGLE_ENDED,
|
|
/* ADC sample wave type.*/
|
|
.phase_cfg[0].hw_cfg.wave_type =EM_ADC_SAMP_WAVE_AC_SINE,
|
|
/* Scale of divider resistance.
|
|
* Meause voltage, use 4 resistors with 47K ohm and one resistor
|
|
* with 50ohm, the scale = (3*47*1000+50)/50.
|
|
* Times this scale, the unit of voltage is V.
|
|
* The numerator: (4*47*1000+50); denominator: 50.
|
|
*/
|
|
.phase_cfg[0].hw_cfg.scale_div_res_numer = (4 * 47 * 1000 + 50),
|
|
.phase_cfg[0].hw_cfg.scale_div_res_denom = 50,
|
|
/* Max voltage on ADC pin, used for calculate adc gain, enlarge
|
|
* or reduce the input signal to the adc reference voltage range.
|
|
* Ex, reference voltage:0.35V, max voltage on ADC pin:0.058V,
|
|
* 0.058V calculate method: 220V times scale of divider resistance,
|
|
* 220V * 50 / (4*47*1000+50).
|
|
* we should select the gain suitable for 0.058V voltage.
|
|
* In order to avoid using float data, V times 1000, now unit is mV.
|
|
*/
|
|
.phase_cfg[0].hw_cfg.pin_volt_max_mv = 58,
|
|
/* Sample frequency. */
|
|
.phase_cfg[0].hw_cfg.sample_freq = EM_ADC_SAMPLE_FREQ_2232HZ,
|
|
/*************************************************/
|
|
/* Software config of phase. */
|
|
/* Phase data analysis method type. */
|
|
.phase_cfg[0].sw_cfg.analy_method_type = EM_PHASE_ANALY_FREQ_DOMAIN,
|
|
/* Phase data time domain analysis method type. */
|
|
.phase_cfg[0].sw_cfg.td_analy_method_type = EM_PHASE_ANALY_TD_INVALID,
|
|
/* Harmonic analysis amplitude threshold. */
|
|
.phase_cfg[0].sw_cfg.harmonic_ampl_thr = 0,
|
|
/* Softdware calibration param. */
|
|
/* Scale liner. */
|
|
.phase_cfg[0].sw_cfg.cali_param.scale_liner = 1,
|
|
/* Scale offset. */
|
|
.phase_cfg[0].sw_cfg.cali_param.scale_offset = 0,
|
|
/* Scale multiple. */
|
|
.phase_cfg[0].sw_cfg.cali_param.scale_mul =1,
|
|
/* Sample source threshold. */
|
|
/* Sampling meter current/leak current, uint is mA; for meter voltage is mV. */
|
|
.phase_cfg[0].sw_cfg.samp_src_thr.max = 30,
|
|
.phase_cfg[0].sw_cfg.samp_src_thr.min = 5,
|
|
/* Led pulse config. */
|
|
/* Mark whether the pahse led pulse is working. */
|
|
.phase_cfg[0].sw_cfg.led_pulse.pulse_on = false,
|
|
/* Config GPIO for led pulse. */
|
|
.phase_cfg[0].sw_cfg.led_pulse.gpio = 43,
|
|
/* Frequency of pulse per second. */
|
|
.phase_cfg[0].sw_cfg.led_pulse.freq_hz = 0,
|
|
/* Get Standard level data callback function. */
|
|
.phase_cfg[0].sw_cfg.data_std_cb = NULL,
|
|
/* Get Professional level data callback function. */
|
|
.phase_cfg[0].sw_cfg.data_pro_cb = NULL,
|
|
/* Get Industrial grade data callback function. */
|
|
.phase_cfg[0].sw_cfg.data_ind_cb = NULL,
|
|
/***********************************************************/
|
|
/* Other profile information. */
|
|
},
|
|
/*******************************************************************/
|
|
/* Other customer info. */
|
|
};
|
|
#endif
|
|
/** \defgroup ENERGE_METER_APIs ENERGE_METER APIs
|
|
* @brief ENERGE_METER APIs
|
|
*
|
|
*
|
|
*/
|
|
|
|
/** @addtogroup ENERGE_METER_APIs
|
|
* @{
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* @brief iot_em_module_open() - open energy meter module.
|
|
* @param p_cust_info pointer to customer info.
|
|
* @return ERR_OK/ERR_FAIL.
|
|
*
|
|
*/
|
|
uint32_t iot_em_module_open(iot_em_cust_info_t *p_cust_info);
|
|
|
|
/**
|
|
* @brief iot_em_phase_enable() - enable/disable each phase.
|
|
* @param phase_id id of phase.
|
|
* @param enable true: enable; false: disable.
|
|
* @return ERR_OK/ERR_FAIL.
|
|
*
|
|
*/
|
|
uint32_t iot_em_phase_enable(uint32_t phase_id, bool_t enable);
|
|
|
|
/**
|
|
* @brief iot_em_phase_correction_set_std() - set correction param of each phase.
|
|
* @param phase_id id of phase.
|
|
* @param analy_method_sel phase data analysis method select.
|
|
* @param td_analy_method phase data time domain analysis method select.
|
|
* @param cali_param softdware calibration param.
|
|
* @return ERR_OK/ERR_FAIL.
|
|
*
|
|
*/
|
|
uint32_t iot_em_phase_correction_set_std(uint32_t phase_id,
|
|
iot_em_phase_analy_method_type analy_method_sel,
|
|
iot_em_phase_td_analy_method_type td_analy_method,
|
|
iot_em_phase_sw_cali_t cali_param);
|
|
|
|
/**
|
|
* @brief iot_em_phase_scale_div_res_set_std() -
|
|
* set scale of divider resistance of each phase.
|
|
* @param phase_id id of phase.
|
|
* @param scale_div_res_numer the numerator of scale.
|
|
* @param scale_div_res_denom the denominator of scale.
|
|
* @return ERR_OK/ERR_FAIL.
|
|
*
|
|
*/
|
|
uint32_t iot_em_phase_scale_div_res_set_std(uint32_t phase_id,
|
|
uint32_t scale_div_res_numer, uint32_t scale_div_res_denom);
|
|
|
|
/**
|
|
* @brief iot_em_phase_pulse_set_std() - set meter pulse of each phase.
|
|
* @param phase_id id of phase.
|
|
* @param p_led_pulse pointer to led pulse config.
|
|
* @return ERR_OK/ERR_FAIL.
|
|
*
|
|
*/
|
|
uint32_t iot_em_phase_pulse_set_std(uint32_t phase_id,
|
|
iot_em_phase_led_pulse_cfg_t *p_led_pulse);
|
|
|
|
/**
|
|
* @brief iot_em_phase_pin_signal_type_get_std() -
|
|
* get pin signal type of each phase.
|
|
* @param p_data pointer to phase data buffer.
|
|
* @return pin signal type.
|
|
*
|
|
*/
|
|
iot_em_adc_pin_signal_type iot_em_phase_pin_signal_type_get_std(
|
|
uint32_t phase_id);
|
|
|
|
/**
|
|
* @brief iot_em_phase_harmonic_ampl_thr_set_pro() -
|
|
* set harmonic amplitude threshold of each phase.
|
|
* @param phase_id id of phase.
|
|
* @param ampl_thr harmonic amplitude threshold.
|
|
* @return ERR_OK/ERR_FAIL.
|
|
*
|
|
*/
|
|
uint32_t iot_em_phase_harmonic_ampl_thr_set_pro(uint32_t phase_id,
|
|
int32_t ampl_thr);
|
|
|
|
/**
|
|
* @brief iot_em_phase_data_get_std() - get standard level data of each phase.
|
|
* @param p_phase_data pointer to phase data buffer.
|
|
* @return ERR_OK/ERR_FAIL.
|
|
*
|
|
*/
|
|
uint32_t iot_em_phase_data_get_std(uint32_t phase_id,
|
|
iot_em_phase_data_std_t *p_phase_data);
|
|
|
|
/**
|
|
* @brief iot_em_phase_data_get_pro() - get professional level data of each phase.
|
|
* @param p_phase_data pointer to phase data buffer.
|
|
* @return ERR_OK/ERR_FAIL.
|
|
*
|
|
*/
|
|
uint32_t iot_em_phase_data_get_pro(uint32_t phase_id,
|
|
iot_em_phase_data_pro_t *p_phase_data);
|
|
|
|
/**
|
|
* @brief iot_em_phase_data_get_ind() - get industrial grade data of each phase.
|
|
* @param p_phase_data pointer to phase data buffer.
|
|
* @return ERR_OK/ERR_FAIL.
|
|
*
|
|
*/
|
|
uint32_t iot_em_phase_data_get_ind(uint32_t phase_id,
|
|
iot_em_phase_data_ind_t *p_phase_data);
|
|
|
|
/**
|
|
* @brief iot_em_phase_get_data_cb_register_std() -
|
|
* register get standard level data of each phase callback function.
|
|
* @param phase_id id of phase.
|
|
* @param cb callback function.
|
|
* @return ERR_OK/ERR_FAIL.
|
|
*
|
|
*/
|
|
uint32_t iot_em_phase_get_data_cb_register_std(uint32_t phase_id,
|
|
iot_em_phase_get_data_std_cb cb);
|
|
|
|
/**
|
|
* @brief iot_em_phase_get_data_cb_register_pro() -
|
|
* register get professional level data of each phase callback function.
|
|
* @param phase_id id of phase.
|
|
* @param cb callback function.
|
|
* @return ERR_OK/ERR_FAIL.
|
|
*
|
|
*/
|
|
uint32_t iot_em_phase_get_data_cb_register_pro(uint32_t phase_id,
|
|
iot_em_phase_get_data_pro_cb cb);
|
|
|
|
/**
|
|
* @brief iot_em_phase_get_data_cb_register_ind() -
|
|
* register get industrial grade data of each phase callback function.
|
|
* @param phase_id id of phase.
|
|
* @param cb callback function.
|
|
* @return ERR_OK/ERR_FAIL.
|
|
*
|
|
*/
|
|
uint32_t iot_em_phase_get_data_cb_register_ind(uint32_t phase_id,
|
|
iot_em_phase_get_data_ind_cb cb);
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /*IOT_ENERGE_METER_API_V2_H*/
|