adc

Dependents:   h7adc

ADE7912.h

Committer:
yuliyasm
Date:
2020-10-28
Revision:
3:1d62b3be52e8
Parent:
2:f480200c8600

File content as of revision 3:1d62b3be52e8:

#ifndef ADE7912
#define ADE7912

#include "stm32h7xx_hal.h"
#include "stdlib.h"

// ADE7912 registers addresses
#define ADE7912_IWV_REG_ADDRESS 						0x00
#define ADE7912_V1WV_REG_ADDRESS 						0x08
#define ADE7912_V2WV_REG_ADDRESS 						0x10
#define ADE7912_ADC_CRC_REG_ADDRESS 				0x20
#define ADE7912_CTRL_CRC_REG_ADDRESS 				0x28
#define ADE7912_CNT_SNAPSHOT_REG_ADDRESS 		0x38
#define ADE7912_CONFIG_REG_ADDRESS 					0x40
#define ADE7912_STATUS0_REG_ADDRESS 				0x48
#define ADE7912_LOCK_REG_ADDRESS 						0x50
#define ADE7912_SYNC_SNAP_REG_ADDRESS 			0x58
#define ADE7912_COUNTER0_REG_ADDRESS 				0x60
#define ADE7912_COUNTER1_REG_ADDRESS 				0x68
#define ADE7912_EMI_CTRL_REG_ADDRESS 				0x70
#define ADE7912_STATUS1_REG_ADDRESS 				0x78
#define ADE7912_TEMPOS_REG_ADDRESS 					0xC0

// ADE7912 bits of CONFIG register
#define ADE7912_CONFIG_BIT_CLKOUTENB				1 << 0
#define ADE7912_CONFIG_BIT_PWRDWNENB				1 << 1
#define ADE7912_CONFIG_BIT_TEMPENB					1 << 3
#define ADE7912_CONFIG_ADC_FREQ_1K					0x0 << 4
#define ADE7912_CONFIG_ADC_FREQ_2K					0x1 << 4
#define ADE7912_CONFIG_ADC_FREQ_4K					0x2 << 4
#define ADE7912_CONFIG_ADC_FREQ_8K					0x3 << 4
#define ADE7912_CONFIG_ADC_FREQ							ADE7912_CONFIG_ADC_FREQ_8K
#define ADE7912_CONFIG_BIT_SWRST						1 << 6
#define ADE7912_CONFIG_BIT_BW								1 << 6

// ADE7912 bits of STATUS0 register
#define ADE7912_STATUS0_BIT_RESET_ON				1 << 0
#define ADE7912_STATUS0_BIT_CRC_STAT				1 << 1
#define ADE7912_STATUS0_BIT_IC_PROT					1 << 2

// ADE7912 bits of STATUS1 register
#define ADE7912_STATUS1_BIT_VERSION					0x7 << 0
#define ADE7912_STATUS1_BIT_ADC_NA					1 << 3

// ADE7912 transmite modes
#define ADE7912_READ_MODE										0x04
#define ADE7912_BRUSH_READ_MODE							0x04
#define ADE7912_WRITE_MODE									0x00

#define ADE7912_DALAY_TIME									2
#define ADE7912_WAITING_TIME								5 * ADE7912_DALAY_TIME

#define ADE7912_TEMPGAIN_WITH_3K3_BW				8.72101e-5f
#define ADE7912_TEMPGAIN_WITH_2K_BW					8.21015e-5f
#define ADE7912_CONST_TEMPOS								306.47f

#define ADE7912_IWV_TRANSLATE_COEF          5.87344e-9f
#define ADE7912_VWV_TRANSLATE_COEF          9.39369e-8f

struct ADE7912_BrushRead_Data
{
	int32_t IWV; 
	int32_t V1WV;
	int32_t V2WV;
	uint16_t ADC_CRC;
	uint8_t STATUS0;
	uint16_t CNT_SNAPSHOT;
};

struct ADE7912_Inst 
{
	SPI_HandleTypeDef *spi;
	uint8_t phasesEnable[4];
	GPIO_TypeDef *CS_ports[4];
	uint16_t CS_pins[4];
	struct ADE7912_BrushRead_Data *phasesData[4];
	uint8_t version[4];
	float tempos[4];
	float tempGain[4];
	GPIO_TypeDef *DReadyPort;
	uint16_t DReadyPin;
	IRQn_Type EXTIinterrupt;
};



enum ADE7912_Phases
{
	PHASE_A = 0,
	PHASE_B,
	PHASE_C,
	COM
};

enum ADE7912_DataUpdateFreq
{
	F_8KHZ,
	F_4KHZ,
	F_2KHZ,
	F_1KHZ
};

enum ADE7912_Bandwidths
{
	BW_3K3HZ,
	BW_2KHZ
};

enum ADE7912_CLKOUT_Functionality
{
	CLKOUT,
	DREADY
};

struct ADE7912_Phase_Settings
{
	GPIO_TypeDef *CS_port;
	uint16_t CS_pin;
	enum ADE7912_DataUpdateFreq freq;
	enum ADE7912_Bandwidths bandwidth;
	enum ADE7912_CLKOUT_Functionality clkoutFunc;
};



void ADE7912_UpdateData(struct ADE7912_Inst *ade);

struct ADE7912_Inst* New_ADE7912(SPI_HandleTypeDef *spi);

void ADE7912_PhaseInit(struct ADE7912_Inst *ade, struct ADE7912_Phase_Settings *settings, enum ADE7912_Phases phase);
void ADE7912_EnablePhase(struct ADE7912_Inst *ade, enum ADE7912_Phases phase);
void ADE7912_DisablePhase(struct ADE7912_Inst *ade, enum ADE7912_Phases phase);
void ADE7912_ResetPhase(struct ADE7912_Inst *ade, enum ADE7912_Phases phase);

void ADE7912_SetDataUpdateFreq(struct ADE7912_Inst *ade, enum ADE7912_Phases phase, enum ADE7912_DataUpdateFreq freq);
void ADE7912_SetPwrConverterEnabled(struct ADE7912_Inst *ade, enum ADE7912_Phases phase, bool enabled);
void ADE7912_SetTempEnabled(struct ADE7912_Inst *ade, enum ADE7912_Phases phase, bool enabled);
void ADE7912_SetBandwidth(struct ADE7912_Inst *ade, enum ADE7912_Phases phase, enum ADE7912_Bandwidths bandwidth);
void ADE7912_SetCLKOUTFunctionality(struct ADE7912_Inst *ade, enum ADE7912_Phases phase, enum ADE7912_CLKOUT_Functionality functionality);

void ADE7912_LockConfigurationRegisters(struct ADE7912_Inst *ade, enum ADE7912_Phases phase);
void ADE7912_UnlockConfigurationRegisters(struct ADE7912_Inst *ade, enum ADE7912_Phases phase);

uint8_t ADE7912_GetADCVersion(struct ADE7912_Inst *ade, enum ADE7912_Phases phase);
float ADE7912_GetVoltage(struct ADE7912_Inst *ade, enum ADE7912_Phases phase);
float ADE7912_GetCurrent(struct ADE7912_Inst *ade, enum ADE7912_Phases phase);
float ADE7912_GetTemp(struct ADE7912_Inst *ade, enum ADE7912_Phases phase);

#endif