pwm_in.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #include "stm32f0xx_hal.h"
  2. #include "pwm_in.h"
  3. #include <stdio.h>
  4. #define LED_ON HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
  5. #define LED_OFF HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
  6. #define PWM_IN_TIM_FREQ 1000000
  7. #define PWM_FILTER_THR 16
  8. static TIM_HandleTypeDef TimHandle;
  9. static TIM_IC_InitTypeDef sConfig;
  10. static TIM_SlaveConfigTypeDef sSlaveConfig;
  11. static uint16_t prescaler;
  12. __IO uint32_t cap_value_1 = 0; // Captured Value
  13. __IO uint32_t duty = 0; // Duty Cycle Value
  14. __IO uint32_t freq = 0; // Frequency Value
  15. uint8_t btn_pressed = 0;
  16. //
  17. void tim_pwm_in_init(void)
  18. {
  19. GPIO_InitTypeDef GPIO_InitStruct;
  20. __HAL_RCC_GPIOA_CLK_ENABLE();
  21. __HAL_RCC_TIM3_CLK_ENABLE();
  22. GPIO_InitStruct.Pin = GPIO_PIN_6;
  23. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  24. GPIO_InitStruct.Pull = GPIO_PULLUP;
  25. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  26. GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
  27. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  28. HAL_NVIC_SetPriority(TIM3_IRQn, 0, 1);
  29. HAL_NVIC_EnableIRQ(TIM3_IRQn);
  30. prescaler = HAL_RCC_GetHCLKFreq()/PWM_IN_TIM_FREQ - 1;
  31. TimHandle.Instance = TIM3;
  32. TimHandle.Init.Period = 0xFFFF;
  33. TimHandle.Init.Prescaler = prescaler;
  34. TimHandle.Init.ClockDivision = 0;
  35. TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
  36. TimHandle.Init.RepetitionCounter = 0;
  37. TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  38. HAL_TIM_IC_Init(&TimHandle);
  39. sConfig.ICPrescaler = TIM_ICPSC_DIV1;
  40. sConfig.ICFilter = 0;
  41. sConfig.ICPolarity = TIM_ICPOLARITY_RISING; ;
  42. sConfig.ICSelection = TIM_ICSELECTION_DIRECTTI;
  43. HAL_TIM_IC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1);
  44. sConfig.ICPolarity = TIM_ICPOLARITY_FALLING;
  45. sConfig.ICSelection = TIM_ICSELECTION_INDIRECTTI;
  46. HAL_TIM_IC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2);
  47. sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
  48. sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
  49. sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_NONINVERTED;
  50. sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;
  51. sSlaveConfig.TriggerFilter = 0;
  52. HAL_TIM_SlaveConfigSynchro(&TimHandle, &sSlaveConfig);
  53. HAL_TIM_IC_Start_IT(&TimHandle, TIM_CHANNEL_1);
  54. HAL_TIM_IC_Start_IT(&TimHandle, TIM_CHANNEL_2);
  55. }
  56. //
  57. void tim_print_out_pwm(void)
  58. {
  59. printf("Captured Value %u\r\n", cap_value_1);
  60. printf("Duty Cycle Value %u\r\n", duty);
  61. printf("Frequency Value %u\r\n\n", freq);
  62. }
  63. //
  64. void TIM3_IRQHandler(void)
  65. {
  66. HAL_TIM_IRQHandler(&TimHandle);
  67. }
  68. //
  69. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  70. {
  71. static uint8_t bt_pressed_flag = 0;
  72. static uint8_t filter_cnt = 0;
  73. if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  74. {
  75. cap_value_1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
  76. if (cap_value_1 != 0)
  77. {
  78. // частота ШИМ в герцах (для контроля)
  79. freq = PWM_IN_TIM_FREQ/cap_value_1;
  80. duty = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
  81. if (duty > 1660) {
  82. filter_cnt++;
  83. LED_ON;
  84. }
  85. else {
  86. bt_pressed_flag = 0;
  87. filter_cnt = 0;
  88. LED_OFF;
  89. }
  90. // Выполняется условие фильтра и было ожатие кнопки
  91. if ((filter_cnt == PWM_FILTER_THR) && (bt_pressed_flag == 0)){
  92. bt_pressed_flag = 1;
  93. btn_pressed = true;
  94. }
  95. }
  96. else
  97. {
  98. duty = 0;
  99. freq = 0;
  100. }
  101. }
  102. }
  103. bool get_button(void)
  104. {
  105. return btn_pressed;
  106. }
  107. //
  108. void set_button(bool state)
  109. {
  110. btn_pressed = state;
  111. }