129 lines
3.8 KiB
C
129 lines
3.8 KiB
C
/**
|
|
* @file grundfos.c
|
|
*
|
|
* @copyright Nehemis SARL reserves all rights even in the event of industrial
|
|
* property rights. We reserve all rights of disposal such as
|
|
* copying and passing on to third parties.
|
|
*
|
|
* @brief
|
|
*
|
|
*/
|
|
|
|
/******************************************************************************
|
|
* Include Header Files
|
|
******************************************************************************/
|
|
#include "grundfos.h"
|
|
#include "gpio.h"
|
|
#include "i2c.h"
|
|
/******************************************************************************
|
|
* Type declarations
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
* Macro Constant Declarations
|
|
******************************************************************************/
|
|
#define GRUNDFOS_PMP_ADC_CHANNEL 5u
|
|
#define GRUNDFOS_PMP_ADC_REF_VOLTAGE 3.3f
|
|
#define GRUNDFOS_PMP_ADC_RESOLUTION 4095.0f /* 12-bit ADC */
|
|
#define GRUNDFOS_PMP_ADC_MODULE &hadc1
|
|
|
|
#define GRUNDFOS_PMP_ENABLE_GPIO_PORT GPIOB
|
|
#define GRUNDFOS_PMP_ENABLE_GPIO_PIN GPIO_PIN_15
|
|
|
|
#define GRUNDFOS_PMP_I2C_HANDLE &hi2c4
|
|
#define GRUNDFOS_PMP_INTERNAL_DAC_ADDR 0x61
|
|
/******************************************************************************
|
|
* Private function Declarations
|
|
******************************************************************************/
|
|
static uint32 GrundfosPmpReadVoltage(void);
|
|
|
|
/******************************************************************************
|
|
* Extern Function Definitions
|
|
******************************************************************************/
|
|
void GrundfosPmpEnable(uint8 state_u8)
|
|
{
|
|
if(state_u8 == 1u)
|
|
{
|
|
HAL_GPIO_WritePin(GRUNDFOS_PMP_ENABLE_GPIO_PORT, GRUNDFOS_PMP_ENABLE_GPIO_PIN, GPIO_PIN_SET);
|
|
}
|
|
else
|
|
{
|
|
HAL_GPIO_WritePin(GRUNDFOS_PMP_ENABLE_GPIO_PORT, GRUNDFOS_PMP_ENABLE_GPIO_PIN, GPIO_PIN_RESET);
|
|
}
|
|
}
|
|
|
|
|
|
uint32 GrundfosPmpFeedbackSpeed(void)
|
|
{
|
|
uint32 feedbackSpeed_u32 = (GrundfosPmpReadVoltage()) * 360uL;
|
|
|
|
return feedbackSpeed_u32;
|
|
}
|
|
|
|
|
|
bool GrundfosPmpSetSpeed(float32 setSpeed_f32)
|
|
{
|
|
uint8 data_au8[2];
|
|
uint16 dacVal_u16;
|
|
|
|
if (setSpeed_f32 < 0.0f)
|
|
{
|
|
setSpeed_f32 = 0.0f;
|
|
}
|
|
else if (setSpeed_f32 > 10.0f)
|
|
{
|
|
setSpeed_f32 = 10.0f;
|
|
}
|
|
else
|
|
{
|
|
/* Do nothing. */
|
|
}
|
|
|
|
dacVal_u16 = (uint16)(setSpeed_f32 * (GRUNDFOS_PMP_ADC_RESOLUTION / 10.0f));
|
|
|
|
data_au8[0] = (uint8)(dacVal_u16 >> 4); /* Upper 8 bits */
|
|
data_au8[1] = (uint8)((dacVal_u16 & 0x0F) << 4); /* Lower 4 bits shifted to the upper nibble */
|
|
|
|
return HAL_I2C_Master_Transmit(GRUNDFOS_PMP_I2C_HANDLE, GRUNDFOS_PMP_INTERNAL_DAC_ADDR, data_au8, 2u, HAL_MAX_DELAY) == HAL_OK;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Private function Definitions
|
|
******************************************************************************/
|
|
/**
|
|
* @brief Function to read ADC voltage data which is directly coming from the pump.
|
|
*
|
|
* @return ADC output voltage based on sensor reading.
|
|
*
|
|
*/
|
|
static uint32 GrundfosPmpReadVoltage(void)
|
|
{
|
|
uint32_t adcVal_u32 = 0uL;
|
|
ADC_ChannelConfTypeDef sConfig = {0};
|
|
sConfig.Channel = GRUNDFOS_PMP_ADC_CHANNEL; /* Set the channel specific to this flowmeter */
|
|
sConfig.Rank = ADC_REGULAR_RANK_1;
|
|
sConfig.SamplingTime = ADC_SAMPLETIME_12CYCLES_5;
|
|
|
|
if (HAL_ADC_ConfigChannel(GRUNDFOS_PMP_ADC_MODULE, &sConfig) != HAL_OK)
|
|
{
|
|
return 0.0f; /* ERROR */
|
|
}
|
|
|
|
if (HAL_ADC_Start(GRUNDFOS_PMP_ADC_MODULE) == HAL_OK)
|
|
{
|
|
if (HAL_ADC_PollForConversion(GRUNDFOS_PMP_ADC_MODULE, HAL_MAX_DELAY) == HAL_OK)
|
|
{
|
|
adcVal_u32 = HAL_ADC_GetValue(GRUNDFOS_PMP_ADC_MODULE);
|
|
}
|
|
HAL_ADC_Stop(GRUNDFOS_PMP_ADC_MODULE);
|
|
}
|
|
else
|
|
{
|
|
/* ERROR */
|
|
}
|
|
|
|
uint32 voltage_u32 = adcVal_u32 * (GRUNDFOS_PMP_ADC_REF_VOLTAGE / GRUNDFOS_PMP_ADC_RESOLUTION);
|
|
|
|
return voltage_u32;
|
|
}
|