Dear Nordic Team
I have changed pwm driver example as you see in bellow . i also observed the codes which you linked for pwm. Bellow code works without the effect of update_pwm and working well. But the problem is that i can not control the duty cycle by void update_pwm function. Kindly please help me.
#include <stdio.h> #include <string.h> #include "nrf_drv_pwm.h" #include "app_util_platform.h" #include "app_error.h" #include "boards.h" #include "bsp.h" #include "app_timer.h" #include "nrf_drv_clock.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" #include "nrf_delay.h" static nrf_drv_pwm_t m_pwm0 = NRF_DRV_PWM_INSTANCE(0); static uint16_t const m_demo1_top = 20000; static uint16_t const m_demo1_step = 200; static uint8_t m_demo1_phase; static nrf_pwm_values_individual_t m_demo1_seq_values; static nrf_pwm_sequence_t const m_demo1_seq = { .values.p_individual = &m_demo1_seq_values, .length = NRF_PWM_VALUES_LENGTH(m_demo1_seq_values), .repeats = 0, .end_delay = 0 }; static void demo1_handler(nrf_drv_pwm_evt_type_t event_type) { if (event_type == NRF_DRV_PWM_EVT_FINISHED) { uint8_t channel = m_demo1_phase >> 1; bool down = m_demo1_phase & 1; bool next_phase = false; uint16_t * p_channels = (uint16_t *)&m_demo1_seq_values; uint16_t value = p_channels[channel]; if (down) { value -= m_demo1_step; if (value == 0) { next_phase = true; } } else { value += m_demo1_step; if (value >= m_demo1_top) { next_phase = true; } } p_channels[channel] = value; if (next_phase) { if (++m_demo1_phase >= 2 * NRF_PWM_CHANNEL_COUNT) { m_demo1_phase = 0; } } } } static void pwm_init(void) { NRF_LOG_INFO("Demo 1"); nrf_drv_pwm_config_t const config0 = { .output_pins = { BSP_LED_0 | NRF_DRV_PWM_PIN_INVERTED, // channel 0 }, .irq_priority = APP_IRQ_PRIORITY_LOWEST, .base_clock = NRF_PWM_CLK_1MHz, .count_mode = NRF_PWM_MODE_UP, .top_value = m_demo1_top, .load_mode = NRF_PWM_LOAD_INDIVIDUAL, .step_mode = NRF_PWM_STEP_AUTO }; APP_ERROR_CHECK(nrf_drv_pwm_init(&m_pwm0, &config0, demo1_handler)); APP_ERROR_CHECK(nrf_drv_pwm_simple_playback(&m_pwm0, &m_demo1_seq, 1, NRF_DRV_PWM_FLAG_LOOP)); } void update_pwm(int16_t duty_cycle) { m_demo1_seq_values.channel_0 = duty_cycle; nrf_drv_pwm_simple_playback(&m_pwm0, &m_demo1_seq, 1, 0); } int main(void) { APP_ERROR_CHECK(NRF_LOG_INIT(NULL)); pwm_init(); for (;;) { } }
Kind regards