使用PWM的正占空比控制舵机转动

1.舵机:常见的角度控制外设,通常在机器人、航模等产品上比较常见,外观如下:

使用PWM的正占空比控制舵机转动_第1张图片

2.驱动原理:通过输出固定周期为20ms的PWM波形驱动舵机,其中正占空比(0.5~2.5ms)决定舵机的转动的角度为-90°到90°

使用PWM的正占空比控制舵机转动_第2张图片   使用PWM的正占空比控制舵机转动_第3张图片

3.舵机硬件原理:

使用PWM的正占空比控制舵机转动_第4张图片    使用PWM的正占空比控制舵机转动_第5张图片

使用PWM的正占空比控制舵机转动_第6张图片

4.外设接线图

舵机 单片机
黑线 GND
红线 VCC(+5)
黄线 PWM输出控制IO

5.参考代码(基于nRF 52840)

#define BSP_PWM_IO 12
static void demo1(void)
{
    NRF_LOG_INFO("Demo 1/ 0.5ms 0du");

    /*
     * This demo uses only one channel, which is reflected on LED 1.
     * The LED blinks three times (200 ms on, 200 ms off), then it stays off
     * for one second.
     * This scheme is performed three times before the peripheral is stopped.
     */

    nrf_drv_pwm_config_t const config0 =
    {
        .output_pins =
        {
            BSP_PWM_IO,                           // channel 0
            NRF_DRV_PWM_PIN_NOT_USED,             // channel 1
            NRF_DRV_PWM_PIN_NOT_USED,             // channel 2
            NRF_DRV_PWM_PIN_NOT_USED,             // channel 3
        },
        .irq_priority = APP_IRQ_PRIORITY_LOWEST,
        .base_clock   = NRF_PWM_CLK_250kHz,
        .count_mode   = NRF_PWM_MODE_UP,
        .top_value    = 5000,
        .load_mode    = NRF_PWM_LOAD_COMMON,
        .step_mode    = NRF_PWM_STEP_AUTO
    };
    APP_ERROR_CHECK(nrf_drv_pwm_init(&m_pwm0, &config0, NULL));
    m_used |= USED_PWM(0);

    // This array cannot be allocated on stack (hence "static") and it must
    // be in RAM (hence no "const", though its content is not changed).
    static uint16_t /*const*/ seq_values[] =
    {
        4375
    };

    nrf_pwm_sequence_t const seq =
    {
        .values.p_common = seq_values,
        .length          = NRF_PWM_VALUES_LENGTH(seq_values),
        .repeats         = 0,
        .end_delay       = 0
    };

    (void)nrf_drv_pwm_simple_playback(&m_pwm0, &seq, 1, NRF_DRV_PWM_FLAG_LOOP);
}

说明:

设置固定周期为20ms

基础时钟为250KHz,那么基础时钟周期为1s/250*1000 = 1000ms / 250000Hz =0.004ms

.base_clock   = NRF_PWM_CLK_250kHz,

如果需要设置PWM的周期为20ms,那么需要设置 20ms/0.004ms = 5000

.top_value    = 5000,

设置正占空比,由于Nordic默认设置的是负占空比,需要转换(A是设置的正占空比的时间,B是我们需要设置的seq_values的值):

A/20 = (5000-B)/5000

比如需要设置舵机转到90°,对应的正占空比时间为2.5ms,即A = 2.5,那么B应该是4375,即

static uint16_t /*const*/ seq_values[] =
{
   4375
};

 

你可能感兴趣的:(其他)