enc_intf.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include "bsp/bsp_driver.h"
  2. #include "libs/logger.h"
  3. static void _io_init(void) {
  4. rcu_apb2_periph_clock_enable(ENC_A_RCU);
  5. rcu_apb2_periph_clock_enable(ENC_B_RCU);
  6. rcu_apb2_periph_clock_enable(ENC_PWM_RCU);
  7. rcu_apb2_periph_clock_enable(ENC_I_RCU);
  8. #ifdef TIMER2_PB4_PB5_REMAP
  9. gpio_pin_remap_config(TIMER2_PB4_PB5_REMAP, ENABLE);
  10. #endif
  11. #ifdef TIMER1_PA15_REMAP
  12. gpio_pin_remap_config(TIMER1_PA15_REMAP, ENABLE);
  13. #endif
  14. gpio_init(ENC_A_GROUP, ENC_A_MODE, GPIO_OSPEED_50MHZ, ENC_A_PIN);
  15. gpio_init(ENC_B_GROUP, ENC_B_MODE, GPIO_OSPEED_50MHZ, ENC_B_PIN);
  16. gpio_init(ENC_PWM_GROUP, ENC_PWM_MODE, GPIO_OSPEED_50MHZ, ENC_PWM_PIN);
  17. gpio_init(ENC_I_GROUP, ENC_I_MODE, GPIO_OSPEED_50MHZ, ENC_I_PIN);
  18. }
  19. static void _io_init_irq(void) {
  20. gpio_exti_source_select(ENC_I_EXIT_SRC_GROUP, ENC_I_EXIT_SRC_PIN);
  21. exti_init(ENC_I_EXTI, EXTI_INTERRUPT, EXTI_TRIG_RISING);
  22. exti_interrupt_flag_clear(ENC_I_EXTI);
  23. exti_interrupt_enable(ENC_I_EXTI);
  24. nvic_irq_enable(ENC_I_IRQ, ENC_I_EXIT_IRQ_PRIORITY, 0U);
  25. }
  26. void enc_intf_init(u32 rate) {
  27. _io_init();
  28. enc_intf_pwm_counter();
  29. enc_intf_quadrature_init(rate);
  30. _io_init_irq();
  31. }
  32. void enc_intf_quadrature_init(u32 rate) {
  33. TIM_TimeBaseInitType TIM_TimeBaseStructure;
  34. TIM_ICInitType TIM_ICInitStructure;
  35. rcu_apb1_periph_clock_enable(ENC_TIMER_RCU);
  36. TIM_Module* TIMx = ENC_TIMER;
  37. //initial tim for encode
  38. TIM_DeInit(TIMx);
  39. TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
  40. TIM_TimeBaseStructure.Period = rate - 1;
  41. TIM_TimeBaseStructure.Prescaler = 0;
  42. TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
  43. TIM_TimeBaseStructure.CntMode = TIM_CNT_MODE_UP;
  44. TIM_InitTimeBase(TIMx,&TIM_TimeBaseStructure);
  45. TIM_InitIcStruct(&TIM_ICInitStructure);
  46. TIM_ICInitStructure.IcPolarity = TIM_IC_POLARITY_RISING;
  47. TIM_ICInitStructure.IcFilter = ENC_FILTER_NR;
  48. TIM_ICInitStructure.Channel = TIM_CH_1;
  49. TIM_ICInit(TIMx,&TIM_ICInitStructure);
  50. TIM_ICInitStructure.Channel = TIM_CH_2;
  51. TIM_ICInit(TIMx,&TIM_ICInitStructure);
  52. //qr encode set
  53. TIM_ConfigEncoderInterface(TIMx,TIM_ENCODE_MODE_TI12,TIM_IC_POLARITY_FALLING,TIM_IC_POLARITY_RISING);
  54. TIM_ConfigArPreload(TIMx,ENABLE);
  55. TIM_SetCnt(TIMx,0);
  56. TIM_Enable(TIMx,ENABLE);
  57. TIM_ClearFlag(TIMx,TIM_FLAG_UPDATE);
  58. TIM_ConfigInt(TIMx,TIM_INT_UPDATE,ENABLE);
  59. }
  60. void enc_intf_pwm_counter(void) {
  61. TIM_TimeBaseInitType TIM_TimeBaseStructure;
  62. TIM_ICInitType TIM_ICInitStructure;
  63. rcu_apb1_periph_clock_enable(ENC_PWM_TIMER_RCU);
  64. TIM_Module* TIMx = ENC_PWM_TIMER;
  65. TIM_DeInit(TIMx);
  66. TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
  67. TIM_TimeBaseStructure.Period = 65535;
  68. TIM_TimeBaseStructure.Prescaler = TIM_PWM_CLK/PWM_TIME_CLK - 1;
  69. TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
  70. TIM_TimeBaseStructure.CntMode = TIM_CNT_MODE_UP;
  71. TIM_InitTimeBase(TIMx,&TIM_TimeBaseStructure);
  72. TIM_ICInitStructure.Channel = ENC_PWM_TIMER_CHAN;
  73. TIM_ICInitStructure.IcPolarity = TIM_IC_POLARITY_RISING;
  74. TIM_ICInitStructure.IcSelection = TIM_IC_SELECTION_DIRECTTI;
  75. TIM_ICInitStructure.IcPrescaler = TIM_IC_PSC_DIV1;
  76. TIM_ICInitStructure.IcFilter = ENC_FILTER_NR;
  77. TIM_ConfigPwmIc(TIMx, &TIM_ICInitStructure);
  78. /* Select the TIM3 Input Trigger: TI2FP2 */
  79. TIM_SelectInputTrig(TIMx, TIM_TRIG_SEL_TI1FP1);
  80. /* Select the slave Mode: Reset Mode */
  81. TIM_SelectSlaveMode(TIMx, TIM_SLAVE_MODE_RESET);
  82. /* Enable the Master/Slave Mode */
  83. TIM_SelectMasterSlaveMode(TIMx, TIM_MASTER_SLAVE_MODE_ENABLE);
  84. /* TIM enable counter */
  85. TIM_Enable(TIMx, ENABLE);
  86. TIM_ClearFlag(TIMx,ENC_PWM_TIMER_INT_FLG);
  87. /* Enable the CC2 Interrupt Request */
  88. TIM_ConfigInt(TIMx, ENC_PWM_TIMER_IRQ_CH, ENABLE);
  89. nvic_irq_enable(ENC_PWM_TIMER_IRQ, ENC_PWM_IRQ_PRIORITY, 0);
  90. }
  91. __weak void ENC_TIMER_Overflow(void) {
  92. }
  93. void ENC_TIMER_IRQHandler(void) {
  94. if (SET == TIM_GetIntStatus(ENC_TIMER, TIM_INT_UPDATE)) {
  95. TIM_ClrIntPendingBit(ENC_TIMER, TIM_INT_UPDATE);
  96. ENC_TIMER_Overflow();
  97. }
  98. }
  99. __weak void ENC_ABI_IRQHandler(void) {
  100. }
  101. void ABI_I_IRQHandler(void) {
  102. ENC_ABI_IRQHandler();
  103. }
  104. __weak void ENC_PWM_Duty_Handler(float t, float d) {
  105. }
  106. static float pwm_freq = 0.0f;
  107. void ENC_PWM_IRQHandler(void) {
  108. if(SET == TIM_GetIntStatus(ENC_PWM_TIMER, ENC_PWM_TIMER_INT_FLG)){
  109. /* clear channel 0 interrupt bit */
  110. TIM_ClrIntPendingBit(ENC_PWM_TIMER, ENC_PWM_TIMER_INT_FLG);
  111. /* read channel 0 capture value */
  112. u32 ic0value = TIMER_CH0CV(ENC_PWM_TIMER)+1;
  113. u32 ic1value = TIMER_CH1CV(ENC_PWM_TIMER)+1;
  114. float p_calc = ENC_PWM_Calc_P(ic0value);
  115. float d_calc = ENC_PWM_Calc_P(ic1value);
  116. ENC_PWM_Duty_Handler(p_calc, d_calc);
  117. pwm_freq = (float)PWM_TIME_CLK/((float)ic0value);
  118. }
  119. }
  120. float enc_get_pwm_freq(void) {
  121. return pwm_freq;
  122. }