|
说明:
功能效果,一目了然

代码,6step的切换是在函数HAL_TIMEx_CommutationCallback里面:
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- /* Step Index */
- __IO uint32_t uwStep = 0;
- /* Timer handler declaration */
- TIM_HandleTypeDef TimHandle;
- /* Timer Output Compare Configuration Structure declaration */
- TIM_OC_InitTypeDef sPWMConfig1, sPWMConfig2, sPWMConfig3;
- /* Timer Break Configuration Structure declaration */
- TIM_BreakDeadTimeConfigTypeDef sBreakConfig;
- /* Authorize TIM COM event generation */
- __IO uint32_t uwAuthorizeTimComEvent = 0;
- /* Private function prototypes -----------------------------------------------*/
- static void SystemClock_Config(void);
- static void Error_Handler(void);
- static void CPU_CACHE_Enable(void);
- /* Private functions ---------------------------------------------------------*/
- /**
- * @brief Main program
- * @param None
- * @retval None
- */
- int main(void)
- {
-
- /* Enable the CPU Cache */
- CPU_CACHE_Enable();
- /* STM32H7xx HAL library initialization:
- - Systick timer is configured by default as source of time base, but user
- can eventually implement his proper time base source (a general purpose
- timer for example or other time source), keeping in mind that Time base
- duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
- handled in milliseconds basis.
- - Set NVIC Group Priority to 4
- - Low Level Initialization
- */
- HAL_Init();
- /* Configure the system clock to 400 MHz */
- SystemClock_Config();
- /* Configure LED2 */
- BSP_LED_Init(LED2);
- /*##-1- Configure the TIM peripheral #######################################*/
- /* ---------------------------------------------------------------------------
- TIM1 input clock (TIM1CLK) is set to 2 * APB2 clock (PCLK2), since APB2
- prescaler is different from 1.
- TIM1CLK = 2 * PCLK2
- PCLK1 = HCLK / 2
- => TIM1CLK = HCLK = SystemCoreClock
- --------------------------------------------------------------------------- */
- /* Initialize TIMx peripheral as follow:
- + Prescaler = 0
- + Period = 4095
- + ClockDivision = 0
- + Counter direction = Up
- */
- TimHandle.Instance = TIM1;
-
- TimHandle.Init.Period = 4095;
- TimHandle.Init.Prescaler = 0;
- TimHandle.Init.ClockDivision = 0;
- TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
- TimHandle.Init.RepetitionCounter = 0;
- if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK)
- {
- /* Initialization Error */
- Error_Handler();
- }
- /*##-2- Configure the output channels ######################################*/
- /* Common configuration for all channels */
- sPWMConfig1.OCMode = TIM_OCMODE_TIMING;
- sPWMConfig1.OCPolarity = TIM_OCPOLARITY_HIGH;
- sPWMConfig1.OCNPolarity = TIM_OCNPOLARITY_HIGH;
- sPWMConfig1.OCIdleState = TIM_OCIDLESTATE_SET;
- sPWMConfig1.OCNIdleState = TIM_OCNIDLESTATE_SET;
- sPWMConfig1.OCFastMode = TIM_OCFAST_DISABLE;
- /* Set the pulse value for channel 1 */
- sPWMConfig1.Pulse = 2047;
- if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sPWMConfig1, TIM_CHANNEL_1) != HAL_OK)
- {
- /* Configuration Error */
- Error_Handler();
- }
-
- /* Set the pulse value for channel 2 */
- sPWMConfig2 = sPWMConfig1;
- sPWMConfig2.Pulse = 1023;
- if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sPWMConfig2, TIM_CHANNEL_2) != HAL_OK)
- {
- /* Configuration Error */
- Error_Handler();
- }
-
- /* Set the pulse value for channel 3 */
- sPWMConfig3 = sPWMConfig1;
- sPWMConfig3.Pulse = 511;
- if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sPWMConfig3, TIM_CHANNEL_3) != HAL_OK)
- {
- /* Configuration Error */
- Error_Handler();
- }
- /*##-3- Configure the Break stage ##########################################*/
- sBreakConfig.OffStateRunMode = TIM_OSSR_ENABLE;
- sBreakConfig.OffStateIDLEMode = TIM_OSSI_ENABLE;
- sBreakConfig.LockLevel = TIM_LOCKLEVEL_OFF;
- sBreakConfig.BreakState = TIM_BREAK_ENABLE;
- sBreakConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
- sBreakConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;
- sBreakConfig.DeadTime = 1;
-
- if(HAL_TIMEx_ConfigBreakDeadTime(&TimHandle, &sBreakConfig) != HAL_OK)
- {
- /* Configuration Error */
- Error_Handler();
- }
- /*##-4- Configure the commutation event: software event ####################*/
- HAL_TIMEx_ConfigCommutationEvent_IT(&TimHandle, TIM_TS_NONE, TIM_COMMUTATION_SOFTWARE);
- /*##-5- Start signals generation ###########################################*/
- /*--------------------------------------------------------------------------*/
- /* Start channel 1 */
- if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
- {
- /* Starting Error */
- Error_Handler();
- }
- /* Start channel 1N */
- if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
- {
- /* Starting Error */
- Error_Handler();
- }
- /*--------------------------------------------------------------------------*/
-
- /*--------------------------------------------------------------------------*/
- /* Start channel 2 */
- if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK)
- {
- /* Starting Error */
- Error_Handler();
- }
- /* Start channel 2N */
- if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK)
- {
- /* Starting Error */
- Error_Handler();
- }
- /*--------------------------------------------------------------------------*/
-
- /*--------------------------------------------------------------------------*/
- /* Start channel 3 */
- if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK)
- {
- /* Starting Error */
- Error_Handler();
- }
- /* Start channel 3N */
- if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK)
- {
- /* Starting Error */
- Error_Handler();
- }
- /* Authorize TIM COM event generation */
- uwAuthorizeTimComEvent = 1;
- while (1)
- {
- }
- }
- /**
- * @brief Commutation event callback in non blocking mode
- * @param htim : Timer handle
- * @retval None
- */
- void HAL_TIMEx_CommutationCallback(TIM_HandleTypeDef *htim)
- {
- /* Entry state */
- if (uwStep == 0)
- {
- /* Next step: Step 1 Configuration -------------------------------------- */
- sPWMConfig1.OCMode = TIM_OCMODE_PWM1;
- HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig1, TIM_CHANNEL_1);
- HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1);
- HAL_TIMEx_OCN_Stop(&TimHandle, TIM_CHANNEL_1);
- /* Channel3 configuration */
- sPWMConfig3.OCMode = TIM_OCMODE_PWM1;
- HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig3, TIM_CHANNEL_3);
- HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_3);
- HAL_TIM_PWM_Stop(&TimHandle, TIM_CHANNEL_3);
- /* Channel2 configuration */
- HAL_TIM_OC_Stop(&TimHandle, TIM_CHANNEL_2);
- HAL_TIMEx_OCN_Stop(&TimHandle, TIM_CHANNEL_2);
- uwStep = 1;
- }
- if (uwStep == 1)
- {
- /* Next step: Step 2 Configuration -------------------------------------- */
- /* Channel1 configuration */
- /* Same configuration as the previous step */
- /* Channel2 configuration */
- sPWMConfig2.OCMode = TIM_OCMODE_PWM1;
- HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig2, TIM_CHANNEL_2);
- HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_2);
- /* Channel3 configuration */
- HAL_TIMEx_OCN_Stop(&TimHandle, TIM_CHANNEL_3);
- uwStep++;
- }
- else if (uwStep == 2)
- {
- /* Next step: Step 3 Configuration -------------------------------------- */
- /* Channel2 configuration */
- /* Same configuration as the previous step */
- /* Channel3 configuration */
- sPWMConfig3.OCMode = TIM_OCMODE_PWM1;
- HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig3, TIM_CHANNEL_3);
- HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_3);
- /* Channel1 configuration */
- HAL_TIM_OC_Stop(&TimHandle, TIM_CHANNEL_1);
- uwStep++;
- }
- else if (uwStep == 3)
- {
- /* Next step: Step 4 Configuration -------------------------------------- */
- /* Channel3 configuration */
- /* Same configuration as the previous step */
- /* Channel2 configuration */
- HAL_TIMEx_OCN_Stop(&TimHandle, TIM_CHANNEL_2);
- /* Channel1 configuration */
- sPWMConfig1.OCMode = TIM_OCMODE_PWM1;
- HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig1, TIM_CHANNEL_1);
- HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_1);
- uwStep++;
- }
- else if (uwStep == 4)
- {
- /* Next step: Step 5 Configuration -------------------------------------- */
- /* Channel3 configuration */
- HAL_TIM_OC_Stop(&TimHandle, TIM_CHANNEL_3);
- /* Channel1 configuration */
- /* Same configuration as the previous step */
- /* Channel2 configuration */
- sPWMConfig2.OCMode = TIM_OCMODE_PWM1;
- HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig2, TIM_CHANNEL_2);
- HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_2);
- uwStep++;
- }
- else if (uwStep == 5)
- {
- /* Next step: Step 6 Configuration -------------------------------------- */
- /* Channel3 configuration */
- sPWMConfig3.OCMode = TIM_OCMODE_PWM1;
- HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig3, TIM_CHANNEL_3);
- HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_3);
- /* Channel1 configuration */
- HAL_TIMEx_OCN_Stop(&TimHandle, TIM_CHANNEL_1);
- /* Channel2 configuration */
- /* Same configuration as the previous step */
- uwStep++;
- }
- else
- {
- /* Next step: Step 1 Configuration -------------------------------------- */
- /* Channel1 configuration */
- sPWMConfig1.OCMode = TIM_OCMODE_PWM1;
- HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig1, TIM_CHANNEL_1);
- HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1);
- /* Channel3 configuration */
- /* Same configuration as the previous step */
- /* Channel2 configuration */
- HAL_TIM_OC_Stop(&TimHandle, TIM_CHANNEL_2);
- uwStep = 1;
- }
- }
复制代码
|
|