Điều Khiển PWM Trên Orange Pi Bằng C và WiringOP: Hướng Dẫn Chi Tiết

Điều Khiển PWM Trên Orange Pi Bằng C và WiringOP: Hướng Dẫn Chi Tiết

Điều khiển các chân GPIO (General Purpose Input/Output) là một trong những tính năng mạnh mẽ nhất của các bo mạch máy tính nhúng như Orange Pi. Trong số đó, Điều chế độ rộng xung (PWM – Pulse-Width Modulation) cho phép chúng ta tạo ra các “tín hiệu tương tự” từ các chân kỹ thuật số, mở ra khả năng điều khiển tốc độ động cơ, độ sáng đèn LED, hoặc các thiết bị khác một cách mượt mà. Bài viết này sẽ hướng dẫn bạn cách triển khai PWM trên Orange Pi bằng ngôn ngữ C kết hợp với thư viện WiringOP.

Giới Thiệu Về PWM và GPIO trên Orange Pi

PWM là kỹ thuật điều khiển công suất bằng cách thay đổi chu kỳ nhiệm vụ (duty cycle) của tín hiệu số. Tín hiệu sẽ luân phiên giữa trạng thái CAO (HIGH) và THẤP (LOW) với tốc độ nhất định. Bằng cách điều chỉnh tỷ lệ thời gian ở trạng thái CAO so với tổng chu kỳ, chúng ta có thể mô phỏng một giá trị tương tự. Ví dụ, chu kỳ nhiệm vụ 50% sẽ cung cấp mức năng lượng trung bình bằng một nửa so với 100%.

Trên Orange Pi, việc điều khiển GPIO có thể thực hiện thông qua nhiều ngôn ngữ lập trình khác nhau, phổ biến nhất là C (sử dụng thư viện WiringOP/WiringPi) và Python. Hướng dẫn này sẽ tập trung vào phương pháp sử dụng ngôn ngữ C với thư viện WiringOP, mang lại hiệu suất cao và kiểm soát chi tiết.

PWM Phần Cứng: Thử Nghiệm và Những Vấn Đề Gặp Phải

PWM phần cứng tận dụng các chân GPIO chuyên dụng được tích hợp khả năng tạo tín hiệu PWM trực tiếp từ phần cứng của vi điều khiển. Điều này giúp giảm tải cho CPU và cho ra tín hiệu ổn định hơn. Theo tài liệu của nhà sản xuất, Orange Pi có một chân PWM phần cứng là PA6 (tương ứng với chân vật lý số 7). Tuy nhiên, việc kích hoạt và sử dụng chân này trên các hệ thống Orange Pi thường gặp phải nhiều thách thức.

Các Bước Cấu Hình PWM Phần Cứng (Thử Nghiệm)

Mặc dù việc sử dụng PWM phần cứng trên Orange Pi thường không mang lại kết quả như mong đợi do các vấn đề về driver hoặc nhận diện chân, chúng tôi vẫn trình bày các bước cấu hình để bạn có cái nhìn tổng quan:

  1. Sao lưu file cấu hình hệ thống:
    sudo cp /boot/script.bin /boot/script.bak
  2. Chuyển đổi file nhị phân sang định dạng văn bản FEX để chỉnh sửa:
    sudo bin2fex /boot/script.bin /boot/script.fex
  3. Mở file FEX để chỉnh sửa:
    sudo nano /boot/script.fex
  4. Tìm đến mục [pwm0_para] và đặt pwm_used = 1 để kích hoạt PWM:
    [pwm0_para]
    pwm_used = 1
    pwm_positive = port:PA05<3><0><default><default>

    Lưu ý: Trong một số tài liệu, chân PWM được đề cập là PA5 thay vì PA6, gây ra sự không nhất quán và khó khăn trong việc nhận diện.

  5. Lưu và đóng file:
    Nhấn Ctrl X, sau đó Y (Yes) và Enter.
  6. Chuyển đổi file FEX đã chỉnh sửa trở lại định dạng nhị phân:
    sudo fex2bin /boot/script.fex /boot/script.bin
  7. Thêm module driver PWM vào hệ thống:
    Mở file /etc/modules:

    sudo nano /etc/modules
  8. Thêm dòng pwm-sunxi vào cuối file:
    pwm-sunxi
  9. Lưu và đóng file:
    Nhấn Ctrl X, sau đó Y (Yes) và Enter.
  10. Khởi động lại hệ thống để áp dụng các thay đổi:
    sudo reboot

Chương Trình Điều Khiển PWM Phần Cứng (Ví dụ)

Sau khi thực hiện các bước cấu hình trên, bạn có thể thử biên dịch và chạy một chương trình C đơn giản. Giả sử chân PA6 (WiringPi pin 7) là chân PWM phần cứng:

  1. Tạo thư mục làm việc và file C:

    mkdir -p programas_gpio/pwm
    cd programas_gpio/pwm
    sudo nano pwm.c
  2. Nhập mã chương trình:
    Chương trình này sẽ thiết lập chân 7 (PA6) làm đầu ra PWM và luân phiên thay đổi chu kỳ nhiệm vụ giữa mức tối đa (1023) và 50% (512) mỗi 10 giây.

    #include <wiringPi.h>
    
    #define PIN_PWM 7 // Chân PA6 tương ứng với WiringPi pin 7
    
    int main(void)
    {
        wiringPiSetup();
        pinMode(PIN_PWM, PWM_OUTPUT); // Thiết lập chân PWM phần cứng
    
        while(1)
        {
            pwmWrite(PIN_PWM, 1023); // Chu kỳ nhiệm vụ tối đa
            delay(10000); // Đợi 10 giây
            pwmWrite(PIN_PWM, 512);  // Chu kỳ nhiệm vụ 50%
            delay(10000); // Đợi 10 giây
        }
    
        return 0;
    }
  3. Lưu và đóng file.

  4. Biên dịch chương trình:

    gcc -o pwm pwm.c -lwiringPi
  5. Chạy chương trình:

    sudo ./pwm

Lưu ý quan trọng: Khi chạy chương trình trên, bạn có thể sẽ nhận được thông báo lỗi cho biết rằng chân được chọn không phải là chân PWM. Điều này khẳng định rằng việc kích hoạt và sử dụng PWM phần cứng trên Orange Pi thông qua các phương pháp truyền thống thường không hiệu quả. Nguyên nhân có thể do sự không rõ ràng trong tài liệu kỹ thuật hoặc hạn chế về driver của SoC H3.

PWM Phần Mềm: Giải Pháp Hiệu Quả và Linh Hoạt

Để khắc phục những hạn chế của PWM phần cứng, giải pháp PWM phần mềm là lựa chọn tối ưu. PWM phần mềm sử dụng thư viện để giả lập chức năng PWM trên bất kỳ chân GPIO kỹ thuật số thông thường nào, bằng cách tạo ra các xung HIGH/LOW với tần số và chu kỳ nhiệm vụ được kiểm soát bởi phần mềm.

Ưu điểm của PWM phần mềm là không yêu cầu cấu hình phần cứng phức tạp và linh hoạt hơn, cho phép bạn sử dụng hầu hết các chân GPIO làm đầu ra PWM.

Chương Trình Điều Khiển PWM Phần Mềm

Chúng ta sẽ sử dụng thư viện softPwm trong WiringOP để triển khai PWM phần mềm. Ví dụ này cũng sử dụng chân PA6 (WiringPi pin 7) nhưng bạn có thể thay đổi sang bất kỳ chân GPIO nào khác (trừ những chân có chức năng đặc biệt đang được sử dụng như UART, I2C, SPI).

  1. Tạo thư mục làm việc và file C (nếu chưa có):

    mkdir -p programas_gpio/pwm
    cd programas_gpio/pwm
    sudo nano pwmsoft.c
  2. Nhập mã chương trình:
    Chương trình này sẽ tạo một chân PWM phần mềm trên chân 7 (PA6) với dải giá trị từ 0 đến 1023. Tương tự như ví dụ trên, nó sẽ luân phiên thay đổi chu kỳ nhiệm vụ giữa mức tối đa và 50% mỗi 10 giây.

    #include <wiringPi.h>
    #include <softPwm.h> // Bao gồm thư viện softPwm
    
    #define PIN_PWM 7 // Chân PA6 tương ứng với WiringPi pin 7
    
    int main(void)
    {
        wiringPiSetup();
        // Khởi tạo PWM phần mềm: chân, giá trị khởi tạo, dải giá trị
        softPwmCreate(PIN_PWM, 0, 1023);
    
        while(1)
        {
            softPwmWrite(PIN_PWM, 1023); // Chu kỳ nhiệm vụ tối đa
            delay(10000); // Đợi 10 giây
            softPwmWrite(PIN_PWM, 512);  // Chu kỳ nhiệm vụ 50%
            delay(10000); // Đợi 10 giây
        }
    
        return 0;
    }
  3. Lưu và đóng file.

  4. Biên dịch chương trình:

    gcc -o pwmsoft pwmsoft.c -lwiringPi

    Lưu ý: Thư viện softPwm đã được tích hợp sẵn trong wiringPi, nên bạn chỉ cần liên kết với -lwiringPi.

  5. Chạy chương trình:

    sudo ./pwmsoft

Kết Quả Thực Tế và Ứng Dụng

Khi chạy chương trình PWM phần mềm, bạn sẽ thấy chân GPIO được chọn tạo ra tín hiệu PWM như mong đợi. Để minh họa, bạn có thể kết nối một quạt nhỏ hoặc đèn LED thông qua một transistor điều khiển. Khi chu kỳ nhiệm vụ thay đổi, tốc độ quay của quạt hoặc độ sáng của đèn LED sẽ thay đổi tương ứng, chứng tỏ khả năng điều khiển “tương tự” hiệu quả từ tín hiệu số.

Kết Luận

Mặc dù PWM phần cứng trên Orange Pi có thể gặp khó khăn trong việc triển khai do các vấn đề về driver và nhận diện chân, PWM phần mềm thông qua thư viện WiringOP (cụ thể là softPwm) cung cấp một giải pháp mạnh mẽ, linh hoạt và đáng tin cậy. Bằng cách sử dụng PWM phần mềm, bạn có thể dễ dàng điều khiển nhiều loại thiết bị yêu cầu tín hiệu tương tự trên Orange Pi của mình, mở rộng khả năng ứng dụng trong các dự án điện tử và tự động hóa.

Leave a Comment

👈 Vuốt để chuyển bài 👉

KIỂM TRA PORT

IPv6 của bạn: Đang lấy...