香橙派硬體PWM控制sg90舵機

ouyanglingle發表於2024-05-21

本人機械電子專業的大一學生一枚,這是我在部落格園的第一篇隨筆

  2024年4月份我在二手平臺花費300大洋入手了香橙派zero3和3B,買回來後一開始是裝上ubuntu跑QQ機器人和minecraft伺服器的,所以雖然看到了板子上的40pin引腳,但當時並未立即探索其硬體擴充套件功能。幾天後,好奇心驅使我深入瞭解這些引腳的用途,我開始研究香橙派的GPIO程式設計。故發表隨筆來記錄我的折騰之旅。

  180度舵機作為一種常見的執行機構,廣泛應用於機器人關節控制、攝像頭雲臺調整等場景。要驅動舵機,關鍵在於理解PWM(脈衝寬度調製)訊號的生成與控制。不過在香橙派上使用wiringPi來輸出PWM不需要像stm32一樣去配置各種暫存器,還算是方便一些。

  我們需要以下函式來輸出硬體PWM波(以香橙派3B為例)

1 pinMode(int pin, int Mode); // 設定引腳為pwm輸出,引數Mode為PWM_OUTPUT
2 pwmSetClock(int pin,int divisor); // 引數divisor為div
3 pwmSetRange(int pin,unsigned int range); // 引數range為arr
4 pwmWrite(int pin, int value); // 引數value為ccr

  硬體PWM的頻率是可調的,有適用於香橙派的計算公式

頻率 = 24000000 / (arr * div);
佔空比 = ccr / arr;

  下面寫一個控制sg90舵機旋轉到45度處的程式碼

1 #include "wiringPi.h"
2 #include <stdio.h>
3 #define PWM_pin 21 
4 //香橙派3B的硬體PWM輸出引腳為wpi編號下的2和21號引腳,這裡使用21號引腳
5 int main()
6 {
7     int div = 8;
8     int arr = 60000;
9     int ccr = 3000;
10    //頻率= 24000000 / (60000 * 8) = 50Hz   sg90舵機要50Hz才能正常驅動
11    if (wiringPiSetup() == -1) {printf("初始化失敗惹>︿<");}
12    pinMode(PWM_pin, PWM_OUTPUT);
13    while (1)
14    {
15        pwmSetClock(PWM_pin, div);
16        pwmSetRange(PWM_pin, arr);
17        pwmWrite(PWM_pin, ccr);
18        //佔空比duty = ccr / arr = 5.0% 對應45度位置   
19    }
20 }

  儲存,命名為main.c

  我是用vscode遠端連線到香橙派3B的,在控制檯輸入gpio readall就可以看到香橙派3B的引腳定義圖。使用cd命令進入程式碼所在資料夾,輸入


orangepi@orangepi3b:my-project/ $ gcc main.c -o test1 -lwiringPi

  然後再輸入


orangepi@orangepi3b:my-project/ $ sudo ./test1

  按照提示輸入密碼後就可以看到舵機轉到了45度處

  python的程式碼和c語言版本大同小異,如下

 1 import wiringpi as pi
 2 from wiringpi import GPIO
 3 
 4 PWM_PIN = 21
 5 div = 8
 6 arr = 60000
 7 ccr = 4500
 8 if pi.wiringPiSetup() == -1:
 9     print("初始化失敗惹>︿<")
10 pi.pinMode(PWM_PIN,GPIO.PWM_OUTPUT)
11 while True:
12     pi.pwmSetClock(PWM_PIN, div)
13     pi.pwmSetRange(PWM_PIN, arr)
14     pi.pwmWrite(PWM_PIN, ccr) # duty = 7.5% 對應 90度

  儲存為main.py 然後以管理員身份執行

   python3 main.py

  是可以看到舵機轉到了90度位置處

相關文章