diff --git a/CommandStation-EX.ino b/CommandStation-EX.ino index d2627ea..219e245 100644 --- a/CommandStation-EX.ino +++ b/CommandStation-EX.ino @@ -101,7 +101,6 @@ void setup() // Invoke any DCC++EX commands in the form "SETUP("xxxx");"" found in optional file mySetup.h. // This can be used to create turnouts, outputs, sensors etc. through the normal text commands. -// PMA - how to handle __has_include?? #if __has_include ( "mySetup.h") #define SETUP(cmd) DCCEXParser::parse(F(cmd)) #include "mySetup.h" diff --git a/DCCTimerSAMD.cpp b/DCCTimerSAMD.cpp index 74ec18b..a3f9c00 100644 --- a/DCCTimerSAMD.cpp +++ b/DCCTimerSAMD.cpp @@ -37,8 +37,33 @@ INTERRUPT_CALLBACK interruptHandler=0; void DCCTimer::begin(INTERRUPT_CALLBACK callback) { interruptHandler=callback; + // PMA - SAMC used on Firebox has 2 ADCs, so choose which to set up based on pin being used + // TODO: this code will need to be fixed - ADCpin is not in scope... as this is stolen from + // the abandoned rf24 branch + #if defined(ARDUINO_ARCH_SAMC) + Adc* ADC; + if ( (g_APinDescription[ADCpin].ulPeripheralAttribute & PER_ATTR_ADC_MASK) == PER_ATTR_ADC_STD ) { + ADC = ADC0; + } else { + ADC = ADC1; + } + #endif + // PMA - Set up ADC to do faster reads... default for Arduino Zero platform configs is 436uS, + // and we need sub-100uS. This code sets it to a read speed of around 21uS, and enables 12-bit + ADC->CTRLA.bit.ENABLE = 0; // disable ADC + while( ADC->STATUS.bit.SYNCBUSY == 1 ); // wait for synchronization + ADC->CTRLB.reg &= 0b1111100011111111; // mask PRESCALER bits + ADC->CTRLB.reg |= ADC_CTRLB_PRESCALER_DIV64 | // divide Clock by 64 + ADC_CTRLB_RESSEL_12BIT; // Result on 12 bits + + ADC->AVGCTRL.reg = ADC_AVGCTRL_SAMPLENUM_1 | // take 1 sample at a time + ADC_AVGCTRL_ADJRES(0x00ul); // adjusting result by 0 + ADC->SAMPCTRL.reg = 0x00; // sampling Time Length = 0 + + ADC->CTRLA.bit.ENABLE = 1; // enable ADC + while(ADC->STATUS.bit.SYNCBUSY == 1); // wait for synchronization } diff --git a/MotorDrivers.h b/MotorDrivers.h index b2b798d..accddf1 100644 --- a/MotorDrivers.h +++ b/MotorDrivers.h @@ -46,9 +46,17 @@ // (HIGH == release brake) // // Arduino standard Motor Shield +#if defined(ARDUINO_ARCH_SAMD) +// PMA - senseFactor for 3.3v systems is 1.95 as calculated when using 10-bit A/D samples, +// and for 12-bit samples it's more like 0.488, but we probably need to tweak both these +#define STANDARD_MOTOR_SHIELD F("STANDARD_MOTOR_SHIELD"), \ + new MotorDriver(3, 12, UNUSED_PIN, 9, A0, 0.488, 2000, UNUSED_PIN), \ + new MotorDriver(11, 13, UNUSED_PIN, 8, A1, 0.488, 2000, UNUSED_PIN) +#else #define STANDARD_MOTOR_SHIELD F("STANDARD_MOTOR_SHIELD"), \ new MotorDriver(3, 12, UNUSED_PIN, 9, A0, 2.99, 2000, UNUSED_PIN), \ new MotorDriver(11, 13, UNUSED_PIN, 8, A1, 2.99, 2000, UNUSED_PIN) +#endif // Pololu Motor Shield #define POLOLU_MOTOR_SHIELD F("POLOLU_MOTOR_SHIELD"), \