diff --git a/firmware/src/hw/fuse.cpp b/firmware/src/hw/fuse.cpp new file mode 100644 index 0000000..3e75203 --- /dev/null +++ b/firmware/src/hw/fuse.cpp @@ -0,0 +1,67 @@ +/**** Includes ****/ +#include "../utils/utils.h" +#include "../utils/interpolate.h" +#include "fuse.h" + +using namespace hw; + +/**** Private definitions ****/ +/**** Private constants ****/ +/**** Private variables ****/ +/**** Private function declarations ****/ + +/**** Public function definitions ****/ +hw::Fuse::Fuse(bsp::AnalogIn* ain_ch) +{ + this->hold_current = 0; + this->trip_cycles = 0; + this->warning = 0; + this->fault = 0; + this->cooldown_counter = 0; + this->cooldown_cycles = 0; + this->retry_cnt = 0; +} + +hw::Fuse::~Fuse(void) +{ + return; +} + +void hw::Fuse::update(void) +{ + // Under threshold + if(this->ain_ch->last_read <= this->hold_current) + { + // Clear warning flag + this->warning = 0; + + // OC energy counter + if(this->oc_counter > 0) this->oc_counter--; + + // Cool down fuse + if(this->cooldown_counter > 0) this->cooldown_counter--; + + // Auto reset logic + if((this->fault)&&(this->cooldown_counter==0)) + { + this->fault = 0; + this->retry_cnt = util::sat_add(this->retry_cnt, 1); + }; + return; + }; + + // Over current condition + this->warning = 1; + + // PC energy counter + this->oc_counter = util::sat_add(this->oc_counter, 1); + + // Check for trip threshold + if(this->oc_counter < this->trip_cycles) return; + + // Trip fuse + this->fault = 1; + this->cooldown_counter = this->cooldown_cycles; +} + +/**** Private function definitions ****/ diff --git a/firmware/src/hw/fuse.h b/firmware/src/hw/fuse.h new file mode 100644 index 0000000..ae789c8 --- /dev/null +++ b/firmware/src/hw/fuse.h @@ -0,0 +1,40 @@ +#ifndef FUSE_H_ +#define FUSE_H_ + +/**** Includes ****/ +#include +#include "../bsp/ain.h" + +namespace hw { + +/**** Public definitions ****/ + +class Fuse +{ + protected: + bsp::AnalogIn* ain_ch; + uint16_t oc_counter; + uint16_t cooldown_counter; + + public: + Fuse(bsp::AnalogIn* ain_ch); + ~Fuse(void); + + uint16_t hold_current; + uint16_t trip_cycles; + uint8_t warning; + uint8_t fault; + uint16_t cooldown_cycles; + uint8_t retry_cnt; + + void update(void); +}; + +/**** Public function declarations ****/ + +#ifdef TESTING +#endif + +} //namespace + +#endif /* POTENTIOMETER_H_ */ \ No newline at end of file diff --git a/firmware/src/uDCCD.cppproj b/firmware/src/uDCCD.cppproj index e57255b..31bffa1 100644 --- a/firmware/src/uDCCD.cppproj +++ b/firmware/src/uDCCD.cppproj @@ -213,6 +213,12 @@ compile + + compile + + + compile + compile