create new branch for 23 charger testing
This commit is contained in:
168
Software/Core/Src/charger_control.c
Normal file
168
Software/Core/Src/charger_control.c
Normal file
@ -0,0 +1,168 @@
|
||||
/*
|
||||
* charger_control.c
|
||||
*
|
||||
* Created on: May 21, 2023
|
||||
* Author: MaxMax
|
||||
*/
|
||||
|
||||
#include "charger_control.h"
|
||||
#include "main.h"
|
||||
|
||||
I2C_HandleTypeDef* charger_i2c;
|
||||
|
||||
|
||||
/*** @brief Start ADC Conversion on Charger Current Channel and returns the result
|
||||
* @note The ADC has a PGA leading to an input range of +-6.144 in twos complement. With single ended measurements, the range is 15 bit and
|
||||
* Voltage = 6.144/(2^(15)-1)
|
||||
* @note The charger maps a voltage range of 0-5V to the output current of 0-10A
|
||||
* @retval ADC Conversion register value
|
||||
*/
|
||||
uint16_t readADCCurrent()
|
||||
{
|
||||
uint8_t writeconfigreg[3] = {0x01, 0xC1, 0xE3};
|
||||
uint8_t readconfigreg[1] = {0x01};
|
||||
uint8_t readconversionreg[1] = {0x00};
|
||||
uint8_t configreg[2];
|
||||
uint8_t conversionreg[2];
|
||||
|
||||
HAL_I2C_Master_Transmit(charger_i2c, CHARGER_ADC_ADR, writeconfigreg, 3, 1000); //Set Config Register and Start conversion
|
||||
|
||||
HAL_I2C_Master_Transmit(charger_i2c, CHARGER_ADC_ADR, readconfigreg, 1, 1000); //Read Back Config Reg to check for conversion completion
|
||||
HAL_I2C_Master_Receive(charger_i2c, CHARGER_ADC_ADR, configreg, 2, 1000);
|
||||
HAL_Delay(1);//@TODO Remove if ADC Works
|
||||
HAL_I2C_Master_Transmit(charger_i2c, CHARGER_ADC_ADR, readconversionreg, 1, 1000); //Read Result from conversion register
|
||||
HAL_I2C_Master_Receive(charger_i2c, CHARGER_ADC_ADR, conversionreg, 2, 1000);
|
||||
|
||||
return (uint16_t)(conversionreg[0]<<8 | conversionreg[1]);
|
||||
|
||||
}
|
||||
|
||||
/*** @brief Start ADC Conversion on Charger Voltage Channel and returns the result
|
||||
* @note The ADC has a PGA leading to an input range of +-6.144 in twos complement. With single ended measurements, the range is 15 bit and
|
||||
* Voltage = 6.144/(2^(15)-1)
|
||||
* @note The charger maps a voltage range of 0-5V to the output voltage range of 0-600V
|
||||
* @retval ADC Conversion register value
|
||||
*/
|
||||
|
||||
uint16_t readADCVoltage()
|
||||
{
|
||||
uint8_t writeconfigreg[3] = {0x01, 0xC1, 0xE3};
|
||||
uint8_t readconfigreg[1] = {0x01};
|
||||
uint8_t readconversionreg[1] = {0x00};
|
||||
uint8_t configreg[2];
|
||||
uint8_t conversionreg[2];
|
||||
|
||||
HAL_I2C_Master_Transmit(charger_i2c, CHARGER_ADC_ADR, writeconfigreg, 3, 1000); //Set Config Register and Start conversion
|
||||
|
||||
HAL_I2C_Master_Transmit(charger_i2c, CHARGER_ADC_ADR, readconfigreg, 1, 1000); //Read Back Config Reg to check for conversion completion
|
||||
HAL_I2C_Master_Receive(charger_i2c, CHARGER_ADC_ADR, configreg, 2, 1000);
|
||||
HAL_Delay(1);//@TODO Remove if ADC Works
|
||||
HAL_I2C_Master_Transmit(charger_i2c, CHARGER_ADC_ADR, readconversionreg, 1, 1000); //Read Result from conversion register
|
||||
HAL_I2C_Master_Receive(charger_i2c, CHARGER_ADC_ADR, conversionreg, 2, 1000);
|
||||
|
||||
return (uint16_t)(conversionreg[0]<<8 | conversionreg[1]);
|
||||
}
|
||||
|
||||
/*** @brief Initilization Routine of the charger
|
||||
* @note initially all outputs are set to 0, remote control and charger relay are deactivated
|
||||
* @param hi2c Handler to I2C struct for ADC and DAC communication
|
||||
*/
|
||||
void charger_control_init(I2C_HandleTypeDef* hi2c)
|
||||
{
|
||||
charger_i2c = hi2c;
|
||||
|
||||
charger_control_disable_remote();
|
||||
charger_control_disable_charger_relay();
|
||||
charger_control_setup_DACs();
|
||||
charger_control_set_current(0);
|
||||
charger_control_set_voltage(0);
|
||||
}
|
||||
|
||||
/*** @brief Get State of voltage, current and error flags of the charger
|
||||
* @retval Struct Containing charger information
|
||||
*/
|
||||
|
||||
ChargerStatusHandleTypeDef charger_control_get_state()
|
||||
{
|
||||
ChargerStatusHandleTypeDef chargerstate;
|
||||
chargerstate.voltage = readADCVoltage();
|
||||
chargerstate.current = readADCCurrent();
|
||||
chargerstate.acfail = HAL_GPIO_ReadPin(Charger_AC_Fail_GPIO_Port, Charger_AC_Fail_Pin);
|
||||
chargerstate.dcfail = HAL_GPIO_ReadPin(Charger_DC_FAIL_GPIO_Port, Charger_DC_FAIL_Pin);
|
||||
chargerstate.cc_status = HAL_GPIO_ReadPin(Charger_CC_Status_GPIO_Port, Charger_CC_Status_Pin);
|
||||
chargerstate.lim_status = HAL_GPIO_ReadPin(Charger_LIM_GPIO_Port, Charger_LIM_Pin);
|
||||
chargerstate.ot_status = HAL_GPIO_ReadPin(Charger_OT_GPIO_Port, Charger_OT_Pin);
|
||||
return chargerstate;
|
||||
}
|
||||
|
||||
void charger_control_setup_DACs()
|
||||
{
|
||||
uint8_t enabledacs[2] = {0x1C, 0x02};
|
||||
HAL_I2C_Master_Transmit(charger_i2c, CURRENT_DAC_ADR, enabledacs, 2, 1000);
|
||||
HAL_I2C_Master_Transmit(charger_i2c, VOLTAGE_DAC_ADR, enabledacs, 2, 1000);
|
||||
}
|
||||
|
||||
/*** @brief set current channel using the DAC
|
||||
* @param current value in 10 bit => 0-5V are equal to 0-10A so 1 bit is approx 49mA
|
||||
*
|
||||
*/
|
||||
|
||||
void charger_control_set_current(uint32_t current)
|
||||
{
|
||||
uint8_t currentlow = current & 0xFF;
|
||||
uint8_t currenthigh = ((current>>8) & 0x03) | 0x04;
|
||||
uint8_t current_dac_data[2] = {currenthigh,currentlow};
|
||||
HAL_I2C_Master_Transmit(charger_i2c, CURRENT_DAC_ADR, current_dac_data, 2, 1000);
|
||||
}
|
||||
|
||||
/** @brief set voltage channel using the DAC
|
||||
* @param voltage value in 10 bit => 0-5V are equal to 0-600V so 1 bit is approx. 2.93V
|
||||
*
|
||||
*/
|
||||
|
||||
void charger_control_set_voltage(uint32_t voltage)
|
||||
{
|
||||
uint8_t voltagelow = voltage & 0xFF;
|
||||
uint8_t voltagehigh = ((voltage>>8) & 0x03) | 0x04;
|
||||
uint8_t voltage_dac_data[2] = {voltagehigh,voltagelow};
|
||||
HAL_I2C_Master_Transmit(charger_i2c, VOLTAGE_DAC_ADR, voltage_dac_data, 2, 1000);
|
||||
}
|
||||
|
||||
/** @brief Closes the main charger Relay
|
||||
* @note The relay is also dependend on the Shutdown Circuit
|
||||
*/
|
||||
|
||||
void charger_control_enable_charger_relay()
|
||||
{
|
||||
HAL_GPIO_WritePin(Charger_Relay_GPIO_Port, Charger_Relay_Pin, GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
/** @brief opens the main charger Relay
|
||||
* @note The relay is also dependend on the Shutdown Circuit
|
||||
*/
|
||||
|
||||
void charger_control_disable_charger_relay()
|
||||
{
|
||||
HAL_GPIO_WritePin(Charger_Relay_GPIO_Port, Charger_Relay_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
|
||||
/** @brief enables remote control of the charger
|
||||
* @note The relay is also dependend on the Shutdown Circuit
|
||||
*/
|
||||
|
||||
void charger_control_enable_remote()
|
||||
{
|
||||
HAL_GPIO_WritePin(Charger_Remote_Shutdown_GPIO_Port, Charger_Remote_Shutdown_Pin, GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
|
||||
/** @brief disable remote control of the charger
|
||||
* @note The relay is also dependend on the Shutdown Circuit
|
||||
*/
|
||||
|
||||
void charger_control_disable_remote()
|
||||
{
|
||||
HAL_GPIO_WritePin(Charger_Remote_Shutdown_GPIO_Port, Charger_Remote_Shutdown_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user