Arduino R4 Wifi 定時中斷及設定14位元的ADC

Arduino Uno R3的 TimerOne不能用在R4上,所以上網找了一下,要換個方式做,寫起來有點小麻煩。

#include "FspTimer.h"  // 引入FspTimer庫,這個庫可能用於處理定時器

int sensorValue = 0;  // 創建一個整數變數sensorValue,用於儲存感應器讀取的數值
bool flag = 0;  // 創建一個布林變數flag,用於標記是否已讀取了感應器數值
FspTimer ADC_30mS_timer;  // 創建一個FspTimer類的實例ADC_30mS_timer,用於處理定時器
uint64_t start_time = 0;  // 創建一個64位整數變數start_time,用於儲存程式開始運行的時間

// 定義一個用於定時器回調的方法
void timer_callback(timer_callback_args_t __attribute((unused)) *p_args) {
  sensorValue = analogRead(A0);  // 讀取A0引腳的模擬數值,並存儲在sensorValue中
  flag = 1;  // 設置flag為1,表示已經讀取了感應器數值
}

// 初始化定時器
bool beginTimer(float rate) {
  uint8_t timer_type = GPT_TIMER;  // 指定定時器類型為GPT_TIMER
  int8_t tindex = FspTimer::get_available_timer(timer_type);  // 獲取可用的定時器索引
  if (tindex < 0) {
    tindex = FspTimer::get_available_timer(timer_type, true);  // 如果沒有可用的定時器,嘗試強制獲取
  }
  if (tindex < 0) {
    return false;  // 如果無法獲得可用的定時器,返回false
  }

  FspTimer::force_use_of_pwm_reserved_timer();  // 強制使用PWM保留的定時器

  if (!ADC_30mS_timer.begin(TIMER_MODE_PERIODIC, timer_type, tindex, rate, 0.0f, timer_callback)) {
    return false;  // 如果無法初始化定時器,返回false
  }

  if (!ADC_30mS_timer.setup_overflow_irq()) {
    return false;  // 如果無法設置溢出中斷,返回false
  }

  if (!ADC_30mS_timer.open()) {
    return false;  // 如果無法打開定時器,返回false
  }

  if (!ADC_30mS_timer.start()) {
    return false;  // 如果無法啟動定時器,返回false
  }
  return true;  // 初始化成功,返回true
}

void setup() {
  analogReadResolution(14);  // 設置模擬數值讀取的位數為14位
  Serial.begin(115200);  // 初始化串口通信,波特率為115200
  beginTimer(33);  // 初始化定時器,設置間隔為33毫秒
  start_time = millis();  // 獲取當前時間,用於記錄程式開始運行的時間
  Serial.println("ready");  // 透過串口輸出"ready"消息
}

void loop() {
  if (flag) {  // 如果flag為1(表示已經讀取了感應器數值)
    Serial.println(sensorValue);  // 透過串口輸出感應器數值
    flag = 0;  // 重置flag為0,等待下一次讀取
  }
}

參考來源
https://www.pschatzmann.ch/home/2023/07/01/under-the-hood-arduino-uno-r4-timers/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *