[英]How can PWM be generated on the Raspberry Pi using wiringPi with C?
[英]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模式。 (這里有很多建議,因為我也沒有示波器)
因此進行設置:
然后您可以通過以下方式從左到右旋轉伺服器
(實際上,我從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.