Mục lục:

Điều khiển động cơ Servo với STM32F4 ARM MCU: 4 bước
Điều khiển động cơ Servo với STM32F4 ARM MCU: 4 bước

Video: Điều khiển động cơ Servo với STM32F4 ARM MCU: 4 bước

Video: Điều khiển động cơ Servo với STM32F4 ARM MCU: 4 bước
Video: 🔴 Arduino #15 | Joystick Nút Nhấn Đa Hướng Điều Khiển Động Cơ Servo Động Cơ Bước 2024, Tháng bảy
Anonim
Điều khiển động cơ Servo với STM32F4 ARM MCU
Điều khiển động cơ Servo với STM32F4 ARM MCU
Điều khiển động cơ Servo với STM32F4 ARM MCU
Điều khiển động cơ Servo với STM32F4 ARM MCU

Xin chào một lần nữa các bạn:) Vì vậy, trong dự án này, chúng tôi sẽ điều khiển một động cơ servo với STM32F4 ARM MCU. Trong trường hợp của tôi, tôi sẽ sử dụng bảng khám phá, nhưng nếu bạn nắm được ý chính của vấn đề, thì bạn có thể áp dụng nó cho mọi MCU. Vì thế. Bắt đầu nào:)

Bước 1: Yêu cầu phần cứng và phần mềm

Về phần cứng, chúng tôi sẽ cần:

  • MCU trong trường hợp của tôi là bảng khám phá STM32f4
  • Một động cơ servo thông thường, như SG90 hoặc bất kỳ động cơ nào khác

Về phần mềm, chúng tôi sẽ cần:

  • STM32CubeMX
  • Keil uVision

Nếu bạn có tất cả những điều này, hãy chuyển sang bước tiếp theo:)

Bước 2: Cấu hình STM32CubeMX

Như bạn đã biết, để điều khiển động cơ servo, chúng ta cần tín hiệu PWM. Các yêu cầu về tín hiệu PWM là như vậy:

  • Khoảng thời gian PWM phải là 20 mS
  • Đúng giờ phải từ 0,5 mS đến 2,5 mS. Khi đúng thời gian là 0,5 mS, thì servo sẽ quay 0 độ, 1,5 mS cho 90 độ và 2,5 mS cho 180 độ.

Vì vậy, chúng ta cần cấu hình PWM và cho mục đích đó, chúng ta sẽ sử dụng Timer1.

  • Đầu tiên, chọn TIM1 từ phần Bộ hẹn giờ. Bước này
  • Sau đó, từ phần Chế độ

    1. Chọn đồng hồ bên trong Bước này
    2. PWM thế hệ CH1 Bước này
  • Sau đó, từ phần Cấu hình

    1. Đặt Prescaler thành 160 Bước này
    2. Đặt Khoảng thời gian Bộ đếm thành 2000 Bước này
    3. Đặt Pulse thành 50 Bước này
  • Ngoài ra, từ Cấu hình đồng hồ, đặt đồng hồ Bộ hẹn giờ APB1 thành 16MHz. Bước này

Bây giờ, hãy nói một chút về bước này:

Tần số của đồng hồ Bộ hẹn giờ APB1 của chúng tôi là 16MHz. Vì vậy, nó có nghĩa là cần 16, 000, 000 tick để có được 1 giây. Tuy nhiên, chúng tôi đặt bộ đếm trước của mình thành 160. Điều đó có nghĩa là, chúng tôi chia tần suất của mình cho số đó và giảm số lượng tích tắc xuống 100, 000. Vì vậy, trong 1 giây, chúng ta cần 100.000 tích tắc. Tuy nhiên, chúng tôi cần 20 triệu giai đoạn PWM như chúng tôi đã nêu trước đây. Vì vậy, dựa trên phép toán đơn giản, chúng ta cần 2000 tích tắc cho 20mS. Vì vậy, bằng cách đặt Khoảng thời gian bộ đếm là 2000, chúng tôi xác định khoảng thời gian của tín hiệu PWM là 20mS. Bây giờ chúng ta cần xác định số đánh dấu cho thời gian Bật từ 0,5mS đến 2,5mS. Chúng ta có thể nhận được phương trình này từ một phép toán đơn giản và nó là:

On_Time = (Số lần đánh dấu / 100). Hãy nhớ rằng đây là thời gian bật thay đổi góc của động cơ servo. Vì vậy, hình ảnh dưới đây tôi tóm tắt bước này. Nếu bạn có bất kỳ câu hỏi nào, hãy viết trong phần bình luận và tôi sẽ trả lời nhanh nhất có thể.

Hình ảnh tính toán

Sau khi thực hiện tất cả những điều này, hãy tạo mã:)

Bước 3: Keil UVision Coding

Vì vậy, trước tiên chúng ta hãy xác định xem chúng ta muốn làm gì? Chúng tôi muốn, viết một hàm chấp nhận mức độ và ghi nó vào servo. Vì vậy, làm thế nào chúng tôi sẽ làm điều đó? Như chúng ta đã nói trước đây, để thay đổi góc, chúng ta cần thay đổi thời gian. Các góc của chúng ta thay đổi giữa [0, 180] và số lượng bọ ve của chúng ta, xác định thời gian thay đổi giữa [50, 250]. Vì vậy, chúng ta cần một chức năng ánh xạ ánh xạ góc đã cho với phạm vi số lượng bọ ve. Ví dụ: đối với tick 0 độ 50, tick 180 độ 250, v.v. Vì vậy, hãy viết hàm ánh xạ của chúng ta:

int map (int st1, int fn1, int st2, int fn2, int value) {return (1.0 * (value-st1)) / ((fn1-st1) * 1.0) * (fn2-st2) + st2; }

Đây là chức năng lập bản đồ của chúng tôi. Bạn có quan tâm nó được bắt nguồn như thế nào không? Sau đó, hãy đọc cái đó. Vì vậy, chúng tôi lấy phạm vi của mình và giá trị mà chúng tôi muốn ánh xạ.

Bây giờ, chúng ta hãy viết một hàm chấp nhận góc và ánh xạ nó tới phạm vi tick:

void servo_write (int angle) {htim1. Instance-> CCR1 = map (0, 180, 50, 250, angle); }

Như bạn có thể thấy, mã này chấp nhận góc và ánh xạ nó với phạm vi số lượng bọ ve. Sau đó, số lượng tích tắc được cấp cho thanh ghi CCR1 kiểm soát thời gian và góc độ.

Tuy nhiên, để tất cả những thứ này hoạt động, trước tiên chúng ta bắt đầu pwm có thể được thực hiện chỉ bằng một dòng mã:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

Vì vậy, chúng ta có một hàm chấp nhận góc và ghi nó vào servo. Hãy kiểm tra nó và viết hàm quét của chúng tôi rất dễ dàng:

void servo_sweep (void) {for (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Delay (10); } for (int i = 180; i> = 0; i--) {servo_write (i); HAL_Delay (10); }}

Vì vậy, nó chỉ đếm lên đến 180 và sau đó xuống 0 và ghi các giá trị này vào servo:) Vì vậy, chúng ta hãy xem kết quả!

Bước 4: Kết quả:)

Vì vậy, đây là kết thúc. Nếu bạn có bất kỳ câu hỏi xin vui lòng hỏi. Tôi sẽ rất vui khi trả lời chúng. Xin chân thành cảm ơn các bạn đã đọc và hy vọng sẽ gặp lại các bạn trong những dự án tiếp theo:)

Đề xuất: