Update `struct pwm_dt_spec` use with pwm_is_ready_dt() Signed-off-by: Nick Ward <nix.ward@gmail.com>
67 lines
1.2 KiB
C
67 lines
1.2 KiB
C
/*
|
|
* Copyright (c) 2016 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file Sample app to demonstrate PWM-based servomotor control
|
|
*/
|
|
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/sys/printk.h>
|
|
#include <zephyr/device.h>
|
|
#include <zephyr/drivers/pwm.h>
|
|
|
|
static const struct pwm_dt_spec servo = PWM_DT_SPEC_GET(DT_NODELABEL(servo));
|
|
static const uint32_t min_pulse = DT_PROP(DT_NODELABEL(servo), min_pulse);
|
|
static const uint32_t max_pulse = DT_PROP(DT_NODELABEL(servo), max_pulse);
|
|
|
|
#define STEP PWM_USEC(100)
|
|
|
|
enum direction {
|
|
DOWN,
|
|
UP,
|
|
};
|
|
|
|
int main(void)
|
|
{
|
|
uint32_t pulse_width = min_pulse;
|
|
enum direction dir = UP;
|
|
int ret;
|
|
|
|
printk("Servomotor control\n");
|
|
|
|
if (!pwm_is_ready_dt(&servo)) {
|
|
printk("Error: PWM device %s is not ready\n", servo.dev->name);
|
|
return 0;
|
|
}
|
|
|
|
while (1) {
|
|
ret = pwm_set_pulse_dt(&servo, pulse_width);
|
|
if (ret < 0) {
|
|
printk("Error %d: failed to set pulse width\n", ret);
|
|
return 0;
|
|
}
|
|
|
|
if (dir == DOWN) {
|
|
if (pulse_width <= min_pulse) {
|
|
dir = UP;
|
|
pulse_width = min_pulse;
|
|
} else {
|
|
pulse_width -= STEP;
|
|
}
|
|
} else {
|
|
pulse_width += STEP;
|
|
|
|
if (pulse_width >= max_pulse) {
|
|
dir = DOWN;
|
|
pulse_width = max_pulse;
|
|
}
|
|
}
|
|
|
|
k_sleep(K_SECONDS(1));
|
|
}
|
|
return 0;
|
|
}
|