/** * @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 "analogMeasurement.h" #include "hal_gpio.h" #include "hal_i2c.h" /****************************************************************************** * Type declarations ******************************************************************************/ /****************************************************************************** * Macro Constant Declarations ******************************************************************************/ #define GRUNDFOS_PMP_INTERNAL_DAC_ADDR (0x61 << 1) /****************************************************************************** * Private function Declarations ******************************************************************************/ static uint32 GrundfosPmpReadVoltage(uint8 channel_u8); /****************************************************************************** * Extern Function Definitions ******************************************************************************/ void GrundfosPmpEnable(uint8 state_u8) { if(state_u8 == 0u) { HalGpioWrite(MAP_HAL_PMP_ENABLE, HAL_GPIO_STATE_HIGH); /* Pulling the line high stops the pump */ } else { HalGpioWrite(MAP_HAL_PMP_ENABLE, HAL_GPIO_STATE_LOW); } } uint32 GrundfosPmpFeedback(uint8 channel_u8) { uint32 feedbackSpeed_u32 = (GrundfosPmpReadVoltage(channel_u8)) * 360u; return feedbackSpeed_u32; } bool GrundfosPmpSetSpeed(float32 setSpeed_f32) { uint8 data_au8[2]; static volatile uint16 dacVal_u16 = 0u; /* Limit the input range to 0V - 10V */ if (setSpeed_f32 < 0.0f) { setSpeed_f32 = 0.0f; } else if (setSpeed_f32 > 10.0f) { setSpeed_f32 = 10.0f; } /* Convert pump speed (0-10V) to DAC value (0-5V output) */ dacVal_u16 = (uint16)((setSpeed_f32 * 4095.0f) / 10.0f); /* Format the 12-bit DAC value into the correct byte format */ data_au8[0] = (uint8)(dacVal_u16 >> 8); /* Upper 8 bits */ data_au8[1] = (uint8)(dacVal_u16 & 0xFF); /* Lower 8 bits */ return HalI2CMasterTransmit(MAP_HAL_GRUNDFOS_PMP_I2C_HANDLE, GRUNDFOS_PMP_INTERNAL_DAC_ADDR, data_au8, 2u) == NMS_ERR_NONE; } /****************************************************************************** * 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(uint8 channel_u8) { /* Convert ADC value to voltage (assuming 12-bit resolution and 3.3V reference) */ float32 voltage_f32 = 0.0f; uint32 adcVal_u32 = 0uL; AnalogMeasurementReadData(channel_u8, &adcVal_u32); voltage_f32 = adcVal_u32 * (uint32)(ANALOG_MEAS_ADC_REF_VOLTAGE / ANALOG_MEAS_ADC_RESOLUTION); return voltage_f32; }