11

I tried controlling the servo with softPwm using the wiringPi Library but this made the servo stutter. Therefore I want to use the hardware PWM pin on the Raspberry Pi (GPIO18) with the wiringPi library. But I don't understand how to set the frequency to 50 Hz and change the duty cycle to have a pulse width ranging from 0.8 ms to 2.5 ms.

I found the following relationship on the internet (i dont know if it is correct):

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

i know the clock divisor max value is something around 4000 and the Raspberry Pi PWM clock has a base frequency of 19.2 MHz. so this gives me ~4,8KHz.

i already got these settings which should give me ~50Hz using the following relationship:

//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) ;

I dont got a oscilloscope to test the output signal to check what setting changes what. this makes it hard to find it out myself.

Long story short: Can anyone tell me how I can achieve a duty cycle with a pulse width of 0,8ms to 2,1ms for controlling a servo using the hardware PWM on the Raspberry Pi.

4

4 回答 4

9

我是 Pi 和 Servo 的新手。但我让它与wiringPi一起工作。

这里说我们希望每 20 毫秒左右创建 1 毫秒到 2 毫秒长度的脉冲。假设这个 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 PWM 400
  • gpio pwmr 1000

然后您可以通过以下方式将伺服从左向右转动

  • GPIO PWM 1 48
  • GPIO PWM 1 96

(实际上,我从 28 到 118 工作的伺服;可能是伺服)(设置顺序似乎很重要;可能是一个错误)

于 2014-01-24T23:29:29.590 回答
6
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+ 可以在引脚 13 和 19 BCM(23、24 wPi)上输出第二个硬件 pwm

于 2015-01-02T23:50:20.640 回答
2

改用 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

于 2013-11-19T23:20:16.563 回答
0

我让wiringPi通过软件位敲击来做到这一点。我可能尝试过 RPIO,但我的特定应用程序要求音频输出正常工作,而且我知道 RPIO 的 DMA 会使音频消失。我可能也尝试过wiringPi的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 驱动信号。

于 2014-11-16T13:33:01.490 回答