見出し画像

使用可能なタイマ [Arduino UNO R4 MINIMA]

 レジスタでPWMを使うプログラムを書きたいが、使ってはいけないタイマがある。

Arduino UNO R4 Minima Cheat Sheetより
Arduino UNO R4 WiFi Cheat Sheetより

 R4のマイコンにはGPT[0-7]とAGT[0,1]の10個のタイマがあるが、GPT[0-3,7]はPWMやパルス測定などで、AGTのうち一つは時間計測などに使われている。

残りのタイマは使ってもいいのか

 使ってもいいタイマはFspTimerライブラリのget_available_timer()で獲得される。

#include "FspTimer.h"
#define NUM 10

FspTimer timer[NUM];

void setup() {

  Serial.begin(9600);
  while(!Serial);

  uint8_t timer_type[NUM];
  int8_t  timer_ch;

  for(int i=0; 1; i++){
    timer_ch = timer[i].get_available_timer(timer_type[i]);
    if(timer_ch < 0)   break;
    //use timer
    timer[i].begin(TIMER_MODE_PWM, timer_type[i], timer_ch, 1000.0, 10.0);
    Serial.print("timer:type_");
    Serial.print(timer_type[i]);
    Serial.print(", ch_");
    Serial.println(timer_ch);
  }
}

void loop() {
}

timer:type_0, ch_4
timer:type_0, ch_5
timer:type_0, ch_6
timer:type_1, ch_1

シリアルモニタからの返事

 GPT→type_0, AGT→type_1 なので、GPT[4-6]、AGT[1]は使えるみたい。

 ただ"analogWave.h"を使って波形を出したりすると、中で"FspTimer.h"を使っているので残りのタイマが減る。

#include "FspTimer.h"
#include "analogWave.h"

#define MAX_TIMER_NUM 10

FspTimer timer[MAX_TIMER_NUM];
analogWave wave(DAC);

void setup() {

  Serial.begin(11520);
  while(!Serial);

//sineWave from A0. use DAC,Timer,DTC,ICU
  analogWriteResolution(12);
  wave.sine(1000.0); //start

//check free timers
  uint8_t timer_type[MAX_TIMER_NUM];
  int8_t  timer_ch;

  for(int i=0; 1; i++){
    timer_ch = timer[i].get_available_timer(timer_type[i]);
    if(timer_ch < 0)   break;
    //use timer
    timer[i].begin(TIMER_MODE_PWM, timer_type[i], timer_ch, 1000.0, 10.0);
    Serial.print("timer:type_");
    Serial.print(timer_type[i]);
    Serial.print(", ch_");
    Serial.println(timer_ch);
  }
}

void loop() {
}

timer:type_0, ch_5
timer:type_0, ch_6
timer:type_1, ch_1

シリアルモニタより

 sine waveを出すためにGPT[4]が奪われた。

この記事が気に入ったらサポートをしてみませんか?