1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-26 17:46:14 +01:00

float memory saver

This commit is contained in:
Asbelos 2022-06-06 17:37:23 +01:00
parent 5f568c05b9
commit 2b2012ef1d
4 changed files with 24 additions and 9 deletions

View File

@ -67,16 +67,23 @@ MotorDriver::MotorDriver(VPIN power_pin, byte signal_pin, byte signal_pin2, int8
pinMode(faultPin, INPUT); pinMode(faultPin, INPUT);
} }
senseFactor=sense_factor; // This conversion performed at compile time so the remainder of the code never needs
// float calculations or libraray code.
senseFactorInternal=sense_factor * senseScale;
tripMilliamps=trip_milliamps; tripMilliamps=trip_milliamps;
rawCurrentTripValue=(int)(trip_milliamps / sense_factor); rawCurrentTripValue=mA2raw(trip_milliamps);
if (currentPin==UNUSED_PIN) if (currentPin==UNUSED_PIN)
DIAG(F("MotorDriver ** WARNING ** No current or short detection")); DIAG(F("MotorDriver ** WARNING ** No current or short detection"));
else else {
DIAG(F("MotorDriver currentPin=A%d, senseOffset=%d, rawCurrentTripValue(relative to offset)=%d"), DIAG(F("MotorDriver currentPin=A%d, senseOffset=%d, rawCurrentTripValue(relative to offset)=%d"),
currentPin-A0, senseOffset,rawCurrentTripValue); currentPin-A0, senseOffset,rawCurrentTripValue);
// self testing diagnostic for the non-float converters... may be removed when happy
// DIAG(F("senseFactorInternal=%d raw2mA(1000)=%d mA2Raw(1000)=%d"),
// senseFactorInternal, raw2mA(1000),mA2raw(1000));
}
// prepare values for current detection // prepare values for current detection
sampleDelay = 0; sampleDelay = 0;
lastSampleTaken = millis(); lastSampleTaken = millis();
@ -164,10 +171,10 @@ int MotorDriver::getCurrentRawInInterrupt() {
} }
unsigned int MotorDriver::raw2mA( int raw) { unsigned int MotorDriver::raw2mA( int raw) {
return (unsigned int)(raw * senseFactor); return (int32_t)raw * senseFactorInternal / senseScale;
} }
int MotorDriver::mA2raw( unsigned int mA) { unsigned int MotorDriver::mA2raw( unsigned int mA) {
return (int)(mA / senseFactor); return (int32_t)mA * senseScale / senseFactorInternal;
} }
void MotorDriver::getFastPin(const FSH* type,int pin, bool input, FASTPIN & result) { void MotorDriver::getFastPin(const FSH* type,int pin, bool input, FASTPIN & result) {

View File

@ -79,7 +79,7 @@ class MotorDriver {
virtual int getCurrentRaw(); virtual int getCurrentRaw();
virtual int getCurrentRawInInterrupt(); virtual int getCurrentRawInInterrupt();
virtual unsigned int raw2mA( int raw); virtual unsigned int raw2mA( int raw);
virtual int mA2raw( unsigned int mA); virtual unsigned int mA2raw( unsigned int mA);
inline bool canBrake() { inline bool canBrake() {
return brakePin!=UNUSED_PIN; return brakePin!=UNUSED_PIN;
} }
@ -108,7 +108,14 @@ class MotorDriver {
FASTPIN fastSignalPin, fastSignalPin2, fastBrakePin,fastFaultPin; FASTPIN fastSignalPin, fastSignalPin2, fastBrakePin,fastFaultPin;
bool dualSignal; // true to use signalPin2 bool dualSignal; // true to use signalPin2
bool invertBrake; // brake pin passed as negative means pin is inverted bool invertBrake; // brake pin passed as negative means pin is inverted
float senseFactor;
// Raw to milliamp conversion factors avoiding float data types.
// Milliamps=rawADCreading * sensefactorInternal / senseScale
//
// senseScale is chosen as 256 to give enough scale for 2 decimal place
// raw->mA conversion with an ultra fast optimised integer multiplication
int senseFactorInternal; // set to senseFactor * senseScale
static const int senseScale=256;
int senseOffset; int senseOffset;
unsigned int tripMilliamps; unsigned int tripMilliamps;
int rawCurrentTripValue; int rawCurrentTripValue;

View File

@ -104,7 +104,7 @@ void StringFormatter::send2(Print * stream,const FSH* format, va_list args) {
case 'b': stream->print(va_arg(args, int), BIN); break; case 'b': stream->print(va_arg(args, int), BIN); break;
case 'o': stream->print(va_arg(args, int), OCT); break; case 'o': stream->print(va_arg(args, int), OCT); break;
case 'x': stream->print(va_arg(args, int), HEX); break; case 'x': stream->print(va_arg(args, int), HEX); break;
case 'f': stream->print(va_arg(args, double), 2); break; //case 'f': stream->print(va_arg(args, double), 2); break;
//format width prefix //format width prefix
case '-': case '-':
formatLeft=true; formatLeft=true;

View File

@ -6,6 +6,7 @@
#define VERSION "4.0.3" #define VERSION "4.0.3"
// 4.0.3 Track Manager additions: // 4.0.3 Track Manager additions:
// Float eliminated saving >1.5kb PROGMEM and speed.
// SET_TRACK(track,mode) Functions (A-H, MAIN|PROG|DC|DCX|OFF) // SET_TRACK(track,mode) Functions (A-H, MAIN|PROG|DC|DCX|OFF)
// New DC track function and DCX reverse polarity function // New DC track function and DCX reverse polarity function
// TrackManager DCC & DC up to 8 Districts Architecture // TrackManager DCC & DC up to 8 Districts Architecture