From b43e507daa2be8c9e57015cfd573bbfd0a60f896 Mon Sep 17 00:00:00 2001 From: hg Date: Sun, 19 Jan 2014 00:37:40 +0100 Subject: [PATCH] over current protection --- .settings/language.settings.xml | 13 ------ .settings/org.eclipse.cdt.core.prefs | 2 +- MeterBusPowerMaster.cpp | 8 ++-- meterBusMaster.cpp | 4 +- meterBusMaster.h | 2 + overCurrentProt.cpp | 66 ++++++++++++++++++++++++++++ overCurrentProt.h | 56 +++++++++++++++++++++++ 7 files changed, 131 insertions(+), 20 deletions(-) delete mode 100644 .settings/language.settings.xml create mode 100644 overCurrentProt.cpp create mode 100644 overCurrentProt.h diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml deleted file mode 100644 index 2b7ad02..0000000 --- a/.settings/language.settings.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs index 6646c0d..52b321f 100644 --- a/.settings/org.eclipse.cdt.core.prefs +++ b/.settings/org.eclipse.cdt.core.prefs @@ -268,7 +268,7 @@ environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE. environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.BOARD_NAME/value=Arduino Micro environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.COM_PORT/delimiter=\: environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.COM_PORT/operation=replace -environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.COM_PORT/value=/dev/tty.usbmodemfd111 +environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.COM_PORT/value=/dev/tty.usbmodemfd1111 environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.EXTRA.C.COMPILE/delimiter=\: environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.EXTRA.C.COMPILE/operation=replace environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.EXTRA.C.COMPILE/value= diff --git a/MeterBusPowerMaster.cpp b/MeterBusPowerMaster.cpp index 385d502..b72fc32 100644 --- a/MeterBusPowerMaster.cpp +++ b/MeterBusPowerMaster.cpp @@ -7,28 +7,28 @@ // #include "test.h" #include "uptime.h" #include "meterBusMaster.h" +#include "overCurrentProt.h" static CmdServer cmdServer(&Serial); // static TestCmd testCmd; static Uptime uptime; static MeterBusMaster meterBusMaster; +static OverCurrentProt overCurrentProt; void setup() { cmdServer.begin(); // testCmd.registerYourself(&cmdServer); + overCurrentProt.begin(&cmdServer); uptime.begin(&cmdServer); meterBusMaster.begin(&cmdServer); - - - Serial.println("Good afternoon, Sir!"); } void loop() { cmdServer.exec(); + overCurrentProt.exec(); uptime.exec(); meterBusMaster.exec(); - } diff --git a/meterBusMaster.cpp b/meterBusMaster.cpp index c64e5bf..25f7a80 100644 --- a/meterBusMaster.cpp +++ b/meterBusMaster.cpp @@ -40,9 +40,9 @@ uint16_t stringToUInt8(String i, uint8_t index) { String MeasureCurrent::exec(String params) { int currentInVal = analogRead(CURRENT_IN); - int current = currentInVal; + int current = ((double)currentInVal * U_UNIT) / R_SHUNT; - return String() + current; + return String() + current + String("mA"); } diff --git a/meterBusMaster.h b/meterBusMaster.h index 3145a00..001e4b2 100644 --- a/meterBusMaster.h +++ b/meterBusMaster.h @@ -14,6 +14,8 @@ const uint8_t RX_ENABLE = LOW; const uint8_t RX_DISABLE = HIGH; const uint8_t CURRENT_IN = A0; +const double U_UNIT = 4.9; // mV +const double R_SHUNT = 11.0; class SendOctets : public Cmd, public ResponseCallback { diff --git a/overCurrentProt.cpp b/overCurrentProt.cpp new file mode 100644 index 0000000..7028ed0 --- /dev/null +++ b/overCurrentProt.cpp @@ -0,0 +1,66 @@ +#include +#include +#include "overCurrentProt.h" + + + +volatile bool overCurrentMarker; + +void overCurrentProtServiceRoutine() { + // switch off current + digitalWrite(CURRENT_SHUTDOWN, CURRENT_OFF); + + // set marker + overCurrentMarker = true; + + Serial.println("X"); +} + + + + +OverCurrentProtCmd::OverCurrentProtCmd(OverCurrentProt *overCurrentProt) : m_overCurrentProt(overCurrentProt) { +} + +String OverCurrentProtCmd::exec(String params) { + return String("") + m_overCurrentProt->getEventCnt(); +} + +OverCurrentResetCmd::OverCurrentResetCmd(OverCurrentProt *overCurrentProt) : m_overCurrentProt(overCurrentProt) { +} + +String OverCurrentResetCmd::exec(String params) { + m_overCurrentProt->resetEventCnt(); + return "done"; +} + + + +OverCurrentProt::OverCurrentProt() : m_overCurrentProtCmd(this), m_overCurrentResetCmd(this), m_eventCnt(0), m_timestamp(0) { + +} + + +void OverCurrentProt::begin(CmdServer *cmdServer) { + m_overCurrentProtCmd.registerYourself(cmdServer); + m_overCurrentResetCmd.registerYourself(cmdServer); + pinMode(CURRENT_SHUTDOWN, OUTPUT); + digitalWrite(CURRENT_SHUTDOWN, CURRENT_ON); + overCurrentMarker = false; + attachInterrupt(CURRENT_INTERRUPT, overCurrentProtServiceRoutine, RISING); + Serial.println("OC ready"); +} + + +void OverCurrentProt::exec() { + if ((m_timestamp == 0) && overCurrentMarker) { + m_eventCnt++; + m_timestamp = millis(); + } + + if ((m_timestamp != 0) && ((m_timestamp + TURN_ON_DELAY) < millis())) { + overCurrentMarker = false; + m_timestamp = 0; + digitalWrite(CURRENT_SHUTDOWN, CURRENT_ON); + } +} diff --git a/overCurrentProt.h b/overCurrentProt.h new file mode 100644 index 0000000..999598a --- /dev/null +++ b/overCurrentProt.h @@ -0,0 +1,56 @@ +#ifndef OVERCURRENTPROT_H_ +#define OVERCURRENTPROT_H_ + + +#include "cmd.h" + + +#define CURRENT_SHUTDOWN 5 +#define CURRENT_ON 0 +#define CURRENT_OFF 1 +#define CURRENT_INTERRUPT 0 + +const unsigned long TURN_ON_DELAY = 10000; // ms + + +class OverCurrentProt; + +class OverCurrentProtCmd : public Cmd { +public: + OverCurrentProtCmd(OverCurrentProt *overCurrentProt); + virtual String getCmdName() { return "OCPC"; } + virtual String getHelp() { return "OCP cnt"; } + virtual String exec(String params); +private: + OverCurrentProt *m_overCurrentProt; +}; + +class OverCurrentResetCmd : public Cmd { +public: + OverCurrentResetCmd(OverCurrentProt *overCurrentProt); + virtual String getCmdName() { return "OCRST"; } + virtual String getHelp() { return "OCP rst"; } + virtual String exec(String params); +private: + OverCurrentProt *m_overCurrentProt; +}; + + + +class OverCurrentProt { +public: + OverCurrentProt(); + void begin(CmdServer *cmdServer); + void exec(); + uint32_t getEventCnt() { return m_eventCnt; }; + void resetEventCnt() { m_eventCnt = 0; }; +private: + OverCurrentProtCmd m_overCurrentProtCmd; + OverCurrentResetCmd m_overCurrentResetCmd; + uint32_t m_eventCnt; + unsigned long m_timestamp; +}; + + + +#endif /* OVERCURRENTPROT_H_ */