最近使用GD32进行电机控制器的程序编写,我们的主控芯片使用的是GD32E103,该芯片的性能我就不详细描述了,但比较适合做电机控制器。
由于我们的编码器使用的光编码器,是AB格式的输出信号。需要一个定时器来进行数据的读取。其他不详细描述。贴代码。
void Encoder_Init_TIM1()
{
timer_ic_parameter_struct timer_icinitpara;
// timer_oc_parameter_struct timer_ocinitpara;
timer_parameter_struct timer_initpara;
// timer_break_parameter_struct timer_breakpara;
rcu_periph_clock_enable(RCU_AF);
rcu_periph_clock_enable(RCU_TIMER1);
/*configure PB3/PA15 as timer1 pin alternate function*/
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
gpio_pin_remap_config(GPIO_TIMER1_FULL_REMAP, ENABLE);
第一步是管脚的配置,我们使用的是PB3和PA15管脚。
timer_deinit(TIMER1);
/* initialize TIMER init parameter struct */
timer_struct_para_init(&timer_initpara);
/* TIMER1 configuration */
timer_initpara.prescaler = 0;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = 65535; //20khz
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_initpara.repetitioncounter = 0;
timer_init(TIMER1, &timer_initpara);
/* TIMER1 configuration */
/* initialize TIMER channel input parameter struct */
timer_channel_input_struct_para_init(&timer_icinitpara);
/* TIMER1 CH0 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 = 0x0;
timer_input_capture_config(TIMER1,TIMER_CH_0,&timer_icinitpara);
timer_input_capture_config(TIMER1,TIMER_CH_1,&timer_icinitpara);
其次是定时器输入模式的配置,还有分频器的配置
/*配置为T1T2计数模式,且在上下延计数*/
timer_quadrature_decoder_mode_config( TIMER1 ,TIMER_ENCODER_MODE2,TIMER_IC_POLARITY_BOTH_EDGE, TIMER_IC_POLARITY_BOTH_EDGE);
最后是模式的配置
/* auto-reload preload enable */
timer_auto_reload_shadow_enable(TIMER1);
timer_enable(TIMER1);
}
搞了一天时间,功能基本没有问题。里面寄存器有点多,需要自己一一查看。总体来说,不是太难。自己写下来,免得以后忘记。