#include <Arduino.h> // ใช้ฟังก์ชันพื้นฐานของ Arduino เช่น pinMode() และค่ากำหนดรีจิสเตอร์
// Include Arduino core functions (pinMode, etc.)
#define LED_PIN (9) // กำหนดขาเอาต์พุต LED (D9 = OC1A บน ATmega328P)
// Define PWM output pin (D9 is OC1A on ATmega328P)
//--------------------------------------------------------------------------------------
// ฟังก์ชันตั้งค่า Timer1 ให้สร้างสัญญาณ PWM แบบฮาร์ดแวร์
// Function to initialize Timer1 hardware PWM
//--------------------------------------------------------------------------------------
void init_timer1_pwm() {
// ------------------------------------------------------------------
// 1) คำนวณค่าตัวหาร Prescaler และค่า TOP
// ความถี่ที่ต้องการ: f_PWM = 1 Hz (คาบ 1 วินาที)
// นาฬิกาหลักของ Arduino Uno/Nano: f_clk = 16 MHz
// เลือก prescaler (N) = 256
// สูตร: TOP = (f_clk / (N * f_PWM)) - 1
// = (16,000,000 / (256 * 1)) - 1
// = 62,500 - 1
// = 62,499
// ------------------------------------------------------------------
// ตั้งค่าโหมดการทำงานของ Timer1
// Use Fast PWM mode 14 (WGM13:0 = 1110)
// TOP = ICR1 (กำหนดคาบได้เอง)
// COM1A1 = 1, COM1A0 = 0 -> Non-Inverting Mode
// * ขา OC1A (D9) จะถูก Set HIGH เมื่อเริ่มนับ (BOTTOM)
// * และจะถูก Clear LOW เมื่อ TCNT1 = OCR1A (ถึงค่าเปรียบเทียบ)
TCCR1A = (1 << COM1A1) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS12); // CS12 = 1 => prescaler = 256
// ตั้งค่า TOP ตามค่าที่คำนวณได้
// Set ICR1 as TOP -> determines PWM frequency
ICR1 = 62500 - 1; // TOP = 62,499 -> ~1 Hz
// ตั้งค่า Duty Cycle
// Duty = (OCR1A + 1) / (ICR1 + 1) ≈ OCR1A / ICR1 (เมื่อค่ามากๆ)
// สำหรับ 50% duty: OCR1A = ICR1 / 2
// = 62,499 / 2
// ≈ 31,249
OCR1A = ICR1 / 2; // ตั้งให้ขา D9 ติดสว่าง ~0.5 s ดับ ~0.5 s
}
//--------------------------------------------------------------------------------------
// ฟังก์ชันเริ่มต้น
// Setup function runs once at startup
//--------------------------------------------------------------------------------------
void setup() {
// ตั้งขา D9 เป็นเอาต์พุตเพื่อส่ง PWM
// Set the PWM pin as output
pinMode(LED_PIN, OUTPUT);
// เรียกฟังก์ชันตั้งค่า Timer1 ให้เริ่มสร้างสัญญาณ PWM อัตโนมัติ
// Initialize Timer1 hardware PWM on D9
init_timer1_pwm();
}
//--------------------------------------------------------------------------------------
// วนซ้ำหลัก
// Main loop runs repeatedly but remains empty
//--------------------------------------------------------------------------------------
void loop() {
// ว่างเปล่าเพราะ Timer1 ทำงานเองในฮาร์ดแวร์
// Empty loop – hardware PWM continues automatically
}