Got hypersensing to work pretty reliably now.

Unfortunately indentation changes.
This commit is contained in:
Hakan Bastedt
2025-10-18 21:36:26 +02:00
parent 924ab972cb
commit a19a3b5b4e

View File

@@ -49,11 +49,7 @@ class OhmicSensing {
uint8_t &sensed); uint8_t &sensed);
// private: // private:
enum OhmicStates { enum OhmicStates { OHMIC_IDLE, OHMIC_SETUP, OHMIC_PROBE };
OHMIC_IDLE,
OHMIC_SETUP,
OHMIC_PROBE
};
OhmicStates ohmicState = OHMIC_IDLE; OhmicStates ohmicState = OHMIC_IDLE;
uint64_t startTime; uint64_t startTime;
float_t oldVoltage = 0.0; float_t oldVoltage = 0.0;
@@ -140,8 +136,7 @@ void cb_get_inputs(void) // Set Master inputs, slave outputs, last operation
Obj.In_Unit2.OhmicSensingVoltageLimit, Obj.In_Unit2.OhmicSensingVoltageLimit,
Obj.In_Unit2.OhmicSensingVoltageDrop, Obj.In_Unit2.OhmicSensingSetupTime, Obj.In_Unit2.OhmicSensingVoltageDrop, Obj.In_Unit2.OhmicSensingSetupTime,
Obj.In_Unit2.EnableOhmicSensing, Obj.Out_Unit2.OhmicSensingSensed); Obj.In_Unit2.EnableOhmicSensing, Obj.Out_Unit2.OhmicSensingSensed);
Obj.Out_Unit1.RawData = validVoltage0_2; Obj.Out_Unit1.RawData = (int)Ohm2.ohmicState;
Obj.Out_Unit2.RawData = Ohm2.ohmicState;
} }
uint16_t dc_checker(void); uint16_t dc_checker(void);
@@ -265,7 +260,8 @@ void handleVoltageReader(float scale_in, float offset, float &outVoltage,
MyMCP3221 *&mcp, uint8_t I2C_address, MyMCP3221 *&mcp, uint8_t I2C_address,
uint32_t &I2C_restarts) { uint32_t &I2C_restarts) {
float scale = scale_in; float scale = scale_in;
if (scale == 0.0) scale = 1.0; if (scale == 0.0)
scale = 1.0;
int stat = 1, data0; int stat = 1, data0;
switch (devType) { switch (devType) {
@@ -339,7 +335,8 @@ void handleVoltageReader(float scale_in, float offset, float &outVoltage,
Wire2.begin(); Wire2.begin();
Wire2.setClock(I2C_BUS_SPEED); Wire2.setClock(I2C_BUS_SPEED);
I2C_restarts++; I2C_restarts++;
if (devType == ADS1014_TYPE && ads != nullptr) ads1014_reset(ads); if (devType == ADS1014_TYPE && ads != nullptr)
ads1014_reset(ads);
// mcp3221 has no reset, reset the I2C bus is the best we can do // mcp3221 has no reset, reset the I2C bus is the best we can do
} }
readStat = stat; readStat = stat;
@@ -382,12 +379,12 @@ void OhmicSensing::handle(uint8_t voltageState, float inVoltage,
if (ohmicState == OHMIC_IDLE && inVoltage > limitVoltage) { if (ohmicState == OHMIC_IDLE && inVoltage > limitVoltage) {
ohmicState = OHMIC_SETUP; ohmicState = OHMIC_SETUP;
startTime = longTime.extendTime(micros()); startTime = longTime.extendTime(micros());
while (!voltages.empty()) voltages.pop(); // Remove history while (!voltages.empty())
voltages.pop(); // Remove history
return; return;
} }
if (ohmicState == OHMIC_SETUP) { if (ohmicState == OHMIC_SETUP) {
dTime = longTime.extendTime(micros()) - startTime; dTime = longTime.extendTime(micros()) - startTime;
Obj.Out_Unit2.RawData = dTime;
if (dTime > setupTime * 1000) { if (dTime > setupTime * 1000) {
ohmicState = OHMIC_PROBE; ohmicState = OHMIC_PROBE;
startTime = longTime.extendTime(micros()); startTime = longTime.extendTime(micros());
@@ -398,21 +395,28 @@ void OhmicSensing::handle(uint8_t voltageState, float inVoltage,
} }
if (ohmicState == OHMIC_PROBE) { if (ohmicState == OHMIC_PROBE) {
dTime = longTime.extendTime(micros()) - startTime; dTime = longTime.extendTime(micros()) - startTime;
Obj.Out_Unit2.RawData = dTime;
voltages.push(inVoltage); voltages.push(inVoltage);
while (voltages.size() > N_VOLTAGES) voltages.pop(); // Only N_VOLTAGES while (voltages.size() > N_VOLTAGES)
voltages.pop(); // Only N_VOLTAGES
if (dTime > 30000000) { // Go to IDLE after 30 seconds if (dTime > 30000000) { // Go to IDLE after 30 seconds
ohmicState = OHMIC_IDLE; ohmicState = OHMIC_IDLE;
return; return;
} }
if ((inVoltage <= limitVoltage) || // Below starting threshold byte c1 = (inVoltage <= limitVoltage) ? 1 : 0; // Below starting threshold
(fabs(voltageDropLimit) > 1e-3 && byte c2 = (fabs(voltageDropLimit) > 1e-3 &&
refVoltage - inVoltage >= refVoltage - inVoltage >= voltageDropLimit)
voltageDropLimit) || // Delta below refVoltage ? 2
(fabs(voltageDropLimit) > 1e-3 && // Immediate drop : 0; // Delta below refVoltage
oldVoltage - inVoltage >= voltageDropLimit) || byte c3 = (fabs(voltageDropLimit) > 1e-3 && // Immediate drop
(fabs(voltageDropLimit) > 1e-3 && // Drop over 3 cycles oldVoltage - inVoltage >= voltageDropLimit)
voltages.front() - voltages.back() > voltageDropLimit)) { ? 4
: 0;
byte c4 = (fabs(voltageDropLimit) > 1e-3 && // Drop over 3 cycles
voltages.front() - voltages.back() > voltageDropLimit)
? 8
: 0;
Obj.Out_Unit2.RawData = c1 + c2 + c3 + c4;
if (c1 + c2 + c3 + c4 > 0) {
sensed = 1; sensed = 1;
} }
oldVoltage = inVoltage; oldVoltage = inVoltage;