Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Init PWM drive
- static void MotorControlPwmInit(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- TIM_OC_InitTypeDef pwmAConfig;
- TIM_OC_InitTypeDef pwmBConfig;
- TIM_OC_InitTypeDef iMeasureConfig;
- // Enable clocks
- __GPIOA_CLK_ENABLE();
- __GPIOB_CLK_ENABLE();
- __TIM1_CLK_ENABLE();
- // First, start by configuring the 4 GPIOs
- // Configure common GPIO settings
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_PULLDOWN;
- GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
- // TIM1_CH1 GPIO Config
- // PA8
- GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
- GPIO_InitStruct.Pin = GPIO_PIN_8;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- // TIM1_CH1N GPIO Config
- // PA7
- GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
- GPIO_InitStruct.Pin = GPIO_PIN_7;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- // TIM1_CH2 GPIO Config
- // PA9
- GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
- GPIO_InitStruct.Pin = GPIO_PIN_9;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- // TIM1_CH2N GPIO Config
- // PB0
- GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
- GPIO_InitStruct.Pin = GPIO_PIN_0;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- // Configure the timer
- pwmOutTimer.Instance = TIM1;
- pwmOutTimer.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- pwmOutTimer.Init.CounterMode = TIM_COUNTERMODE_UP;
- pwmOutTimer.Init.Period = MOTOR_CONTROL_PWM_PERIOD;
- // Commit the timer
- HAL_TIM_PWM_Init(&pwmOutTimer);
- // Now, start configuring the two PWM channels
- // PWM A
- pwmAConfig.OCMode = TIM_OCMODE_PWM1;
- pwmAConfig.OCFastMode = TIM_OCFAST_DISABLE;
- pwmAConfig.OCIdleState = TIM_OCIDLESTATE_SET;
- pwmAConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
- pwmAConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
- pwmAConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
- pwmAConfig.Pulse = 0;
- // PWM B
- pwmBConfig.OCMode = TIM_OCMODE_PWM1;
- pwmBConfig.OCFastMode = TIM_OCFAST_DISABLE;
- pwmBConfig.OCIdleState = TIM_OCIDLESTATE_SET;
- pwmBConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
- pwmBConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
- pwmBConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
- pwmBConfig.Pulse = 0;
- // i measure
- iMeasureConfig.OCMode = TIM_OCMODE_PWM1;
- iMeasureConfig.OCFastMode = TIM_OCFAST_DISABLE;
- iMeasureConfig.OCIdleState = TIM_OCIDLESTATE_SET;
- iMeasureConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
- iMeasureConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
- iMeasureConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
- iMeasureConfig.Pulse = 0;
- // Commit pwmA config
- HAL_TIM_PWM_ConfigChannel(&pwmOutTimer, &pwmAConfig, TIM_CHANNEL_1);
- // Commit pwmB config
- HAL_TIM_PWM_ConfigChannel(&pwmOutTimer, &pwmBConfig, TIM_CHANNEL_2);
- // Commit imeasure config
- HAL_TIM_PWM_ConfigChannel(&pwmOutTimer, &iMeasureConfig, TIM_CHANNEL_4);
- // Configure for deadtime
- TIM_BreakDeadTimeConfigTypeDef TIM_BreakDeadTimeConfig;
- TIM_BreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
- TIM_BreakDeadTimeConfig.DeadTime = 50; // Rob recommends 50
- TIM_BreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE;
- TIM_BreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_ENABLE;
- TIM_BreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_1;
- TIM_BreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
- TIM_BreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;
- // Commit the break/deadtime config
- HAL_TIMEx_ConfigBreakDeadTime(&pwmOutTimer, &TIM_BreakDeadTimeConfig);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement