Mục lục:

Tạo tín hiệu PWM độ phân giải cao cho RC Servos với thiết bị STM32: 3 bước
Tạo tín hiệu PWM độ phân giải cao cho RC Servos với thiết bị STM32: 3 bước

Video: Tạo tín hiệu PWM độ phân giải cao cho RC Servos với thiết bị STM32: 3 bước

Video: Tạo tín hiệu PWM độ phân giải cao cho RC Servos với thiết bị STM32: 3 bước
Video: Lập trình STM32 bằng Arduino - 09: Điều chế độ rộng xung (PWM) 2024, Tháng mười một
Anonim
Tạo tín hiệu PWM độ phân giải cao cho RC Servos với thiết bị STM32
Tạo tín hiệu PWM độ phân giải cao cho RC Servos với thiết bị STM32
Tạo tín hiệu PWM độ phân giải cao cho RC Servos với thiết bị STM32
Tạo tín hiệu PWM độ phân giải cao cho RC Servos với thiết bị STM32
Tạo tín hiệu PWM độ phân giải cao cho RC Servos với thiết bị STM32
Tạo tín hiệu PWM độ phân giải cao cho RC Servos với thiết bị STM32

Hiện tại, tôi đang xây dựng một bộ phát / thu RC dựa trên chip RF SX1280. Một trong những mục tiêu của dự án là tôi muốn độ phân giải servo 12 bit từ các thanh tất cả xuống đến Servo. Một phần là vì các Servos kỹ thuật số hiện đại có độ phân giải 12 bit, thứ hai, một bộ phát cao cấp vẫn đang sử dụng 12 bit. Tôi đang tìm hiểu cách tạo tín hiệu PWM độ phân giải cao trên thiết bị STM32. Hiện tại, tôi đang sử dụng viên thuốc màu đen (STM32F103C8T8) cho mẫu thử nghiệm.

Bước 1: Danh sách bộ phận

Phần cứng

  • Bất kỳ bảng phát triển STM32F103 nào (viên thuốc màu xanh lam, viên thuốc màu đen, v.v.)
  • Một ngân hàng điện USB làm nguồn cung cấp năng lượng
  • Bộ lập trình STM32 (Segger j-links, ST-LINK / V2, hoặc đơn giản là một bản sao liên kết st)

Phần mềm

  • STM32CubeMX
  • Atollic TrueSTUDIO cho STM32
  • Nguồn dự án từ github

Bước 2: Giải pháp rõ ràng

Giải pháp rõ ràng
Giải pháp rõ ràng
Giải pháp rõ ràng
Giải pháp rõ ràng
Giải pháp rõ ràng
Giải pháp rõ ràng

Có lẽ giải pháp đơn giản nhất là sử dụng một trong những bộ đếm thời gian có thể tạo ra tín hiệu PWM, như TIM1-3 trên STM32F103. Đối với một servo kỹ thuật số hiện đại, tốc độ khung hình có thể giảm xuống còn 5 ms hoặc lâu hơn, nhưng đối với một servo tương tự cũ, nó phải là 20 ms hoặc 50 Hz. Vì vậy, trong trường hợp xấu nhất, hãy tạo ra điều đó. Với đồng hồ 72 MHz và độ phân giải bộ đếm bộ định thời 16 bit, chúng ta cần đặt bộ đếm trước của bộ định thời thành tối thiểu 23 để đáp ứng tốc độ khung hình 20 ms. Tôi đã chọn 24 vì sau đó trong 20 ms, tôi cần đặt bộ đếm chính xác thành 60000. Bạn có thể thấy thiết lập CubeMX và các tín hiệu PWM 1 và 1,5 ms được tạo trong ảnh chụp màn hình. Thật không may, đối với 1ms, bộ đếm của bộ định thời phải được đặt thành 3000, điều này sẽ chỉ cung cấp cho chúng tôi độ phân giải 11 bit. Không tệ, nhưng mục tiêu là 12 bit, vì vậy chúng ta hãy thử một cái gì đó khác.

Tất nhiên Nếu tôi chọn một bộ điều khiển vi mô có bộ đếm thời gian 32 bit, như STM32L476, độ phân giải này có thể cao hơn nhiều và vấn đề sẽ được giải quyết.

Nhưng ở đây, tôi muốn đề xuất một giải pháp thay thế sẽ làm tăng thêm độ phân giải ngay cả trên STM32F103.

Bước 3: Bộ hẹn giờ xếp tầng để có độ phân giải cao hơn

Bộ hẹn giờ xếp tầng cho độ phân giải cao hơn
Bộ hẹn giờ xếp tầng cho độ phân giải cao hơn
Bộ hẹn giờ xếp tầng cho độ phân giải cao hơn
Bộ hẹn giờ xếp tầng cho độ phân giải cao hơn
Bộ hẹn giờ xếp tầng cho độ phân giải cao hơn
Bộ hẹn giờ xếp tầng cho độ phân giải cao hơn

Vấn đề chính với giải pháp trước đó là tốc độ khung hình (20 ms) tương đối cao so với tín hiệu PWM thực sự được tạo ra (từ 1 đến 2 ms), vì vậy chúng tôi đang lãng phí một số bit có giá trị trong 18 mili giây còn lại khi chúng tôi chờ đợi. khung tiếp theo. Điều này có thể được giải quyết bằng cách xếp tầng bộ định thời sử dụng tính năng liên kết bộ hẹn giờ để đồng bộ hóa.

Ý tưởng là tôi sẽ sử dụng TIM1 làm chủ để tạo ra tốc độ khung hình (20 mili giây) và TIM2, TIM3 để đối phó với các tín hiệu PWM dưới dạng nô lệ. Khi chủ kích hoạt các nô lệ, chúng chỉ tạo ra tín hiệu PWM ở một chế độ xung. Do đó, tôi chỉ cần sử dụng 2 ms trong các bộ hẹn giờ đó. May mắn thay, bạn có thể phân tầng các bộ hẹn giờ đó trong phần cứng nên việc đồng bộ hóa này không cần bất kỳ sự can thiệp nào từ bộ xử lý và nó cũng rất chính xác, jitter nằm trong vùng ps. Bạn có thể thấy thiết lập CubeMX trên ảnh chụp màn hình.

Như bạn có thể thấy, tôi đã chọn 3 làm prescalar vì vậy trong 2 mili giây, tôi cần đặt 48000 trong bộ đếm của bộ định thời. Điều này mang lại cho chúng tôi 24000 cho 1 ms, thực sự là nhiều hơn những gì chúng tôi cần cho độ phân giải 14 bit. Tadaaaa…

Vui lòng xem ảnh chụp màn hình máy hiện sóng trong phần giới thiệu để biết kết quả cuối cùng. Kênh 3 (màu tím) là ngắt của bộ định thời chính sẽ kích hoạt bộ định thời tạo ra một xung. Kênh 1 và 4 (chùm màu vàng và xanh lục) là các tín hiệu PWM thực tế được tạo ra bởi các bộ định thời khác nhau. Lưu ý rằng chúng được đồng bộ hóa nhưng chúng được đồng bộ hóa ở các cạnh cuối, đó là do chế độ PWM 2. Đây không phải là vấn đề, vì tốc độ PWM cho servo cụ thể vẫn chính xác.

Lợi ích khác của giải pháp này là thay đổi tốc độ khung hình có nghĩa là chỉ thay đổi khoảng thời gian trong TIM1. Đối với các servo kỹ thuật số hiện đại, bạn có thể giảm xuống thậm chí 200-300 Hz, nhưng hãy tham khảo hướng dẫn sử dụng của servo nếu bạn muốn tinh chỉnh.

Đề xuất: