4x faster PWM, add Timer changes from #1926

This commit is contained in:
jonasius
2024-06-26 00:13:23 +02:00
parent 56b91ac13c
commit e6a3f380e1
2 changed files with 7 additions and 10 deletions

View File

@@ -105,7 +105,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (PWMSafetyTimer == 0) { if (PWMSafetyTimer == 0) {
htim4.Instance->CCR3 = 0; htim4.Instance->CCR3 = 0;
} else { } else {
htim4.Instance->CCR3 = pendingPWM; htim4.Instance->CCR3 = pendingPWM / 4;
} }
} else if (htim->Instance == TIM1) { } else if (htim->Instance == TIM1) {
// STM uses this for internal functions as a counter for timeouts // STM uses this for internal functions as a counter for timeouts

View File

@@ -57,7 +57,7 @@ void Setup_HAL() {
GPIO_InitStruct.Pin = MOVEMENT_Pin; GPIO_InitStruct.Pin = MOVEMENT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // We would like sharp rising edges GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(MOVEMENT_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(MOVEMENT_GPIO_Port, &GPIO_InitStruct);
} }
} }
@@ -254,23 +254,20 @@ static void MX_IWDG_Init(void) {
static void MX_TIM4_Init(void) { static void MX_TIM4_Init(void) {
/* /*
* We use the channel 1 to trigger the ADC at end of PWM period * On Sequre devies we run the output PWM as fast as possible due to the low tip resistance + no inductor for filtering.
* And we use the channel 4 as the PWM modulation source using Interrupts * So we run it as fast as we can and hope that the caps filter out the current spikes.
* */ * */
TIM_ClockConfigTypeDef sClockSourceConfig; TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig; TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC; TIM_OC_InitTypeDef sConfigOC;
memset(&sConfigOC, 0, sizeof(sConfigOC)); memset(&sConfigOC, 0, sizeof(sConfigOC));
// Timer 2 is fairly slow as its being used to run the PWM and trigger the ADC
// in the PWM off time.
htim4.Instance = TIM4; htim4.Instance = TIM4;
// dummy value, will be reconfigured by BSPInit() // dummy value, will be reconfigured by BSPInit()
htim4.Init.Prescaler = 10; // 2 MHz timer clock/1000 = 2 kHz tick rate htim4.Init.Prescaler = 10; // 2 MHz timer clock/10 = 200 kHz tick rate
// pwm out is 10k from tim3, we want to run our PWM at around 10hz or slower on the output stage
// These values give a rate of around 3.5 Hz for "fast" mode and 1.84 Hz for "slow"
htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = 255; htim4.Init.Period = 64;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 8 MHz (x2 APB1) before divide htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 8 MHz (x2 APB1) before divide
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;