704 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			704 lines
		
	
	
		
			25 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 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*/
 |