pwrmeter330a  2.1.0.0
pwrmeter330a.h
Go to the documentation of this file.
1 /****************************************************************************
2 ** Copyright (C) 2020 MikroElektronika d.o.o.
3 ** Contact: https://www.mikroe.com/contact
4 **
5 ** Permission is hereby granted, free of charge, to any person obtaining a copy
6 ** of this software and associated documentation files (the "Software"), to deal
7 ** in the Software without restriction, including without limitation the rights
8 ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 ** copies of the Software, and to permit persons to whom the Software is
10 ** furnished to do so, subject to the following conditions:
11 ** The above copyright notice and this permission notice shall be
12 ** included in all copies or substantial portions of the Software.
13 **
14 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
16 ** OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18 ** DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
19 ** OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20 ** USE OR OTHER DEALINGS IN THE SOFTWARE.
21 ****************************************************************************/
22 
28 #ifndef PWRMETER330A_H
29 #define PWRMETER330A_H
30 
31 #ifdef __cplusplus
32 extern "C"{
33 #endif
34 
39 #ifdef PREINIT_SUPPORTED
40 #include "preinit.h"
41 #endif
42 
43 #ifdef MikroCCoreVersion
44  #if MikroCCoreVersion >= 1
45  #include "delays.h"
46  #endif
47 #endif
48 
49 #include "drv_digital_out.h"
50 #include "drv_digital_in.h"
51 #include "drv_i2c_master.h"
52 
73 #define PWRMETER330A_REG_EEPROM_0B 0x0B
74 #define PWRMETER330A_REG_EEPROM_0C 0x0C
75 #define PWRMETER330A_REG_EEPROM_0D 0x0D
76 #define PWRMETER330A_REG_EEPROM_0E 0x0E
77 #define PWRMETER330A_REG_EEPROM_0F 0x0F
78 
86 #define PWRMETER330A_REG_SHADOW_1B 0x1B
87 #define PWRMETER330A_REG_SHADOW_1C 0x1C
88 #define PWRMETER330A_REG_SHADOW_1D 0x1D
89 #define PWRMETER330A_REG_SHADOW_1E 0x1E
90 #define PWRMETER330A_REG_SHADOW_1F 0x1F
91 
96 #define PWRMETER330A_REG_VOLATILE_20 0x20
97 #define PWRMETER330A_REG_VOLATILE_21 0x21
98 #define PWRMETER330A_REG_VOLATILE_22 0x22
99 #define PWRMETER330A_REG_VOLATILE_25 0x25
100 #define PWRMETER330A_REG_VOLATILE_26 0x26
101 #define PWRMETER330A_REG_VOLATILE_27 0x27
102 #define PWRMETER330A_REG_VOLATILE_28 0x28
103 #define PWRMETER330A_REG_VOLATILE_29 0x29
104 #define PWRMETER330A_REG_VOLATILE_2A 0x2A
105 #define PWRMETER330A_REG_VOLATILE_2C 0x2C
106 #define PWRMETER330A_REG_VOLATILE_2D 0x2D
107 #define PWRMETER330A_REG_VOLATILE_2F 0x2F
108 #define PWRMETER330A_REG_VOLATILE_30 0x30
109  // pwrmeter330a_reg
111 
126 #define PWRMETER330A_CUST_ACCESS_CODE 0x4F70656Eul
127 #define PWRMETER330A_CUST_ACCESS_CODE_CLEAR 0x00000000ul
128 
133 #define PWRMETER330A_VEVENT_CYCS_MASK 0x0000003Ful
134 #define PWRMETER330A_OVERVREG_MASK 0x00003F00ul
135 #define PWRMETER330A_UNDERVREG_MASK 0x000FC000ul
136 #define PWRMETER330A_DELAYCNT_SEL_MASK 0x00100000ul
137 #define PWRMETER330A_HALFCYCLC_EN_MASK 0x00200000ul
138 #define PWRMETER330A_SQUAREWAVE_EN_MASK 0x00400000ul
139 #define PWRMETER330A_ZEROCROSSCHANSEL_MASK 0x00800000ul
140 #define PWRMETER330A_ZEROCROSSEDGESEL_MASK 0x01000000ul
141 #define PWRMETER330A_ECC_MASK 0xFC000000ul
142 #define PWRMETER330A_OVERVREG_MAX 63
143 #define PWRMETER330A_UNDERVREG_MAX 63
144 #define PWRMETER330A_OVERVREG_3 3
145 #define PWRMETER330A_UNDERVREG_1 1
146 
151 #define PWRMETER330A_I2C_SLV_ADDR_MASK 0x000001FCul
152 #define PWRMETER330A_I2C_DIS_SLV_ADDR 0x00000200ul
153 #define PWRMETER330A_DIO_0_SEL_MASK 0x00000C00ul
154 #define PWRMETER330A_DIO_1_SEL_MASK 0x00003000ul
155 #define PWRMETER330A_N_MASK 0x00FFC000ul
156 #define PWRMETER330A_BYPASS_N_EN_MASK 0x01000000ul
157 #define PWRMETER330A_DIO_0_SEL_ZC 0
158 #define PWRMETER330A_DIO_0_SEL_OV 1
159 #define PWRMETER330A_DIO_0_SEL_UV 2
160 #define PWRMETER330A_DIO_0_SEL_OV_UV 3
161 #define PWRMETER330A_DIO_1_SEL_OCF 0
162 #define PWRMETER330A_DIO_1_SEL_UV 1
163 #define PWRMETER330A_DIO_1_SEL_OV 2
164 #define PWRMETER330A_DIO_1_SEL_OV_UV_OCF 3
165 #define PWRMETER330A_BYPASS_N_DISABLE 0
166 #define PWRMETER330A_BYPASS_N_ENABLE 1
167 #define PWRMETER330A_MAX_NUM_SAMPLES 1023u
168 
173 #define PWRMETER330A_RSENSE_OHM 2000.0f
174 #define PWRMETER330A_AC_RDIV_OHM 2000000.0f
175 #define PWRMETER330A_DC_RDIV_OHM 4000000.0f
176 #define PWRMETER330A_ADC_FSCALE 55000u
177 #define PWRMETER330A_DELTA_VIN_MAX_mV 250
178 #define PWRMETER330A_mV_TO_V 1000u
179 #define PWRMETER330A_MAX_CURRENT 30
180 #define PWRMETER330A_DEF_AVG_SAMPLES 500u
181 
187 #define PWRMETER330A_DEVICE_ADDRESS_0 0x60
188 #define PWRMETER330A_DEVICE_ADDRESS_1 0x61
189 #define PWRMETER330A_DEVICE_ADDRESS_2 0x64
190 #define PWRMETER330A_DEVICE_ADDRESS_3 0x65
191  // pwrmeter330a_set
193 
208 #define PWRMETER330A_MAP_MIKROBUS( cfg, mikrobus ) \
209  cfg.scl = MIKROBUS( mikrobus, MIKROBUS_SCL ); \
210  cfg.sda = MIKROBUS( mikrobus, MIKROBUS_SDA ); \
211  cfg.dio1 = MIKROBUS( mikrobus, MIKROBUS_AN ); \
212  cfg.en = MIKROBUS( mikrobus, MIKROBUS_RST ); \
213  cfg.dio0 = MIKROBUS( mikrobus, MIKROBUS_INT )
214  // pwrmeter330a_map // pwrmeter330a
217 
222 typedef struct
223 {
224  // Output pins
225  digital_out_t en;
227  // Input pins
228  digital_in_t dio1;
229  digital_in_t dio0;
231  // Modules
232  i2c_master_t i2c;
234  // I2C slave address
235  uint8_t slave_address;
237  uint8_t bypass_n_en;
240 
245 typedef struct
246 {
247  pin_name_t scl;
248  pin_name_t sda;
250  pin_name_t dio1;
251  pin_name_t dio0;
252  pin_name_t en;
254  uint32_t i2c_speed;
255  uint8_t i2c_address;
258 
263 typedef enum
264 {
266  PWRMETER330A_ERROR = -1
267 
269 
286 
301 
315 
329 err_t pwrmeter330a_write_register ( pwrmeter330a_t *ctx, uint8_t reg, uint32_t data_in );
330 
344 err_t pwrmeter330a_read_register ( pwrmeter330a_t *ctx, uint8_t reg, uint32_t *data_out );
345 
355 
365 
375 
385 
397 
409 
423 err_t pwrmeter330a_set_bypass_n_state ( pwrmeter330a_t *ctx, uint8_t state );
424 
437 err_t pwrmeter330a_set_num_samples ( pwrmeter330a_t *ctx, uint16_t num_samples );
438 
453 err_t pwrmeter330a_set_dio0_sel ( pwrmeter330a_t *ctx, uint8_t dio_sel );
454 
469 err_t pwrmeter330a_set_dio1_sel ( pwrmeter330a_t *ctx, uint8_t dio_sel );
470 
482 err_t pwrmeter330a_set_ovrms_thold ( pwrmeter330a_t *ctx, uint8_t ovrms );
483 
495 err_t pwrmeter330a_set_uvrms_thold ( pwrmeter330a_t *ctx, uint8_t uvrms );
496 
509 err_t pwrmeter330a_read_rms ( pwrmeter330a_t *ctx, float *v_rms, float *i_rms );
510 
525 err_t pwrmeter330a_read_average_rms ( pwrmeter330a_t *ctx, float *v_rms, float *i_rms, uint16_t num_avg );
526 
527 #ifdef __cplusplus
528 }
529 #endif
530 #endif // PWRMETER330A_H
531  // pwrmeter330a
533 
534 // ------------------------------------------------------------------------ END
pwrmeter330a_deny_write_access
err_t pwrmeter330a_deny_write_access(pwrmeter330a_t *ctx)
PWR Meter 3 30A deny write access function.
PWRMETER330A_OK
@ PWRMETER330A_OK
Definition: pwrmeter330a.h:265
pwrmeter330a_allow_write_access
err_t pwrmeter330a_allow_write_access(pwrmeter330a_t *ctx)
PWR Meter 3 30A allow write access function.
pwrmeter330a_cfg_t
PWR Meter 3 30A Click configuration object.
Definition: pwrmeter330a.h:246
pwrmeter330a_get_dio1_pin
uint8_t pwrmeter330a_get_dio1_pin(pwrmeter330a_t *ctx)
PWR Meter 3 30A get dio1 pin function.
pwrmeter330a_cfg_t::dio0
pin_name_t dio0
Definition: pwrmeter330a.h:251
pwrmeter330a_t::en
digital_out_t en
Definition: pwrmeter330a.h:225
pwrmeter330a_t::slave_address
uint8_t slave_address
Definition: pwrmeter330a.h:235
pwrmeter330a_set_bypass_n_state
err_t pwrmeter330a_set_bypass_n_state(pwrmeter330a_t *ctx, uint8_t state)
PWR Meter 3 30A set bypass n state function.
pwrmeter330a_cfg_t::scl
pin_name_t scl
Definition: pwrmeter330a.h:247
pwrmeter330a_return_value_t
pwrmeter330a_return_value_t
PWR Meter 3 30A Click return value data.
Definition: pwrmeter330a.h:264
pwrmeter330a_get_dio0_pin
uint8_t pwrmeter330a_get_dio0_pin(pwrmeter330a_t *ctx)
PWR Meter 3 30A get dio0 pin function.
pwrmeter330a_t::dio1
digital_in_t dio1
Definition: pwrmeter330a.h:228
pwrmeter330a_set_dio1_sel
err_t pwrmeter330a_set_dio1_sel(pwrmeter330a_t *ctx, uint8_t dio_sel)
PWR Meter 3 30A set dio1 sel function.
pwrmeter330a_set_uvrms_thold
err_t pwrmeter330a_set_uvrms_thold(pwrmeter330a_t *ctx, uint8_t uvrms)
PWR Meter 3 30A set uvrms threshold function.
PWRMETER330A_ERROR
@ PWRMETER330A_ERROR
Definition: pwrmeter330a.h:266
pwrmeter330a_set_num_samples
err_t pwrmeter330a_set_num_samples(pwrmeter330a_t *ctx, uint16_t num_samples)
PWR Meter 3 30A set num samples function.
pwrmeter330a_cfg_t::i2c_address
uint8_t i2c_address
Definition: pwrmeter330a.h:255
pwrmeter330a_t::i2c
i2c_master_t i2c
Definition: pwrmeter330a.h:232
pwrmeter330a_set_dio0_sel
err_t pwrmeter330a_set_dio0_sel(pwrmeter330a_t *ctx, uint8_t dio_sel)
PWR Meter 3 30A set dio0 sel function.
pwrmeter330a_t::bypass_n_en
uint8_t bypass_n_en
Definition: pwrmeter330a.h:237
pwrmeter330a_set_ovrms_thold
err_t pwrmeter330a_set_ovrms_thold(pwrmeter330a_t *ctx, uint8_t ovrms)
PWR Meter 3 30A set ovrms threshold function.
pwrmeter330a_cfg_setup
void pwrmeter330a_cfg_setup(pwrmeter330a_cfg_t *cfg)
PWR Meter 3 30A configuration object setup function.
pwrmeter330a_default_cfg
err_t pwrmeter330a_default_cfg(pwrmeter330a_t *ctx)
PWR Meter 3 30A default configuration function.
pwrmeter330a_cfg_t::sda
pin_name_t sda
Definition: pwrmeter330a.h:248
pwrmeter330a_cfg_t::i2c_speed
uint32_t i2c_speed
Definition: pwrmeter330a.h:254
pwrmeter330a_read_rms
err_t pwrmeter330a_read_rms(pwrmeter330a_t *ctx, float *v_rms, float *i_rms)
PWR Meter 3 30A read rms function.
pwrmeter330a_t::dio0
digital_in_t dio0
Definition: pwrmeter330a.h:229
pwrmeter330a_t
PWR Meter 3 30A Click context object.
Definition: pwrmeter330a.h:223
pwrmeter330a_write_register
err_t pwrmeter330a_write_register(pwrmeter330a_t *ctx, uint8_t reg, uint32_t data_in)
PWR Meter 3 30A write register function.
pwrmeter330a_cfg_t::en
pin_name_t en
Definition: pwrmeter330a.h:252
pwrmeter330a_enable_device
void pwrmeter330a_enable_device(pwrmeter330a_t *ctx)
PWR Meter 3 30A enable device function.
pwrmeter330a_read_register
err_t pwrmeter330a_read_register(pwrmeter330a_t *ctx, uint8_t reg, uint32_t *data_out)
PWR Meter 3 30A read register function.
pwrmeter330a_cfg_t::dio1
pin_name_t dio1
Definition: pwrmeter330a.h:250
pwrmeter330a_disable_device
void pwrmeter330a_disable_device(pwrmeter330a_t *ctx)
PWR Meter 3 30A disable device function.
pwrmeter330a_init
err_t pwrmeter330a_init(pwrmeter330a_t *ctx, pwrmeter330a_cfg_t *cfg)
PWR Meter 3 30A initialization function.
pwrmeter330a_read_average_rms
err_t pwrmeter330a_read_average_rms(pwrmeter330a_t *ctx, float *v_rms, float *i_rms, uint16_t num_avg)
PWR Meter 3 30A read average rms function.