mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2025-02-26 18:46:04 +01:00
Nucleo-F4 Timer Sync - speed fix
This commit is contained in:
parent
a3bd5ac86f
commit
56a339a598
@ -631,7 +631,23 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
|
|||||||
else break; // will reply <X>
|
else break; // will reply <X>
|
||||||
}
|
}
|
||||||
//TrackManager::streamTrackState(NULL,t);
|
//TrackManager::streamTrackState(NULL,t);
|
||||||
|
|
||||||
|
TrackManager::setTrackPowerF439ZI(0);
|
||||||
|
TrackManager::setTrackPowerF439ZI(1);
|
||||||
|
TrackManager::setTrackPowerF439ZI(2);
|
||||||
|
TrackManager::setTrackPowerF439ZI(3);
|
||||||
|
TrackManager::setTrackPowerF439ZI(4);
|
||||||
|
TrackManager::setTrackPowerF439ZI(5);
|
||||||
|
TrackManager::setTrackPowerF439ZI(6);
|
||||||
|
TrackManager::setTrackPowerF439ZI(7);
|
||||||
|
TrackManager::setTrackPowerF439ZI(0); // repeated in case the <F29..31 was
|
||||||
|
TrackManager::setTrackPowerF439ZI(1); // set on a later track than power
|
||||||
|
TrackManager::setTrackPowerF439ZI(2); // Note: this retains power but prevents
|
||||||
|
TrackManager::setTrackPowerF439ZI(3); // speed doubling.
|
||||||
|
TrackManager::setTrackPowerF439ZI(4);
|
||||||
|
TrackManager::setTrackPowerF439ZI(5);
|
||||||
|
TrackManager::setTrackPowerF439ZI(6);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -344,7 +344,7 @@ void DCCTimer::DCCEXanalogWriteFrequencyInternal(uint8_t pin, uint32_t frequency
|
|||||||
if (pin_timer[pin] != NULL)
|
if (pin_timer[pin] != NULL)
|
||||||
{
|
{
|
||||||
pin_timer[pin]->setPWM(pin_channel[pin], pin, frequency, 0); // set frequency in Hertz, 0% dutycycle
|
pin_timer[pin]->setPWM(pin_channel[pin], pin, frequency, 0); // set frequency in Hertz, 0% dutycycle
|
||||||
DIAG(F("DCCEXanalogWriteFrequency::Pin %d on Timer Channel %d, frequency %d"), pin, pin_channel[pin], frequency);
|
DIAG(F("DCCEXanalogWriteFrequency::Pin %d on Timer %d Channel %d, frequency %d"), pin, pin_timer[pin], pin_channel[pin], frequency);
|
||||||
resetCounterDCmodeTimers();
|
resetCounterDCmodeTimers();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -353,6 +353,7 @@ void DCCTimer::DCCEXanalogWriteFrequencyInternal(uint8_t pin, uint32_t frequency
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Frequency change request
|
// Frequency change request
|
||||||
|
//DIAG(F("DCCEXanalogWriteFrequency_356::pin %d frequency %d"), pin, frequency);
|
||||||
if (frequency != channel_frequency[pin])
|
if (frequency != channel_frequency[pin])
|
||||||
{
|
{
|
||||||
pinmap_pinout(digitalPinToPinName(pin), PinMap_TIM); // ensure the pin has been configured!
|
pinmap_pinout(digitalPinToPinName(pin), PinMap_TIM); // ensure the pin has been configured!
|
||||||
|
@ -371,7 +371,9 @@ void MotorDriver::setDCSignal(byte speedcode, uint8_t frequency /*default =0*/)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
//DIAG(F("Brake pin %d value %d freqency %d"), brakePin, brake, f);
|
//DIAG(F("Brake pin %d value %d freqency %d"), brakePin, brake, f);
|
||||||
|
//DIAG(F("MotorDriver_cpp_374_DCCEXanalogWriteFequency::Pin %d, frequency %d, tSpeed %d"), brakePin, f, tSpeed);
|
||||||
DCCTimer::DCCEXanalogWriteFrequency(brakePin, f); // set DC PWM frequency
|
DCCTimer::DCCEXanalogWriteFrequency(brakePin, f); // set DC PWM frequency
|
||||||
|
//DIAG(F("MotorDriver_cpp_375_DCCEXanalogWrite::brakePin %d, frequency %d, invertBrake"), brakePin, brake, invertBrake);
|
||||||
DCCTimer::DCCEXanalogWrite(brakePin, brake, invertBrake); // line swapped to set frequency first
|
DCCTimer::DCCEXanalogWrite(brakePin, brake, invertBrake); // line swapped to set frequency first
|
||||||
#else // all AVR here
|
#else // all AVR here
|
||||||
DCCTimer::DCCEXanalogWriteFrequency(brakePin, frequency); // frequency steps
|
DCCTimer::DCCEXanalogWriteFrequency(brakePin, frequency); // frequency steps
|
||||||
|
@ -738,3 +738,38 @@ TRACK_MODE TrackManager::getMode(byte t) {
|
|||||||
int16_t TrackManager::returnDCAddr(byte t) {
|
int16_t TrackManager::returnDCAddr(byte t) {
|
||||||
return (trackDCAddr[t]);
|
return (trackDCAddr[t]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set track power for EACH track, independent of mode
|
||||||
|
// This updates the settings so that speed is correct
|
||||||
|
// following a frequency change - DC mode
|
||||||
|
void TrackManager::setTrackPowerF439ZI(byte t) {
|
||||||
|
MotorDriver *driver=track[t];
|
||||||
|
if (driver == NULL) { // track is not defined at all
|
||||||
|
// DIAG(F("Error: Track %c does not exist"), t+'A');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
TRACK_MODE trackmode = driver->getMode();
|
||||||
|
POWERMODE powermode = driver->getPower(); // line added to enable processing for DC mode tracks
|
||||||
|
POWERMODE oldpower = driver->getPower();
|
||||||
|
//if (trackmode & TRACK_MODE_NONE) {
|
||||||
|
// driver->setBrake(true); // Track is unused. Brake is good to have.
|
||||||
|
// powermode = POWERMODE::OFF; // Track is unused. Force it to OFF
|
||||||
|
//} else
|
||||||
|
if (trackmode & TRACK_MODE_DC) { // includes inverted DC (called DCX)
|
||||||
|
if (powermode == POWERMODE::ON) {
|
||||||
|
driver->setBrake(true); // DC starts with brake on
|
||||||
|
applyDCSpeed(t); // speed match DCC throttles
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//else /* MAIN PROG EXT BOOST */ {
|
||||||
|
// if (powermode == POWERMODE::ON) {
|
||||||
|
// // toggle brake before turning power on - resets overcurrent error
|
||||||
|
// // on the Pololu board if brake is wired to ^D2.
|
||||||
|
// driver->setBrake(true);
|
||||||
|
// driver->setBrake(false); // DCC runs with brake off
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
driver->setPower(powermode);
|
||||||
|
if (oldpower != driver->getPower())
|
||||||
|
CommandDistributor::broadcastPower();
|
||||||
|
}
|
@ -67,6 +67,7 @@ class TrackManager {
|
|||||||
|
|
||||||
static void setPower(POWERMODE mode) {setMainPower(mode); setProgPower(mode);}
|
static void setPower(POWERMODE mode) {setMainPower(mode); setProgPower(mode);}
|
||||||
static void setTrackPower(POWERMODE mode, byte t);
|
static void setTrackPower(POWERMODE mode, byte t);
|
||||||
|
static void setTrackPowerF439ZI(byte t);
|
||||||
static void setTrackPower(TRACK_MODE trackmode, POWERMODE powermode);
|
static void setTrackPower(TRACK_MODE trackmode, POWERMODE powermode);
|
||||||
static void setMainPower(POWERMODE mode) {setTrackPower(TRACK_MODE_MAIN, mode);}
|
static void setMainPower(POWERMODE mode) {setTrackPower(TRACK_MODE_MAIN, mode);}
|
||||||
static void setProgPower(POWERMODE mode) {setTrackPower(TRACK_MODE_PROG, mode);}
|
static void setProgPower(POWERMODE mode) {setTrackPower(TRACK_MODE_PROG, mode);}
|
||||||
|
Loading…
Reference in New Issue
Block a user