|
@@ -18,20 +18,22 @@ static void _io_init(void) {
|
|
|
gpio_init(ENC_I_GROUP, ENC_I_MODE, GPIO_OSPEED_50MHZ, ENC_I_PIN);
|
|
gpio_init(ENC_I_GROUP, ENC_I_MODE, GPIO_OSPEED_50MHZ, ENC_I_PIN);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static void _io_init_irq(void) {
|
|
|
|
|
|
|
+static void z_io_init_irq(void) {
|
|
|
|
|
+#ifdef ENC_I_IRQ
|
|
|
gpio_exti_source_select(ENC_I_EXIT_SRC_GROUP, ENC_I_EXIT_SRC_PIN);
|
|
gpio_exti_source_select(ENC_I_EXIT_SRC_GROUP, ENC_I_EXIT_SRC_PIN);
|
|
|
exti_init(ENC_I_EXTI, EXTI_INTERRUPT, EXTI_TRIG_RISING);
|
|
exti_init(ENC_I_EXTI, EXTI_INTERRUPT, EXTI_TRIG_RISING);
|
|
|
exti_interrupt_flag_clear(ENC_I_EXTI);
|
|
exti_interrupt_flag_clear(ENC_I_EXTI);
|
|
|
exti_interrupt_enable(ENC_I_EXTI);
|
|
exti_interrupt_enable(ENC_I_EXTI);
|
|
|
-
|
|
|
|
|
nvic_irq_enable(ENC_I_IRQ, ENC_I_EXIT_IRQ_PRIORITY, 0U);
|
|
nvic_irq_enable(ENC_I_IRQ, ENC_I_EXIT_IRQ_PRIORITY, 0U);
|
|
|
|
|
+#endif
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void enc_intf_init(u32 rate) {
|
|
void enc_intf_init(u32 rate) {
|
|
|
_io_init();
|
|
_io_init();
|
|
|
enc_intf_pwm_counter();
|
|
enc_intf_pwm_counter();
|
|
|
enc_intf_quadrature_init(rate);
|
|
enc_intf_quadrature_init(rate);
|
|
|
- _io_init_irq();
|
|
|
|
|
|
|
+ z_io_init_irq();
|
|
|
|
|
+ enc_intf_z_counter();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void enc_intf_quadrature_init(u32 rate) {
|
|
void enc_intf_quadrature_init(u32 rate) {
|
|
@@ -60,7 +62,7 @@ void enc_intf_quadrature_init(u32 rate) {
|
|
|
timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
|
|
timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
|
|
|
timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
|
|
timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
|
|
|
timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
|
|
timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
|
|
|
- timer_icinitpara.icfilter = ENC_FILTER_NR;//采样频率120M, 这个必须要加入滤波,否则AB的计数可能不对
|
|
|
|
|
|
|
+ timer_icinitpara.icfilter = CONFIG_ENC_FILTER_NR;//采样频率120M, 这个必须要加入滤波,否则AB的计数可能不对
|
|
|
timer_input_capture_config(timer,TIMER_CH_0,&timer_icinitpara);
|
|
timer_input_capture_config(timer,TIMER_CH_0,&timer_icinitpara);
|
|
|
|
|
|
|
|
timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
|
|
timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
|
|
@@ -105,7 +107,7 @@ void enc_intf_pwm_counter(void) {
|
|
|
timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
|
|
timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
|
|
|
timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
|
|
timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
|
|
|
timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
|
|
timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
|
|
|
- timer_icinitpara.icfilter = ENC_FILTER_NR;
|
|
|
|
|
|
|
+ timer_icinitpara.icfilter = CONFIG_PWM_FILTER_NR;
|
|
|
timer_input_pwm_capture_config(timer, ENC_PWM_TIMER_CHAN, &timer_icinitpara);
|
|
timer_input_pwm_capture_config(timer, ENC_PWM_TIMER_CHAN, &timer_icinitpara);
|
|
|
|
|
|
|
|
/* slave mode selection: TIMER */
|
|
/* slave mode selection: TIMER */
|
|
@@ -126,6 +128,54 @@ void enc_intf_pwm_counter(void) {
|
|
|
timer_enable(timer);
|
|
timer_enable(timer);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+void enc_intf_z_counter(void) {
|
|
|
|
|
+#ifdef ENC_I_TIMER
|
|
|
|
|
+ timer_ic_parameter_struct timer_icinitpara;
|
|
|
|
|
+ timer_parameter_struct timer_initpara;
|
|
|
|
|
+ u32 timer = ENC_I_TIMER;
|
|
|
|
|
+
|
|
|
|
|
+ rcu_periph_clock_enable(ENC_I_TIMER_RCU);
|
|
|
|
|
+
|
|
|
|
|
+ timer_deinit(timer);
|
|
|
|
|
+
|
|
|
|
|
+ /* TIMER configuration */
|
|
|
|
|
+ timer_struct_para_init(&timer_initpara);
|
|
|
|
|
+ timer_initpara.prescaler = TIM_CLOCK/PWM_TIME_CLK - 1;
|
|
|
|
|
+ timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
|
|
|
|
|
+ timer_initpara.counterdirection = TIMER_COUNTER_UP;
|
|
|
|
|
+ timer_initpara.period = 65535;
|
|
|
|
|
+ timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
|
|
|
|
|
+ timer_initpara.repetitioncounter = 0;
|
|
|
|
|
+ timer_init(timer,&timer_initpara);
|
|
|
|
|
+
|
|
|
|
|
+ timer_channel_input_struct_para_init(&timer_icinitpara);
|
|
|
|
|
+ /* TIMER CH0 PWM input capture configuration */
|
|
|
|
|
+ timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
|
|
|
|
|
+ timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
|
|
|
|
|
+ timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
|
|
|
|
|
+ timer_icinitpara.icfilter = CONFIG_PWM_FILTER_NR;
|
|
|
|
|
+ timer_input_capture_config(timer, ENC_I_TIMER_CHAN, &timer_icinitpara);
|
|
|
|
|
+
|
|
|
|
|
+ /* slave mode selection: TIMER */
|
|
|
|
|
+ timer_input_trigger_source_select(timer, TIMER_SMCFG_TRGSEL_CI0FE0);
|
|
|
|
|
+ timer_slave_mode_select(timer, TIMER_SLAVE_MODE_RESTART);
|
|
|
|
|
+
|
|
|
|
|
+ /* select the master slave mode */
|
|
|
|
|
+ timer_master_slave_mode_config(timer, TIMER_MASTER_SLAVE_MODE_ENABLE);
|
|
|
|
|
+
|
|
|
|
|
+ /* auto-reload preload enable */
|
|
|
|
|
+ timer_auto_reload_shadow_enable(timer);
|
|
|
|
|
+ /* clear channel 0 interrupt bit */
|
|
|
|
|
+ timer_interrupt_flag_clear(timer, ENC_I_TIMER_INT_FLG);
|
|
|
|
|
+ /* channel 0 interrupt enable */
|
|
|
|
|
+ timer_interrupt_enable(timer, ENC_I_TIMER_IRQ_CH);
|
|
|
|
|
+ nvic_irq_enable(ENC_I_TIMER_IRQ, ENC_I_EXIT_IRQ_PRIORITY, 0);
|
|
|
|
|
+ /* TIMER2 counter enable */
|
|
|
|
|
+ timer_enable(timer);
|
|
|
|
|
+#endif
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
__weak void ENC_TIMER_Overflow(void) {
|
|
__weak void ENC_TIMER_Overflow(void) {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
@@ -143,7 +193,19 @@ __weak void ENC_ABI_IRQHandler(void) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void ABI_I_IRQHandler(void) {
|
|
void ABI_I_IRQHandler(void) {
|
|
|
|
|
+#ifdef ENC_I_IRQ
|
|
|
ENC_ABI_IRQHandler();
|
|
ENC_ABI_IRQHandler();
|
|
|
|
|
+#endif
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void ENC_I_IRQHandler(void) {
|
|
|
|
|
+#ifdef ENC_I_TIMER
|
|
|
|
|
+ if(SET == timer_interrupt_flag_get(ENC_I_TIMER, ENC_I_TIMER_INT_FLG)){
|
|
|
|
|
+ /* clear channel 0 interrupt bit */
|
|
|
|
|
+ timer_interrupt_flag_clear(ENC_I_TIMER, ENC_I_TIMER_INT_FLG);
|
|
|
|
|
+ ENC_ABI_IRQHandler();
|
|
|
|
|
+ }
|
|
|
|
|
+#endif
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
__weak void ENC_PWM_Duty_Handler(float t, float d) {
|
|
__weak void ENC_PWM_Duty_Handler(float t, float d) {
|