Library files for AD1234.

Committer:
mlambe
Date:
Tue Oct 15 12:06:51 2019 +0000
Revision:
2:f9a986799375
Parent:
1:2eb9d6296ec3
Child:
3:6c708642886d
Updated comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mlambe 1:2eb9d6296ec3 1 /**
mlambe 1:2eb9d6296ec3 2 * @file ADE120x.h
mlambe 1:2eb9d6296ec3 3 * @brief ADE120x library. This file contains all ADE120x library functions.
mlambe 1:2eb9d6296ec3 4 * @version V0.0.1
mlambe 1:2eb9d6296ec3 5 * @author ADI
mlambe 2:f9a986799375 6 * @date October 2019
mlambe 1:2eb9d6296ec3 7 * @par Revision History:
mlambe 1:2eb9d6296ec3 8 *
mlambe 1:2eb9d6296ec3 9 * Copyright (c) 2017-2019 Analog Devices, Inc. All Rights Reserved.
mlambe 1:2eb9d6296ec3 10 *
mlambe 1:2eb9d6296ec3 11 * This software is proprietary to Analog Devices, Inc. and its licensors.
mlambe 1:2eb9d6296ec3 12 * By using this software you agree to the terms of the associated
mlambe 1:2eb9d6296ec3 13 * Analog Devices Software License Agreement.
mlambe 1:2eb9d6296ec3 14 **/
mlambe 2:f9a986799375 15
mlambe 1:2eb9d6296ec3 16 #ifndef _ADE120x_h_
mlambe 1:2eb9d6296ec3 17 #define _ADE120x_h_
mlambe 1:2eb9d6296ec3 18
mlambe 1:2eb9d6296ec3 19 #include "stdio.h"
mlambe 1:2eb9d6296ec3 20 #include "math.h"
mlambe 1:2eb9d6296ec3 21 #include "string.h"
mlambe 1:2eb9d6296ec3 22 #include <stdint.h>
mlambe 1:2eb9d6296ec3 23
mlambe 1:2eb9d6296ec3 24 #include "mbed.h"
mlambe 1:2eb9d6296ec3 25
mlambe 2:f9a986799375 26
mlambe 2:f9a986799375 27 /**
mlambe 2:f9a986799375 28 * Structure for configuring threshold levels
mlambe 2:f9a986799375 29 */
mlambe 2:f9a986799375 30 typedef struct threshold{
mlambe 2:f9a986799375 31 float BIN_HighThresh; /** Binary channel high threshold */
mlambe 2:f9a986799375 32 float BIN_LowThresh; /** Binary channel low threshold */
mlambe 2:f9a986799375 33 float WARNA_HighThresh; /** WARNA channel high threshold */
mlambe 2:f9a986799375 34 float WARNA_LowThresh; /** WARNA channel Low threshold */
mlambe 2:f9a986799375 35 float WARNB_HighThresh; /** WARNB channel high threshold */
mlambe 2:f9a986799375 36 float WARNB_LowThresh; /** WARNB channel Low threshold */
mlambe 2:f9a986799375 37 float WARNC_HighThresh; /** WARNC channel high threshold */
mlambe 2:f9a986799375 38 float WARNC_LowThresh; /** WARNC channel Low threshold */
mlambe 2:f9a986799375 39 uint8_t BIN_Mode; /** Binary Channel comparator mode */
mlambe 2:f9a986799375 40 uint8_t WARNA_Mode; /** WARNA Channel comparator mode */
mlambe 2:f9a986799375 41 uint8_t WARNB_Mode; /** WARNB Channel comparator mode */
mlambe 2:f9a986799375 42 uint8_t WARNC_Mode; /** WARNC Channel comparator mode */
mlambe 2:f9a986799375 43 uint8_t ADCPga; /** ADC PGA setting */
mlambe 2:f9a986799375 44 float VGain; /** Voltage divider gain */
mlambe 1:2eb9d6296ec3 45 }THRESHCfg_Type;
mlambe 2:f9a986799375 46
mlambe 2:f9a986799375 47 /**
mlambe 2:f9a986799375 48 * Structure for setting programmable load
mlambe 2:f9a986799375 49 */
mlambe 1:2eb9d6296ec3 50 typedef struct{
mlambe 1:2eb9d6296ec3 51 uint8_t enable; /** Enable PL */
mlambe 2:f9a986799375 52 uint8_t mode; /** Configure mode, HIGH_IDLE, LOW_IDLE */
mlambe 2:f9a986799375 53 float HighCurrent; /** High current in mA */
mlambe 1:2eb9d6296ec3 54 float LowCurrent; /** Low current in mA */
mlambe 1:2eb9d6296ec3 55 float HighTime; /** Duration of current pulse in us */
mlambe 1:2eb9d6296ec3 56 float VoltThresh; /** VOltage threshold to trigger programmable load */
mlambe 1:2eb9d6296ec3 57 uint8_t ADCPga; /** ADC PGA setting */
mlambe 2:f9a986799375 58 float VGain; /** Voltage gain set by external resister divider */
mlambe 1:2eb9d6296ec3 59 }PLOADCfg_Type;
mlambe 1:2eb9d6296ec3 60
mlambe 2:f9a986799375 61 /**
mlambe 2:f9a986799375 62 * Structure for configuring energy meter
mlambe 2:f9a986799375 63 */
mlambe 1:2eb9d6296ec3 64 typedef struct{
mlambe 2:f9a986799375 65 uint8_t enable; /** Enable energy meter function */
mlambe 2:f9a986799375 66 float FET_Energy; /** SOA energy of exernal FET used */
mlambe 1:2eb9d6296ec3 67 float PulseMagnitude; /** AMplitude of current pulse in mA */
mlambe 2:f9a986799375 68 float PulseTime; /** Length of current pulse in ms */
mlambe 1:2eb9d6296ec3 69 float WorkingVoltage; /** Working voltage of system in V*/
mlambe 1:2eb9d6296ec3 70 uint32_t AvgADCCode; /** Average ADC code */
mlambe 2:f9a986799375 71 float SampleRate; /** Sample rate, 20us for ADE1202, 10us foe ADE1201 */
mlambe 2:f9a986799375 72 uint8_t Cooldown_TimeStep; /** Set cooldown timestep */
mlambe 2:f9a986799375 73 uint8_t Cooldown_Decr; /* Set cooldown decrement */
mlambe 2:f9a986799375 74 uint8_t Cooldown_Sec; /** Set cooldown period */
mlambe 2:f9a986799375 75 uint8_t Ov_Scale; /** Set over voltage scale factor */
mlambe 2:f9a986799375 76 uint8_t ADCPga; /** ADC PGA setting */
mlambe 2:f9a986799375 77 float VGain; /** Voltage gain set by external resister divider */
mlambe 1:2eb9d6296ec3 78 }EnergyMtrCfg_Type;
mlambe 1:2eb9d6296ec3 79
mlambe 2:f9a986799375 80 /**
mlambe 2:f9a986799375 81 * Data sreuture for reading back register data
mlambe 2:f9a986799375 82 */
mlambe 1:2eb9d6296ec3 83 typedef struct{
mlambe 1:2eb9d6296ec3 84 uint16_t reg_addr;
mlambe 1:2eb9d6296ec3 85 uint32_t reg_data;
mlambe 1:2eb9d6296ec3 86 }RegisterData_Type;
mlambe 1:2eb9d6296ec3 87
mlambe 1:2eb9d6296ec3 88 /******* REGISTER DEFINITION ***********/
mlambe 1:2eb9d6296ec3 89
mlambe 1:2eb9d6296ec3 90 #define REG_LOCK 0x000
mlambe 1:2eb9d6296ec3 91 #define REG_CTRL 0x001
mlambe 1:2eb9d6296ec3 92 #define REG_BIN_CTRL 0x002
mlambe 1:2eb9d6296ec3 93 #define REG_BIN_THR 0x003
mlambe 1:2eb9d6296ec3 94 #define REG_WARNA_THR 0x004
mlambe 1:2eb9d6296ec3 95 #define REG_WARNB_THR 0x005
mlambe 1:2eb9d6296ec3 96 #define REG_WARNC_THR 0x006
mlambe 1:2eb9d6296ec3 97 #define REG_BIN_FILTER 0x007
mlambe 1:2eb9d6296ec3 98 #define REG_WARNA_FILTER 0x008
mlambe 1:2eb9d6296ec3 99 #define REG_WARNB_FILTER 0x009
mlambe 1:2eb9d6296ec3 100 #define REG_WARNC_FILTER 0x00A
mlambe 1:2eb9d6296ec3 101 #define REG_MASK 0x00B
mlambe 1:2eb9d6296ec3 102 #define REG_INT_STATUS 0x00C
mlambe 1:2eb9d6296ec3 103 #define REG_STATUS 0x00D
mlambe 1:2eb9d6296ec3 104 #define REG_ADC 0x00E
mlambe 1:2eb9d6296ec3 105 #define REG_ADCDEC 0x00F
mlambe 1:2eb9d6296ec3 106 #define REG_PL_CTRL 0x010
mlambe 1:2eb9d6296ec3 107 #define REG_PL_RISE_THR 0x011
mlambe 1:2eb9d6296ec3 108 #define REG_PL_LOW_CODE 0x012
mlambe 1:2eb9d6296ec3 109 #define REG_PL_HIGH_CODE 0x013
mlambe 1:2eb9d6296ec3 110 #define REG_PL_HIGH_TIME 0x014
mlambe 1:2eb9d6296ec3 111 #define REG_EGY_MTR_CTRL 0x015
mlambe 1:2eb9d6296ec3 112 #define REG_EGY_MTR_THR 0x016
mlambe 1:2eb9d6296ec3 113 #define REG_EGY_MTR1 0x017
mlambe 1:2eb9d6296ec3 114 #define REG_PL_EN 0x200
mlambe 1:2eb9d6296ec3 115 #define REG_PGA_GAIN 0x201
mlambe 1:2eb9d6296ec3 116
mlambe 1:2eb9d6296ec3 117 /**************************************/
mlambe 1:2eb9d6296ec3 118
mlambe 1:2eb9d6296ec3 119 /******** BIT DEFINITION **************/
mlambe 2:f9a986799375 120 /** Config_LOCK **/
mlambe 2:f9a986799375 121 #define DEV_UNLOCK 0xADE0
mlambe 2:f9a986799375 122 #define DEV_LOCK 0xADE1
mlambe 1:2eb9d6296ec3 123
mlambe 2:f9a986799375 124 /** CTRL **/
mlambe 2:f9a986799375 125 #define DEV_ADE1201 0x0
mlambe 2:f9a986799375 126 #define DEV_ADE1202 0x1000
mlambe 2:f9a986799375 127 #define SW_RST 0x10
mlambe 2:f9a986799375 128 #define ADDR_RELOAD 0x8
mlambe 2:f9a986799375 129 #define ADE1202_IRQ 0x4
mlambe 2:f9a986799375 130 #define CRC_EN 0x1
mlambe 1:2eb9d6296ec3 131
mlambe 2:f9a986799375 132 /** BIN_CTRL **/
mlambe 2:f9a986799375 133 #define Mode_Hysteretic 0
mlambe 2:f9a986799375 134 #define Mode_Inbetween 1
mlambe 2:f9a986799375 135 #define Mode_Greater 2
mlambe 2:f9a986799375 136 #define Mode_LessEqual 3
mlambe 2:f9a986799375 137 #define Decrate_Bypass 0
mlambe 2:f9a986799375 138 #define Decrate_2 1
mlambe 2:f9a986799375 139 #define Decrate_4 2
mlambe 2:f9a986799375 140 #define Decrate_8 3
mlambe 1:2eb9d6296ec3 141
mlambe 2:f9a986799375 142 /** xxx_FILTER **/
mlambe 2:f9a986799375 143 #define Filter_En (1<<15)
mlambe 2:f9a986799375 144 #define Filter_UpDown (1<<14)
mlambe 1:2eb9d6296ec3 145
mlambe 2:f9a986799375 146 /** Interrupt source selection. These sources are defined as bit mask.
mlambe 2:f9a986799375 147 * They are available for register INT_STATUS and STATUS **/
mlambe 1:2eb9d6296ec3 148 #define INTSRC_DOUT1 0x0001 /**< Bit0, DOUT1 */
mlambe 1:2eb9d6296ec3 149 #define INTSRC_WARNA1 0x0002 /**< Bit1, Warning A from channel 1 */
mlambe 1:2eb9d6296ec3 150 #define INTSRC_WARNB1 0x0004 /**< Bit2, Warning B from channel 1 */
mlambe 1:2eb9d6296ec3 151 #define INTSRC_WARNC1 0x0008 /**< Bit3, Warning C from channel 1 */
mlambe 1:2eb9d6296ec3 152 #define INTSRC_DOUT2 0x0010 /**< Bit4, DOUT2 */
mlambe 1:2eb9d6296ec3 153 #define INTSRC_WARNA2 0x0020 /**< Bit5, Warning A from channel 2 */
mlambe 1:2eb9d6296ec3 154 #define INTSRC_WARNB2 0x0040 /**< Bit6, Warning B from channel 2 */
mlambe 1:2eb9d6296ec3 155 #define INTSRC_WARNC2 0x0080 /**< Bit7, Warning C from channel 2 */
mlambe 1:2eb9d6296ec3 156 #define INTSRC_MEMFLT 0x0100 /**< Bit8, Memory fault. After a memory fault is detected the user could reconfigure the device. */
mlambe 1:2eb9d6296ec3 157 #define INTSRC_COMFLT 0x0200 /**< Bit9, Communication fault */
mlambe 1:2eb9d6296ec3 158 #define INTSRC_TSD 0x0400 /**< Bit10, Thermal shutdown detected */
mlambe 1:2eb9d6296ec3 159 #define INTSRC_COOLDOWN1 0x0800 /**< Bit12, Channel 1 is in Cooldown mode */
mlambe 1:2eb9d6296ec3 160 #define INTSRC_COOLDOWN2 0x1000 /**< Bit13, Channel 2 is in Cooldown mode */
mlambe 1:2eb9d6296ec3 161 #define INTSRC_BUSY 0x2000 /**< Bit13, During busy assertion, internal communication is in progress. Once busy is deasserted, an irq can be triggered which indicates normal operation has resumed */
mlambe 1:2eb9d6296ec3 162 #define INTSRC_RSTDONE 0x4000 /**< Bit14, Indicates that the device has reset and is ready to be programmed or begin default normal operation */
mlambe 2:f9a986799375 163 #define INTSRC_ALL 0x7FFF /**< All bits. Used to clear all interrupt sources */
mlambe 2:f9a986799375 164
mlambe 2:f9a986799375 165 /** ADC **/
mlambe 2:f9a986799375 166 #define ADC_RAW 0
mlambe 2:f9a986799375 167 #define ADC_DECIMATOR 1
mlambe 2:f9a986799375 168
mlambe 2:f9a986799375 169 /** PL_CTRL **/
mlambe 2:f9a986799375 170 #define LOW_IDLE 0
mlambe 2:f9a986799375 171 #define HIGH_IDLE 1
mlambe 2:f9a986799375 172
mlambe 2:f9a986799375 173 /** EGY_MTR_CTRL **/
mlambe 2:f9a986799375 174 #define OV_SCALE_1 0
mlambe 2:f9a986799375 175 #define OV_SCALE_4 1
mlambe 2:f9a986799375 176 #define OV_SCALE_8 2
mlambe 2:f9a986799375 177 #define OV_SCALE_16 3
mlambe 2:f9a986799375 178
mlambe 1:2eb9d6296ec3 179
mlambe 2:f9a986799375 180 typedef enum
mlambe 2:f9a986799375 181 {
mlambe 2:f9a986799375 182 COOLDOWN_TS_10us = 0,
mlambe 2:f9a986799375 183 COOLDOWN_TS_20us = 1,
mlambe 2:f9a986799375 184 COOLDOWN_TS_40us = 2,
mlambe 2:f9a986799375 185 COOLDOWN_TS_80us = 3
mlambe 2:f9a986799375 186 }COOLDOWN_TIMESTAMP;
mlambe 2:f9a986799375 187
mlambe 2:f9a986799375 188 #define CH1_Enable 1
mlambe 2:f9a986799375 189 #define CH2_Enable 2
mlambe 2:f9a986799375 190 #define CH1_CH2_Enable 3
mlambe 2:f9a986799375 191 #define CH1_Disable 0
mlambe 2:f9a986799375 192 #define CH2_disable 0
mlambe 2:f9a986799375 193 #define CH1_CH2_Disable 0
mlambe 2:f9a986799375 194
mlambe 2:f9a986799375 195 /** PL_EN **/
mlambe 2:f9a986799375 196 #define PL_CH2_ENABLE (1<<15)
mlambe 2:f9a986799375 197 #define PL_CH1_ENABLE (1<<14)
mlambe 2:f9a986799375 198 #define PL_CH2_DISABLE (0<<15)
mlambe 2:f9a986799375 199 #define PL_CH1_DISABLE (0<<14)
mlambe 2:f9a986799375 200
mlambe 2:f9a986799375 201 /** PGA_GAIN **/
mlambe 2:f9a986799375 202 #define ADCPGA_1 1
mlambe 2:f9a986799375 203 #define ADCPGA_2 3
mlambe 2:f9a986799375 204 #define ADCPGA_5 7
mlambe 2:f9a986799375 205 #define ADCPGA_10 0xF
mlambe 2:f9a986799375 206
mlambe 1:2eb9d6296ec3 207
mlambe 1:2eb9d6296ec3 208 /**
mlambe 1:2eb9d6296ec3 209 * Method to identify ADE120x
mlambe 1:2eb9d6296ec3 210 * [15:14][13:12][11:9] [8:5]
mlambe 1:2eb9d6296ec3 211 * [ RES ][MODEL][Addr][RevIf]
mlambe 1:2eb9d6296ec3 212 *
mlambe 1:2eb9d6296ec3 213 */
mlambe 2:f9a986799375 214 #define ADE120x_Model(data) ((((uint32_t)data)>>12)&0x3) /**< Return model. 0: ADE1201, 1:ADE1202 */
mlambe 2:f9a986799375 215 #define ADE120x_ChipAddr(data) ((((uint32_t)data)>>9)&0x7) /**< Return Chip address*/
mlambe 2:f9a986799375 216 #define ADE120x_RevId(data) ((((uint32_t)data)>>5)&0xf) /**< Return silicon rev ID */
mlambe 1:2eb9d6296ec3 217
mlambe 1:2eb9d6296ec3 218 class ADE120x{
mlambe 1:2eb9d6296ec3 219 public:
mlambe 1:2eb9d6296ec3 220 ADE120x(PinName mosi, PinName miso, PinName sclk, PinName cs);
mlambe 1:2eb9d6296ec3 221
mlambe 1:2eb9d6296ec3 222 void WriteReg(uint8_t addr, uint32_t reg_addr, uint32_t data);
mlambe 1:2eb9d6296ec3 223 uint32_t ReadReg(uint8_t addr, uint32_t reg_addr);
mlambe 1:2eb9d6296ec3 224
mlambe 1:2eb9d6296ec3 225
mlambe 1:2eb9d6296ec3 226 uint8_t Reset(uint8_t addr);
mlambe 1:2eb9d6296ec3 227 uint16_t GetDevID(uint8_t addr);
mlambe 1:2eb9d6296ec3 228 void UnLock(uint8_t addr);
mlambe 1:2eb9d6296ec3 229 void Lock(uint8_t addr);
mlambe 1:2eb9d6296ec3 230 uint8_t DefaultConfig(uint8_t addr);
mlambe 1:2eb9d6296ec3 231
mlambe 1:2eb9d6296ec3 232 void ClearIntStatus(uint8_t addr, uint16_t IntSrcSel);
mlambe 1:2eb9d6296ec3 233 uint16_t GetIntStatus(uint8_t addr);
mlambe 1:2eb9d6296ec3 234 void SetInt(uint8_t addr, uint16_t IntSrcSel);
mlambe 1:2eb9d6296ec3 235
mlambe 1:2eb9d6296ec3 236 void SetBinaryThresh(uint8_t addr, uint16_t thresh);
mlambe 1:2eb9d6296ec3 237 uint8_t CalculateThreshCode(float V_Thresh, uint8_t ADCPga, float V_Gain);
mlambe 1:2eb9d6296ec3 238 uint8_t ThresholdCfg(uint8_t addr, THRESHCfg_Type *pCfg);
mlambe 1:2eb9d6296ec3 239 uint8_t ProgrammableLoadCfg(uint8_t addr, PLOADCfg_Type *pCfg);
mlambe 1:2eb9d6296ec3 240 uint8_t EnergyMtrCfg(uint8_t addr, EnergyMtrCfg_Type *pCfg);
mlambe 1:2eb9d6296ec3 241
mlambe 1:2eb9d6296ec3 242 void SetPgaGain(uint8_t addr, uint16_t gain);
mlambe 1:2eb9d6296ec3 243 uint8_t ReadADC(uint8_t addr, int8_t src);
mlambe 1:2eb9d6296ec3 244 float ADCCode2Volt(uint32_t ADCCode, uint8_t ADCPga, float VOLTAGE_Gain);
mlambe 1:2eb9d6296ec3 245 void GetRegisterData(uint8_t addr, RegisterData_Type *pBuff);
mlambe 1:2eb9d6296ec3 246 private:
mlambe 1:2eb9d6296ec3 247 SPI spi_;
mlambe 1:2eb9d6296ec3 248 DigitalOut nCS_;
mlambe 1:2eb9d6296ec3 249
mlambe 1:2eb9d6296ec3 250 };
mlambe 1:2eb9d6296ec3 251
mlambe 1:2eb9d6296ec3 252 #endif