enc_intf.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. #include "bsp/bsp_driver.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. #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 z_io_init_irq(void) {
  20. #ifdef ENC_I_IRQ
  21. gpio_exti_source_select(ENC_I_EXIT_SRC_GROUP, ENC_I_EXIT_SRC_PIN);
  22. exti_init(ENC_I_EXTI, EXTI_INTERRUPT, EXTI_TRIG_RISING);
  23. exti_interrupt_flag_clear(ENC_I_EXTI);
  24. exti_interrupt_enable(ENC_I_EXTI);
  25. nvic_irq_enable(ENC_I_IRQ, ENC_I_EXIT_IRQ_PRIORITY, 0U);
  26. #endif
  27. }
  28. void enc_intf_init(u32 rate) {
  29. _io_init();
  30. enc_intf_pwm_counter();
  31. enc_intf_quadrature_init(rate);
  32. z_io_init_irq();
  33. enc_intf_z_counter();
  34. }
  35. void enc_intf_quadrature_init(u32 rate) {
  36. timer_parameter_struct timer_initpara;
  37. timer_ic_parameter_struct timer_icinitpara;
  38. u32 timer = ENC_TIMER;
  39. rcu_periph_clock_enable(ENC_TIMER_RCU);
  40. timer_deinit(timer);
  41. /* TIMER configuration */
  42. timer_struct_para_init(&timer_initpara);
  43. timer_initpara.prescaler = 0;//TIM_CLOCK/PWM_TIME_CLK - 1;
  44. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  45. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  46. timer_initpara.period = rate-1;
  47. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  48. timer_initpara.repetitioncounter = 0;
  49. timer_init(timer,&timer_initpara);
  50. /* initialize TIMER channel input parameter struct */
  51. timer_channel_input_struct_para_init(&timer_icinitpara);
  52. /* TIMER2 CH0 input capture configuration */
  53. timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
  54. timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
  55. timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
  56. timer_icinitpara.icfilter = CONFIG_ENC_FILTER_NR;//采样频率120M, 这个必须要加入滤波,否则AB的计数可能不对
  57. timer_input_capture_config(timer,TIMER_CH_0,&timer_icinitpara);
  58. timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
  59. timer_input_capture_config(timer,TIMER_CH_1,&timer_icinitpara);
  60. timer_quadrature_decoder_mode_config(timer ,TIMER_ENCODER_MODE2,TIMER_IC_POLARITY_FALLING, TIMER_IC_POLARITY_RISING);
  61. /* TIMER CH2 PWM input capture configuration */
  62. timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
  63. timer_icinitpara.icselection = TIMER_IC_SELECTION_ITS;
  64. timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
  65. timer_icinitpara.icfilter = 0;
  66. timer_input_capture_config(timer, TIMER_CH_2, &timer_icinitpara);
  67. timer_input_trigger_source_select(timer, TIMER_SMCFG_TRGSEL_ITI3);//come from trigger out of time3 which captrue the Z singnal and output to me
  68. /* auto-reload preload enable */
  69. timer_auto_reload_shadow_enable(timer);
  70. timer_interrupt_flag_clear(timer, TIMER_INT_FLAG_UP);
  71. /* clear channel 0 interrupt bit */
  72. timer_interrupt_flag_clear(timer, TIMER_INT_FLAG_CH2);
  73. /* channel 0 interrupt enable */
  74. timer_interrupt_enable(timer, TIMER_INT_CH2);
  75. nvic_irq_enable(ENC_TIMER_IRQ, ENC_I_EXIT_IRQ_PRIORITY, 0);
  76. /* TIMER2 counter enable */
  77. timer_enable(timer);
  78. }
  79. void enc_intf_pwm_counter(void) {
  80. timer_ic_parameter_struct timer_icinitpara;
  81. timer_parameter_struct timer_initpara;
  82. u32 timer = ENC_PWM_TIMER;
  83. rcu_periph_clock_enable(ENC_PWM_TIMER_RCU);
  84. timer_deinit(timer);
  85. /* TIMER configuration */
  86. timer_struct_para_init(&timer_initpara);
  87. timer_initpara.prescaler = TIM_CLOCK/PWM_TIME_CLK - 1;
  88. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  89. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  90. timer_initpara.period = 65535;
  91. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  92. timer_initpara.repetitioncounter = 0;
  93. timer_init(timer,&timer_initpara);
  94. timer_channel_input_struct_para_init(&timer_icinitpara);
  95. /* TIMER CH0 PWM input capture configuration */
  96. timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
  97. timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
  98. timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
  99. timer_icinitpara.icfilter = CONFIG_PWM_FILTER_NR;
  100. timer_input_pwm_capture_config(timer, ENC_PWM_TIMER_CHAN, &timer_icinitpara);
  101. /* slave mode selection: TIMER */
  102. timer_input_trigger_source_select(timer, TIMER_SMCFG_TRGSEL_CI0FE0);
  103. timer_slave_mode_select(timer, TIMER_SLAVE_MODE_RESTART);
  104. /* select the master slave mode */
  105. timer_master_slave_mode_config(timer, TIMER_MASTER_SLAVE_MODE_ENABLE);
  106. /* auto-reload preload enable */
  107. timer_auto_reload_shadow_enable(timer);
  108. /* clear channel 0 interrupt bit */
  109. timer_interrupt_flag_clear(timer, ENC_PWM_TIMER_INT_FLG);
  110. /* channel 0 interrupt enable */
  111. timer_interrupt_enable(timer, ENC_PWM_TIMER_IRQ_CH);
  112. nvic_irq_enable(ENC_PWM_TIMER_IRQ, ENC_PWM_IRQ_PRIORITY, 0);
  113. /* TIMER2 counter enable */
  114. timer_enable(timer);
  115. }
  116. void enc_intf_z_counter(void) {
  117. #ifdef ENC_I_TIMER
  118. timer_ic_parameter_struct timer_icinitpara;
  119. timer_parameter_struct timer_initpara;
  120. u32 timer = ENC_I_TIMER;
  121. rcu_periph_clock_enable(ENC_I_TIMER_RCU);
  122. timer_deinit(timer);
  123. /* TIMER configuration */
  124. timer_struct_para_init(&timer_initpara);
  125. timer_initpara.prescaler = 0;
  126. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  127. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  128. timer_initpara.period = 65535;
  129. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  130. timer_initpara.repetitioncounter = 0;
  131. timer_init(timer,&timer_initpara);
  132. timer_channel_input_struct_para_init(&timer_icinitpara);
  133. /* TIMER CH0 PWM input capture configuration */
  134. timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
  135. timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
  136. timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
  137. timer_icinitpara.icfilter = CONFIG_Z_IDX_FILTER_NR;
  138. timer_input_capture_config(timer, ENC_I_TIMER_CHAN, &timer_icinitpara);
  139. /* select the master slave mode */
  140. timer_master_slave_mode_config(timer,TIMER_MASTER_SLAVE_MODE_ENABLE);
  141. /* TIMER1 update event is used as trigger output */
  142. timer_master_output_trigger_source_select(timer,TIMER_TRI_OUT_SRC_CH0); //ch0 as tirgger out to encoder timer
  143. /* auto-reload preload enable */
  144. timer_auto_reload_shadow_enable(timer);
  145. #if 0
  146. /* clear channel 0 interrupt bit */
  147. timer_interrupt_flag_clear(timer, ENC_I_TIMER_INT_FLG);
  148. /* channel 0 interrupt enable */
  149. timer_interrupt_enable(timer, ENC_I_TIMER_IRQ_CH);
  150. nvic_irq_enable(ENC_I_TIMER_IRQ, ENC_I_EXIT_IRQ_PRIORITY, 0);
  151. #endif
  152. /* TIMER2 counter enable */
  153. timer_enable(timer);
  154. #endif
  155. }
  156. __weak void ENC_TIMER_Overflow(void) {
  157. }
  158. __weak void ENC_ABI_IRQHandler(u32 count) {
  159. }
  160. void ENC_TIMER_IRQHandler(void) {
  161. if (SET == timer_interrupt_flag_get(ENC_TIMER, TIMER_INT_FLAG_UP)) {
  162. timer_interrupt_flag_clear(ENC_TIMER, TIMER_INT_FLAG_UP);
  163. ENC_TIMER_Overflow();
  164. }
  165. if (SET == timer_interrupt_flag_get(ENC_TIMER, TIMER_INT_CH2)) {
  166. timer_interrupt_flag_clear(ENC_TIMER, TIMER_INT_FLAG_CH2);
  167. ENC_ABI_IRQHandler(TIMER_CH2CV(ENC_TIMER));
  168. }
  169. }
  170. void ABI_I_IRQHandler(void) {
  171. #ifdef ENC_I_IRQ
  172. ENC_ABI_IRQHandler(TIMER_CNT(ENC_TIMER));
  173. #endif
  174. }
  175. void ENC_I_IRQHandler(void) {
  176. #ifdef ENC_I_TIMER
  177. if(SET == timer_interrupt_flag_get(ENC_I_TIMER, ENC_I_TIMER_INT_FLG)){
  178. /* clear channel 0 interrupt bit */
  179. timer_interrupt_flag_clear(ENC_I_TIMER, ENC_I_TIMER_INT_FLG);
  180. #if 0
  181. ENC_ABI_IRQHandler(TIMER_CNT(ENC_TIMER));
  182. #endif
  183. }
  184. #endif
  185. }
  186. __weak void ENC_PWM_Duty_Handler(float t, float d) {
  187. }
  188. static float pwm_freq = 0.0f;
  189. void ENC_PWM_IRQHandler(void) {
  190. if(SET == timer_interrupt_flag_get(ENC_PWM_TIMER, ENC_PWM_TIMER_INT_FLG)){
  191. /* clear channel 0 interrupt bit */
  192. timer_interrupt_flag_clear(ENC_PWM_TIMER, ENC_PWM_TIMER_INT_FLG);
  193. /* read channel 0 capture value */
  194. u32 ic0value = TIMER_CH0CV(ENC_PWM_TIMER)+1;
  195. u32 ic1value = TIMER_CH1CV(ENC_PWM_TIMER)+1;
  196. float p_calc = ENC_PWM_Calc_P(ic0value);
  197. float d_calc = ENC_PWM_Calc_P(ic1value);
  198. ENC_PWM_Duty_Handler(p_calc, d_calc);
  199. pwm_freq = (float)PWM_TIME_CLK/((float)ic0value);
  200. }
  201. }
  202. float enc_get_pwm_freq(void) {
  203. return pwm_freq;
  204. }