|
Bluenet
5.7.0
Bluenet, firmware for nRF52 smart home devices
|
Pulse Wide Modulation class. More...
#include <cs_PWM.h>

Public Member Functions | |
| uint32_t | init (const pwm_config_t &config) |
| Initialize the PWM settings. More... | |
| uint32_t | deinit () |
| De-Initialize the PWM instance, i.e. free allocated resources. More... | |
| uint32_t | start (bool onZeroCrossing) |
| Start PWM. More... | |
| void | setValue (uint8_t channel, uint8_t value, uint8_t speed) |
| Set the value of a specific channel. More... | |
| uint8_t | getValue (uint8_t channel) |
| Get current value of a specific channel. More... | |
| void | onPeriodEnd () |
| Function to be called on the end of the PWM period. More... | |
| void | onZeroCrossingInterrupt () |
| Function to be called on a zero crossing interrupt. More... | |
| void | _handleInterrupt () |
| Interrupt handler: internal function, implementation specific. More... | |
Static Public Member Functions | |
| static PWM & | getInstance () |
| Gets a static singleton (no dynamic memory allocation) of the PWM class. More... | |
Static Public Attributes | |
| static const uint8_t | _maxValue = 100 |
Private Member Functions | |
| PWM () | |
| Private PWM constructor. More... | |
| PWM (PWM const &) | |
| Private PWM copy constructor. More... | |
| void | operator= (PWM const &) |
| Private PWM copy assignment definition. More... | |
| uint32_t | initChannel (uint8_t index, pwm_channel_config_t &config) |
| Init a channel. More... | |
| void | start () |
| Start the PWM timer, and mark PWM as started. More... | |
| void | updateValues () |
| Check if the current value with the target value. More... | |
| void | setValue (uint8_t channel, uint8_t newValue) |
| Actually set the value in the peripheral. More... | |
| void | gpioteConfig (uint8_t channel, bool initOn) |
| Config gpiote. More... | |
| void | gpioteUnconfig (uint8_t channel) |
| Unconfig gpiote. More... | |
| void | gpioteEnable (uint8_t channel) |
| Enable gpiote. More... | |
| void | gpioteDisable (uint8_t channel) |
| Disable gpiote. More... | |
| void | gpioteForce (uint8_t channel, bool initOn) |
| Force gpiote state. More... | |
| void | gpioOn (uint8_t channel) |
| Turn on with gpio. More... | |
| void | gpioOff (uint8_t channel) |
| Turn off with gpio. More... | |
| void | writeCC (uint8_t channelIdx, uint32_t ticks) |
| Write CC of timer. More... | |
| uint32_t | readCC (uint8_t channelIdx) |
| Read CC of timer. More... | |
| void | enableInterrupt () |
| Enables the timer interrupt, to change the pwm value. More... | |
| nrf_timer_cc_channel_t | getTimerChannel (uint8_t index) |
| Helper function to get the timer channel, given the index. More... | |
| nrf_gpiote_tasks_t | getGpioteTaskOut (uint8_t index) |
| Helper function to get the gpiote task out, given the index. More... | |
| nrf_gpiote_tasks_t | getGpioteTaskSet (uint8_t index) |
| Helper function to get the gpiote task out, given the index. More... | |
| nrf_gpiote_tasks_t | getGpioteTaskClear (uint8_t index) |
| Helper function to get the gpiote task out, given the index. More... | |
| nrf_ppi_channel_t | getPpiChannel (uint8_t index) |
| Helper function to get the ppi channel, given the index. More... | |
| nrf_ppi_channel_group_t | getPpiGroup (uint8_t index) |
| Helper function to get the ppi group, given the index. More... | |
| nrf_ppi_task_t | getPpiTaskEnable (uint8_t index) |
| Helper function to get the ppi enable task, given the group index. More... | |
| nrf_ppi_task_t | getPpiTaskDisable (uint8_t index) |
| Helper function to get the ppi disable task, given the group index. More... | |
Private Attributes | |
| pwm_config_t | _config |
| Config of the PWM. More... | |
| uint8_t | _values [CS_PWM_MAX_CHANNELS] = {0} |
| Duty cycle values of the channels in percentage. More... | |
| bool | _initialized |
| Flag to indicate that the init function has been successfully performed. More... | |
| bool | _started |
| Flag to indicate that the start functions has been successfully performed. More... | |
| bool | _startOnZeroCrossing |
| Flag to indicate whether to wait for a zero crossing to start. More... | |
| uint32_t | _maxTickVal |
| Max value of channel, in ticks. Set at init. More... | |
| uint32_t | _adjustedMaxTickVal |
| Max value of channel, in ticks. Adjusted to sync with zero crossings. More... | |
| uint8_t | _targetValues [CS_PWM_MAX_CHANNELS] = {0} |
| Target duty cycle values of the channels in percentage. More... | |
| uint8_t | _stepSize [CS_PWM_MAX_CHANNELS] = {0} |
| Step size to move actual value towards target value. More... | |
| uint8_t | _updateValuesCountdown = 0 |
| Current number of periods to wait before next value update. More... | |
| uint32_t | _tickValues [CS_PWM_MAX_CHANNELS] = {0} |
| Duty cycle values of the channels in ticks. More... | |
| nrf_ppi_channel_t | _ppiChannelsOn [CS_PWM_MAX_CHANNELS] |
| PPI channels to be used to trigger GPIOTE tasks from timer compare events. Turning the switch on. More... | |
| nrf_ppi_channel_t | _ppiChannelsOff [CS_PWM_MAX_CHANNELS] |
| PPI channels to be used to trigger GPIOTE tasks from timer compare events. Turning the switch off. More... | |
| nrf_ppi_channel_t | _ppiTransitionChannel |
| PPI channel to be used for duty cycle transitions. More... | |
| nrf_gpiote_outinit_t | _gpioteInitStatesOn [CS_PWM_MAX_CHANNELS] |
| GPIOTE init states cache. More... | |
| nrf_gpiote_outinit_t | _gpioteInitStatesOff [CS_PWM_MAX_CHANNELS] |
| bool | _isPwmEnabled [CS_PWM_MAX_CHANNELS] |
| Returns whether a channel is currently dimming (value > 0 and < max). More... | |
| uint32_t | _zeroCrossingCounter |
| Counter to keep up the number of zero crossing callbacks. More... | |
| int64_t | _zeroCrossTicksDeviationAvg |
| Moving average amount of timer ticks deviation compared to when the zero crossing callback was called. More... | |
| int64_t | _zeroCrossDeviationIntegral |
| Integral of the tick deviations. More... | |
Static Private Attributes | |
| static const uint8_t | numPeriodsBeforeValueUpdate = 3 |
| Only update values every so many PWM periods. More... | |
Pulse Wide Modulation class.
To turn on/off the power, as well as all intermediate stages, for example with dimming, the PWM class is used.
TODO: The PWM class concerns dimming in general. It should be called "Dimmer", not just "PWM".
| void PWM::_handleInterrupt | ( | ) |
Interrupt handler: internal function, implementation specific.
| uint32_t PWM::deinit | ( | ) |
De-Initialize the PWM instance, i.e. free allocated resources.
|
private |
Enables the timer interrupt, to change the pwm value.
|
private |
Helper function to get the gpiote task out, given the index.
|
private |
Helper function to get the gpiote task out, given the index.
|
private |
Helper function to get the gpiote task out, given the index.
|
inlinestatic |
Gets a static singleton (no dynamic memory allocation) of the PWM class.
|
private |
Helper function to get the ppi channel, given the index.
|
private |
Helper function to get the ppi group, given the index.
|
private |
Helper function to get the ppi disable task, given the group index.
|
private |
Helper function to get the ppi enable task, given the group index.
|
private |
Helper function to get the timer channel, given the index.
| uint8_t PWM::getValue | ( | uint8_t | channel | ) |
Get current value of a specific channel.
|
private |
Turn off with gpio.
|
private |
Turn on with gpio.
|
private |
Config gpiote.
|
private |
Disable gpiote.
|
private |
Enable gpiote.
|
private |
Force gpiote state.
|
private |
Unconfig gpiote.
| uint32_t PWM::init | ( | const pwm_config_t & | config | ) |
Initialize the PWM settings.
config can be safely deleted after calling this function.
|
private |
Init a channel.
| void PWM::onPeriodEnd | ( | ) |
Function to be called on the end of the PWM period.
Decoupled from interrupt.
| void PWM::onZeroCrossingInterrupt | ( | ) |
Function to be called on a zero crossing interrupt.
|
private |
Read CC of timer.
|
private |
Actually set the value in the peripheral.
| void PWM::setValue | ( | uint8_t | channel, |
| uint8_t | value, | ||
| uint8_t | speed | ||
| ) |
Set the value of a specific channel.
Each tick, the value will go towards target value by increasing or decreasing the actual value with 'speed'.
| [in] | channel | Channel to set. |
| [in] | value | Target value to set the channel to (0-100). |
| [in] | speed | Speed at which to go to target value (1-100). |
|
private |
| uint32_t PWM::start | ( | bool | onZeroCrossing | ) |
Start PWM.
| [in] | onZeroCrossing | Set to true to make it start at the first zero crossing. |
|
private |
Check if the current value with the target value.
If not equal, set the value.
|
private |
Write CC of timer.
|
private |
Max value of channel, in ticks. Adjusted to sync with zero crossings.
|
private |
Config of the PWM.
|
private |
|
private |
GPIOTE init states cache.
|
private |
Flag to indicate that the init function has been successfully performed.
|
private |
Returns whether a channel is currently dimming (value > 0 and < max).
|
private |
Max value of channel, in ticks. Set at init.
|
static |
|
private |
PPI channels to be used to trigger GPIOTE tasks from timer compare events. Turning the switch off.
|
private |
PPI channels to be used to trigger GPIOTE tasks from timer compare events. Turning the switch on.
|
private |
PPI channel to be used for duty cycle transitions.
|
private |
Flag to indicate that the start functions has been successfully performed.
|
private |
Flag to indicate whether to wait for a zero crossing to start.
|
private |
Step size to move actual value towards target value.
|
private |
Target duty cycle values of the channels in percentage.
|
private |
Duty cycle values of the channels in ticks.
|
private |
Current number of periods to wait before next value update.
|
private |
Duty cycle values of the channels in percentage.
|
private |
Integral of the tick deviations.
|
private |
Counter to keep up the number of zero crossing callbacks.
|
private |
Moving average amount of timer ticks deviation compared to when the zero crossing callback was called.
|
staticprivate |
Only update values every so many PWM periods.