Use timer channels in sane order

This commit is contained in:
Ben V. Brown
2024-05-24 21:12:07 +10:00
committed by Ben V. Brown
parent 1c1231b6fe
commit 05384ae5a0
2 changed files with 18 additions and 17 deletions

View File

@@ -82,10 +82,11 @@ void start_PWM_output(void) {
} }
// Update trigger for the end point of the PWM cycle // Update trigger for the end point of the PWM cycle
if (pendingPWM > 0) { if (pendingPWM > 0) {
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_1, pendingPWM - 1); TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, pendingPWM - 1);
// Turn on output // Turn on output
PWM_Channel_Enable(PWM_Channel); PWM_Channel_Enable(PWM_Channel);
} else { } else {
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, 255 - 1);
// Leave output off // Leave output off
PWM_Channel_Disable(PWM_Channel); PWM_Channel_Disable(PWM_Channel);
} }
@@ -96,18 +97,24 @@ void start_PWM_output(void) {
TIMER_Enable(TIMER_CH0); TIMER_Enable(TIMER_CH0);
} }
// Timer 0 is used to co-ordinate the ADC and the output PWM
void timer0_comp0_callback(void) { void timer0_comp0_callback(void) {
// Trigged at end of output cycle; turn off the tip PWM
PWM_Channel_Disable(PWM_Channel);
TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_0);
}
// Timer 0 is used to co-ordinate the ADC and the output PWM
void timer0_comp1_callback(void) {
if (PWM_Channel_Is_Enabled(PWM_Channel)) { if (PWM_Channel_Is_Enabled(PWM_Channel)) {
ADC_FIFO_Clear();
// So there appears to be a bug _somewhere_ where sometimes the comparator doesn't fire // So there appears to be a bug _somewhere_ where sometimes the comparator doesn't fire
// Its not re-occurring with specific values, so suspect its a weird bug // Its not re-occurring with specific values, so suspect its a weird bug
// For now, we just skip the cycle and throw away the ADC readings. Its a waste but // For now, we just skip the cycle and throw away the ADC readings. Its a waste but
// It stops stupid glitches in readings, i'd take slight instability from the time jump // It stops stupid glitches in readings, i'd take slight instability from the time jump
// Over the readings we get that are borked as the header is left on // Over the readings we get that are borked as the heater is left on
// <Ralim 2023/10/14> // <Ralim 2023/10/14>
PWM_Channel_Disable(PWM_Channel); PWM_Channel_Disable(PWM_Channel);
// MSG("ALERT PWM Glitch\r\n"); // Trigger the PID now instead
// Triger the PID now instead
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) {
BaseType_t xHigherPriorityTaskWoken = pdFALSE; BaseType_t xHigherPriorityTaskWoken = pdFALSE;
if (pidTaskNotification) { if (pidTaskNotification) {
@@ -118,18 +125,12 @@ void timer0_comp0_callback(void) {
} else { } else {
ADC_Start(); ADC_Start();
} }
TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_0);
}
void timer0_comp1_callback(void) {
// Trigged at end of output cycle; turn off the tip PWM
PWM_Channel_Disable(PWM_Channel);
TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_1); TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_1);
} }
void timer0_comp2_callback(void) { void timer0_comp2_callback(void) {
// Triggered at end of timer cycle; re-start the tip driver // Triggered at end of timer cycle; re-start the tip driver
start_PWM_output();
TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_2); TIMER_ClearIntStatus(TIMER_CH0, TIMER_COMP_ID_2);
start_PWM_output();
} }
void switchToFastPWM(void) { void switchToFastPWM(void) {
inFastPWMMode = true; inFastPWMMode = true;
@@ -139,7 +140,7 @@ void switchToFastPWM(void) {
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM); TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM);
// ~10Hz // ~10Hz
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, powerPWM + holdoffTicks); TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_1, powerPWM + holdoffTicks);
// Set divider to 10 ~= 10.5Hz // Set divider to 10 ~= 10.5Hz
uint32_t tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCDR); uint32_t tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCDR);
@@ -158,7 +159,7 @@ void switchToSlowPWM(void) {
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM); TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_2, totalPWM);
// Adjust ADC // Adjust ADC
TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_0, powerPWM + holdoffTicks); TIMER_SetCompValue(TIMER_CH0, TIMER_COMP_ID_1, powerPWM + holdoffTicks);
// Set divider for ~ 5Hz // Set divider for ~ 5Hz

View File

@@ -202,10 +202,10 @@ void setup_timer_scheduler() {
TIMER_PRELOAD_TRIG_COMP2, // Trigger; reset after trigger 0 TIMER_PRELOAD_TRIG_COMP2, // Trigger; reset after trigger 0
TIMER_COUNT_PRELOAD, // Counter mode TIMER_COUNT_PRELOAD, // Counter mode
22, // Clock div 22, // Clock div
(uint16_t)(powerPWM + holdoffTicks), // CH0 compare (adc) (uint16_t)(powerPWM), // CH0 compare (pwm out)
(uint16_t)(powerPWM), // CH1 compare (pwm out) (uint16_t)(powerPWM + holdoffTicks), // CH1 compare (adc)
(uint16_t)(powerPWM + holdoffTicks + tempMeasureTicks), // CH2 compare end of cycle (uint16_t)(powerPWM + holdoffTicks + tempMeasureTicks), // CH2 compare end of cycle
0, // Preload 0, // Preload, copied to counter on trigger of comp2
}; };
TIMER_Init(&cfg); TIMER_Init(&cfg);