1*942ab02bSAntoniu Miclaus.. SPDX-License-Identifier: GPL-2.0 2*942ab02bSAntoniu Miclaus 3*942ab02bSAntoniu Miclaus=============== 4*942ab02bSAntoniu MiclausADE9000 driver 5*942ab02bSAntoniu Miclaus=============== 6*942ab02bSAntoniu Miclaus 7*942ab02bSAntoniu MiclausThis driver supports Analog Device's ADE9000 energy measurement IC on SPI bus. 8*942ab02bSAntoniu Miclaus 9*942ab02bSAntoniu Miclaus1. Supported devices 10*942ab02bSAntoniu Miclaus==================== 11*942ab02bSAntoniu Miclaus 12*942ab02bSAntoniu Miclaus* `ADE9000 <https://www.analog.com/media/en/technical-documentation/data-sheets/ADE9000.pdf>`_ 13*942ab02bSAntoniu Miclaus 14*942ab02bSAntoniu MiclausThe ADE9000 is a highly accurate, fully integrated, multiphase energy and power 15*942ab02bSAntoniu Miclausquality monitoring device. Superior analog performance and a digital signal 16*942ab02bSAntoniu Miclausprocessing (DSP) core enable accurate energy monitoring over a wide dynamic 17*942ab02bSAntoniu Miclausrange. An integrated high end reference ensures low drift over temperature 18*942ab02bSAntoniu Miclauswith a combined drift of less than ±25 ppm/°C maximum for the entire channel 19*942ab02bSAntoniu Miclausincluding a programmable gain amplifier (PGA) and an analog-to-digital 20*942ab02bSAntoniu Miclausconverter (ADC). 21*942ab02bSAntoniu Miclaus 22*942ab02bSAntoniu Miclaus2. Device attributes 23*942ab02bSAntoniu Miclaus==================== 24*942ab02bSAntoniu Miclaus 25*942ab02bSAntoniu MiclausPower and energy measurements are provided for voltage, current, active power, 26*942ab02bSAntoniu Miclausreactive power, apparent power, and power factor across three phases. 27*942ab02bSAntoniu Miclaus 28*942ab02bSAntoniu MiclausEach IIO device has a device folder under ``/sys/bus/iio/devices/iio:deviceX``, 29*942ab02bSAntoniu Miclauswhere X is the IIO index of the device. Under these folders reside a set of 30*942ab02bSAntoniu Miclausdevice files, depending on the characteristics and features of the hardware 31*942ab02bSAntoniu Miclausdevice in question. These files are consistently generalized and documented in 32*942ab02bSAntoniu Miclausthe IIO ABI documentation. 33*942ab02bSAntoniu Miclaus 34*942ab02bSAntoniu MiclausThe following tables show the ADE9000 related device files, found in the 35*942ab02bSAntoniu Miclausspecific device folder path ``/sys/bus/iio/devices/iio:deviceX``. 36*942ab02bSAntoniu Miclaus 37*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 38*942ab02bSAntoniu Miclaus| Current measurement related device files | Description | 39*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 40*942ab02bSAntoniu Miclaus| in_current[0-2]_raw | Raw current measurement for phases A, B, C. | 41*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 42*942ab02bSAntoniu Miclaus| in_current[0-2]_scale | Scale for current channels. | 43*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 44*942ab02bSAntoniu Miclaus| in_current[0-2]_calibscale | Calibration gain for current channels (AIGAIN reg). | 45*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 46*942ab02bSAntoniu Miclaus| in_altcurrent[0-2]_rms_raw | RMS current measurement for phases A, B, C. | 47*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 48*942ab02bSAntoniu Miclaus| in_altcurrent[0-2]_rms_scale | Scale for RMS current channels. | 49*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 50*942ab02bSAntoniu Miclaus| in_altcurrent[0-2]_rms_calibbias | RMS offset correction for current channels (IRMSOS reg). | 51*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 52*942ab02bSAntoniu Miclaus 53*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 54*942ab02bSAntoniu Miclaus| Voltage measurement related device files | Description | 55*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 56*942ab02bSAntoniu Miclaus| in_voltage[0-2]_raw | Raw voltage measurement for phases A, B, C. | 57*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 58*942ab02bSAntoniu Miclaus| in_voltage[0-2]_scale | Scale for voltage channels. | 59*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 60*942ab02bSAntoniu Miclaus| in_voltage[0-2]_calibscale | Calibration gain for voltage channels (AVGAIN reg). | 61*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 62*942ab02bSAntoniu Miclaus| in_voltage[0-2]_frequency | Measured line frequency from instantaneous voltage. | 63*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 64*942ab02bSAntoniu Miclaus| in_altvoltage[0-2]_rms_raw | RMS voltage measurement for phases A, B, C. | 65*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 66*942ab02bSAntoniu Miclaus| in_altvoltage[0-2]_rms_scale | Scale for RMS voltage channels. | 67*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 68*942ab02bSAntoniu Miclaus| in_altvoltage[0-2]_rms_calibbias | RMS offset correction for voltage channels (VRMSOS reg). | 69*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 70*942ab02bSAntoniu Miclaus 71*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 72*942ab02bSAntoniu Miclaus| Power measurement related device files | Description | 73*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 74*942ab02bSAntoniu Miclaus| in_power[0-2]_active_raw | Active power measurement for phases A, B, C. | 75*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 76*942ab02bSAntoniu Miclaus| in_power[0-2]_active_scale | Scale for active power channels. | 77*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 78*942ab02bSAntoniu Miclaus| in_power[0-2]_active_calibbias | Calibration offset for active power (xWATTOS regs). | 79*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 80*942ab02bSAntoniu Miclaus| in_power[0-2]_active_calibscale | Calibration gain for active power (APGAIN reg). | 81*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 82*942ab02bSAntoniu Miclaus| in_power[0-2]_reactive_raw | Reactive power measurement for phases A, B, C. | 83*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 84*942ab02bSAntoniu Miclaus| in_power[0-2]_reactive_scale | Scale for reactive power channels. | 85*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 86*942ab02bSAntoniu Miclaus| in_power[0-2]_reactive_calibbias | Calibration offset for reactive power (xVAROS regs). | 87*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 88*942ab02bSAntoniu Miclaus| in_power[0-2]_apparent_raw | Apparent power measurement for phases A, B, C. | 89*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 90*942ab02bSAntoniu Miclaus| in_power[0-2]_apparent_scale | Scale for apparent power channels. | 91*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 92*942ab02bSAntoniu Miclaus| in_power[0-2]_powerfactor | Power factor for phases A, B, C. | 93*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 94*942ab02bSAntoniu Miclaus 95*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 96*942ab02bSAntoniu Miclaus| Energy measurement related device files | Description | 97*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 98*942ab02bSAntoniu Miclaus| in_energy[0-2]_active_raw | Active energy measurement for phases A, B, C. | 99*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 100*942ab02bSAntoniu Miclaus| in_energy[0-2]_reactive_raw | Reactive energy measurement for phases A, B, C. | 101*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 102*942ab02bSAntoniu Miclaus| in_energy[0-2]_apparent_raw | Apparent energy measurement for phases A, B, C. | 103*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 104*942ab02bSAntoniu Miclaus 105*942ab02bSAntoniu Miclaus+------------------------------+------------------------------------------------------------------+ 106*942ab02bSAntoniu Miclaus| Shared device attributes | Description | 107*942ab02bSAntoniu Miclaus+------------------------------+------------------------------------------------------------------+ 108*942ab02bSAntoniu Miclaus| name | Name of the IIO device. | 109*942ab02bSAntoniu Miclaus+------------------------------+------------------------------------------------------------------+ 110*942ab02bSAntoniu Miclaus| filter_type | Waveform buffer filter type (sinc4, sinc4+lp). | 111*942ab02bSAntoniu Miclaus+------------------------------+------------------------------------------------------------------+ 112*942ab02bSAntoniu Miclaus| filter_type_available | Available filter types for waveform buffer. | 113*942ab02bSAntoniu Miclaus+------------------------------+------------------------------------------------------------------+ 114*942ab02bSAntoniu Miclaus 115*942ab02bSAntoniu Miclaus3. Calibration and scaling 116*942ab02bSAntoniu Miclaus=========================== 117*942ab02bSAntoniu Miclaus 118*942ab02bSAntoniu MiclausThe ADE9000 provides multiple levels of gain and offset correction: 119*942ab02bSAntoniu Miclaus 120*942ab02bSAntoniu Miclaus**Calibration Gain (per-channel)** 121*942ab02bSAntoniu Miclaus Fine-tuning calibration gains applied in the digital domain for each channel type. 122*942ab02bSAntoniu Miclaus Controlled via ``calibscale`` attributes (AIGAIN, AVGAIN, APGAIN registers). 123*942ab02bSAntoniu Miclaus 124*942ab02bSAntoniu Miclaus**Calibration Bias (per-channel)** 125*942ab02bSAntoniu Miclaus Hardware calibration offsets applied by the device internally: 126*942ab02bSAntoniu Miclaus 127*942ab02bSAntoniu Miclaus - Power measurements: Controlled via ``calibbias`` attributes for power channels (xWATTOS, xVAROS registers). 128*942ab02bSAntoniu Miclaus - RMS measurements: Controlled via ``calibbias`` attributes for RMS channels (IRMSOS, VRMSOS registers). 129*942ab02bSAntoniu Miclaus 130*942ab02bSAntoniu Miclaus These are internal chip calibrations, not userspace-applied offsets. 131*942ab02bSAntoniu Miclaus 132*942ab02bSAntoniu Miclaus4. Event attributes 133*942ab02bSAntoniu Miclaus=================== 134*942ab02bSAntoniu Miclaus 135*942ab02bSAntoniu MiclausThe ADE9000 provides various interrupts that are mapped to IIO events. 136*942ab02bSAntoniu MiclausEvent functionality is only available if the corresponding interrupts are 137*942ab02bSAntoniu Miclausconnected in the device tree. 138*942ab02bSAntoniu Miclaus 139*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 140*942ab02bSAntoniu Miclaus| IIO Event Attribute | ADE9000 Datasheet Equivalent | 141*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 142*942ab02bSAntoniu Miclaus| in_voltage[0-2]_thresh_either_en | Zero crossing detection interrupt (ZXVx) | 143*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 144*942ab02bSAntoniu Miclaus| in_altvoltage[0-2]_rms_thresh_rising_en | RMS swell detection interrupt (SWELLx) | 145*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 146*942ab02bSAntoniu Miclaus| in_altvoltage[0-2]_rms_thresh_rising_value | RMS swell threshold (SWELL_LVL register) | 147*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 148*942ab02bSAntoniu Miclaus| in_altvoltage[0-2]_rms_thresh_falling_en | RMS sag/dip detection interrupt (DIPx) | 149*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 150*942ab02bSAntoniu Miclaus| in_altvoltage[0-2]_rms_thresh_falling_value | RMS sag/dip threshold (DIP_LVL register) | 151*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 152*942ab02bSAntoniu Miclaus| in_current[0-2]_thresh_either_en | Current zero crossing detection interrupt (ZXIx) | 153*942ab02bSAntoniu Miclaus+---------------------------------------------------+----------------------------------------------------------+ 154*942ab02bSAntoniu Miclaus 155*942ab02bSAntoniu MiclausEvent directions: 156*942ab02bSAntoniu Miclaus 157*942ab02bSAntoniu Miclaus- ``rising``: Upper threshold crossing (swell detection) 158*942ab02bSAntoniu Miclaus- ``falling``: Lower threshold crossing (sag/dip detection) 159*942ab02bSAntoniu Miclaus- ``either``: Any threshold crossing (zero crossing detection) 160*942ab02bSAntoniu Miclaus- ``none``: Timeout or non-directional events 161*942ab02bSAntoniu Miclaus 162*942ab02bSAntoniu Miclaus**Note**: Event attributes are only available if the corresponding interrupts 163*942ab02bSAntoniu Miclaus(irq0, irq1, dready) are specified in the device tree. The driver works without 164*942ab02bSAntoniu Miclausinterrupts but with reduced functionality. 165*942ab02bSAntoniu Miclaus 166*942ab02bSAntoniu Miclaus5. Device buffers 167*942ab02bSAntoniu Miclaus================= 168*942ab02bSAntoniu Miclaus 169*942ab02bSAntoniu MiclausThis driver supports IIO buffers for waveform capture. Buffer functionality 170*942ab02bSAntoniu Miclausrequires the dready interrupt to be connected. 171*942ab02bSAntoniu Miclaus 172*942ab02bSAntoniu MiclausThe device supports capturing voltage and current waveforms for power quality 173*942ab02bSAntoniu Miclausanalysis. The waveform buffer can be configured to capture data from different 174*942ab02bSAntoniu Miclauschannel combinations. 175*942ab02bSAntoniu Miclaus 176*942ab02bSAntoniu MiclausSupported channel combinations for buffered capture: 177*942ab02bSAntoniu Miclaus 178*942ab02bSAntoniu Miclaus- Phase A: voltage and current (IA + VA) 179*942ab02bSAntoniu Miclaus- Phase B: voltage and current (IB + VB) 180*942ab02bSAntoniu Miclaus- Phase C: voltage and current (IC + VC) 181*942ab02bSAntoniu Miclaus- All phases: all voltage and current channels 182*942ab02bSAntoniu Miclaus- Individual channels: IA, VA, IB, VB, IC, VC 183*942ab02bSAntoniu Miclaus 184*942ab02bSAntoniu MiclausUsage examples 185*942ab02bSAntoniu Miclaus-------------- 186*942ab02bSAntoniu Miclaus 187*942ab02bSAntoniu MiclausEnable waveform capture for Phase A: 188*942ab02bSAntoniu Miclaus 189*942ab02bSAntoniu Miclaus.. code-block:: bash 190*942ab02bSAntoniu Miclaus 191*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> echo 1 > scan_elements/in_current0_en 192*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> echo 1 > scan_elements/in_voltage0_en 193*942ab02bSAntoniu Miclaus 194*942ab02bSAntoniu MiclausSet buffer length and enable: 195*942ab02bSAntoniu Miclaus 196*942ab02bSAntoniu Miclaus.. code-block:: bash 197*942ab02bSAntoniu Miclaus 198*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> echo 100 > buffer/length 199*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> echo 1 > buffer/enable 200*942ab02bSAntoniu Miclaus 201*942ab02bSAntoniu Miclaus6. Clock output 202*942ab02bSAntoniu Miclaus=============== 203*942ab02bSAntoniu Miclaus 204*942ab02bSAntoniu MiclausThe ADE9000 can provide a clock output via the CLKOUT pin when using an external 205*942ab02bSAntoniu Miclauscrystal/clock source. This feature is enabled by specifying ``#clock-cells = <0>`` 206*942ab02bSAntoniu Miclausin the device tree. The output clock will be registered as "clkout" and can be 207*942ab02bSAntoniu Miclausreferenced by other devices. 208*942ab02bSAntoniu Miclaus 209*942ab02bSAntoniu Miclaus7. Usage examples 210*942ab02bSAntoniu Miclaus================= 211*942ab02bSAntoniu Miclaus 212*942ab02bSAntoniu MiclausShow device name: 213*942ab02bSAntoniu Miclaus 214*942ab02bSAntoniu Miclaus.. code-block:: bash 215*942ab02bSAntoniu Miclaus 216*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> cat name 217*942ab02bSAntoniu Miclaus ade9000 218*942ab02bSAntoniu Miclaus 219*942ab02bSAntoniu MiclausRead voltage measurements: 220*942ab02bSAntoniu Miclaus 221*942ab02bSAntoniu Miclaus.. code-block:: bash 222*942ab02bSAntoniu Miclaus 223*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> cat in_voltage0_raw 224*942ab02bSAntoniu Miclaus 12345 225*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> cat in_voltage0_scale 226*942ab02bSAntoniu Miclaus 0.000030517 227*942ab02bSAntoniu Miclaus 228*942ab02bSAntoniu Miclaus- Phase A voltage = in_voltage0_raw * in_voltage0_scale = 0.3769 V 229*942ab02bSAntoniu Miclaus 230*942ab02bSAntoniu MiclausRead power measurements: 231*942ab02bSAntoniu Miclaus 232*942ab02bSAntoniu Miclaus.. code-block:: bash 233*942ab02bSAntoniu Miclaus 234*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> cat in_power0_active_raw 235*942ab02bSAntoniu Miclaus 5678 236*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> cat in_power0_scale 237*942ab02bSAntoniu Miclaus 0.000244140 238*942ab02bSAntoniu Miclaus 239*942ab02bSAntoniu Miclaus- Phase A active power = in_power0_active_raw * in_power0_scale = 1.386 W 240*942ab02bSAntoniu Miclaus 241*942ab02bSAntoniu MiclausConfigure calibration gains: 242*942ab02bSAntoniu Miclaus 243*942ab02bSAntoniu Miclaus.. code-block:: bash 244*942ab02bSAntoniu Miclaus 245*942ab02bSAntoniu Miclaus # Set current channel 0 calibration gain 246*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> echo 0x800000 > in_current0_calibscale 247*942ab02bSAntoniu Miclaus # Set voltage channel 0 calibration gain 248*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> echo 0x7FFFFF > in_voltage0_calibscale 249*942ab02bSAntoniu Miclaus 250*942ab02bSAntoniu MiclausConfigure RMS voltage event thresholds (requires interrupts): 251*942ab02bSAntoniu Miclaus 252*942ab02bSAntoniu Miclaus.. code-block:: bash 253*942ab02bSAntoniu Miclaus 254*942ab02bSAntoniu Miclaus # Set RMS sag detection threshold 255*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> echo 180000 > events/in_altvoltage0_rms_thresh_falling_value 256*942ab02bSAntoniu Miclaus # Enable RMS sag detection 257*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> echo 1 > events/in_altvoltage0_rms_thresh_falling_en 258*942ab02bSAntoniu Miclaus 259*942ab02bSAntoniu Miclaus # Set RMS swell detection threshold 260*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> echo 260000 > events/in_altvoltage0_rms_thresh_rising_value 261*942ab02bSAntoniu Miclaus # Enable RMS swell detection 262*942ab02bSAntoniu Miclaus root:/sys/bus/iio/devices/iio:device0> echo 1 > events/in_altvoltage0_rms_thresh_rising_en 263*942ab02bSAntoniu Miclaus 264*942ab02bSAntoniu Miclaus8. IIO Interfacing Tools 265*942ab02bSAntoniu Miclaus======================== 266*942ab02bSAntoniu Miclaus 267*942ab02bSAntoniu MiclausSee ``Documentation/iio/iio_tools.rst`` for the description of the available IIO 268*942ab02bSAntoniu Miclausinterfacing tools. 269