From 65268098c694cf8b7030382b2ecb9fdaf3fe2347 Mon Sep 17 00:00:00 2001 From: ZodiusInfuser Date: Thu, 10 Mar 2022 05:55:56 +0000 Subject: [PATCH] Fix for pulse width bug when changing from high to low frequencies if there was an overrun --- drivers/pwm/pwm_cluster.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/pwm/pwm_cluster.cpp b/drivers/pwm/pwm_cluster.cpp index e8f1fa58..52010740 100644 --- a/drivers/pwm/pwm_cluster.cpp +++ b/drivers/pwm/pwm_cluster.cpp @@ -387,7 +387,7 @@ void PWMCluster::load_pwm() { // Invert this channel's initial state if it's polarity invert is set if(state.polarity) { - pin_states |= (1u << channel); // Set the pin + pin_states |= (1u << channel_to_pin_map[channel]); // Set the pin } uint channel_start = state.offset; @@ -404,19 +404,21 @@ void PWMCluster::load_pwm() { // Did the previous sequence overrun the wrap level? if(state.overrun > 0) { // Flip the initial state so the pin starts "high" (or "low" if polarity inverted) - pin_states ^= (1u << channel); + pin_states ^= (1u << channel_to_pin_map[channel]); // Check for a few edge cases when pulses change length across the wrap level // Not entirely sure I understand which statements does what, but they seem to work if((channel_end >= channel_start) || (state.overrun > channel_end)) { // Add a transition to "low" (or "high" if polarity inverted) at the overrun level of the previous sequence PWMCluster::sorted_insert(transitions, data_size, TransitionData(channel, state.overrun, state.polarity)); + //printf("C = %d, Added Low at %d\n", channel, state.overrun); } } if(state.level > 0 && channel_start < wrap_level) { // Add a transition to "high" (or "low" if polarity inverted) at the start level PWMCluster::sorted_insert(transitions, data_size, TransitionData(channel, channel_start, !state.polarity)); + //printf("C = %d, Added High at %d\n", channel, channel_start); // If the channel has overrun the wrap level, record by how much if(channel_end < channel_start) { @@ -427,7 +429,10 @@ void PWMCluster::load_pwm() { if(state.level < wrap_level) { // Add a transition to "low" (or "high" if polarity inverted) at the end level PWMCluster::sorted_insert(transitions, data_size, TransitionData(channel, channel_end, state.polarity)); + //printf("C = %d, Added Low at %d\n", channel, channel_end); } + + //printf("C = %d, Start = %d, End = %d, Overrun = %d\n", channel, channel_start, channel_end, state.overrun); } // Introduce "Loading Zone" transitions to the end of the sequence to @@ -518,6 +523,9 @@ void PWMCluster::load_pwm() { // Record the looping pin states looping_mask[write_index] = pin_states; + //BUG It's not just the first one that needs overriding! D'oh! + // It could be a whole load of pulses that need updating to account for when multiple pulses pass the looping line + // May be best to have an intermediary sequence? } else { // There were no transitions (either because there was a zero wrap, or no channels because there was a zero wrap?),