I am quite new with nordic environment .
My application is to start 2 pwm instance in opposite polarity (i.e 1 high polarity and another is low polarity with same duty cycle) when got interrupt in gpio pin.
I am able to create the same by using PWM_Library example in SDK .
Here is my code
#define Period 20000 //20ms #define PIN_IN 22 #define PWM_PIN (11UL) int duty_1= 20; static volatile bool ready_flag; static int gpio_flag =0; APP_PWM_INSTANCE(PWM1,1); APP_PWM_INSTANCE(PWM2,2); void pwm_ready_callback(uint32_t pwm_id) // PWM callback function { ready_flag = true; } void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { gpio_flag =1; } static void gpio_init(void) { ret_code_t err_code; err_code = nrf_drv_gpiote_init(); APP_ERROR_CHECK(err_code); nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_LOTOHI(true); in_config.pull = NRF_GPIO_PIN_PULLDOWN; err_code = nrf_drv_gpiote_in_init(PIN_IN, &in_config, in_pin_handler); APP_ERROR_CHECK(err_code); nrf_drv_gpiote_in_event_enable(PIN_IN, true); } static void pwm_pin_init(void) { ret_code_t err_code; app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(Period, BSP_LED_0); app_pwm_config_t pwm2_cfg = APP_PWM_DEFAULT_CONFIG_1CH(Period, BSP_LED_1); pwm1_cfg.pin_polarity [0]= APP_PWM_POLARITY_ACTIVE_HIGH; pwm2_cfg.pin_polarity [0]= APP_PWM_POLARITY_ACTIVE_LOW; err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback); APP_ERROR_CHECK(err_code); err_code = app_pwm_init(&PWM2,&pwm2_cfg,pwm_ready_callback); APP_ERROR_CHECK(err_code); app_pwm_enable(&PWM1); app_pwm_enable(&PWM2); } int main(void) { bsp_board_init(BSP_INIT_LEDS); gpio_init(); pwm_pin_init(); uint32_t value; while(true) { if(gpio_flag == 1) { value = duty_1; gpio_flag =0; ready_flag = false; /* Set the duty cycle - keep trying until PWM is ready... */ while ((app_pwm_channel_duty_set(&PWM1, 0, value))&(app_pwm_channel_duty_set(&PWM2, 0, value)) == NRF_ERROR_BUSY); /* ... or wait for callback. */ while (!ready_flag); APP_ERROR_CHECK(app_pwm_channel_duty_set(&PWM1, 0, value)); APP_ERROR_CHECK(app_pwm_channel_duty_set(&PWM2, 0, value)); // nrf_delay_ms(25); } else { app_pwm_channel_duty_set(&PWM1, 0, 0); app_pwm_channel_duty_set(&PWM2, 0, 0); } } }
This code is working properly but I want to set duty cycle inside the interrupt function not in main function .
So how to do so because I tried but without any success.
So guide me .