pwm_out.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "stm32f0xx_hal.h"
  2. #include "pwm_out.h"
  3. #include <stdio.h>
  4. #define PWM_OUT_TIM_FREQ 1000000
  5. #define PERIOD_VALUE 20000
  6. #define IDLE_PULSE 1552 // Начальное значение PWM до нажатий
  7. static TIM_HandleTypeDef TimHandle;
  8. static TIM_OC_InitTypeDef sConfig;
  9. static uint16_t prescaler;
  10. //
  11. void tim_pwm_out_init(void)
  12. {
  13. GPIO_InitTypeDef GPIO_InitStruct;
  14. __HAL_RCC_GPIOA_CLK_ENABLE();
  15. __HAL_RCC_TIM1_CLK_ENABLE();
  16. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  17. GPIO_InitStruct.Pull = GPIO_PULLUP;
  18. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  19. GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
  20. GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
  21. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  22. prescaler = HAL_RCC_GetHCLKFreq()/PWM_OUT_TIM_FREQ - 1;
  23. TimHandle.Instance = TIM1;
  24. TimHandle.Init.Prescaler = prescaler;
  25. TimHandle.Init.Period = PERIOD_VALUE;
  26. TimHandle.Init.ClockDivision = 0;
  27. TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
  28. TimHandle.Init.RepetitionCounter = 0;
  29. TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  30. HAL_TIM_PWM_Init(&TimHandle);
  31. sConfig.OCMode = TIM_OCMODE_PWM1;
  32. sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
  33. sConfig.OCFastMode = TIM_OCFAST_DISABLE;
  34. sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  35. sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  36. sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
  37. sConfig.Pulse = IDLE_PULSE;
  38. HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2);
  39. sConfig.Pulse = IDLE_PULSE;
  40. HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3);
  41. HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_2);
  42. HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_3);
  43. }
  44. //
  45. void tim_pwm_out_set_pulse(pwm_out_ch channel, uint16_t pulse)
  46. {
  47. switch (channel)
  48. {
  49. case PWM_OUT_CH_1:
  50. TIM1->CCR2 = pulse;
  51. break;
  52. case PWM_OUT_CH_2:
  53. TIM1->CCR3 = pulse;
  54. break;
  55. default : break;
  56. }
  57. }
  58. //
  59. void tim_pwm_pulse_idle(void)
  60. {
  61. TIM1->CCR2 = IDLE_PULSE;
  62. TIM1->CCR3 = IDLE_PULSE;
  63. }