[STM32U5] 【NUCLEO-U575ZI-Q测评】PWM

[复制链接]
721|9
 楼主| 比神乐 发表于 2023-2-24 12:40 | 显示全部楼层 |阅读模式
今天搞了一下PWM,定时器一(也就是定时器A)的几个通道,用的例程。原理图:
4.jpg
代码:
  1. #include "main.h"

  2. /* Private includes ----------------------------------------------------------*/
  3. /* USER CODE BEGIN Includes */

  4. /* USER CODE END Includes */

  5. /* Private typedef -----------------------------------------------------------*/
  6. /* USER CODE BEGIN PTD */

  7. /* USER CODE END PTD */

  8. /* Private define ------------------------------------------------------------*/
  9. /* USER CODE BEGIN PD */

  10. /* USER CODE END PD */

  11. /* Private macro -------------------------------------------------------------*/
  12. /* USER CODE BEGIN PM */

  13. /* USER CODE END PM */

  14. /* Private variables ---------------------------------------------------------*/

  15. TIM_HandleTypeDef htim1;

  16. /* USER CODE BEGIN PV */

  17. /* USER CODE END PV */

  18. /* Private function prototypes -----------------------------------------------*/
  19. void SystemClock_Config(void);
  20. static void SystemPower_Config(void);
  21. static void MX_GPIO_Init(void);
  22. static void MX_ICACHE_Init(void);
  23. static void MX_TIM1_Init(void);
  24. /* USER CODE BEGIN PFP */

  25. /* USER CODE END PFP */

  26. /* Private user code ---------------------------------------------------------*/
  27. /* USER CODE BEGIN 0 */

  28. /* USER CODE END 0 */

  29. /**
  30.   * [url=home.php?mod=space&uid=247401]@brief[/url]  The application entry point.
  31.   * @retval int
  32.   */
  33. int main(void)
  34. {
  35.   /* USER CODE BEGIN 1 */
  36.   
  37.   /* STM32U5xx HAL library initialization:
  38.        - Configure the Flash prefetch
  39.        - Configure the Systick to generate an interrupt each 1 msec
  40.        - Set NVIC Group Priority to 3
  41.        - Low Level Initialization
  42.      */
  43.   /* USER CODE END 1 */

  44.   /* MCU Configuration--------------------------------------------------------*/

  45.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  46.   HAL_Init();

  47.   /* USER CODE BEGIN Init */

  48.   /* USER CODE END Init */

  49.   /* Configure the system clock */
  50.   SystemClock_Config();

  51.   /* Configure the System Power */
  52.   SystemPower_Config();

  53.   /* USER CODE BEGIN SysInit */

  54.   /* Configure LED3 */
  55.   BSP_LED_Init(LED3);

  56.   /* USER CODE END SysInit */

  57.   /* Initialize all configured peripherals */
  58.   MX_GPIO_Init();
  59.   MX_ICACHE_Init();
  60.   MX_TIM1_Init();
  61.   /* USER CODE BEGIN 2 */

  62. /*## Start PWM signals generation #######################################*/
  63.   /* Start channel 1 */
  64.   if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK)
  65.   {
  66.     /* PWM Generation Error */
  67.     Error_Handler();
  68.   }
  69.   /* Start channel 2 */
  70.   if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2) != HAL_OK)
  71.   {
  72.     /* PWM Generation Error */
  73.     Error_Handler();
  74.   }
  75.   /* Start channel 3 */
  76.   if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3) != HAL_OK)
  77.   {
  78.     /* PWM generation Error */
  79.     Error_Handler();
  80.   }
  81.   /* Start channel 4 */
  82.   if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4) != HAL_OK)
  83.   {
  84.     /* PWM generation Error */
  85.     Error_Handler();
  86.   }

  87.   /* USER CODE END 2 */

  88.   /* Infinite loop */
  89.   /* USER CODE BEGIN WHILE */
  90.   while (1)
  91.   {
  92.     /* USER CODE END WHILE */

  93.     /* USER CODE BEGIN 3 */

  94.   }
  95.   /* USER CODE END 3 */
  96. }

  97. /**
  98.   * @brief System Clock Configuration
  99.   * @retval None
  100.   */
  101. void SystemClock_Config(void)
  102. {
  103.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  104.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  105.   /** Configure the main internal regulator output voltage
  106.   */
  107.   if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
  108.   {
  109.     Error_Handler();
  110.   }

  111.   /** Initializes the CPU, AHB and APB busses clocks
  112.   */
  113.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  114.   RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  115.   RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  116.   RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_4;
  117.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  118.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
  119.   RCC_OscInitStruct.PLL.PLLMBOOST = RCC_PLLMBOOST_DIV1;
  120.   RCC_OscInitStruct.PLL.PLLM = 1;
  121.   RCC_OscInitStruct.PLL.PLLN = 80;
  122.   RCC_OscInitStruct.PLL.PLLP = 2;
  123.   RCC_OscInitStruct.PLL.PLLQ = 2;
  124.   RCC_OscInitStruct.PLL.PLLR = 2;
  125.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLLVCIRANGE_0;
  126.   RCC_OscInitStruct.PLL.PLLFRACN = 0;
  127.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  128.   {
  129.     Error_Handler();
  130.   }

  131.   /** Initializes the CPU, AHB and APB busses clocks
  132.   */
  133.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  134.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
  135.                               |RCC_CLOCKTYPE_PCLK3;
  136.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  137.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  138.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  139.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  140.   RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;

  141.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  142.   {
  143.     Error_Handler();
  144.   }
  145. }

  146. /**
  147.   * @brief Power Configuration
  148.   * @retval None
  149.   */
  150. static void SystemPower_Config(void)
  151. {

  152.   /*
  153.    * Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral
  154.    */
  155.   HAL_PWREx_DisableUCPDDeadBattery();

  156.   /*
  157.    * Switch to SMPS regulator instead of LDO
  158.    */
  159.   if (HAL_PWREx_ConfigSupply(PWR_SMPS_SUPPLY) != HAL_OK)
  160.   {
  161.     Error_Handler();
  162.   }
  163. }

  164. /**
  165.   * @brief ICACHE Initialization Function
  166.   * @param None
  167.   * @retval None
  168.   */
  169. static void MX_ICACHE_Init(void)
  170. {

  171.   /* USER CODE BEGIN ICACHE_Init 0 */

  172.   /* USER CODE END ICACHE_Init 0 */

  173.   /* USER CODE BEGIN ICACHE_Init 1 */

  174.   /* USER CODE END ICACHE_Init 1 */

  175.   /** Enable instruction cache in 1-way (direct mapped cache)
  176.   */
  177.   if (HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY) != HAL_OK)
  178.   {
  179.     Error_Handler();
  180.   }
  181.   if (HAL_ICACHE_Enable() != HAL_OK)
  182.   {
  183.     Error_Handler();
  184.   }
  185.   /* USER CODE BEGIN ICACHE_Init 2 */

  186.   /* USER CODE END ICACHE_Init 2 */

  187. }

  188. /**
  189.   * @brief TIM1 Initialization Function
  190.   * @param None
  191.   * @retval None
  192.   */
  193. static void MX_TIM1_Init(void)
  194. {

  195.   /* USER CODE BEGIN TIM1_Init 0 */

  196.   /* USER CODE END TIM1_Init 0 */

  197.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  198.   TIM_OC_InitTypeDef sConfigOC = {0};
  199.   TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  200.   /* USER CODE BEGIN TIM1_Init 1 */

  201.   /* USER CODE END TIM1_Init 1 */
  202.   htim1.Instance = TIM1;
  203.   htim1.Init.Prescaler = PRESCALER_VALUE;
  204.   htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  205.   htim1.Init.Period = PERIOD_VALUE;
  206.   htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  207.   htim1.Init.RepetitionCounter = 0;
  208.   htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  209.   if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  210.   {
  211.     Error_Handler();
  212.   }
  213.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  214.   sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
  215.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  216.   if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  217.   {
  218.     Error_Handler();
  219.   }
  220.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  221.   sConfigOC.Pulse = PULSE1_VALUE;
  222.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  223.   sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  224.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  225.   sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  226.   sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  227.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  228.   {
  229.     Error_Handler();
  230.   }
  231.   sConfigOC.Pulse = PULSE2_VALUE;
  232.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  233.   {
  234.     Error_Handler();
  235.   }
  236.   sConfigOC.Pulse = PULSE3_VALUE;
  237.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  238.   {
  239.     Error_Handler();
  240.   }
  241.   sConfigOC.Pulse = PULSE4_VALUE;
  242.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  243.   {
  244.     Error_Handler();
  245.   }
  246.   sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  247.   sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  248.   sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  249.   sBreakDeadTimeConfig.DeadTime = 0;
  250.   sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  251.   sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  252.   sBreakDeadTimeConfig.BreakFilter = 0;
  253.   sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT;
  254.   sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
  255.   sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
  256.   sBreakDeadTimeConfig.Break2Filter = 0;
  257.   sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT;
  258.   sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  259.   if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  260.   {
  261.     Error_Handler();
  262.   }
  263.   /* USER CODE BEGIN TIM1_Init 2 */

  264.   /* USER CODE END TIM1_Init 2 */
  265.   HAL_TIM_MspPostInit(&htim1);

  266. }

  267. /**
  268.   * @brief GPIO Initialization Function
  269.   * @param None
  270.   * @retval None
  271.   */
  272. static void MX_GPIO_Init(void)
  273. {

  274.   /* GPIO Ports Clock Enable */
  275.   __HAL_RCC_GPIOE_CLK_ENABLE();

  276. }

  277. /* USER CODE BEGIN 4 */

  278. /* USER CODE END 4 */

  279. /**
  280.   * @brief  This function is executed in case of error occurrence.
  281.   * @retval None
  282.   */
  283. void Error_Handler(void)
  284. {
  285.   /* USER CODE BEGIN Error_Handler_Debug */
  286.   /* Turn LED3 on */
  287.   BSP_LED_On(LED3);
  288.   while(1)
  289.   {
  290.   }
  291.   /* USER CODE END Error_Handler_Debug */
  292. }

  293. #ifdef  USE_FULL_ASSERT
  294. /**
  295.   * @brief  Reports the name of the source file and the source line number
  296.   *         where the assert_param error has occurred.
  297.   * @param  file: pointer to the source file name
  298.   * @param  line: assert_param error line source number
  299.   * @retval None
  300.   */
  301. void assert_failed(uint8_t *file, uint32_t line)
  302. {
  303.   /* USER CODE BEGIN 6 */
  304.   /* User can add his own implementation to report the file name and line number,
  305.     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  306.   /* Infinite loop */
  307.   while (1)
  308.   {
  309.   }

  310.   /* USER CODE END 6 */
  311. }
  312. #endif /* USE_FULL_ASSERT */
效果图:
0.jpg 1.jpg 2.jpg 3.jpg
chenci2013 发表于 2023-5-14 20:42 | 显示全部楼层
stm32输出pwm频率是如何计算的
belindagraham 发表于 2023-5-18 14:49 | 显示全部楼层
输出的PWM最大频率是多少.               
 楼主| 比神乐 发表于 2023-5-18 19:30 | 显示全部楼层
chenci2013 发表于 2023-5-14 20:42
stm32输出pwm频率是如何计算的

没仔细看
 楼主| 比神乐 发表于 2023-5-18 19:30 | 显示全部楼层
belindagraham 发表于 2023-5-18 14:49
输出的PWM最大频率是多少.

不清楚
jkl21 发表于 2023-5-21 11:27 | 显示全部楼层
tm32 如何在每周期修改pwm占空比
mmbs 发表于 2023-5-21 14:36 | 显示全部楼层
NUCLEO-U575ZI可以产生几路PWM信号?能有六路吗?
tabmone 发表于 2023-5-21 15:23 | 显示全部楼层
输出的PWM最大频率是多少.               
bartonalfred 发表于 2023-5-21 16:29 | 显示全部楼层
stm32输出pwm,怎么控制直流电机的正反转?
 楼主| 比神乐 发表于 2023-5-22 06:48 | 显示全部楼层
bartonalfred 发表于 2023-5-21 16:29
stm32输出pwm,怎么控制直流电机的正反转?

PWM只能控制电机转速,无法控制电机正反转
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部