mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2025-07-28 18:03:45 +02:00
Compare commits
9 Commits
v5.5.37-De
...
EX-RAIL-DC
Author | SHA1 | Date | |
---|---|---|---|
|
4dfe1ec262 | ||
|
a6eaa3660c | ||
|
60b9ba53d0 | ||
|
4d00d56685 | ||
|
faa8383bc3 | ||
|
414e109f9d | ||
|
66cf6d632b | ||
|
fafa9d8477 | ||
|
b47d768de2 |
14
DCC.cpp
14
DCC.cpp
@@ -61,8 +61,15 @@ void DCC::begin(const FSH * motorShieldName, MotorDriver * mainDriver, MotorDriv
|
||||
EEStore::init();
|
||||
|
||||
DCCWaveform::begin(mainDriver,progDriver);
|
||||
#ifdef DCdistrict
|
||||
DCCWaveform::mainTrack.pwmSpeed(0);
|
||||
#else
|
||||
DCCWaveform::mainTrack.pwmSpeed(255);
|
||||
#endif
|
||||
DCCWaveform::progTrack.pwmSpeed(255);
|
||||
}
|
||||
|
||||
|
||||
void DCC::setJoinRelayPin(byte joinRelayPin) {
|
||||
joinRelay=joinRelayPin;
|
||||
if (joinRelay!=UNUSED_PIN) {
|
||||
@@ -72,6 +79,13 @@ void DCC::setJoinRelayPin(byte joinRelayPin) {
|
||||
}
|
||||
|
||||
void DCC::setThrottle( uint16_t cab, uint8_t tSpeed, bool tDirection) {
|
||||
#ifdef DCdistrict
|
||||
if (cab == DCdistrict) {
|
||||
DCCWaveform::mainTrack.pwmSpeed(tSpeed, tDirection);
|
||||
}
|
||||
#else
|
||||
#error fooar
|
||||
#endif
|
||||
byte speedCode = (tSpeed & 0x7F) + tDirection * 128;
|
||||
setThrottle2(cab, speedCode);
|
||||
// retain speed for loco reminders
|
||||
|
@@ -65,7 +65,9 @@ void DCCWaveform::interruptHandler() {
|
||||
byte sigProg=progTrackSyncMain? sigMain : signalTransform[progTrack.state];
|
||||
|
||||
// Set the signal state for both tracks
|
||||
#ifndef DCdistrict
|
||||
mainTrack.motorDriver->setSignal(sigMain);
|
||||
#endif
|
||||
progTrack.motorDriver->setSignal(sigProg);
|
||||
|
||||
// Move on in the state engine
|
||||
|
@@ -107,6 +107,27 @@ class DCCWaveform {
|
||||
inline void setMaxAckPulseDuration(unsigned int i) {
|
||||
maxAckPulseDuration = i;
|
||||
}
|
||||
#ifdef DCdistrict
|
||||
inline void pwmSpeed(uint8_t tSpeed) {
|
||||
// DCC Speed with 0,1 stop and speed steps 2 to 127
|
||||
uint8_t brake;
|
||||
if (!motorDriver)
|
||||
return;
|
||||
if (tSpeed <= 1)
|
||||
brake = 255;
|
||||
else if (tSpeed >= 127)
|
||||
brake = 0;
|
||||
else
|
||||
brake = 2 * (128-tSpeed);
|
||||
motorDriver->setBrake(brake);
|
||||
}
|
||||
inline void pwmSpeed(uint8_t tSpeed, bool tDirection) {
|
||||
if (!motorDriver)
|
||||
return;
|
||||
pwmSpeed(tSpeed);
|
||||
motorDriver->setSignal(tDirection);
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
|
||||
|
@@ -1 +1 @@
|
||||
#define GITHUB_SHA "37904b5"
|
||||
#define GITHUB_SHA "EX-RAIL-DC-20211109-2306"
|
||||
|
@@ -31,6 +31,7 @@ bool MotorDriver::commonFaultPin=false;
|
||||
|
||||
MotorDriver::MotorDriver(byte 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) {
|
||||
brakePWM=false;
|
||||
powerPin=power_pin;
|
||||
getFastPin(F("POWER"),powerPin,fastPowerPin);
|
||||
pinMode(powerPin, OUTPUT);
|
||||
@@ -53,7 +54,7 @@ MotorDriver::MotorDriver(byte power_pin, byte signal_pin, byte signal_pin2, int8
|
||||
brakePin=invertBrake ? 0-brake_pin : brake_pin;
|
||||
getFastPin(F("BRAKE"),brakePin,fastBrakePin);
|
||||
pinMode(brakePin, OUTPUT);
|
||||
setBrake(false);
|
||||
// setBrake(0); moved out to DCC::begin
|
||||
}
|
||||
else brakePin=UNUSED_PIN;
|
||||
|
||||
@@ -89,8 +90,11 @@ void MotorDriver::setPower(bool on) {
|
||||
if (on) {
|
||||
// toggle brake before turning power on - resets overcurrent error
|
||||
// on the Pololu board if brake is wired to ^D2.
|
||||
setBrake(true);
|
||||
setBrake(false);
|
||||
// Yes, this is an ugly special case
|
||||
if (brakePin == 4 && invertBrake) {
|
||||
setBrake(255);
|
||||
setBrake(0);
|
||||
}
|
||||
setHIGH(fastPowerPin);
|
||||
}
|
||||
else setLOW(fastPowerPin);
|
||||
@@ -104,10 +108,29 @@ void MotorDriver::setPower(bool on) {
|
||||
// (HIGH == release brake) and setBrake does
|
||||
// compensate for that.
|
||||
//
|
||||
void MotorDriver::setBrake(bool on) {
|
||||
void MotorDriver::setBrake(uint8_t intensity) {
|
||||
if (brakePin == UNUSED_PIN) return;
|
||||
if (on ^ invertBrake) setHIGH(fastBrakePin);
|
||||
else setLOW(fastBrakePin);
|
||||
DIAG(F("Brake pin=%d val=%d"),brakePin,intensity);
|
||||
if (invertBrake)
|
||||
intensity = 255 - intensity;
|
||||
if (intensity == 255) {
|
||||
if (brakePWM) {
|
||||
digitalWrite(brakePin, HIGH);
|
||||
brakePWM = false;
|
||||
} else
|
||||
setHIGH(fastBrakePin);
|
||||
return;
|
||||
}
|
||||
if (intensity == 0) {
|
||||
if (brakePWM) {
|
||||
digitalWrite(brakePin, LOW);
|
||||
brakePWM = false;
|
||||
} else
|
||||
setLOW(fastBrakePin);
|
||||
return;
|
||||
}
|
||||
brakePWM = true;
|
||||
analogWrite(brakePin, intensity);
|
||||
}
|
||||
|
||||
void MotorDriver::setSignal( bool high) {
|
||||
|
@@ -46,7 +46,7 @@ class MotorDriver {
|
||||
byte current_pin, float senseFactor, unsigned int tripMilliamps, byte faultPin);
|
||||
virtual void setPower( bool on);
|
||||
virtual void setSignal( bool high);
|
||||
virtual void setBrake( bool on);
|
||||
virtual void setBrake(uint8_t);
|
||||
virtual int getCurrentRaw();
|
||||
virtual unsigned int raw2mA( int raw);
|
||||
virtual int mA2raw( unsigned int mA);
|
||||
@@ -69,6 +69,7 @@ class MotorDriver {
|
||||
FASTPIN fastPowerPin,fastSignalPin, fastSignalPin2, fastBrakePin,fastFaultPin;
|
||||
bool dualSignal; // true to use signalPin2
|
||||
bool invertBrake; // brake pin passed as negative means pin is inverted
|
||||
bool brakePWM; // brake is used for PWM
|
||||
float senseFactor;
|
||||
int senseOffset;
|
||||
unsigned int tripMilliamps;
|
||||
|
@@ -48,6 +48,11 @@
|
||||
new MotorDriver(3, 12, UNUSED_PIN, UNUSED_PIN, A0, 2.99, 2000, UNUSED_PIN), \
|
||||
new MotorDriver(11, 13, UNUSED_PIN, UNUSED_PIN, A1, 2.99, 2000, UNUSED_PIN)
|
||||
|
||||
// TO GET THE DC district feature use this shield definition
|
||||
#define STD_DCC_DC_SHIELD F("STD_DCC_DC_SHIELD"), \
|
||||
new MotorDriver(3, 12, UNUSED_PIN, 9, A0, 2.99, 2000, UNUSED_PIN), \
|
||||
new MotorDriver(11, 13, UNUSED_PIN, UNUSED_PIN, A1, 2.99, 2000, UNUSED_PIN)
|
||||
|
||||
// Pololu Motor Shield
|
||||
#define POLOLU_MOTOR_SHIELD F("POLOLU_MOTOR_SHIELD"), \
|
||||
new MotorDriver( 9, 7, UNUSED_PIN, -4, A0, 18, 3000, 12), \
|
||||
|
@@ -23,6 +23,10 @@ The configuration file for DCC-EX Command Station
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
// SPECIAL CONFIG WITH MAIN AS DC (PWM) track reacting on cab #2.
|
||||
//
|
||||
#define DCdistrict 2
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// NOTE: Before connecting these boards and selecting one in this software
|
||||
// check the quick install guides!!! Some of these boards require a voltage
|
||||
@@ -38,10 +42,11 @@ The configuration file for DCC-EX Command Station
|
||||
// FIREBOX_MK1 : The Firebox MK1
|
||||
// FIREBOX_MK1S : The Firebox MK1S
|
||||
// IBT_2_WITH_ARDUINO : Arduino Motor Shield for PROG and IBT-2 for MAIN
|
||||
// STD_DCC_DC_SHIELD : as STANDARD but with brake so MAIN can be run as DC (PWM)
|
||||
// |
|
||||
// +-----------------------v
|
||||
//
|
||||
#define MOTOR_SHIELD_TYPE STANDARD_MOTOR_SHIELD
|
||||
#define MOTOR_SHIELD_TYPE STD_DCC_DC_SHIELD
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// The IP port to talk to a WIFI or Ethernet shield.
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
#include "StringFormatter.h"
|
||||
|
||||
#define VERSION "3.2.0 rc2"
|
||||
#define VERSION "3.2.0 DCrc2"
|
||||
// 3.2.0 Major functional and non-functional changes.
|
||||
// New HAL added for I/O (digital and analogue inputs and outputs, servos etc).
|
||||
// Support for MCP23008, MCP23017 and PCF9584 I2C GPIO Extender modules.
|
||||
|
Reference in New Issue
Block a user