背景:
- 使用编码器获取电机的转动情况,gd32部分timer带有编码器模式,因此可以直接使用简化处理。
环境:
- 硬件平台:gd32f330r8t6
- gd库版本:GD32F3x0_Firmware_Library_V2.2.1
配置源码
- 使用timer0的ch0和ch1通道,ch2和ch3不能再使用
- io使用PA8 PA9
void timer_encode_config(void)
{
timer_ic_parameter_struct timer_icintpara;
timer_oc_parameter_struct timer_ocintpara;
timer_parameter_struct timer_initpara;
rcu_periph_clock_enable(RCU_TIMER0);
rcu_periph_clock_enable(RCU_GPIOA);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_8);
gpio_af_set(GPIOA, GPIO_AF_2, GPIO_PIN_9);
timer_deinit(TIMER0);
timer_initpara.prescaler = 0;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = 0xffff;
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_initpara.repetitioncounter = 0;
timer_init(TIMER0,&timer_initpara);
nvic_irq_enable(TIMER0_Channel_IRQn, 0, 0);
timer_update_source_config(TIMER0, TIMER_UPDATE_SRC_REGULAR);
timer_quadrature_decoder_mode_config(TIMER0,TIMER_ENCODER_MODE2,TIMER_IC_POLARITY_RISING,TIMER_IC_POLARITY_RISING);
timer_interrupt_enable(TIMER0, TIMER_INT_UP);
timer_auto_reload_shadow_enable(TIMER0);
timer_enable(TIMER0);
}
uint32_t value= timer_counter_read(TIMER0);
printf("value:%d\r\n",value);
实验结果:
2023/01/14: 15:42:12(737):
value:22541
value:22514
value:22487
value:22460
va
2023/01/14: 15:42:12(785):
value:22407
- 两个反向分别对应编码器的值一个递增,一个递减,需要自己处理溢出的情况。