Привет! Я использую библиотеку таймера AVDweb SAMD21 на реквизитах ItsyBitsy M0 Express -> для разработчиков.
Теперь я расширил библиотеку для функции setPeriod, чтобы изменить период во время выполнения.используется базовая единица измерения, теперь единица измерения параметра в setPeriod изменяется на мс.Кто-нибудь знает, почему он это делает?
Thx
SAMDtimer::SAMDtimer(byte timerNr, tc_callback_t _ISR, unsigned period_us, bool ISRenable):
Adafruit_ZeroTimer(timerNr)
{ ISR = _ISR;
countersize = TC_COUNTER_SIZE_16BIT;
calc(period_us, period_us/2);
init(1);
setCallback(ISRenable, TC_CALLBACK_CC_CHANNEL1, ISR);
}
void SAMDtimer::setPeriod(unsigned _period){
calc(_period, _period/2);
init(1);
setCallback(true, TC_CALLBACK_CC_CHANNEL1, ISR);
}
void SAMDtimer::init(bool enabled)
{ configure(prescale, countersize, TC_WAVE_GENERATION_MATCH_PWM);
PWMout(true, 1, pin); // must be ch1 for 16bit
setPeriodMatch(periodCounter, PWcounter, 1);
enable(enabled);
}
void SAMDtimer::calc(unsigned period_us, unsigned pulseWidth_us)
{ periodCounter = (F_CPU * (signed)period_us) / 1000000; // why signed?
PWcounter = (F_CPU * (signed)pulseWidth_us) / 1000000;
if(periodCounter < 65536) prescale = TC_CLOCK_PRESCALER_DIV1;
else if((PWcounter >>= 1, periodCounter >>= 1) < 65536) prescale = TC_CLOCK_PRESCALER_DIV2; // = 256
else if((PWcounter >>= 1, periodCounter >>= 1) < 65536) prescale = TC_CLOCK_PRESCALER_DIV4;
else if((PWcounter >>= 1, periodCounter >>= 1) < 65536) prescale = TC_CLOCK_PRESCALER_DIV8;
else if((PWcounter >>= 1, periodCounter >>= 1) < 65536) prescale = TC_CLOCK_PRESCALER_DIV16;
else if((PWcounter >>= 2, periodCounter >>= 2) < 65536) prescale = TC_CLOCK_PRESCALER_DIV64;
else if((PWcounter >>= 2, periodCounter >>= 2) < 65536) prescale = TC_CLOCK_PRESCALER_DIV256;
else if((PWcounter >>= 2, periodCounter >>= 2) < 65536) prescale = TC_CLOCK_PRESCALER_DIV1024;
}