From 266178d7ae1490060924410bf1d551919edd280c Mon Sep 17 00:00:00 2001 From: hubmartin Date: Thu, 12 Aug 2021 22:10:42 +0200 Subject: [PATCH 1/2] Add PWM Backlight --- .../brightness/BrightnessController.cpp | 51 ++++++++++++++----- .../brightness/BrightnessController.h | 4 ++ 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/components/brightness/BrightnessController.cpp b/src/components/brightness/BrightnessController.cpp index 8ad987d1f4..8d51d47b69 100644 --- a/src/components/brightness/BrightnessController.cpp +++ b/src/components/brightness/BrightnessController.cpp @@ -2,38 +2,65 @@ #include #include "displayapp/screens/Symbols.h" +#include "nrf_pwm.h" + using namespace Pinetime::Controllers; void BrightnessController::Init() { + + // Use only LIGHT1 mosfet with 30R resistor for now nrf_gpio_cfg_output(pinLcdBacklight1); nrf_gpio_cfg_output(pinLcdBacklight2); nrf_gpio_cfg_output(pinLcdBacklight3); + + nrf_gpio_pin_clear(pinLcdBacklight1); + nrf_gpio_pin_clear(pinLcdBacklight2); + nrf_gpio_pin_clear(pinLcdBacklight3); + + static nrf_pwm_sequence_t seq; + + seq.values.p_common = pwmSequence; + seq.length = 1; + seq.repeats = 0; + seq.end_delay = 0; + + uint32_t out_pins[] = {pinLcdBacklight3, pinLcdBacklight2, pinLcdBacklight1, NRF_PWM_PIN_NOT_CONNECTED}; + + nrf_pwm_pins_set(NRF_PWM0, out_pins); + nrf_pwm_enable(NRF_PWM0); + // With 8 MHz and 10000 reload timer PWM frequency is 712 Hz + nrf_pwm_configure(NRF_PWM0, NRF_PWM_CLK_8MHz, NRF_PWM_MODE_UP, 10000); + nrf_pwm_loop_set(NRF_PWM0, 0); + nrf_pwm_decoder_set(NRF_PWM0, NRF_PWM_LOAD_COMMON, NRF_PWM_STEP_AUTO); + nrf_pwm_sequence_set(NRF_PWM0, 0, &seq); + nrf_pwm_task_trigger(NRF_PWM0, NRF_PWM_TASK_SEQSTART0); + Set(level); } + +void BrightnessController::setPwm(uint16_t val) +{ + pwmSequence[0] = val; + nrf_pwm_task_trigger(NRF_PWM0, NRF_PWM_TASK_SEQSTART0); +} + void BrightnessController::Set(BrightnessController::Levels level) { + this->level = level; switch (level) { default: case Levels::High: - nrf_gpio_pin_clear(pinLcdBacklight1); - nrf_gpio_pin_clear(pinLcdBacklight2); - nrf_gpio_pin_clear(pinLcdBacklight3); + setPwm(10000); break; case Levels::Medium: - nrf_gpio_pin_clear(pinLcdBacklight1); - nrf_gpio_pin_clear(pinLcdBacklight2); - nrf_gpio_pin_set(pinLcdBacklight3); + setPwm(5000); break; case Levels::Low: - nrf_gpio_pin_clear(pinLcdBacklight1); - nrf_gpio_pin_set(pinLcdBacklight2); - nrf_gpio_pin_set(pinLcdBacklight3); + setPwm(500); break; case Levels::Off: - nrf_gpio_pin_set(pinLcdBacklight1); - nrf_gpio_pin_set(pinLcdBacklight2); - nrf_gpio_pin_set(pinLcdBacklight3); + setPwm(0); break; } } diff --git a/src/components/brightness/BrightnessController.h b/src/components/brightness/BrightnessController.h index c47158a910..be5be996e1 100644 --- a/src/components/brightness/BrightnessController.h +++ b/src/components/brightness/BrightnessController.h @@ -27,6 +27,10 @@ namespace Pinetime { static constexpr uint8_t pinLcdBacklight3 = 23; Levels level = Levels::High; Levels backupLevel = Levels::High; + uint16_t pwmSequence[1] = {10000}; + + void setPwm(uint16_t val); + }; } } From adf49799f847352aa86372e37dc776913b11cc7d Mon Sep 17 00:00:00 2001 From: hubmartin Date: Sat, 14 Aug 2021 11:54:38 +0200 Subject: [PATCH 2/2] Set low/med levels to be exactly same like without PWM --- .../brightness/BrightnessController.cpp | 20 +++++++++++++++++-- .../brightness/BrightnessController.h | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/components/brightness/BrightnessController.cpp b/src/components/brightness/BrightnessController.cpp index 8d51d47b69..f0e955cac5 100644 --- a/src/components/brightness/BrightnessController.cpp +++ b/src/components/brightness/BrightnessController.cpp @@ -45,6 +45,22 @@ void BrightnessController::setPwm(uint16_t val) nrf_pwm_task_trigger(NRF_PWM0, NRF_PWM_TASK_SEQSTART0); } +void BrightnessController::pwmEnable(bool enable) +{ + if(enable) + { + nrf_pwm_enable(NRF_PWM0); + uint32_t out_pins[] = {pinLcdBacklight3, pinLcdBacklight2, pinLcdBacklight1, NRF_PWM_PIN_NOT_CONNECTED}; + nrf_pwm_pins_set(NRF_PWM0, out_pins); + } + else + { + uint32_t out_pins[] = {NRF_PWM_PIN_NOT_CONNECTED, NRF_PWM_PIN_NOT_CONNECTED, NRF_PWM_PIN_NOT_CONNECTED, NRF_PWM_PIN_NOT_CONNECTED}; + nrf_pwm_pins_set(NRF_PWM0, out_pins); + nrf_pwm_disable(NRF_PWM0); + } +} + void BrightnessController::Set(BrightnessController::Levels level) { this->level = level; @@ -54,10 +70,10 @@ void BrightnessController::Set(BrightnessController::Levels level) { setPwm(10000); break; case Levels::Medium: - setPwm(5000); + setPwm(3800); break; case Levels::Low: - setPwm(500); + setPwm(830); break; case Levels::Off: setPwm(0); diff --git a/src/components/brightness/BrightnessController.h b/src/components/brightness/BrightnessController.h index be5be996e1..216ee751d7 100644 --- a/src/components/brightness/BrightnessController.h +++ b/src/components/brightness/BrightnessController.h @@ -30,6 +30,7 @@ namespace Pinetime { uint16_t pwmSequence[1] = {10000}; void setPwm(uint16_t val); + void pwmEnable(bool enable); }; }