pwm_in.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "stm32f0xx_hal.h"
  2. #include "pwm_in.h"
  3. #include <stdio.h>
  4. #define PWM_IN_TIM_FREQ 1000000
  5. static TIM_HandleTypeDef TimHandle;
  6. static TIM_IC_InitTypeDef sConfig;
  7. static TIM_SlaveConfigTypeDef sSlaveConfig;
  8. static uint16_t prescaler;
  9. static uint32_t tim_freq;
  10. __IO uint32_t cap_value_1 = 0; // Captured Value
  11. __IO uint32_t uwDutyCycle = 0; // Duty Cycle Value
  12. __IO uint32_t uwFrequency = 0; // Frequency Value
  13. //
  14. void tim_pwm_in_init(void)
  15. {
  16. GPIO_InitTypeDef GPIO_InitStruct;
  17. __HAL_RCC_GPIOA_CLK_ENABLE();
  18. __HAL_RCC_TIM3_CLK_ENABLE();
  19. GPIO_InitStruct.Pin = GPIO_PIN_6;
  20. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  21. GPIO_InitStruct.Pull = GPIO_PULLUP;
  22. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  23. GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;//GPIO_AF0_TIM3;
  24. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  25. HAL_NVIC_SetPriority(TIM3_IRQn, 0, 1);
  26. //HAL_NVIC_SetPriority(TIM3_IRQn, 2, 0); // From lasertag project
  27. HAL_NVIC_EnableIRQ(TIM3_IRQn);
  28. prescaler = HAL_RCC_GetHCLKFreq()/PWM_IN_TIM_FREQ - 1;
  29. TimHandle.Instance = TIM3;
  30. TimHandle.Init.Period = 0xFFFF;
  31. TimHandle.Init.Prescaler = 47;
  32. TimHandle.Init.ClockDivision = 0;
  33. TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
  34. TimHandle.Init.RepetitionCounter = 0;
  35. TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  36. HAL_TIM_IC_Init(&TimHandle);
  37. //HAL_TIM_Base_Init(&TimHandle);
  38. sConfig.ICPrescaler = TIM_ICPSC_DIV1;
  39. sConfig.ICFilter = 0;
  40. sConfig.ICPolarity = TIM_ICPOLARITY_RISING; ;
  41. sConfig.ICSelection = TIM_ICSELECTION_DIRECTTI;
  42. HAL_TIM_IC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1);
  43. sConfig.ICPolarity = TIM_ICPOLARITY_FALLING;
  44. sConfig.ICSelection = TIM_ICSELECTION_INDIRECTTI;
  45. HAL_TIM_IC_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2);
  46. sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
  47. sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
  48. sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_NONINVERTED;
  49. sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;
  50. sSlaveConfig.TriggerFilter = 0;
  51. HAL_TIM_SlaveConfigSynchro(&TimHandle, &sSlaveConfig);
  52. HAL_TIM_IC_Start_IT(&TimHandle, TIM_CHANNEL_1);
  53. HAL_TIM_IC_Start_IT(&TimHandle, TIM_CHANNEL_2);
  54. }
  55. //
  56. void tim_print_out_pwm(void)
  57. {
  58. printf("Captured Value %u\r\n", uwIC2Value);
  59. printf("Duty Cycle Value %u\r\n", uwDutyCycle);
  60. printf("Frequency Value %u\r\n\n", uwFrequency);
  61. }
  62. void TIM3_IRQHandler(void)
  63. {
  64. HAL_TIM_IRQHandler(&TimHandle);
  65. }
  66. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  67. {
  68. static uint32_t cnt = 0;
  69. cnt++;
  70. #if 1
  71. if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  72. {
  73. // Get the Input Capture value
  74. uwIC2Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
  75. if (uwIC2Value != 0)
  76. {
  77. // Duty cycle computation
  78. //uwDutyCycle = ((HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2)) * 100) / uwIC2Value;
  79. uwDutyCycle = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
  80. // uwFrequency computation
  81. //TIM3 counter clock = (RCC_Clocks.HCLK_Frequency)
  82. uwFrequency = tim_freq/uwIC2Value;
  83. }
  84. else
  85. {
  86. uwDutyCycle = 0;
  87. uwFrequency = 0;
  88. }
  89. }
  90. #endif
  91. }