當然,我只花了大概半小時就讓Teensy 動了起來,也許有Arduino的基礎,少了安裝Arduino的步驟,但加上安裝,要讓一塊陌生的板子DIY到實際運作,以前可能要查資料,老師再教一下,寫個code,至少要半天,現在不到1小時就完成,效率真的加倍了!
下一步,除了基本的Led外,就要進入到Pin腳測試了,這麼強大的MCU,不拿來實作一下怎麼行?
接下來我請claude code給我更大範圍的Smoke Test!
/*
* Teensy 4.1 Smoke Test: PWM & TACH Simulation
* 驗證硬體確定性與非阻塞中斷架構
*/
// --- 腳位定義 ---
const uint8_t pwmPins[] = {2, 3, 4}; // 模擬 3 通道風扇控制
const uint8_t tachInputPin = 10; // 讀取 TACH 脈衝 (中斷腳)
const uint8_t tachSimPin = 14; // 產生假 TACH 方波
// --- 系統常數 ---
const uint32_t PWM_FREQ = 25000; // 風扇標準 25kHz
const uint32_t TACH_SIM_FREQ = 500; // 模擬頻率 (500Hz -> 15000 RPM)
// --- 共用變數 (必須使用 volatile 供中斷使用) ---
volatile uint32_t tachPulseCount = 0;
uint16_t currentRPM = 0;
uint8_t currentDutyCycle = 0; // 0-255
// --- 中斷服務常式 (ISR) ---
void tachISR() {
tachPulseCount++; // 極致瘦身,只做計數
}
void setup() {
Serial.begin(115200);
// 1. 初始化 PWM 輸出
analogWriteResolution(8); // 8-bit 解析度 (0-255)
for (int i = 0; i < 3; i++) {
pinMode(pwmPins[i], OUTPUT);
analogWriteFrequency(pwmPins[i], PWM_FREQ);
analogWrite(pwmPins[i], 0); // 初始為 0 (LED 滅)
}
// 2. 初始化 TACH 模擬輸出 (自產自銷方波)
pinMode(tachSimPin, OUTPUT);
analogWriteFrequency(tachSimPin, TACH_SIM_FREQ);
analogWrite(tachSimPin, 128); // 50% 佔空比方波
// 3. 初始化 TACH 讀取中斷
pinMode(tachInputPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(tachInputPin), tachISR, FALLING);
}
// 用於非阻塞計時
uint32_t lastCalcTime = 0;
uint32_t lastLEDTime = 0;
void loop() {
uint32_t now = millis();
// 任務一:每秒結算一次 RPM (模擬上位機讀取)
if (now - lastCalcTime >= 1000) {
lastCalcTime = now;
// 關鍵:短暫關閉中斷以安全複製數據
noInterrupts();
uint32_t pulses = tachPulseCount;
tachPulseCount = 0;
interrupts();
// 計算 RPM (假設 1 轉 2 脈衝)
currentRPM = (pulses * 60) / 2;
Serial.print("目前設定 PWM (%): ");
Serial.print((currentDutyCycle * 100) / 255);
Serial.print(" | 偵測轉速 (RPM): ");
Serial.println(currentRPM);
}
// 任務二:讓 LED 呼吸燈效應 (模擬動態改變 PWM 設定)
if (now - lastLEDTime >= 10) {
lastLEDTime = now;
// 改變 Duty Cycle (0->255->0 循環)
static int8_t fadeAmount = 1;
currentDutyCycle += fadeAmount;
if (currentDutyCycle == 0 || currentDutyCycle == 255) {
fadeAmount = -fadeAmount;
}
// 套用至 3 個通道
for (int i = 0; i < 3; i++) {
analogWrite(pwmPins[i], currentDutyCycle);
}
}
}
實際看到3顆PWM的LEDs在同時在fade in/fade out,及透過serial port印在螢幕上的轉速,還是蠻感動的!

Figure 1: PWM Pin 2,3,4 with 3 Green leds fade in

Figure 2: PWM Pin 2,3,4 with 3 Green leds fade out