Lập trình STM32F103 Thanh Ghi: Cấu hình PWM Mode STM32F103RCT6

Cấu hình PWM mode STM32F103 là một kỹ thuật cốt lõi trong lập trình nhúng, cho phép bạn tạo ra tín hiệu PWM (Pulse Width Modulation) để điều khiển các thiết bị như LED, motor, servo hoặc buzzer. Trong bài viết này, chúng ta sẽ khám phá chi tiết cách cấu hình PWM mode trên STM32F103RCT6 sử dụng thanh ghi trực tiếp, tập trung vào TIM1 với tần số 1kHz và duty cycle 50% trên kênh CH1 (PA8). Nếu bạn đang tìm hiểu PWM mode STM32F103 hoặc lập trình STM32F103 thanh ghi, đây là hướng dẫn thực tế kèm mã nguồn để áp dụng ngay vào dự án.

Giới Thiệu Về PWM Mode Trên STM32F103

PWM Mode là chế độ mà timer tạo ra tín hiệu xung vuông với độ rộng xung có thể điều chỉnh, thường dùng để kiểm soát công suất hoặc tốc độ. Trên STM32F103RCT6, cấu hình PWM mode STM32F103 sử dụng các timer như TIM1 (Advanced Timer) để xuất tín hiệu qua chân GPIO. Ví dụ, với tần số 1kHz và duty cycle 50% trên CH1, tín hiệu sẽ HIGH trong 50% chu kỳ, phù hợp cho việc điều chỉnh độ sáng LED hoặc tốc độ quạt.

Lập trình STM32F103 thanh ghi cho PWM Mode mang lại sự kiểm soát chính xác, không phụ thuộc vào thư viện HAL, giúp tối ưu hóa code và hiểu rõ phần cứng.

Công thức tính tần số PWM:

Với f_CLK = 72MHz (APB2 timer clock), PSC=71, ARR=999 sẽ cho 1kHz.

Ứng Dụng Của PWM Mode STM32F103

Cấu hình PWM mode được áp dụng rộng rãi trong các lĩnh vực:

  • Điều khiển độ sáng LED hoặc màn hình LCD để tạo hiệu ứng ánh sáng động.
  • Kiểm soát tốc độ motor DC hoặc stepper motor trong robot và máy móc tự động.
  • Tạo âm thanh cho buzzer hoặc loa, như báo hiệu trong thiết bị IoT.
  • Điều chỉnh công suất cho đèn sưởi ấm hoặc quạt gió trong hệ thống điều khiển nhiệt độ.
  • Trong servo motor, PWM dùng để định vị góc quay chính xác, hữu ích cho cánh tay robot.

Bằng cách sử dụng PWM mode STM32F103, bạn có thể tạo ra các hệ thống điều khiển mượt mà, tiết kiệm năng lượng và dễ mở rộng.

Các Bước Cấu Hình TIM1 Chế Độ PWM Trên STM32F103RCT6

Dưới đây là hướng dẫn chi tiết cấu hình PWM mode STM32F103 qua thanh ghi, đảm bảo tín hiệu PWM xuất ra chân PA8 ổn định và đáng tin cậy. Chúng ta sẽ tập trung vào PWM Mode 1 với tần số 1kHz và 50% duty cycle.

Bật Clock Cho TIM1 Và GPIO

Thanh ghi RCC->APB2ENR điều khiển việc cấp clock cho các ngoại vi trên bus APB2.

  • TIM1 nằm trên APB2 → phải bật TIM1EN.
  • PA8 thuộc GPIOA → cần bật IOPAEN để cấu hình chân.
  • Code:

Bước này là nền tảng cho cấu hình PWM mode STM32F103, vì không có clock, timer sẽ không hoạt động.

Cấu Hình Chân GPIO (PA8) Làm Alternate Function Push-Pull

Thanh ghi GPIOA->CRH điều khiển cấu hình các chân từ PA8 đến PA15.

  • CNF8 = 10: Alternate Function Push-Pull → cho phép TIM1 điều khiển chân.
  • MODE8 = 11: Tốc độ 50 MHz (tối ưu cho PWM).
  • Nếu không cấu hình đúng → không có tín hiệu PWM ra chân.
  • Code:

Trong lập trình STM32F103 thanh ghi, cấu hình Alternate Function đảm bảo tín hiệu PWM được truyền ra chân vật lý mà không bị xung đột.

Đặt Tần Số PWM (PSC Và ARR)

Thanh ghi TIM1->PSC (Prescaler) và TIM1->ARR (Auto-Reload) xác định tần số PWM.

  • Công thức: fPWM=fCLK(PSC+1)×(ARR+1) f_{PWM} = \frac{f_{CLK}}{(PSC + 1) \times (ARR + 1)} .
  • Với PSC=71, ARR=999 → 1 kHz PWM.
  • ARR xác định chu kỳ đầy đủ (100%).
  • Code:

Điều chỉnh PSC và ARR là chìa khóa để tùy chỉnh tần số trong PWM mode STM32F103.

Chọn Chế Độ PWM Mode 1 Cho Kênh 1 (PA8)

Thanh ghi TIM1->CCMR1 điều khiển chế độ Output Compare cho CH1/CH2.

  • OC1M = 110: PWM Mode 1 →
    • HIGH khi TIM1->CNT < TIM1->CCR1.
    • LOW khi TIM1->CNT ≥ TIM1->CCR1.
  • Code:

PWM Mode 1 phổ biến cho các ứng dụng cần tín hiệu HIGH ở đầu chu kỳ.

Bật Preload Cho CCR1 (Output Compare Preload)

Thanh ghi TIM1->CCMR1, bit OC1PE.

  • Khi OC1PE = 1: Giá trị CCR1 mới chỉ được nạp vào thanh ghi bóng (shadow register).
  • Giá trị thực chỉ cập nhật vào lần overflow tiếp theo (Update Event) → tránh nhiễu, giật PWM.
  • Code:
Bước này đảm bảo thay đổi duty cycle mượt mà trong runtime.

Bật Preload Cho ARR (Auto-Reload Preload)

Thanh ghi TIM1->CR1, bit ARPE.

  • Tương tự OC1PE, cho phép thay đổi ARR mượt mà.
  • Cần thiết khi thay đổi tần số PWM trong runtime.
  • Code:

Bật Kênh Đầu Ra CH1

Thanh ghi TIM1->CCER, bit CC1E.

  • Cho phép tín hiệu PWM từ bộ so sánh đi ra bên trong timer.
  • Chưa đủ để ra chân vật lý.
  • Code:

Bật Main Output Enable (MOE) (Bắt Buộc)

Thanh ghi TIM1->BDTR, bit MOE (bit 15).

  • Chỉ áp dụng cho TIM1 và TIM8 (Advanced Timers).
  • MOE = 1: Mở cổng đầu ra → PWM mới thực sự ra chân PA8.
  • Thiếu bước này → 99% trường hợp “không thấy PWM” dù code đúng!
  • Code:

Đây là bước quan trọng nhất trong cấu hình PWM mode STM32F103 cho Advanced Timers.

Đặt Duty Cycle (Giá Trị So Sánh)

Thanh ghi TIM1->CCR1 chứa giá trị so sánh.

  • CCR1 từ 0 → ARR → duty từ 0% → 100%.
  • Giá trị được nạp vào shadow register (do OC1PE=1) → cập nhật mượt.
  • Code:

Bật Bộ Đếm (Counter Enable)

Thanh ghi TIM1->CR1, bit CEN.

  • Timer bắt đầu đếm từ 0 → ARR → lặp lại.
  • Mỗi khi CNT < CCR1 → PA8 = HIGH → tạo xung PWM.
  • Code:

Với cấu hình PWM trên, sẽ cho ra kết quả:

  • PA8 xuất xung vuông 1 kHz.
  • Duty cycle = 50% → HIGH trong 500 µs, LOW trong 500 µs.
  • Có thể thay đổi CCR1 bất kỳ lúc nào → điều chỉnh độ sáng LED, tốc độ motor, v.v.

Tham chiếu: RM0008, Section 14 (trang 373-392).

Code Chương Trình Cho Cấu Hình PWM Mode STM32F103RCT6

Dưới đây là chương trình mẫu cấu hình PWM mode STM32F103 để xuất PWM ra PA8, thay đổi độ sáng LED bằng nút nhấn. Trạng thái ban đầu LED sáng 50% độ sáng, mỗi lần nhấn nút nhấn độ sáng giảm 10%. (Lưu ý: Code mẫu gốc có tăng duty, nhưng tôi điều chỉnh để khớp mô tả giảm 10%.)

Mã này minh họa rõ ràng lập trình STM32F103 thanh ghi cho PWM, với các bước được thực hiện theo thứ tự logic để tránh lỗi.

Link Github: Download chương trình cấu hình STM32F103 PWM Mode

Lợi Ích Và Lưu Ý Khi Sử Dụng PWM Mode Trên STM32F103

Sử dụng cấu hình PWM mode STM32F103 mang lại lợi ích như kiểm soát chính xác, giảm tải CPU và dễ dàng điều chỉnh động. Tuy nhiên, lưu ý:

  • Đảm bảo bật MOE cho Advanced Timers để tránh lỗi không xuất tín hiệu.
  • Kiểm tra tần số clock hệ thống (thường 72MHz) để tính toán PSC/ARR chính xác.
  • Trong dự án lớn, kết hợp interrupt để xử lý sự kiện PWM hoặc thay đổi duty cycle mà không gián đoạn.
  • Nếu gặp vấn đề, tham khảo RM0008 để kiểm tra thanh ghi chi tiết.

Kết Luận

Tóm lại, cấu hình PWM mode STM32F103 là công cụ mạnh mẽ giúp bạn điều khiển thiết bị ngoại vi một cách linh hoạt qua lập trình STM32F103 thanh ghi. Từ điều chỉnh độ sáng LED đến kiểm soát motor, PWM mode STM32F103 mở ra vô vàn ứng dụng trong lập trình nhúng. Với hướng dẫn chi tiết, mã nguồn mẫu và lưu ý thực tế, bạn có thể triển khai ngay hôm nay trên STM32F103RCT6. Nếu cần thêm ví dụ hoặc hỗ trợ, hãy chia sẻ trong phần bình luận!

Câu Hỏi Thường Gặp (FAQ) Về PWM Mode Trên STM32F103

PWM Mode là gì trong STM32F103?

PWM Mode là chế độ của timer cho phép tạo xung vuông với độ rộng xung thay đổi (duty cycle), thường dùng để điều khiển độ sáng LED, tốc độ động cơ và công suất tải. (PWM thường được cấu hình qua Output Compare Mode trong timer.)

Sự khác nhau giữa PSC, ARR và CCR trong PWM là gì?

PSC chia tần số clock cho timer, ARR xác định chu kỳ PWM, còn CCR quyết định duty cycle bằng cách so sánh với giá trị đếm CNT. (Tần số PWM = f_CLK / ((PSC + 1) × (ARR + 1)), và duty cycle ≈ (CCR / (ARR + 1)) × 100%. Ví dụ: PSC=71, ARR=999, CCR=499 cho 1kHz với 50% duty.)

Tại sao phải bật MOE khi dùng TIM1 PWM?

TIM1 là advanced timer, nếu không bật MOE (Main Output Enable) thì tín hiệu PWM sẽ không xuất ra chân GPIO dù cấu hình đúng. (MOE nằm trong thanh ghi BDTR (bit 15), chỉ áp dụng cho TIM1/TIM8. Đây là lỗi phổ biến gây “không thấy PWM” trên chân như PA8.)

Duty cycle 50% nghĩa là gì?

Duty cycle 50% nghĩa là tín hiệu PWM ở mức HIGH trong nửa chu kỳ và LOW trong nửa chu kỳ còn lại. (Trong thực tế, với PWM Mode 1, điều này tương ứng CCR = ARR / 2 + 1, nhưng thường làm tròn để chính xác.)

Có thể thay đổi duty cycle khi chương trình đang chạy không?

Có. Chỉ cần cập nhật giá trị CCRx, PWM sẽ thay đổi mượt nếu đã bật preload (OCxPE). (Preload (OCxPE=1 trong CCMRx) đảm bảo giá trị mới chỉ cập nhật tại Update Event (overflow), tránh giật tín hiệu. Nếu không bật, thay đổi CCR có thể gây nhiễu tức thì.)

Nên dùng PWM Mode 1 hay PWM Mode 2?

PWM Mode 1 phổ biến hơn và dễ hiểu: HIGH khi CNT < CCR, LOW khi CNT ≥ CCR; PWM Mode 2 thì ngược lại. (PWM Mode 1 (OCxM=110) thường dùng cho điều khiển motor/LED vì bắt đầu HIGH; Mode 2 (OCxM=111) dùng cho một số ứng dụng đặc biệt như inverter. Lựa chọn tùy thuộc vào yêu cầu logic tín hiệu.)

Viết một bình luận

This site uses Akismet to reduce spam. Learn how your comment data is processed.