Bài 05: PWM với STM32F303CC trong MXCUBE

PWM với STM32F303CC

  1. Giới thiệu sơ lược về PWM.
  2. PWM(pulse- with modulation) hay còn gọi nôm na là “băm xung” hay “điều khiển độ rộng xung” là ứng dụng phổ biến và thường dùng trong lĩnh vực điều khiển động cơ. Với động cơ, chúng ta có 3 loại điều khiển chính đó là : điều khiển vị trí, điều khiển vận tốc, điều khiển torque(moment). Khi dùng PWM để điều khiển động cơ chúng ta chú ý các khái niệm cần nắm rõ:

    • Duty cycle : tỷ lệ phần trăm xung ở mức cao.
    • Period : là chu kì xung(bao gồm tổng thời gian mức cao + mức thấp).
    • Pulse width là giá trị của mức cao so với period.
    • PTO là xung vuông có 50% thời gian cao, 50% thời gian thấp.
    • Biên độ xung: là giá trị điện áp của xung khi ở mức cao.
    • Cái khái niệm về tần số, chu kì.

    Các timer có thể phát xung trên vi điều khiển này là :TIM1, TIM2, TIM3,TIM4, TIM8, TIM15, TIM16, TIM17. Mỗi timer có 1 hay nhiều kênh phát xung độc lập. Riêng TIM1 và TIM8 là 2 timer đặc biệt, nhà sản xuất đã ưu tiên nó với nhiều chế độ phát xung hơn, hỗ trợ hiệu quả tối đa cho việc phát xung, bảo vệ… 2 timer này có các kênh PWM đảo (vd: CH1 – CH1N) giúp tránh tình trạng trùng dẫn với nửa cầu H trên và nửa cầu H dưới của mạch driver điều khiển động cơ. Nó có chế độ one-pulse để xuất ra 1 xung hay nhiều xung với số xung đếm được, ngắt input để bảo vệ động cơ, có mode hỗ trợ encoder và cảm biến Hall…

    Sử dụng PWM chủ yếu là để điều khiển động cơ, khi điều khiển cần chú ý là mỗi loại động cơ đều có cơ cấu điều khiển khác nhau, tần số điều khiển cũng khác nhau. Cần chú ý về mục đích điều khiển là tốc độ, vị trí, moment… để xuất xung với số lượng xung, tần số và chu kì thích hợp.

    Trên STM32F303CC thì cần chú ý là sử dụng PWM của timer nào thì cần tra datasheet để biết ngõ ra của timer đó là chân nào, có Remap hay trùng với các chân đặc biệt, các chân timer khác không.

  3. Cấu hình trên STM32 cubeMx.
  4. Cấu hình TIM4 channel 4 với chu kì 1s, duty cycle là 30%.

    1. New project . Cửa sổ mới được mở ra. Chọn loại MCU theo tên hoặc theo họ, loại package… Ở đây mình nhớ tên luôn nên gõ vào cho nhanh STM32F303CC.
    2. Chọn loại MCU, Double click vào tên MCU được tìm thấy hoặc bấm vào Start project để bắt đầu quá trình cài đặt. Cấu hình thạch anh, chuẩn nạp trước tiên. Bài này sử dụng timer 4 channel 4(Cấu hình pwm). Click chuột trái để chọn chức năng cho ngoại vi.Click chuột phải để tạo nhãn cho chân ngoại vi cho dễ nhìn. Ở đây, chân PB9 là TIM4 channel4.
    3. Cấu hình clock ở tab clock configuration. Tùy thuộc vào thạch anh sử dụng và các ứng dụng khác nhau mà chỉnh tốc độ clock ở các mode khác nhau. Ở đây mình đã sử dụng thạch anh ngoại 8Mhz nên có thể điều chỉnh tốc độ tối đa của HCLK là 72Mhz. Những chỗ nào mà chương trình cho phép thay đổi giá trị thì chỗ đó được phép thay đổi clock. Chúng ta có thể quan sát được đầu ra của tất cả các ngoại vi. Khá rõ ràng đúng không.
    4. Tab Configuration -> Control -> click vào timer đã chọn(TIM4) để bắt đầu cấu hình. Để có được chu kì 1s với tần số clock hệ thống là 72Mhz. Tra datasheet, TIM4 thuộc nhánh clock APB2 và clock chia cho timer 4 tối đa sẽ là 72Mhz. Áp dụng công thức ở bài 4: chọn prescaler là 7199 và period sẽ là 9999, pulse là 3000 tức là 30%. Các thông số khác giữ mặc định. Sau khi nhập các thông số, nhấn Ok để đóng bảng.
    5. Cài đặt file xuất ra cho project : vào Project -> settings.Việc cài đặt tương tự như các bài 02, 03. Và không có gì khác biệt nhiều.
    6. Xuất code sau khi cài đặt : Project -> code generate hoặc click vào biểu tượng. Sau khi code được sinh ra click vào open project để mở project đó lên.
  5. Chỉnh sửa code trên keil C.
    1. Mở file main.c trong khung project lên để chỉnh sửa code sinh ra.
    2. Thêm dòng code như hình để timer4, channel 4 hoạt động.
    3. Lưu ý: thêm code vào giữa begin và end để generate code lần sau không bị mất code đã thêm vào. Và code được thêm phải nằm sau chương trình goi cấu hình timer và clock.
    4. Chọn reset and run trong options of target -> setting -> Flash download để sau khi nạp xong chương trình chạy luôn mà không cần nhấn nút reset.
    5. Biên dịch chương trình(Build) ở lần đầu tiên và Rebuild(F7) cho các lần tiếp theo. Chương trình không báo lỗi. Nhấn nút Load để nạp(F8).
    6. Lưu ý:
      • Sử dụng hàm HAL_TIM_PWM_Start_IT thay cho hàm HAL_TIM_PWM_Start khi có ngắt đi kèm theo hoặc HAL_TIM_PWM_Start_DMA khi sử dụng DMA.
      • Sử dụng hàm __HAL_TIM_SET_COMPARE() để set PWM cho timer hoặc __HAL_TIM_GET_COUNTER để đọc giá trị đếm của counter cho các trường hợp khác.
      • Timer còn có các mode khác, thay đổi để hiểu rõ hơn.
      • Mình sử dụng chu kì là 1s để mắt thường có thể quan sát rõ hơn. Nếu các bạn có thiết bị đo(OSC, đồng hồ đo tần số…) thì có thể thử lại với chu kì nhỏ hơn(tần số lớn hơn).
  6. Bài tập
    1. Cấu hình Cấu hình TIM4 channel 4 với chu kì 1s, duty cycle là thay đổi và lặp lại từ 0%, 10%...... 100% sau mỗi 1s.
    2. Cấu hình tương tự chu kì 1s, duty cycle 10% với các TIM1, TIM2, TIM3, TIM8, TIM15, TIM16, TIM17.


Link tải ví dụ demo timer4 pwm