enc_intf.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include "bsp/enc_intf.h"
  2. #include "libs/logger.h"
  3. static void _io_init(void) {
  4. rcu_periph_clock_enable(ENC_A_RCU);
  5. rcu_periph_clock_enable(ENC_B_RCU);
  6. rcu_periph_clock_enable(ENC_PWM_RCU);
  7. rcu_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. gpio_init(ENC_A_GROUP, ENC_A_MODE, GPIO_OSPEED_50MHZ, ENC_A_PIN);
  12. gpio_init(ENC_B_GROUP, ENC_B_MODE, GPIO_OSPEED_50MHZ, ENC_B_PIN);
  13. gpio_init(ENC_PWM_GROUP, ENC_PWM_MODE, GPIO_OSPEED_50MHZ, ENC_PWM_PIN);
  14. gpio_init(ENC_I_GROUP, ENC_I_MODE, GPIO_OSPEED_50MHZ, ENC_I_PIN);
  15. }
  16. static void _io_init_irq(void) {
  17. gpio_exti_source_select(ENC_I_EXIT_SRC_GROUP, ENC_I_EXIT_SRC_PIN);
  18. exti_init(ENC_I_EXTI, EXTI_INTERRUPT, EXTI_TRIG_RISING);
  19. exti_interrupt_flag_clear(ENC_I_EXTI);
  20. exti_interrupt_enable(ENC_I_EXTI);
  21. nvic_irq_enable(ENC_I_IRQ, ENC_I_EXIT_IRQ_PRIORITY, 0U);
  22. }
  23. void enc_intf_init(u32 rate) {
  24. _io_init();
  25. enc_intf_pwm_counter();
  26. enc_intf_quadrature_init(rate);
  27. _io_init_irq();
  28. }
  29. void enc_intf_quadrature_init(u32 rate) {
  30. timer_parameter_struct timer_initpara;
  31. timer_ic_parameter_struct timer_icinitpara;
  32. u32 timer = ENC_TIMER;
  33. rcu_periph_clock_enable(ENC_TIMER_RCU);
  34. timer_deinit(timer);
  35. /* TIMER configuration */
  36. timer_struct_para_init(&timer_initpara);
  37. timer_initpara.prescaler = 0;//TIM_CLOCK/PWM_TIME_CLK - 1;
  38. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  39. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  40. timer_initpara.period = rate-1;
  41. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  42. timer_initpara.repetitioncounter = 0;
  43. timer_init(timer,&timer_initpara);
  44. /* initialize TIMER channel input parameter struct */
  45. timer_channel_input_struct_para_init(&timer_icinitpara);
  46. /* TIMER2 CH0 input capture configuration */
  47. timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
  48. timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
  49. timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
  50. timer_icinitpara.icfilter = 0x4;//采样频率120M, 这个必须要加入滤波,否则AB的计数可能不对
  51. timer_input_capture_config(timer,TIMER_CH_0,&timer_icinitpara);
  52. timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
  53. timer_input_capture_config(timer,TIMER_CH_1,&timer_icinitpara);
  54. timer_quadrature_decoder_mode_config(timer ,TIMER_ENCODER_MODE2,TIMER_IC_POLARITY_RISING, TIMER_IC_POLARITY_RISING);
  55. /* auto-reload preload enable */
  56. timer_auto_reload_shadow_enable(timer);
  57. timer_interrupt_flag_clear(timer, TIMER_INT_FLAG_UP);
  58. //timer_interrupt_enable(timer, TIMER_INT_UP);
  59. //nvic_irq_enable(ENC_TIMER_IRQ, ENC_TIMER_IRQ_PRIORITY, 0);
  60. /* TIMER2 counter enable */
  61. timer_enable(timer);
  62. }
  63. void enc_intf_pwm_counter(void) {
  64. timer_ic_parameter_struct timer_icinitpara;
  65. timer_parameter_struct timer_initpara;
  66. u32 timer = ENC_PWM_TIMER;
  67. rcu_periph_clock_enable(ENC_PWM_TIMER_RCU);
  68. timer_deinit(timer);
  69. /* TIMER configuration */
  70. timer_struct_para_init(&timer_initpara);
  71. timer_initpara.prescaler = TIM_CLOCK/PWM_TIME_CLK - 1;
  72. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  73. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  74. timer_initpara.period = 65535;
  75. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  76. timer_initpara.repetitioncounter = 0;
  77. timer_init(timer,&timer_initpara);
  78. timer_channel_input_struct_para_init(&timer_icinitpara);
  79. /* TIMER CH0 PWM input capture configuration */
  80. timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
  81. timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
  82. timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
  83. timer_icinitpara.icfilter = 0x0;
  84. timer_input_pwm_capture_config(timer, ENC_PWM_TIMER_CHAN, &timer_icinitpara);
  85. /* slave mode selection: TIMER */
  86. timer_input_trigger_source_select(timer, TIMER_SMCFG_TRGSEL_CI0FE0);
  87. timer_slave_mode_select(timer, TIMER_SLAVE_MODE_RESTART);
  88. /* select the master slave mode */
  89. timer_master_slave_mode_config(timer, TIMER_MASTER_SLAVE_MODE_ENABLE);
  90. /* auto-reload preload enable */
  91. timer_auto_reload_shadow_enable(timer);
  92. /* clear channel 0 interrupt bit */
  93. timer_interrupt_flag_clear(timer, ENC_PWM_TIMER_INT_FLG);
  94. /* channel 0 interrupt enable */
  95. timer_interrupt_enable(timer, ENC_PWM_TIMER_IRQ_CH);
  96. nvic_irq_enable(ENC_PWM_TIMER_IRQ, ENC_PWM_IRQ_PRIORITY, 0);
  97. /* TIMER2 counter enable */
  98. timer_enable(timer);
  99. }
  100. __weak void ENC_TIMER_Overflow(void) {
  101. }
  102. void ENC_TIMER_IRQHandler(void) {
  103. if (SET == timer_interrupt_flag_get(ENC_TIMER, TIMER_INT_FLAG_UP)) {
  104. timer_interrupt_flag_clear(ENC_TIMER, TIMER_INT_FLAG_UP);
  105. ENC_TIMER_Overflow();
  106. }
  107. }
  108. __weak void ENC_ABI_IRQHandler(void) {
  109. }
  110. void ABI_I_IRQHandler(void) {
  111. ENC_ABI_IRQHandler();
  112. }
  113. __weak void ENC_PWM_Duty_Handler(float t, float d) {
  114. }
  115. void ENC_PWM_IRQHandler(void) {
  116. if(SET == timer_interrupt_flag_get(ENC_PWM_TIMER, ENC_PWM_TIMER_INT_FLG)){
  117. /* clear channel 0 interrupt bit */
  118. timer_interrupt_flag_clear(ENC_PWM_TIMER, ENC_PWM_TIMER_INT_FLG);
  119. /* read channel 0 capture value */
  120. u32 ic0value = TIMER_CH0CV(ENC_PWM_TIMER)+1;
  121. u32 ic1value = TIMER_CH1CV(ENC_PWM_TIMER)+1;
  122. float p_calc = ENC_PWM_Calc_P(ic0value);
  123. float d_calc = ENC_PWM_Calc_P(ic1value);
  124. ENC_PWM_Duty_Handler(p_calc, d_calc);
  125. }
  126. }