簡體   English   中英

使用帶有布線Pi的硬件​​PWM通過樹莓派控制伺服

[英]Controlling a servo with raspberry pi using the hardware PWM with wiringPi

我嘗試使用wireingPi庫通過softPwm控制伺服器,但這導致了伺服器斷斷續續。 因此,我想將Raspberry Pi(GPIO18)上的硬件PWM引腳與connectioningPi庫一起使用。 但是我不明白如何將頻率設置為50 Hz,以及如何將占空比更改為具有0.8 ms至2.5 ms的脈沖寬度。

我在互聯網上發現以下關系(我不知道是否正確):

pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.

我知道時鍾除數最大值約為4000,而Raspberry Pi PWM時鍾的基本頻率為19.2 MHz。 所以這給了我約4.8KHz。

我已經有了這些設置,應該使用以下關系給我〜50Hz:

//put PWM in mark-space mode, which will give you 
//the traditional (and easily predictable) PWM    
pwmSetMode(PWM_MODE_MS);
//setting ping GPIO 18 as a pwm output
pinMode(18,PWM_OUTPUT);
//Set clock divisor to 4000
pwmSetClock(4000);
pwmSetRange (10) ;

我沒有示波器來測試輸出信號,以檢查什么設置會改變什么。 這使得我很難找到答案。

長話短說:誰能告訴我如何在Raspberry Pi上使用硬件PWM實現0.8ms至2.1ms的脈沖寬度來控制伺服器。

我對Pi和Servo來說是個新手。 但是我讓它與connectionPi一起使用。

它表示在這里 ,我們正在尋找每20ms左右創建1ms至2ms長度的脈沖。 假設此19.2Mhz基本時鍾確實正確,將pwm時鍾設置為400,將pwm范圍設置為1000,則應以48Hz或每20.8 ms給出一個脈沖。 然后將pwm值設置為48應該給您一個1ms長的脈沖,而將pwm值設置為96應該給您一個2ms長的脈沖。 但是您需要將芯片設置為pwm-ms模式。 (這里有很多建議,因為我也沒有示波器)

因此進行設置:

  • gpio模式1 pwm
  • gpio pwm-ms
  • gpio pwmc 400
  • gpio pwmr 1000

然后您可以通過以下方式從左到右旋轉伺服器

  • gpio pwm 1 48
  • gpio pwm 1 96

(實際上,我從28到118工作的伺服系統;可能是伺服系統)(設置順序似乎很重要;可能是一個錯誤)

if (wiringPiSetup () == -1) //using wPi pin numbering
 exit (1) ;

pinMode(1, PWM_OUTPUT);
pwmSetMode(PWM_MODE_MS); 
pwmSetClock(384); //clock at 50kHz (20us tick)
pwmSetRange(1000); //range at 1000 ticks (20ms)
pwmWrite(1, 75);  //theretically 50 (1ms) to 100 (2ms) on my servo 30-130 works ok
return 0 ;

確保使用正確的gpio引腳!

型號A和B在引腳18 BCM(1 wPi)上具有一個硬件PWM。

型號A +和B +可以在BCM引腳13和19(23、24 wPi)上輸出第二個硬件pwm

改用RPIO怎么樣? 這是該庫的鏈接: http : //pythonhosted.org/RPIO/index.html

這是PWM示例: http : //pythonhosted.org/RPIO/pwm_py.html而且您也可以直接使用C源代碼: https : //github.com/metachris/RPIO/tree/master/source/c/pwm

我讓wiringPi通過軟件來實現它。 我可能嘗試過RPIO,但我的特定應用程序要求音頻輸出有效,並且我了解RPIO的DMA可以消除音頻。 我可能還嘗試過接線Pi的softPwm甚至softServo,但是我也需要通過PWM運行直流電動機,我不想僅將整個系統的頻率降低到50Hz。

該程序用作演示,沒有抖動(因為它不會連續驅動定位脈沖),並且每次都以明顯不可識別的錯誤着陸在其目標上。 授予Pi當時沒有做太多事情來干擾程序的時間(除非通過SSH,gedit,終端會話, top所有東西運行X服務器)。

// Servo trial 11/15/14 by SLC

#include <wiringPi.h>

#include <stdio.h>
#include <unistd.h>

int main()
{
    wiringPiSetup();
    pinMode( 6, OUTPUT );
    digitalWrite( 6,  HIGH );

    int idx = 0, tries = 0;
    while ( tries++ < 30 )
    {
        int i;
        const int period[] = { 500, 1500, 2500 };

        printf( "Setting period to %i ms\n", period[idx] );
        for ( i = 0; i < 20; ++i )
        {
            // Output going through an inverter (to convert 3.3V to 5V)
            digitalWrite( 6, LOW );
            usleep( period[idx] );
            digitalWrite( 6,  HIGH );
            usleep( 20 * 1000 );
        }
        ++idx;
        idx %= 3;

        sleep( 2 );
    }
}

我的伺服器是Radio Shack微型伺服器,看起來與那里的其他“微型”伺服器相同。 我還發現我可以拋棄逆變器,而只是使用3.3V GPIO驅動信號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM