Библиотека таймера AVDweb SAMD21 -> добавление функции - PullRequest
0 голосов
/ 13 декабря 2018

Привет! Я использую библиотеку таймера 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; 
}
...