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/