ผลการเรียนรู้ (Learning Outcomes)
- อธิบายโครงสร้างภายในของ Timer (counter, prescaler, auto-reload register, capture/compare register)
- คำนวณค่า prescaler (PSC) และ auto-reload (ARR) เพื่อให้ได้ความถี่ interrupt หรือช่วงเวลาที่กำหนด
- อธิบายแหล่งจ่าย clock ของ Timer (APB1/APB2, การคูณ 2, HSI/LSI, crystal, PLL)
- แยกประเภท Timer ของ STM32F767 (Advanced-control, General-purpose, Basic) และคุณสมบัติเด่น
- อธิบายหลักการ PWM, คำนวณ duty cycle และใช้ CCR สร้าง duty cycle ตามต้องการ
- อธิบายการควบคุมมอเตอร์ด้วย H-bridge/motor driver (L293/L298) และการใช้ Watchdog Timer
§8.1 Timer คืออะไร และวงจร Counter ภายใน
Timer คือนาฬิกาสำหรับงานที่ต้องการเวลาแม่นยำ. ใช้ทำงานซ้ำเป็นคาบที่แน่นอน (เช่นทุก 100 ms, 500 ms พอดี), สร้างสัญญาณ PWM, หรือทำ input capture (วัดความกว้างของพัลส์ที่รับเข้ามา).
หัวใจของ Timer คือวงจร Counter (เคาน์เตอร์) จากวิชาดิจิทัล. เคาน์เตอร์ขนาด n บิต เมื่อนับขึ้นจะนับจาก 0 ถึง 2^n − 1 เช่น 8 บิตนับ 0 ถึง 255. พอถึงค่าสูงสุดแล้วนับต่อ ค่าจะวนกลับไป 0 ใหม่ เรียกว่าเกิด overflow. โครงสร้างเคาน์เตอร์สร้างจาก flip-flop เช่น JK ต่อกัน.
เคาน์เตอร์นับตามสัญญาณนาฬิกา (clock) ที่ได้รับ. เคาน์เตอร์ซับซ้อนขึ้นจะมีขา control เลือกได้ว่านับขึ้น (up) หรือนับลง (down).
การจับเวลา: ถ้าเคาน์เตอร์ 8 บิตได้ clock 1 MHz แต่ละลูกกินเวลา 1 µs (period). นับ 0 ถึง 255 แล้ววนกลับคือนับทั้งสิ้น 256 ครั้ง = 256 µs. ถ้าไม่ต้องรอ overflow ก็เอาจำนวนครั้งที่นับคูณกับคาบของ clock ได้เวลาที่ต้องการ. เวลาจึงแม่นยำเพราะอิงกับ clock จริง.
เมื่อเคาน์เตอร์นับถึงค่าที่กำหนด (หรือ overflow) Timer สามารถ generate สัญญาณ interrupt ออกมา แล้วไปเรียก service routine ได้. ดังนั้นงานใดที่ต้องทำซ้ำในเวลาที่แน่นอน ให้พิจารณาใช้ Timer เสมอ รวมถึง OS ที่ใช้ Timer ทำ context switch ตามคาบเวลา.
ตัวนับเพิ่มค่าทีละ 1 จาก 0 จนถึง ARR (2^n − 1) แล้ว 'wrap' กลับเป็น 0 ทันที จุดวนกลับคือ overflow ที่ใช้สร้าง interrupt เป็นจังหวะ.
§8.2 Prescaler, Auto-Reload และการคำนวณช่วงเวลา
เคาน์เตอร์หลักของ Timer จะนับตาม clock ที่ได้รับ. แต่ clock ของระบบเร็วมาก (STM32F767 ถึง 216 MHz) ถ้าเคาน์เตอร์ 16 บิตนับตรง ๆ จะ overflow เร็วเกินไป. จึงมีวงจร Prescaler (PSC) คอยหารความถี่ให้ลดลงก่อนป้อนให้เคาน์เตอร์หลัก เพื่อให้นับได้นานขึ้น. Prescaler เองก็เป็นเคาน์เตอร์ตัวหนึ่ง.
เคาน์เตอร์หลักนับขึ้นจาก 0 ถึงค่าใน Auto-Reload Register (ARR) แล้ววนกลับ (หรือนับลงจาก ARR ถึง 0 ในโหมดนับลง). ARR จึงเป็นตัวกำหนดคาบเวลาใหญ่. นอกจากนั้นยังมี Capture/Compare Register (CCR) ทำเป็น channel ย่อยสำหรับ output โดยเฉพาะใช้สร้าง PWM.
สูตรพื้นฐาน: Timer clock / ((PSC+1) × (ARR+1)) = ความถี่ interrupt ที่ต้องการ. สิ่งที่ต้องรู้คือ clock ที่จ่ายให้ Timer มีขนาดเท่าใด. ความถี่ (frequency) กับเวลา (period) เป็นส่วนกลับกัน: 1 Hz = 1 ครั้ง/วินาที, 1 kHz = 1000 ครั้ง/วินาที.
ตัวอย่าง: ต้องการ interrupt 1 kHz, clock ให้ระบบ 216 MHz. ตัวหารรวมที่ต้องการ = 216×10^6 / 1000 = 216,000. กระจายเป็น PSC กับ ARR ได้หลายแบบ เช่น PSC หาร 216 (ตั้งค่า 215 เพราะนับ 0–215) ให้เหลือ 1 MHz, แล้ว ARR หาร 1000 (ตั้งค่า 999 เพราะนับ 0–999) ให้ได้ 1 kHz. หรือ PSC = 1 กับ ARR = 215999 ก็ได้เช่นกัน.
สำคัญ: ค่าที่ set ลง register ต้องลบ 1 เสมอ เพราะการนับ 0 ถึง N−1 คือการนับ N ครั้ง. บางระบบให้ใส่ค่าเต็มแล้วลบให้เองภายใน ต้องดูตามคู่มือของแต่ละค่าย. เมื่อเคาน์เตอร์หลักนับครบ 0–999 กลับเป็น 0 ใหม่จะเท่ากับ 1 ms พอดีถ้า clock เข้าเป็น 1 MHz.
| PSC division | ค่าเข้าเคาน์เตอร์ | ARR division | ผลลัพธ์ |
|---|---|---|---|
| 1 (set 0) | 216 MHz | 216,000 | 1 kHz |
| 216 (set 215) | 1 MHz | 1000 (set 999) | 1 kHz |
| 2 (set 1) | 108 MHz | 108,000 | 1 kHz |
Timer_clock / ((PSC+1) x (ARR+1)) = f_interrupt
ตัวอย่าง: 216 MHz, f = 1 kHz
ตัวหารรวม = 216,000,000 / 1000 = 216,000
PSC = 216 (set 215) -> 1 MHz
ARR = 1000 (set 999) -> 1 kHz (period = 1 ms)f_out = f_clk / ((PSC+1)·(ARR+1)) = 16.00 MHz / (16000·1000) = 1.000 Hz
T_out = 1 / f_out = 1.000 s
หมายเหตุ: set-value = count − 1 (นับ 0..N−1) จึงต้องตั้ง PSC/ARR น้อยกว่าจำนวนที่ต้องการ 1
สัญญาณนาฬิกาเข้า ÷ (PSC+1) ได้ความถี่นับ แล้ว ÷ (ARR+1) ได้ความถี่/คาบของ update interrupt. ค่าที่ตั้งคือ count − 1 (นับ 0..N−1).
§8.3 แหล่งจ่าย Clock ของ Timer
Timer เกาะอยู่กับบัส peripheral คือ APB1 หรือ APB2 (ชื่อ bus ที่จ่าย clock ให้ I/O และ peripheral). ที่ความเร็วระบบสูงสุด 216 MHz: APB1 ได้ 54 MHz, APB2 ได้ 108 MHz. แต่ clock ที่เข้า Timer จะถูกคูณ 2 ก่อน ดังนั้น Timer บน APB1 ได้สูงสุด 108 MHz, Timer บน APB2 ได้สูงสุด 216 MHz.
ต้องตรวจสอบว่า Timer ตัวที่ใช้เกาะบัสไหน เพราะมีผลต่อ clock ที่ป้อนสูตร. ตัวอย่าง: Timer 2, 3, 4, 5, 12, 13, 14 เกาะ APB1; Timer 1, 8, 9, 10, 11 เกาะ APB2.
ต้นทางสัญญาณนาฬิกา: ภายในชิปมีวงจร RC oscillator ให้ 2 ตัว คือ HSI (High Speed Internal) 16 MHz และ LSI (Low Speed Internal) 32 kHz. ปกติใช้ HSI เป็นแหล่งจ่าย clock ให้ระบบ. วงจร RC ภายในสะดวก (ไม่ต้องต่อวงจรนอก) แต่ sensitive ต่ออุณหภูมิ ค่าจะเพี้ยนเล็กน้อยเมื่อร้อนขึ้น (เช่นจาก 16 เป็น 16.001 MHz) มีผลถ้ารันนาน ๆ.
ถ้าต้องการความถี่สูงกว่า 16 MHz (เช่น 216 MHz) ต้องผ่านวงจรคูณความถี่ชื่อ PLL (Phase-Locked Loop) ก่อน แล้วค่อยหารลงด้วยเคาน์เตอร์ให้เหมาะกับแต่ละ device. เปรียบเหมือน CPU ใน PC ที่มี base bus แล้วใช้ตัวคูณ (multiplier) ดันขึ้นเป็น speed สูง.
บนบอร์ด NUCLEO-F767ZI มีแหล่ง clock ภายนอกเป็น crystal (ผลึก) ให้ด้วย ซึ่งทนต่อการเปลี่ยนอุณหภูมิได้ดีกว่า RC ภายใน (คลาดเคลื่อนน้อยกว่า). บอร์ดมี crystal ความถี่สูง 8 MHz และ 32.768 kHz. ถ้าใช้แค่ 8 MHz วิ่งตรงได้ แต่ถ้าจะ 216 MHz ต้องผ่าน PLL. วงจรคูณ/หารความถี่ทั้งหมดอยู่ในโมดูล RCC (Reset & Clock Control).
| บัส | APB clock | Timer clock (คูณ 2) | Timer ที่เกาะอยู่ |
|---|---|---|---|
| APB1 | 54 MHz | 108 MHz | TIM2,3,4,5,12,13,14 |
| APB2 | 108 MHz | 216 MHz | TIM1,8,9,10,11 |
APB1 bus 54 MHz → timer บน APB1 ได้ ×2 = 108 MHz (TIM2–7,12–14)
นาฬิกาจากแหล่งกำเนิดผ่าน PLL คูณขึ้นเป็น SYSCLK แล้วหารลงตามบัส. Timer บน APB จะถูกคูณ ×2 อีกครั้ง คลิกโหนดเพื่อดูรายละเอียด.
§8.4 ประเภทของ Timer ใน STM32F767
STM32F767 มี Timer ให้เพียบ: Advanced-control Timer 2 ตัว, General-purpose 10 ตัว, Basic Timer 2 ตัว, Low-power Timer 1 ตัว, Watchdog 2 ตัว, และ System Timer 1 ตัว.
Advanced-control Timer คือ TIM1 และ TIM8. เคาน์เตอร์ 16 บิต, prescaler 16 บิต, มี capture/compare 4 channel, มี complementary output (เอาต์พุตคู่ตรงข้ามกัน), ใช้ DMA ได้. นับขึ้น/นับลง/นับขึ้นแล้วลงเป็น 1 รอบได้.
คุณสมบัติพิเศษของ Advanced-control คือมี Repetition Counter. ปกติเมื่อนับถึงค่าใน ARR จะ generate สัญญาณ update/interrupt ทันที. แต่ถ้ามี repetition counter มันจะลดค่า repetition ก่อน แล้วนับรอบใหม่ กว่าจะส่งสัญญาณจริงต้องนับซ้ำตาม repetition counter (ขนาด 16 บิต นับซ้ำได้ถึง 65536 ครั้ง). ทำให้นับได้นานมาก เหมาะกับงานที่ต้องนับเป็นนาทีทั้งที่ clock เป็นหลัก MHz.
General-purpose Timer นับได้เยอะ (16 บิต, 0–65535, หารได้ 1 ถึง 65536), มี capture/compare สูงสุด 4 channel, ใช้ DMA ได้ แต่ไม่มี complementary output. บางตัวมี channel ย่อยน้อยกว่า.
Basic Timer ของ F767 ไม่มี channel ย่อย เพราะออกแบบสำหรับงานภายใน มักใช้คู่กับ DAC เป็นหลัก.
แต่ละ channel ของ Timer ทำได้ 4 แบบ: Input Capture (วัดความกว้างพัลส์), Output Compare, PWM Generation, และ One-Pulse Mode. Prescaler เปลี่ยนค่าได้ขณะนับอยู่ (on the fly) แต่การ config เคาน์เตอร์หลักต้อง stop Timer ก่อนเสมอ มิฉะนั้นอาจมีปัญหาในจังหวะเปลี่ยน.
| ประเภท | ตัวอย่าง | คุณสมบัติเด่น |
|---|---|---|
| Advanced-control | TIM1, TIM8 | 4 channel + complementary + repetition counter |
| General-purpose | TIM2–5 ฯลฯ | สูงสุด 4 channel, ไม่มี complementary |
| Basic | TIM6, TIM7 | ไม่มี channel ย่อย, คู่กับ DAC |
| Watchdog | IWDG, WWDG | รีเซ็ตระบบเมื่อโปรแกรมแฮงก์ |
| ชนิด Timer | ความละเอียด (bit) | ช่อง (channels) | complementary output | repetition counter | DMA |
|---|---|---|---|---|---|
Advanced-control TIM1, TIM8 | 16-bit | 4 | |||
General-purpose TIM2–5, TIM9–14 | 16/32-bit | 1–4 | |||
Basic TIM6, TIM7 | 16-bit | 0 |
ชี้หรือโฟกัสที่คอลัมน์/เซลล์เพื่อดูว่าฟีเจอร์นั้นทำอะไร. complementary output และ repetition counter มีเฉพาะ Advanced-control timer เท่านั้น.
Advanced-control, General-purpose และ Basic timer ต่างกันที่ฟีเจอร์. โฟกัส/ชี้เซลล์เพื่อดูคำอธิบายฟีเจอร์นั้น. ฟีเจอร์เฉพาะ Advanced ถูกเน้นสี.
§8.5 PWM: หลักการ, Duty Cycle และการใช้ CCR
สัญญาณ clock หรือ square wave ทั่วไปมี on:off = 50:50. ถ้าจ่าย logic 1 เต็มให้ LED จะสว่าง 100%, ถ้าเป็น 0 จะดับ. คำถามคือถ้าอยากให้สว่างแค่ 50% หรือมอเตอร์หมุน 60% ของความเร็วเต็มทำอย่างไร.
หลักการ PWM (Pulse Width Modulation): ที่ความถี่สูงพอ การเปิด-ปิดสลับเร็ว ๆ จะถูกถัวเฉลี่ยออกมาเป็นค่าเฉลี่ย. LED ที่ปิด-เปิดเร็วเกินกว่าตาจะแยกออกจะดูเหมือนสว่างระดับกลางระหว่างสูงสุดกับดับ. จึงเป็นการควบคุมพลังงานเฉลี่ยด้วยความกว้างของพัลส์.
Duty Cycle = เวลาช่วงที่ on (T_on) หารด้วยคาบทั้งหมด (T = T_on + T_off) คูณ 100 เป็นเปอร์เซ็นต์. ตัวอย่างคาบ 1 ms: ถ้า T_on = 100 µs, T_off = 900 µs → duty = 100/1000 = 10%. ถ้า T_on = 300 µs → duty = 30%. duty สูง = พลังงานเฉลี่ยมาก = LED สว่างกว่า / มอเตอร์เร็วกว่า.
สร้าง PWM ด้วย CCR: ตั้ง ARR = 8 (เคาน์เตอร์นับ 0–8 แล้ววน). ตั้ง CCR = 4. ขณะเคาน์เตอร์นับ 0,1,2,3 output = logic 1; พอถึงค่า CCR (4) toggle เป็น 0 จนกว่าจะถึง ARR แล้ว overflow กลับเป็น 1. ปรับ CCR จึงปรับ duty cycle ได้: CCR น้อย = duty น้อย, CCR มาก = duty มาก.
ข้อควรระวัง: ตั้ง CCR ≤ ARR เสมอ. ถ้า CCR = ARR ได้ duty เกือบสูงสุด, ถ้า CCR เกิน ARR จะ active 100% ตลอด, ถ้า CCR = 0 จะ 0% ตลอด. มี Shadow Register ทำหน้าที่เป็น buffer mirror ค่าจากเคาน์เตอร์หลักมา compare เพื่อให้การเปลี่ยนค่าปลอดภัย.
ใช้งานจริง: จอมอนิเตอร์ปรับ brightness ด้วย PWM ที่จ่ายให้ backlight LED (จอ LCD มี LED ส่องด้านหลัง). ลดความสว่างก็คือลด duty cycle ของ PWM นั่นเอง.
| สัญญาณ | T_on | T_off | Duty cycle |
|---|---|---|---|
| S1 | 100 µs | 900 µs | 10% |
| S2 | 300 µs | 700 µs | 30% |
| CCR | พฤติกรรม output |
|---|---|
| 2 | duty ต่ำ (on ช่วงสั้น) |
| 4 | duty กลาง (on ครึ่งคาบ) |
| 8 (= ARR) | duty สูงสุด |
| > ARR หรือ 0 | active 100% / 0% ตลอด |
คลื่นสี่เหลี่ยม PWM: สัดส่วนเวลา 'on' ต่อคาบคือ duty%. ยิ่ง duty สูง ค่าเฉลี่ย (เส้นประ) ยิ่งสูง ใช้คุมความสว่าง/ความเร็วได้.
ตัวนับไต่ 0→ARR เป็นฟันเลื่อย เทียบกับเส้น CCR. ขณะ count < CCR เอาต์พุตเป็น high เมื่อ count ≥ CCR เป็น low ได้คลื่น PWM ด้านล่าง. duty = CCR/(ARR+1).
§8.6 ควบคุมมอเตอร์ด้วย H-Bridge และ Watchdog Timer
สัญญาณ PWM จาก Timer เป็นสัญญาณ logic ดิจิทัลที่ขับกระแสได้แค่ประมาณ 120 mA ซึ่งไม่พอขับมอเตอร์. ต้องจ่าย PWM ให้ Motor Driver ซึ่งมีแหล่งจ่ายไฟภายนอกแยก แล้ว driver ขับมอเตอร์อีกที.
วงจร H-Bridge ใช้สวิตช์ 4 ตัวเรียงเป็นรูปตัว H. ปิดสวิตช์คู่ 1 และ 4 ไฟไหลทางหนึ่ง มอเตอร์หมุนตามเข็ม (clockwise); ปิดคู่ 2 และ 3 ไฟไหลกลับทาง มอเตอร์หมุนทวนเข็ม. จึงคุมทิศทางได้. ถ้าใส่ PWM เข้าไปแทนไฟตรง ก็คุมความเร็วได้ด้วย. ใน MCU ใช้ transistor 4 ตัวแทนสวิตช์เพื่อให้ควบคุมด้วยโปรแกรมได้.
ในทางปฏิบัติใช้ IC สำเร็จรูป: L293 (แพ็กเกจพลาสติก DIP ระบายความร้อนได้น้อย เหมาะงานไม่ต่อเนื่อง, ขับได้ ~800 mA–1A) หรือ L298N (แพ็กเกจโลหะ ต่อ heat sink ได้ ระบายความร้อนดีกว่า รับโหลดต่อเนื่องได้มากกว่า). L293 มี driver 4 ชุดใน 1 IC — หมุนทิศเดียวใช้ 1 driver/มอเตอร์, หมุน 2 ทิศต้องใช้ 2 driver.
ควรต่อ protection diode ป้องกันกระแสย้อนกลับจากมอเตอร์ (back-EMF) ไหลเข้า power supply. L293D มี diode มาให้ในตัว แต่ L293B ไม่มี ต้องต่อเอง.
Watchdog Timer คือ Timer พิเศษที่คอยรีเซ็ตระบบเมื่อโปรแกรมแฮงก์ (เช่นสายการผลิตที่ห้ามหยุดนาน). หลักการ: ตั้งเวลาไว้ (เช่น 1–2 วินาที) นับถอยหลังลง 0. หน้าที่ของโปรแกรมคือต้องส่งสัญญาณรีเซ็ต Watchdog (kick) ก่อนนับถึง 0. ถ้าโปรแกรมแฮงก์จะไม่ได้ kick, Watchdog นับถึง 0 แล้ว generate รีเซ็ตระบบกู้คืนเอง. ต้องตั้งเวลาให้มากกว่าเวลางานปกติ 1 รอบ.
F767 มี Watchdog 2 ตัว: IWDG (Independent Watchdog) เกาะ LSI 32 kHz แยกอิสระ (ยังทำงานได้แม้บัสหลักเจ๊ง), เคาน์เตอร์ 12 บิต + prescaler 8 บิต; และ WWDG (Window Watchdog) เกาะ APB เคาน์เตอร์ 7 บิต. IWDG ใช้ key register: เขียนค่า hex พิเศษเพื่อสั่งงาน (เช่นเขียนค่าหนึ่งเพื่อ reload/kick, อีกค่าเพื่อ enable แก้ไข prescaler/reload) กันการเขียนผิดโดยไม่ตั้งใจ.
สวิตช์ 4 ตัวรอบมอเตอร์. เปิดคู่ S1+S4 กระแสไหลทางหนึ่ง มอเตอร์หมุน CW; เปิดคู่ S2+S3 กระแสกลับทาง หมุน CCW. duty ของ PWM กำหนดความเร็ว.
ตัวนับถอยหลังจาก set-time ไปหา 0. ต้อง 'kick' (reload) ก่อนถึง 0 ไม่งั้นระบบจะรีเซ็ต. ถ้าโปรแกรม hang แล้วหยุด kick แถบจะถึง 0 และเกิด SYSTEM RESET.
แบบฝึกหัด
12 ข้อ — แต่ละข้อมีชนิดและระดับความยากกำกับ กดปุ่ม "ดูเฉลย" เพื่อดูคำตอบและคำอธิบาย
- 1.ปรนัยง่าย
หัวใจของวงจร Timer คืออะไร
- 2.ปรนัยง่าย
เคาน์เตอร์ 8 บิตแบบนับขึ้น จะนับได้ในช่วงค่าใด
- 3.เติมคำง่าย
วงจรที่หารความถี่ clock ให้ลดลงก่อนป้อนเคาน์เตอร์หลัก เรียกว่าอะไร
- 4.ปรนัยกลาง
clock ให้ Timer = 1 MHz, ต้องการ interrupt ทุก 1 ms ควรตั้ง ARR เป็นเท่าใด (PSC = 0)
- 5.ปรนัยกลาง
ที่ระบบ 216 MHz, Timer ที่เกาะบัส APB2 จะได้ clock สูงสุดเท่าใด
- 6.ปรนัยกลาง
วงจรที่ใช้คูณความถี่ให้สูงขึ้น (เช่นจาก 16 MHz เป็น 216 MHz) คือข้อใด
- 7.ปรนัยกลาง
สัญญาณ PWM คาบ 1 ms มี T_on = 300 µs duty cycle เท่ากับเท่าใด
- 8.ถูก/ผิดง่าย
ยิ่งค่า duty cycle สูง LED ที่ขับด้วย PWM จะยิ่งสว่าง
- 9.ปรนัยยาก
ตั้ง ARR = 8 และ CCR = 4 ในโหมด PWM output จะเป็น logic 1 ในช่วงใด
- 10.ปรนัยยาก
เหตุใดต้องจ่าย PWM ให้ motor driver แทนที่จะต่อ Timer เข้ามอเตอร์ตรง ๆ
- 11.ถูก/ผิดกลาง
วงจร H-Bridge สามารถควบคุมทิศทางการหมุนของมอเตอร์ได้โดยเลือกคู่สวิตช์ที่ปิด
- 12.วิเคราะห์ยาก
อธิบายหลักการทำงานของ Watchdog Timer ว่าช่วยกู้ระบบจากการแฮงก์ได้อย่างไร และโปรแกรมต้องทำอะไรเพื่อไม่ให้ Watchdog รีเซ็ตระบบระหว่างทำงานปกติ