1.舵机:常见的角度控制外设,通常在机器人、航模等产品上比较常见,外观如下:
2.驱动原理:通过输出固定周期为20ms的PWM波形驱动舵机,其中正占空比(0.5~2.5ms)决定舵机的转动的角度为-90°到90°
3.舵机硬件原理:
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
};