pwrmeter  2.0.0.0
pwrmeter.h
Go to the documentation of this file.
1 /*
2  * MikroSDK - MikroE Software Development Kit
3  * Copyright© 2020 MikroElektronika d.o.o.
4  *
5  * Permission is hereby granted, free of charge, to any person
6  * obtaining a copy of this software and associated documentation
7  * files (the "Software"), to deal in the Software without restriction,
8  * including without limitation the rights to use, copy, modify, merge,
9  * publish, distribute, sublicense, and/or sell copies of the Software,
10  * and to permit persons to whom the Software is furnished to do so,
11  * subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
20  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
22  * OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
33 // ----------------------------------------------------------------------------
34 
35 #ifndef PWRMETER_H
36 #define PWRMETER_H
37 
38 #include "mikrosdk_version.h"
39 
40 #ifdef __GNUC__
41 #if mikroSDK_GET_VERSION < 20800ul
42 #include "rcu_delays.h"
43 #else
44 #include "delays.h"
45 #endif
46 #endif
47 
48 #include "drv_digital_out.h"
49 #include "drv_digital_in.h"
50 #include "drv_uart.h"
51 
52 
53 // -------------------------------------------------------------- PUBLIC MACROS
63 #define PWRMETER_MAP_MIKROBUS( cfg, mikrobus ) \
64  cfg.tx_pin = MIKROBUS( mikrobus, MIKROBUS_TX ); \
65  cfg.rx_pin = MIKROBUS( mikrobus, MIKROBUS_RX ); \
66  cfg.en = MIKROBUS( mikrobus, MIKROBUS_CS )
67 
73 #define PWRMETER_RETVAL uint8_t
74 #define PWRMETER_P const uint8_t*
75 
76 #define PWRMETER_OK 0x00
77 #define PWRMETER_INIT_ERROR 0xFF
78 
84 #define PWRMETER_ERROR_COMMAND_OR_ELEMENT 0xFF
85 #define PWRMETER_ERROR_START_OR_END_COMMAND 0x8F
86 #define PWRMETER_ERROR_NEXT_ELEMENT 0x4F
87 #define PWRMETER_ERROR_CURRENT_ELEMENT 0x2F
88 #define PWRMETER_NO_ERROR 0x00
89 
95 #define PWRMETER_HEADER_BYTE 0xA5
96 
102 #define PWRMETER_REG_READ_COMM 0x4E
103 #define PWRMETER_REG_WRITE_COMM 0x4D
104 #define PWRMETER_SET_ADDR_POINTER_COMM 0x41
105 #define PWRMETER_SAVE_TO_FLASH_COMM 0x53
106 #define PWRMETER_EEPROM_READ_COMM 0x42
107 #define PWRMETER_EEPROM_WRITE_COMM 0x50
108 #define PWRMETER_EEPROM_ERASE_COMM 0x4F
109 #define PWRMETER_GAIN_CALIB_COMM 0x5A
110 #define PWRMETER_REACTIVE_GAIN_CALIB_COMM 0x7A
111 #define PWRMETER_FREQ_CALIB_COMM 0x76
112 #define PWRMETER_SAVE_ENERGY_TO_EEPROM_COMM 0x45
113 
114 
119 #define PWRMETER_SUCCESSFUL 0x06
120 #define PWRMETER_COMMAND_FAIL 0x15
121 #define PWRMETER_CHECKSUM_FAIL 0x51
122 #define PWRMETER_ADDRESS_FAIL 0x00
123 #define PWRMETER_NBYTES_FAIL 0x01
124 #define PWRMETER_PAGE_NUM_FAIL 0x02
125 
130 #define PWRMETER_16BIT_DATA 0x00
131 #define PWRMETER_32BIT_DATA 0x01
132 
137 #define PWRMETER_DCMODE_MASK 0x01
138 #define PWRMETER_DCCURR_SIGN_MASK 0x02
139 #define PWRMETER_DCVOLT_SIGN_MASK 0x04
140 #define PWRMETER_PR_SIGN_MASK 0x08
141 #define PWRMETER_PA_SIGN_MASK 0x10
142 
147 #define PWRMETER_ENABLE 0x00
148 #define PWRMETER_DISABLE 0x01
149 
154 #define PWRMETER_INSTR_POINTER_REG 0x0000
155 #define PWRMETER_SYS_STATUS_REG 0x0002
156 #define PWRMETER_SYS_VERSION_REG 0x0004
157 #define PWRMETER_VOLT_RMS_REG 0x0006
158 #define PWRMETER_LINE_FREQ_REG 0x0008
159 #define PWRMETER_THERM_VOLT_REG 0x000A
160 #define PWRMETER_PWR_FACTOR_REG 0x000C
161 #define PWRMETER_CURR_RMS_REG 0x000E
162 #define PWRMETER_ACTIVE_PWR_REG 0x0012
163 #define PWRMETER_REACTIVE_PWR_REG 0x0016
164 #define PWRMETER_APPARENT_PWR_REG 0x001A
165 #define PWRMETER_IMPORT_ACTIVE_E_COUNT_REG 0x001E
166 #define PWRMETER_EXPORT_ACTIVE_E_COUNT_REG 0x0026
167 #define PWRMETER_IMPORT_REACTIVE_E_COUNT_REG 0x002E
168 #define PWRMETER_EXPORT_REACTIVE_E_COUNT_REG 0x0036
169 #define PWRMETER_MIN_RECORD_1_REG 0x003E
170 #define PWRMETER_MIN_RECORD_2_REG 0x0042
171 #define PWRMETER_MAX_RECORD_1_REG 0x0046
172 #define PWRMETER_MAX_RECORD_2_REG 0x004A
173 #define PWRMETER_CALIB_DELIMIT_REG 0x004E
174 #define PWRMETER_GAIN_CURR_RMS_REG 0x0050
175 #define PWRMETER_GAIN_VOLT_RMS_REG 0x0052
176 #define PWRMETER_GAIN_ACTIVE_PWR_REG 0x0054
177 #define PWRMETER_GAIN_REACTIVE_PWR_REG 0x0056
178 #define PWRMETER_OFFSET_CURR_RMS_REG 0x005A
179 #define PWRMETER_OFFSET_ACTIVE_PWR_REG 0x005C
180 #define PWRMETER_OFFSET_REACTIVE_PWR_REG 0x005E
181 #define PWRMETER_GAIN_LINE_FREQ_REG 0x0060
182 #define PWRMETER_PHASE_COMP_REG 0x0062
183 #define PWRMETER_VOLT_DROP_COMP_REG 0x0064
184 #define PWRMETER_INCAP_CURR_COMP_REG 0x0066
185 #define PWRMETER_RANGE_VDROP_COMP_REG 0x0068
186 #define PWRMETER_DC_GAIN_CURR_RMS_REG 0x006C
187 #define PWRMETER_DC_GAIN_VOLT_RMS_REG 0x006E
188 #define PWRMETER_DC_GAIN_ACTIVE_PWR_REG 0x0070
189 #define PWRMETER_DC_OFFSET_CURR_RMS_REG 0x0072
190 #define PWRMETER_DC_OFFSET_AVTIVE_PWR_REG 0x0074
191 #define PWRMETER_OFFCAL_MSB_REG 0x007A
192 #define PWRMETER_OFFCAL_CH0_REG 0x007C
193 #define PWRMETER_OFFCAL_CH1_REG 0x007E
194 #define PWRMETER_TEMP_POS_COMP_FREQ_REG 0x0080
195 #define PWRMETER_TEMP_NEG_COMP_FREQ_REG 0x0082
196 #define PWRMETER_TEMP_POS_COMP_CURR_REG 0x0084
197 #define PWRMETER_TEMP_NEG_COMP_CURR_REG 0x0086
198 #define PWRMETER_TEMP_POS_COMP_PWR_REG 0x0088
199 #define PWRMETER_TEMP_NEG_COMP_PWR_REG 0x008A
200 #define PWRMETER_SYS_CONFIG_REG 0x0094
201 #define PWRMETER_EVENT_CONFIG_REG 0x0098
202 #define PWRMETER_RANGE_REG 0x009C
203 #define PWRMETER_CALIB_CURR_REG 0x00A0
204 #define PWRMETER_CALIB_VOLT_REG 0x00A4
205 #define PWRMETER_CALIB_PWR_ACTIVE_REG 0x00A6
206 #define PWRMETER_CALIB_PWR_REACTIVE_REG 0x00AA
207 #define PWRMETER_APP_PWR_DIV_DIG_REG 0x00BE
208 #define PWRMETER_ACCUM_INTER_PAR_REG 0x00C0
209 #define PWRMETER_PWM_PERIOD_REG 0x00C2
210 #define PWRMETER_PWM_DUTY_CYCLE_REG 0x00C4
211 #define PWRMETER_MIN_MAX_POINTER1_REG 0x00C6
212 #define PWRMETER_MIN_MAX_POINTER2_REG 0x00C8
213 #define PWRMETER_LINE_FREQ_REF_REG 0x00CA
214 #define PWRMETER_THERM_VOLT_CALIB_REG 0x00CC
215 #define PWRMETER_VOLT_SAG_LIMIT_REG 0x00CE
216 #define PWRMETER_VOLT_SURGE_LIMIT_REG 0x00D0
217 #define PWRMETER_OVER_CURR_LIMIT_REG 0x00D2
218 #define PWRMETER_OVER_PWR_LIMIT_REG 0x00D6
219 #define PWRMETER_OVER_TEMP_LIMIT_REG 0x00DA
220 #define PWRMETER_VOLT_LOW_THRESHOLD_REG 0x00DC
221 #define PWRMETER_VOLT_HIGH_THRESHOLD_REG 0x00DE
222 #define PWRMETER_NO_LOAD_THRESHOLD_REG 0x00E0
223 
228 #define PWRMETER_VOLT_GAIN_32 0x28000000
229 #define PWRMETER_VOLT_GAIN_16 0x20000000
230 #define PWRMETER_VOLT_GAIN_8 0x18000000
231 #define PWRMETER_VOLT_GAIN_4 0x10000000
232 #define PWRMETER_VOLT_GAIN_2 0x08000000
233 #define PWRMETER_VOLT_GAIN_1 0x00000000
234 #define PWRMETER_CURR_GAIN_32 0x05000000
235 #define PWRMETER_CURR_GAIN_16 0x04000000
236 #define PWRMETER_CURR_GAIN_8 0x03000000
237 #define PWRMETER_CURR_GAIN_4 0x02000000
238 #define PWRMETER_CURR_GAIN_2 0x01000000
239 #define PWRMETER_CURR_GAIN_1 0x00000000
240 #define PWRMETER_UART_BR_1200 0x0000E000
241 #define PWRMETER_UART_BR_2400 0x0000C000
242 #define PWRMETER_UART_BR_4800 0x0000A000
243 #define PWRMETER_UART_BR_9600 0x00008000
244 #define PWRMETER_UART_BR_19200 0x00006000
245 #define PWRMETER_UART_BR_38400 0x00004000
246 #define PWRMETER_UART_BR_57600 0x00002000
247 #define PWRMETER_UART_BR_115200 0x00000000
248 #define PWRMETER_ZCD_INVERTED 0x00001000
249 #define PWRMETER_ZCD_OUTPUT_DISABLED 0x00000400
250 #define PWRMETER_SINGLE_WIRE_EN 0x00000100
251 #define PWRMETER_TEMP_COMP_EN 0x00000080
252 #define PWRMETER_BOTH_RESET 0x00000060
253 #define PWRMETER_VOLT_RESET 0x00000040
254 #define PWRMETER_CURR_RESET 0x00000020
255 #define PWRMETER_BOTH_SHUTDOWN 0x00000018
256 #define PWRMETER_VOLT_SHUTDOWN 0x00000010
257 #define PWRMETER_CURR_SHUTDOWN 0x00000008
258 #define PWRMETER_INT_VOLT_REF_DISABLED 0x00000004
259 #define PWRMETER_PWM_TURNED_ON 0x00000002
260 #define PWRMETER_ENERGY_ON 0x00000001
261 
266 #define DRV_RX_BUFFER_SIZE 500
267  // End group macro
270 // --------------------------------------------------------------- PUBLIC TYPES
278 typedef struct
279 {
280  // Output pins
281 
282  digital_out_t en;
283 
284  // Modules
285 
286  uart_t uart;
287 
288  char uart_rx_buffer[ DRV_RX_BUFFER_SIZE ];
289  char uart_tx_buffer[ DRV_RX_BUFFER_SIZE ];
290 
291 } pwrmeter_t;
292 
296 typedef struct
297 {
298  // Communication gpio pins
299 
300  pin_name_t rx_pin;
301  pin_name_t tx_pin;
302 
303  // Additional gpio pins
304 
305  pin_name_t en;
306 
307  // static variable
308 
309  uint32_t baud_rate; // Clock speed.
311  uart_data_bits_t data_bit; // Data bits.
312  uart_parity_t parity_bit; // Parity bit.
313  uart_stop_bits_t stop_bit; // Stop bits.
314 
316 
320 typedef uint8_t pwrmeter_error_t;
321  // End types group
323 // ----------------------------------------------- PUBLIC FUNCTION DECLARATIONS
324 
330 #ifdef __cplusplus
331 extern "C"{
332 #endif
333 
343 
353 
362 
373 void pwrmeter_generic_write ( pwrmeter_t *ctx, char *data_buf, uint16_t len );
374 
387 int32_t pwrmeter_generic_read ( pwrmeter_t *ctx, char *data_buf, uint16_t max_len );
388 
401 PWRMETER_RETVAL pwrmeter_read_reg_bytes ( pwrmeter_t *ctx, uint16_t reg_addr, uint8_t n_bytes, uint8_t *data_out );
402 
414 PWRMETER_RETVAL pwrmeter_read_reg_word ( pwrmeter_t *ctx, uint16_t register_addr, uint16_t *data_out );
415 
427 PWRMETER_RETVAL pwrmeter_read_reg_dword ( pwrmeter_t *ctx, uint16_t register_addr, uint32_t *data_out );
428 
441 PWRMETER_RETVAL pwrmeter_read_reg_signed ( pwrmeter_t *ctx, uint16_t register_addr, uint8_t data_mode, int32_t *data_out );
442 
455 PWRMETER_RETVAL pwrmeter_write_reg_bytes ( pwrmeter_t *ctx, uint16_t reg_addr, uint8_t n_bytes, uint8_t *data_in );
456 
468 PWRMETER_RETVAL pwrmeter_write_reg_word ( pwrmeter_t *ctx, uint16_t register_addr, uint16_t data_in );
469 
481 PWRMETER_RETVAL pwrmeter_write_reg_dword ( pwrmeter_t *ctx, uint16_t register_addr, uint32_t data_in );
482 
495 PWRMETER_RETVAL pwrmeter_write_reg_signed ( pwrmeter_t *ctx, uint16_t register_addr, uint8_t data_mode, int32_t data_in );
496 
507 PWRMETER_RETVAL pwrmeter_send_command ( pwrmeter_t *ctx, uint8_t command_byte );
508 
520 PWRMETER_RETVAL pwrmeter_read_page_eeprom ( pwrmeter_t *ctx, uint8_t page_num, uint16_t *data_out );
521 
533 PWRMETER_RETVAL pwrmeter_write_page_eeprom ( pwrmeter_t *ctx, uint8_t page_num, uint16_t *data_in );
534 
546 PWRMETER_RETVAL pwrmeter_get_status ( pwrmeter_t *ctx, uint8_t *status_data );
547 
556 void pwrmeter_enable ( pwrmeter_t *ctx, uint8_t state );
557 
558 #ifdef __cplusplus
559 }
560 #endif
561 #endif // _PWRMETER_H_
562  // End public_function group
565 
566 // ------------------------------------------------------------------------- END
pwrmeter_write_reg_bytes
PWRMETER_RETVAL pwrmeter_write_reg_bytes(pwrmeter_t *ctx, uint16_t reg_addr, uint8_t n_bytes, uint8_t *data_in)
Bytes Write function.
DRV_RX_BUFFER_SIZE
#define DRV_RX_BUFFER_SIZE
Definition: pwrmeter.h:266
pwrmeter_cfg_t::en
pin_name_t en
Definition: pwrmeter.h:305
pwrmeter_t
Click ctx object definition.
Definition: pwrmeter.h:279
pwrmeter_init
PWRMETER_RETVAL pwrmeter_init(pwrmeter_t *ctx, pwrmeter_cfg_t *cfg)
Initialization function.
pwrmeter_enable
void pwrmeter_enable(pwrmeter_t *ctx, uint8_t state)
Enable function.
pwrmeter_send_command
PWRMETER_RETVAL pwrmeter_send_command(pwrmeter_t *ctx, uint8_t command_byte)
Command Send function.
pwrmeter_cfg_t
Click configuration structure definition.
Definition: pwrmeter.h:297
pwrmeter_read_reg_signed
PWRMETER_RETVAL pwrmeter_read_reg_signed(pwrmeter_t *ctx, uint16_t register_addr, uint8_t data_mode, int32_t *data_out)
Signed Data Read function.
pwrmeter_read_page_eeprom
PWRMETER_RETVAL pwrmeter_read_page_eeprom(pwrmeter_t *ctx, uint8_t page_num, uint16_t *data_out)
EEPROM Read function.
pwrmeter_cfg_t::baud_rate
uint32_t baud_rate
Definition: pwrmeter.h:309
pwrmeter_t::uart
uart_t uart
Definition: pwrmeter.h:286
pwrmeter_read_reg_dword
PWRMETER_RETVAL pwrmeter_read_reg_dword(pwrmeter_t *ctx, uint16_t register_addr, uint32_t *data_out)
DWORD Read function.
pwrmeter_cfg_t::stop_bit
uart_stop_bits_t stop_bit
Definition: pwrmeter.h:313
pwrmeter_error_t
uint8_t pwrmeter_error_t
Error type.
Definition: pwrmeter.h:320
PWRMETER_RETVAL
#define PWRMETER_RETVAL
Definition: pwrmeter.h:73
pwrmeter_read_reg_word
PWRMETER_RETVAL pwrmeter_read_reg_word(pwrmeter_t *ctx, uint16_t register_addr, uint16_t *data_out)
WORD Read function.
pwrmeter_write_reg_word
PWRMETER_RETVAL pwrmeter_write_reg_word(pwrmeter_t *ctx, uint16_t register_addr, uint16_t data_in)
WORD Write function.
pwrmeter_generic_read
int32_t pwrmeter_generic_read(pwrmeter_t *ctx, char *data_buf, uint16_t max_len)
Generic read function.
pwrmeter_cfg_t::data_bit
uart_data_bits_t data_bit
Definition: pwrmeter.h:311
pwrmeter_read_reg_bytes
PWRMETER_RETVAL pwrmeter_read_reg_bytes(pwrmeter_t *ctx, uint16_t reg_addr, uint8_t n_bytes, uint8_t *data_out)
Bytes Read function.
pwrmeter_get_status
PWRMETER_RETVAL pwrmeter_get_status(pwrmeter_t *ctx, uint8_t *status_data)
Status Get function.
pwrmeter_cfg_setup
void pwrmeter_cfg_setup(pwrmeter_cfg_t *cfg)
Config Object Initialization function.
pwrmeter_write_reg_dword
PWRMETER_RETVAL pwrmeter_write_reg_dword(pwrmeter_t *ctx, uint16_t register_addr, uint32_t data_in)
DWORD Write function.
pwrmeter_cfg_t::rx_pin
pin_name_t rx_pin
Definition: pwrmeter.h:300
pwrmeter_generic_write
void pwrmeter_generic_write(pwrmeter_t *ctx, char *data_buf, uint16_t len)
Generic write function.
pwrmeter_t::en
digital_out_t en
Definition: pwrmeter.h:282
pwrmeter_cfg_t::tx_pin
pin_name_t tx_pin
Definition: pwrmeter.h:301
pwrmeter_write_reg_signed
PWRMETER_RETVAL pwrmeter_write_reg_signed(pwrmeter_t *ctx, uint16_t register_addr, uint8_t data_mode, int32_t data_in)
Signed Data Write function.
pwrmeter_cfg_t::uart_blocking
bool uart_blocking
Definition: pwrmeter.h:310
pwrmeter_write_page_eeprom
PWRMETER_RETVAL pwrmeter_write_page_eeprom(pwrmeter_t *ctx, uint8_t page_num, uint16_t *data_in)
EEPROM Write function.
pwrmeter_default_cfg
void pwrmeter_default_cfg(pwrmeter_t *ctx)
Click Default Configuration function.
pwrmeter_cfg_t::parity_bit
uart_parity_t parity_bit
Definition: pwrmeter.h:312