Hello,
With respect to my previous post, I am trying to use the nrfx_pwm_simple_playback function to run sequences continuously for an RGB led.
Initially I did not fully understand the nrfx_pwm library.
Objective is to run the RGB led for specific durations. [Due to project requirements, I cannot use/implement the timer based method using sw_pwm, and so I need to use the nrfx_pwm method]
Prior Post:
Trying to use nrfx simple playback command to run RGB LED for specific duration on nrf5340 board
Based on my understanding of the header file, I have made some further changes to the code.
#include <hal/nrf_gpio.h>
LOG_MODULE_REGISTER(LED_PWM, LOG_LEVEL_DBG); // Register a module for your logs
// Definitions for the LED PINS
#define GREEN_LED_PIN (NRF_GPIO_PIN_MAP(1, 13)) // This is the pin number for the green LED
#define BLUE_LED_PIN (NRF_GPIO_PIN_MAP(1, 14))
#define RED_LED_PIN (NRF_GPIO_PIN_MAP(1, 15))
#include "nrfx_pwm.h"
#define TIME_DELAY_50MS 9
#define TIME_DELAY_100MS 20
#define TIME_DELAY_150MS 30
#define TIME_DELAY_1950MS 400
#define PWM_TOP_5MS 5000
#define PWM_TOP_2_5MS 2500
#define DUTY_CYCLE_100 0x8000
#define DUTY_CYCLE_YELLOW 0x200
#define DUTY_CYCLE_0 0x00
#define PWM_STEP 4000
#define PWM_COMMON 0x02
#define USED_PWM(idx) (1UL << idx)
static uint8_t m_used = 0;
#define MAX_LED_NUMBER 1
uint8_t previousLEDState = PWM_COMMON;
// Definition for a single pwm driver instance using a Macro for creating a PWM driver instance.
static nrfx_pwm_t m_pwm0 = NRFX_PWM_INSTANCE(0);
static uint16_t const m_pwm_top = PWM_TOP_5MS;
static uint16_t const m_pwm_top_idle = PWM_TOP_2_5MS;
static uint16_t const m_pwm_step = PWM_STEP;
static uint8_t m_pwm_phase;
static nrf_pwm_values_individual_t m_pwm_seq_values;
static nrf_pwm_sequence_t const m_pwm_seq =
{
.values.p_individual = &m_pwm_seq_values,
.length = NRF_PWM_VALUES_LENGTH(m_pwm_seq_values),
.repeats = 0,
.end_delay = 0
};
//Configuration for the idle mode.
nrfx_pwm_config_t config_pwm_idle =
{
.output_pins =
{
GREEN_LED_PIN, RED_LED_PIN, NRF_PWM_PIN_NOT_CONNECTED
},
.irq_priority = NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY,
.base_clock = NRF_PWM_CLK_1MHz,
.count_mode = NRF_PWM_MODE_UP,
.top_value = m_pwm_top_idle, //2500 ticks.
.load_mode = NRF_PWM_LOAD_INDIVIDUAL,
.step_mode = NRF_PWM_STEP_AUTO
};
//Function for uninitializing the pwm driver.
void UninitPWM( void )
{
if (m_used & USED_PWM(0))
{
nrfx_pwm_uninit(&m_pwm0);
}
m_used = 0;
}
uint8_t channel = 0;
uint16_t * p_channels = (uint16_t *)&m_pwm_seq_values;
// Handler Function for the idle mode
static void ledPwm_handler_idle(nrfx_pwm_evt_type_t event_type)
{
if (event_type == NRFX_PWM_EVT_FINISHED)
{
uint8_t channel = m_pwm_phase >> 1;
bool down = m_pwm_phase & 1;
bool next_phase = false;
static uint16_t timer;
uint16_t * p_channels = (uint16_t *)&m_pwm_seq_values;
uint16_t value = p_channels[channel];
if (down)
{
value -= m_pwm_step;
if (value == 0)
{
next_phase = true;
}
}
else
{
value += m_pwm_step;
if (value >= m_pwm_top_idle)
{
next_phase = true;
}
}
if(timer > 10)
{
p_channels[0] = 0;
if(timer > 4000)
{
timer = 0;
}
}
else
{
p_channels[0] = DUTY_CYCLE_100;
}
timer++;
//p_channels[1]= 0;
if (next_phase)
{
if (++m_pwm_phase >= 2 * NRF_PWM_CHANNEL_COUNT)
{
m_pwm_phase = 0;
}
}
}
}
int32_t start_pwm()
{
// UninitPWM();
m_pwm_seq_values.channel_0 = 0;
m_pwm_seq_values.channel_1 = 0;
m_pwm_seq_values.channel_2 = 0;
m_pwm_seq_values.channel_3 = 0;
m_pwm_phase = 0;
nrfx_pwm_init(&m_pwm0, &config_pwm_idle, ledPwm_handler_idle, NULL);
// Tried to increase the playback count below, but the sequence repeats only once.
// Tried to put the below statement in a loop but still the sequence executes only once.
// NRFX_PWM_FLAG_LOOP i understand that this means after a single sequence is played, it should repeat again but I dont see it.
// In the above configuration for idle mode, I have tried to use repeats field but still dont observe the sequence being played again
nrfx_pwm_simple_playback(&m_pwm0, &m_pwm_seq, 2, NRFX_PWM_FLAG_LOOP);
LOG_DBG("PWM playback completed");
}Can you please provide some inputs on how I can achieve my objective? In case there is more detailed documentation + examples for individual mode using nrfx_pwm, can you please share the link?
Thanks