From 99c7ff6c3fa656d6011ae965fed2d477d4027061 Mon Sep 17 00:00:00 2001 From: Asbelos Date: Wed, 23 Mar 2022 12:30:21 +0000 Subject: [PATCH] EXPERIMENTAL vpin for motorDriver power No need to use fastpin for power, so we can allow a remoted vpin which helps when TrafficManger is running short of pins --- CommandStation-EX.ino | 3 +++ DCC.cpp | 3 --- MotorDriver.cpp | 11 +++++------ MotorDriver.h | 8 +++++--- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/CommandStation-EX.ino b/CommandStation-EX.ino index 8d650f9..cd23f0e 100644 --- a/CommandStation-EX.ino +++ b/CommandStation-EX.ino @@ -84,6 +84,9 @@ void setup() EthernetInterface::setup(); #endif // ETHERNET_ON +// Initialise HAL layer before reading EEprom or setting up MotorDrivers + IODevice::begin(); + // Responsibility 3: Start the DCC engine. // Note: this provides DCC with two motor drivers, main and prog, which handle the motor shield(s) // Standard supported devices have pre-configured macros but custome hardware installations require diff --git a/DCC.cpp b/DCC.cpp index 977a304..05fb00a 100644 --- a/DCC.cpp +++ b/DCC.cpp @@ -64,9 +64,6 @@ void DCC::begin(const FSH * motorShieldName) { shieldName=(FSH *)motorShieldName; StringFormatter::send(Serial,F("\n"), F(VERSION), F(ARDUINO_TYPE), shieldName, F(GITHUB_SHA)); - // Initialise HAL layer before reading EEprom. - IODevice::begin(); - #ifndef DISABLE_EEPROM // Load stuff from EEprom (void)EEPROM; // tell compiler not to warn this is unused diff --git a/MotorDriver.cpp b/MotorDriver.cpp index 348a954..0967ec5 100644 --- a/MotorDriver.cpp +++ b/MotorDriver.cpp @@ -33,11 +33,10 @@ bool MotorDriver::usePWM=false; bool MotorDriver::commonFaultPin=false; -MotorDriver::MotorDriver(byte power_pin, byte signal_pin, byte signal_pin2, int8_t brake_pin, +MotorDriver::MotorDriver(VPIN power_pin, byte signal_pin, byte signal_pin2, int8_t brake_pin, byte current_pin, float sense_factor, unsigned int trip_milliamps, byte fault_pin) { powerPin=power_pin; - getFastPin(F("POWER"),powerPin,fastPowerPin); - pinMode(powerPin, OUTPUT); + IODevice::write(powerPin,LOW);// set to OUTPUT and off signalPin=signal_pin; getFastPin(F("SIG"),signalPin,fastSignalPin); @@ -102,9 +101,9 @@ void MotorDriver::setPower(POWERMODE mode) { // on the Pololu board if brake is wired to ^D2. setBrake(true); setBrake(false); - setHIGH(fastPowerPin); + IODevice::write(powerPin,HIGH); } - else setLOW(fastPowerPin); + else IODevice::write(powerPin,LOW); powerMode=mode; } @@ -160,7 +159,7 @@ int MotorDriver::getCurrentRaw() { current = analogRead(currentPin)-senseOffset; interrupts(); if (current<0) current=0-current; - if ((faultPin != UNUSED_PIN) && isLOW(fastFaultPin) && isHIGH(fastPowerPin)) + if ((faultPin != UNUSED_PIN) && isLOW(fastFaultPin) && powerMode==POWERMODE::ON) return (current == 0 ? -1 : -current); return current; diff --git a/MotorDriver.h b/MotorDriver.h index c69f63d..7f31397 100644 --- a/MotorDriver.h +++ b/MotorDriver.h @@ -22,6 +22,7 @@ #ifndef MotorDriver_h #define MotorDriver_h #include "FSH.h" +#include "IODevice.h" // Virtualised Motor shield 1-track hardware Interface @@ -48,7 +49,7 @@ enum class POWERMODE : byte { OFF, ON, OVERLOAD }; class MotorDriver { public: - MotorDriver(byte power_pin, byte signal_pin, byte signal_pin2, int8_t brake_pin, + MotorDriver(VPIN power_pin, byte signal_pin, byte signal_pin2, int8_t brake_pin, byte current_pin, float senseFactor, unsigned int tripMilliamps, byte faultPin); virtual void setPower( POWERMODE mode); virtual POWERMODE getPower() { return powerMode;} @@ -75,8 +76,9 @@ class MotorDriver { void getFastPin(const FSH* type,int pin, FASTPIN & result) { getFastPin(type, pin, 0, result); } - byte powerPin, signalPin, signalPin2, currentPin, faultPin, brakePin; - FASTPIN fastPowerPin,fastSignalPin, fastSignalPin2, fastBrakePin,fastFaultPin; + VPIN powerPin; + byte signalPin, signalPin2, currentPin, faultPin, brakePin; + FASTPIN fastSignalPin, fastSignalPin2, fastBrakePin,fastFaultPin; bool dualSignal; // true to use signalPin2 bool invertBrake; // brake pin passed as negative means pin is inverted float senseFactor;