STM32F411: Allow non-PWM pins as heater output.

This commit is contained in:
Nico Tonnhofer 2016-03-24 22:24:24 +01:00
parent 423c5694d0
commit afc4c3e8e4
2 changed files with 229 additions and 72 deletions

View File

@ -34,6 +34,8 @@
Use alphas for PORT and numerics for PIN, close to the design. Use alphas for PORT and numerics for PIN, close to the design.
*/ */
#define NO_TIMER ((TIM_TypeDef *) 0)
#define PA_0_PIN 0 #define PA_0_PIN 0
#define PA_0_PORT GPIOA #define PA_0_PORT GPIOA
#define PA_0_ADC 0 #define PA_0_ADC 0
@ -52,6 +54,10 @@
#define PA_2_PIN 2 #define PA_2_PIN 2
#define PA_2_PORT GPIOA #define PA_2_PORT GPIOA
#define PA_2_AF 0
#define PA_2_TIMER NO_TIMER
#define PA_2_CHANNEL 1
#define PA_2_INVERT 0
// #define PA_2_ADC 2 // #define PA_2_ADC 2
// #define PA_2_AF 3 // #define PA_2_AF 3
// #define PA_2_TIMER TIM9 // #define PA_2_TIMER TIM9
@ -60,6 +66,10 @@
#define PA_3_PIN 3 #define PA_3_PIN 3
#define PA_3_PORT GPIOA #define PA_3_PORT GPIOA
#define PA_3_AF 0
#define PA_3_TIMER NO_TIMER
#define PA_3_CHANNEL 1
#define PA_3_INVERT 0
// #define PA_3_ADC 3 // #define PA_3_ADC 3
// #define PA_3_AF 3 // #define PA_3_AF 3
// #define PA_3_TIMER TIM9 // #define PA_3_TIMER TIM9
@ -69,6 +79,10 @@
#define PA_4_PIN 4 #define PA_4_PIN 4
#define PA_4_PORT GPIOA #define PA_4_PORT GPIOA
#define PA_4_ADC 4 #define PA_4_ADC 4
#define PA_4_AF 0
#define PA_4_TIMER NO_TIMER
#define PA_4_CHANNEL 1
#define PA_4_INVERT 0
#define PA_5_PIN 5 #define PA_5_PIN 5
#define PA_5_PORT GPIOA #define PA_5_PORT GPIOA
@ -81,6 +95,10 @@
#define PA_6_PIN 6 #define PA_6_PIN 6
#define PA_6_PORT GPIOA #define PA_6_PORT GPIOA
#define PA_6_ADC 6 #define PA_6_ADC 6
#define PA_6_AF 0
#define PA_6_TIMER NO_TIMER
#define PA_6_CHANNEL 1
#define PA_6_INVERT 0
// #define PA_6_AF 2 // #define PA_6_AF 2
// #define PA_6_TIMER TIM3 // #define PA_6_TIMER TIM3
// #define PA_6_CHANNEL 1 // #define PA_6_CHANNEL 1
@ -89,6 +107,10 @@
#define PA_7_PIN 7 #define PA_7_PIN 7
#define PA_7_PORT GPIOA #define PA_7_PORT GPIOA
#define PA_7_ADC 7 #define PA_7_ADC 7
#define PA_7_AF 0
#define PA_7_TIMER NO_TIMER
#define PA_7_CHANNEL 1
#define PA_7_INVERT 0
// #define PA_7_AF 1 // #define PA_7_AF 1
// #define PA_7_TIMER TIM1 // #define PA_7_TIMER TIM1
// #define PA_7_CHANNEL 1 // #define PA_7_CHANNEL 1
@ -117,22 +139,38 @@
#define PA_11_PIN 11 #define PA_11_PIN 11
#define PA_11_PORT GPIOA #define PA_11_PORT GPIOA
#define PA_11_AF 1 #define PA_11_AF 1
#define PA_11_TIMER TIM1 #define PA_11_TIMER TIM1
#define PA_11_CHANNEL 4 #define PA_11_CHANNEL 4
#define PA_11_INVERT 0 #define PA_11_INVERT 0
#define PA_12_PIN 12 #define PA_12_PIN 12
#define PA_12_PORT GPIOA #define PA_12_PORT GPIOA
#define PA_12_AF 0
#define PA_12_TIMER NO_TIMER
#define PA_12_CHANNEL 0
#define PA_12_INVERT 0
#define PA_13_PIN 13 #define PA_13_PIN 13
#define PA_13_PORT GPIOA #define PA_13_PORT GPIOA
#define PA_13_AF 0
#define PA_13_TIMER NO_TIMER
#define PA_13_CHANNEL 0
#define PA_13_INVERT 0
#define PA_14_PIN 14 #define PA_14_PIN 14
#define PA_14_PORT GPIOA #define PA_14_PORT GPIOA
#define PA_14_AF 0
#define PA_14_TIMER NO_TIMER
#define PA_14_CHANNEL 0
#define PA_14_INVERT 0
#define PA_15_PIN 15 #define PA_15_PIN 15
#define PA_15_PORT GPIOA #define PA_15_PORT GPIOA
#define PA_15_AF 0
#define PA_15_TIMER NO_TIMER
#define PA_15_CHANNEL 0
#define PA_15_INVERT 0
// #define PA_15_AF 1 // #define PA_15_AF 1
// #define PA_15_TIMER TIM2 // #define PA_15_TIMER TIM2
// #define PA_15_CHANNEL 1 // #define PA_15_CHANNEL 1
@ -156,9 +194,17 @@
#define PB_2_PIN 2 #define PB_2_PIN 2
#define PB_2_PORT GPIOB #define PB_2_PORT GPIOB
#define PB_2_AF 0
#define PB_2_TIMER NO_TIMER
#define PB_2_CHANNEL 1
#define PB_2_INVERT 0
#define PB_3_PIN 3 #define PB_3_PIN 3
#define PB_3_PORT GPIOB #define PB_3_PORT GPIOB
#define PB_3_AF 0
#define PB_3_TIMER NO_TIMER
#define PB_3_CHANNEL 1
#define PB_3_INVERT 0
// #define PB_3_AF 1 // #define PB_3_AF 1
// #define PB_3_TIMER TIM2 // #define PB_3_TIMER TIM2
// #define PB_3_CHANNEL 2 // #define PB_3_CHANNEL 2
@ -215,9 +261,17 @@
#define PB_12_PIN 12 #define PB_12_PIN 12
#define PB_12_PORT GPIOB #define PB_12_PORT GPIOB
#define PB_12_AF 0
#define PB_12_TIMER NO_TIMER
#define PB_12_CHANNEL 0
#define PB_12_INVERT 0
#define PB_13_PIN 13 #define PB_13_PIN 13
#define PB_13_PORT GPIOB #define PB_13_PORT GPIOB
#define PB_13_AF 0
#define PB_13_TIMER NO_TIMER
#define PB_13_CHANNEL 0
#define PB_13_INVERT 0
// #define PB_13_AF 1 // #define PB_13_AF 1
// #define PB_13_TIMER TIM1 // #define PB_13_TIMER TIM1
// #define PB_13_CHANNEL 1 // #define PB_13_CHANNEL 1
@ -225,6 +279,10 @@
#define PB_14_PIN 14 #define PB_14_PIN 14
#define PB_14_PORT GPIOB #define PB_14_PORT GPIOB
#define PB_14_AF 0
#define PB_14_TIMER NO_TIMER
#define PB_14_CHANNEL 0
#define PB_14_INVERT 0
// #define PB_14_AF 1 // #define PB_14_AF 1
// #define PB_14_TIMER TIM1 // #define PB_14_TIMER TIM1
// #define PB_14_CHANNEL 2 // #define PB_14_CHANNEL 2
@ -232,6 +290,10 @@
#define PB_15_PIN 15 #define PB_15_PIN 15
#define PB_15_PORT GPIOB #define PB_15_PORT GPIOB
#define PB_15_AF 0
#define PB_15_TIMER NO_TIMER
#define PB_15_CHANNEL 0
#define PB_15_INVERT 0
// #define PB_15_AF 1 // #define PB_15_AF 1
// #define PB_15_TIMER TIM1 // #define PB_15_TIMER TIM1
// #define PB_15_CHANNEL 3 // #define PB_15_CHANNEL 3
@ -240,29 +302,57 @@
#define PC_0_PIN 0 #define PC_0_PIN 0
#define PC_0_PORT GPIOC #define PC_0_PORT GPIOC
#define PC_0_ADC 10 #define PC_0_ADC 10
#define PC_0_AF 0
#define PC_0_TIMER NO_TIMER
#define PC_0_CHANNEL 1
#define PC_0_INVERT 0
#define PC_1_PIN 1 #define PC_1_PIN 1
#define PC_1_PORT GPIOC #define PC_1_PORT GPIOC
#define PC_1_ADC 11 #define PC_1_ADC 11
#define PC_1_AF 0
#define PC_1_TIMER NO_TIMER
#define PC_1_CHANNEL 1
#define PC_1_INVERT 0
#define PC_2_PIN 2 #define PC_2_PIN 2
#define PC_2_PORT GPIOC #define PC_2_PORT GPIOC
#define PC_2_ADC 12 #define PC_2_ADC 12
#define PC_2_AF 0
#define PC_2_TIMER NO_TIMER
#define PC_2_CHANNEL 1
#define PC_2_INVERT 0
#define PC_3_PIN 3 #define PC_3_PIN 3
#define PC_3_PORT GPIOC #define PC_3_PORT GPIOC
#define PC_3_ADC 13 #define PC_3_ADC 13
#define PC_3_AF 0
#define PC_3_TIMER NO_TIMER
#define PC_3_CHANNEL 1
#define PC_3_INVERT 0
#define PC_4_PIN 4 #define PC_4_PIN 4
#define PC_4_PORT GPIOC #define PC_4_PORT GPIOC
#define PC_4_ADC 14 #define PC_4_ADC 14
#define PC_4_AF 0
#define PC_4_TIMER NO_TIMER
#define PC_4_CHANNEL 1
#define PC_4_INVERT 0
#define PC_5_PIN 5 #define PC_5_PIN 5
#define PC_5_PORT GPIOC #define PC_5_PORT GPIOC
#define PC_5_ADC 15 #define PC_5_ADC 15
#define PC_5_AF 0
#define PC_5_TIMER NO_TIMER
#define PC_5_CHANNEL 1
#define PC_5_INVERT 0
#define PC_6_PIN 6 #define PC_6_PIN 6
#define PC_6_PORT GPIOC #define PC_6_PORT GPIOC
#define PC_6_AF 0
#define PC_6_TIMER NO_TIMER
#define PC_6_CHANNEL 1
#define PC_6_INVERT 0
// #define PC_6_AF 2 // #define PC_6_AF 2
// #define PC_6_TIMER TIM3 // #define PC_6_TIMER TIM3
// #define PC_6_CHANNEL 1 // #define PC_6_CHANNEL 1
@ -270,6 +360,10 @@
#define PC_7_PIN 7 #define PC_7_PIN 7
#define PC_7_PORT GPIOC #define PC_7_PORT GPIOC
#define PC_7_AF 0
#define PC_7_TIMER NO_TIMER
#define PC_7_CHANNEL 1
#define PC_7_INVERT 0
// #define PC_7_AF 2 // #define PC_7_AF 2
// #define PC_7_TIMER TIM3 // #define PC_7_TIMER TIM3
// #define PC_7_CHANNEL 2 // #define PC_7_CHANNEL 2
@ -277,6 +371,10 @@
#define PC_8_PIN 8 #define PC_8_PIN 8
#define PC_8_PORT GPIOC #define PC_8_PORT GPIOC
#define PC_8_AF 0
#define PC_8_TIMER NO_TIMER
#define PC_8_CHANNEL 1
#define PC_8_INVERT 0
// #define PC_8_AF 2 // #define PC_8_AF 2
// #define PC_8_TIMER TIM3 // #define PC_8_TIMER TIM3
// #define PC_8_CHANNEL 3 // #define PC_8_CHANNEL 3
@ -284,6 +382,10 @@
#define PC_9_PIN 9 #define PC_9_PIN 9
#define PC_9_PORT GPIOC #define PC_9_PORT GPIOC
#define PC_9_AF 0
#define PC_9_TIMER NO_TIMER
#define PC_9_CHANNEL 1
#define PC_9_INVERT 0
// #define PC_9_AF 2 // #define PC_9_AF 2
// #define PC_9_TIMER TIM3 // #define PC_9_TIMER TIM3
// #define PC_9_CHANNEL 4 // #define PC_9_CHANNEL 4
@ -291,27 +393,63 @@
#define PC_10_PIN 10 #define PC_10_PIN 10
#define PC_10_PORT GPIOC #define PC_10_PORT GPIOC
#define PC_10_AF 0
#define PC_10_TIMER NO_TIMER
#define PC_10_CHANNEL 0
#define PC_10_INVERT 0
#define PC_11_PIN 11 #define PC_11_PIN 11
#define PC_11_PORT GPIOC #define PC_11_PORT GPIOC
#define PC_11_AF 0
#define PC_11_TIMER NO_TIMER
#define PC_11_CHANNEL 0
#define PC_11_INVERT 0
#define PC_12_PIN 12 #define PC_12_PIN 12
#define PC_12_PORT GPIOC #define PC_12_PORT GPIOC
#define PC_12_AF 0
#define PC_12_TIMER NO_TIMER
#define PC_12_CHANNEL 1
#define PC_12_INVERT 0
#define PC_13_PIN 13 #define PC_13_PIN 13
#define PC_13_PORT GPIOC #define PC_13_PORT GPIOC
#define PC_13_AF 0
#define PC_13_TIMER NO_TIMER
#define PC_13_CHANNEL 1
#define PC_13_INVERT 0
#define PC_14_PIN 14 #define PC_14_PIN 14
#define PC_14_PORT GPIOC #define PC_14_PORT GPIOC
#define PC_14_AF 0
#define PC_14_TIMER NO_TIMER
#define PC_14_CHANNEL 1
#define PC_14_INVERT 0
#define PC_15_PIN 15 #define PC_15_PIN 15
#define PC_15_PORT GPIOC #define PC_15_PORT GPIOC
#define PC_15_AF 0
#define PC_15_TIMER NO_TIMER
#define PC_15_CHANNEL 1
#define PC_15_INVERT 0
#define PD_2_PIN 2 #define PD_2_PIN 2
#define PD_2_PORT GPIOD #define PD_2_PORT GPIOD
#define PD_2_AF 0
#define PD_2_TIMER NO_TIMER
#define PD_2_CHANNEL 1
#define PD_2_INVERT 0
#define PH_0_PIN 0 #define PH_0_PIN 0
#define PH_0_PORT GPIOH #define PH_0_PORT GPIOH
#define PH_0_AF 0
#define PH_0_TIMER NO_TIMER
#define PH_0_CHANNEL 1
#define PH_0_INVERT 0
#define PH_1_PIN 1 #define PH_1_PIN 1
#define PH_1_PORT GPIOH #define PH_1_PORT GPIOH
#define PH_1_AF 0
#define PH_1_TIMER NO_TIMER
#define PH_1_CHANNEL 1
#define PH_1_INVERT 0

View File

@ -61,13 +61,25 @@
#include "config_wrapper.h" trick. #include "config_wrapper.h" trick.
*/ */
typedef struct { typedef struct {
/// Pointer to the capture compare register which changes PWM duty. union {
__IO uint32_t* ccr; /// Pointer to the capture compare register which changes PWM duty.
__IO uint32_t* ccr;
/// Pointer to the port for non-PWM pins.
__IO uint32_t* bsrr;
};
uint16_t masked_pin;
uint8_t uses_pwm;
} heater_definition_t; } heater_definition_t;
#undef DEFINE_HEATER #undef DEFINE_HEATER
#define DEFINE_HEATER(name, pin, pwm) \ #define DEFINE_HEATER(name, pin, pwm) \
{ &(pin ## _TIMER-> EXPANDER(CCR, pin ## _CHANNEL,)) }, { \
{ pwm && pin ## _TIMER ? \
&(pin ## _TIMER-> EXPANDER(CCR, pin ## _CHANNEL,)) : \
&(pin ## _PORT->BSRR) }, \
MASK(pin ## _PIN), \
pwm && pin ## _TIMER \
},
static const heater_definition_t heaters[NUM_HEATERS] = { static const heater_definition_t heaters[NUM_HEATERS] = {
#include "config_wrapper.h" #include "config_wrapper.h"
}; };
@ -141,70 +153,72 @@ void heater_init() {
- PIOC_9 PWM3/4 02 SDA3 - PIOC_9 PWM3/4 02 SDA3
*/ */
if (NUM_HEATERS) { // At least one channel in use. // Auto-generate pin setup.
uint32_t freq; #undef DEFINE_HEATER
uint8_t macro_mask; #define DEFINE_HEATER(name, pin, pwm) \
if (pwm && pin ## _TIMER) { \
// Auto-generate pin setup. uint32_t freq; \
#undef DEFINE_HEATER uint8_t macro_mask; \
#define DEFINE_HEATER(name, pin, pwm) \ if (pin ## _TIMER == TIM1) { \
if (pin ## _TIMER == TIM1) { \ RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; } /* turn on TIM1 */ \
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; } /* turn on TIM1 */ \ else if (pin ## _TIMER == TIM2) { \
else if (pin ## _TIMER == TIM2) { \ RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; } /* turn on TIM2 */ \
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; } /* turn on TIM2 */ \ else if (pin ## _TIMER == TIM3) { \
else if (pin ## _TIMER == TIM3) { \ RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; } /* turn on TIM3 */ \
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; } /* turn on TIM3 */ \ else if (pin ## _TIMER == TIM4) { \
else if (pin ## _TIMER == TIM4) { \ RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; } /* turn on TIM4 */ \
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; } /* turn on TIM4 */ \ /* TIM5 is for stepper, TIM9, TIM10 and TIM11 are not used */ \
/* TIM5 is for stepper, TIM9, TIM10 and TIM11 are not used */ \ pin ## _PORT->MODER &= ~(3 << (pin ## _PIN << 1)); /* reset pin mode */ \
pin ## _PORT->MODER &= ~(3 << (pin ## _PIN << 1)); /* reset pin mode */ \ pin ## _PORT->MODER |= (2 << (pin ## _PIN << 1)); /* pin mode to AF */ \
pin ## _PORT->MODER |= (2 << (pin ## _PIN << 1)); /* pin mode to AF */ \ pin ## _PORT->OSPEEDR |= (3 << (pin ## _PIN << 1)); /* high speed */ \
pin ## _PORT->OSPEEDR |= (3 << (pin ## _PIN << 1)); /* high speed */ \ pin ## _PORT->PUPDR &= ~(3 << ((pin ## _PIN) << 1)); /* no pullup-pulldown */ \
pin ## _PORT->PUPDR &= ~(3 << ((pin ## _PIN) << 1)); /* no pullup-pulldown */ \ macro_mask = pin ## _PIN < 8 ? (pin ## _PIN) : (pin ## _PIN - 8); \
macro_mask = pin ## _PIN < 8 ? (pin ## _PIN) : (pin ## _PIN - 8); \ /* we have to registers for AFR. ARF[0] for the first 8, ARF[1] for the second 8*/ \
/* we have to registers for AFR. ARF[0] for the first 8, ARF[1] for the second 8*/ \ /* also we use this to keep the compiler happy and don't shift > 32 */ \
/* also we use this to keep the compiler happy and don't shift > 32 */ \ if (pin ## _PIN < 8) { \
if (pin ## _PIN < 8) { \ pin ## _PORT->AFR[0] |= pin ## _AF << (macro_mask * 4); \
pin ## _PORT->AFR[0] |= pin ## _AF << (macro_mask * 4); \ } else { \
} else { \ pin ## _PORT->AFR[1] |= pin ## _AF << (macro_mask * 4); \
pin ## _PORT->AFR[1] |= pin ## _AF << (macro_mask * 4); \ } \
} \ /* AFR is a 64bit register, first half are for pin 0-7, second half 8-15 */ \
/* AFR is a 64bit register, first half are for pin 0-7, second half 8-15 */ \ pin ## _TIMER->CR1 |= TIM_CR1_ARPE; /* auto-reload preload */ \
pin ## _TIMER->CR1 |= TIM_CR1_ARPE; /* auto-reload preload */ \ pin ## _TIMER->ARR = PWM_SCALE - 1; /* reset on auto reload at 254 */ \
pin ## _TIMER->ARR = PWM_SCALE - 1; /* reset on auto reload at 254 */ \ /* PWM_SCALE - 1, so CCR = 255 is full off. */ \
/* PWM_SCALE - 1, so CCR = 255 is full off. */ \ pin ## _TIMER-> EXPANDER(CCR, pin ## _CHANNEL,) = 0; /* start off */ \
pin ## _TIMER-> EXPANDER(CCR, pin ## _CHANNEL,) = 0; /* start off */ \ freq = F_CPU / PWM_SCALE / (pwm ? pwm : 1); /* Figure PWM freq. */ \
freq = F_CPU / PWM_SCALE / pwm; /* Figure PWM freq. */ \ if (freq > 65535) \
if (freq > 65535) \ freq = 65535; \
freq = 65535; \ if (freq < 1) \
if (freq < 1) \ freq = 1; \
freq = 1; \ pin ## _TIMER->PSC = freq - 1; /* 1kHz */ \
pin ## _TIMER->PSC = freq - 1; /* 1kHz */ \ macro_mask = pin ## _CHANNEL > 2 ? 2 : 1; \
macro_mask = pin ## _CHANNEL > 2 ? 2 : 1; \ if (macro_mask == 1) { \
if (macro_mask == 1) { \ pin ## _TIMER->CCMR1 |= 0x0D << (3 + (8 * (pin ## _CHANNEL / macro_mask - 1))); \
pin ## _TIMER->CCMR1 |= 0x0D << (3 + (8 * (pin ## _CHANNEL / macro_mask - 1))); \ /* ch 2 / mm 1 - 1 = 1, ch 1 / mm 1 - 1 = 0*/ \
/* ch 2 / mm 1 - 1 = 1, ch 1 / mm 1 - 1 = 0*/ \ } else { \
} else { \ pin ## _TIMER->CCMR2 |= 0x0D << (3 + (8 * (pin ## _CHANNEL / macro_mask - 1))); \
pin ## _TIMER->CCMR2 |= 0x0D << (3 + (8 * (pin ## _CHANNEL / macro_mask - 1))); \ /* ch 4 / mm 2 - 1 = 1, ch 3 / mm 2 - 1 = 0*/ \
/* ch 4 / mm 2 - 1 = 1, ch 3 / mm 2 - 1 = 0*/ \ } \
} \ pin ## _TIMER->CCER |= EXPANDER(TIM_CCER_CC, pin ## _CHANNEL, E); \
pin ## _TIMER->CCER |= EXPANDER(TIM_CCER_CC, pin ## _CHANNEL, E); \ /* output enable */ \
/* output enable */ \ if (pin ## _INVERT) { \
if (pin ## _INVERT) { \ pin ## _TIMER->CCER |= EXPANDER(TIM_CCER_CC, pin ## _CHANNEL, P); \
pin ## _TIMER->CCER |= EXPANDER(TIM_CCER_CC, pin ## _CHANNEL, P); \ } else { \
} else { \ pin ## _TIMER->CCER &= ~(EXPANDER(TIM_CCER_CC, pin ## _CHANNEL, P)); \
pin ## _TIMER->CCER &= ~(EXPANDER(TIM_CCER_CC, pin ## _CHANNEL, P)); \ } \
} \ /* invert the signal for negated timers*/ \
/* invert the signal for negated timers*/ \ /* TODO: use this also with a XOR for inverted heaters later */ \
/* TODO: use this also with a XOR for inverted heaters later */ \ pin ## _TIMER->EGR |= TIM_EGR_UG; /* update generation */ \
pin ## _TIMER->EGR |= TIM_EGR_UG; /* update generation */ \ pin ## _TIMER->CR1 |= TIM_CR1_CEN; /* enable counters */ \
pin ## _TIMER->CR1 |= TIM_CR1_CEN; /* enable counters */ } \
else { \
SET_OUTPUT(pin); \
WRITE(pin, 0); \
}
#include "config_wrapper.h" #include "config_wrapper.h"
#undef DEFINE_HEATER #undef DEFINE_HEATER
} /* NUM_HEATERS */
#if 0 #if 0
pid_init(i); pid_init(i);
#endif /* 0 */ #endif /* 0 */
@ -226,12 +240,17 @@ void heater_set(heater_t index, uint8_t value) {
heaters_runtime[index].heater_output = value; heaters_runtime[index].heater_output = value;
// Remember, we scale, and duty cycle is inverted. if (heaters[index].uses_pwm) {
*heaters[index].ccr = (uint32_t)value * (PWM_SCALE / 255); // Remember, we scale, and duty cycle is inverted.
*heaters[index].ccr = (uint32_t)value * (PWM_SCALE / 255);
if (DEBUG_PID && (debug_flags & DEBUG_PID))
sersendf_P(PSTR("PWM %su = %lu\n"), index, *heaters[index].ccr);
if (DEBUG_PID && (debug_flags & DEBUG_PID))
sersendf_P(PSTR("PWM %su = %lu\n"), index, *heaters[index].ccr);
}
else {
*(heaters[index].bsrr) =
heaters[index].masked_pin << ((value >= HEATER_THRESHOLD) ? 0 : 16);
}
if (value) if (value)
power_on(); power_on();
} }