搜索

GD32定时器编码器模式没有硬件计数吗?

[复制链接]
130|8
 楼主 | 2020-11-25 19:29 | 显示全部楼层 |阅读模式
近日由于各种缺货涨价等等原因,准备换GD32F303,可是正交编码器模式总是调试不通,以前STM32F103很好配置的。没办法到处找资料、例程,最后找到厂家给的一个例程还是不行,好像例程是利用中断处理的,难道不应该是硬件自动计数?不知大家有没有遇到这种问题。
附上例程代码如下:
void timer2_init(void)
{
    timer_parameter_struct timer_initpara;
    timer_ic_parameter_struct timer_icinitpara;
    timer_oc_parameter_struct timer_ocintpara;
       
    rcu_periph_clock_enable(RCU_TIMER2);

    timer_deinit(TIMER2);
    timer_initpara.prescaler         = 0;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 3999;
    timer_initpara.clockdivision     = 0;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER2, &timer_initpara);

    timer_icinitpara.icpolarity  = TIMER_IC_POLARITY_RISING;
    timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
    timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
    timer_icinitpara.icfilter    = 0x5;
    timer_input_capture_config(TIMER2, TIMER_CH_0, &timer_icinitpara);

    timer_icinitpara.icfilter    = 0x5;
    timer_input_capture_config(TIMER2, TIMER_CH_2, &timer_icinitpara);

    timer_quadrature_decoder_mode_config(TIMER2,TIMER_ENCODER_MODE2,TIMER_IC_POLARITY_RISING,TIMER_IC_POLARITY_RISING);

    timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH0);
    timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH2);
               
    timer_interrupt_enable(TIMER2, TIMER_INT_CH0 |TIMER_INT_CH2);

    timer_enable(TIMER2);
}
int main(void)
{
        timer2_init();
        while(1);
}
void TIMER2_IRQHandler(void)
{
   if(timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_CH0)){
       timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH0);
                        //处理正交编码信号
         }
   if(timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_CH2)){
       timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_CH2);
                        //处理过零点信号       
   }

}


使用特权

评论回复
| 2020-11-29 12:13 | 显示全部楼层
楼主解决了吗?我也是遇到同样问题,原来STM32挺容易就配置好了, 我用GD32F330, 整了一周了都没搞定

使用特权

评论回复
| 2020-11-29 17:50 | 显示全部楼层
记得很久以前调过编码器,就是寄存器不同而已……对照着TIMER的固件库看看就行了

使用特权

评论回复
| 2020-11-30 08:54 | 显示全部楼层
要不要用中断,由你自己的应用需求来定,只要配置了编码器模式,计数值就是硬件计数的,和STM32是一样的

使用特权

评论回复
| 2021-1-8 19:48 | 显示全部楼层
                            /* TIM3 clock enable */       
                rcu_periph_clock_enable(RCU_TIMER3);
               
                /**TIM3 GPIO Configuration
                PD12     ------> TIM3_CH1
                PD13     ------> TIM3_CH2
                */       
                gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12|GPIO_PIN_13);
                gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12|GPIO_PIN_13);       
                               
                gpio_af_set(GPIOD, GPIO_AF_2, GPIO_PIN_12|GPIO_PIN_13);
               
                timer_deinit(TIMER3);       

                 timer_initpara.period = 2000;
                timer_initpara.prescaler = 0;
                timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
                timer_initpara.counterdirection  = TIMER_COUNTER_UP;
                timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
                timer_initpara.repetitioncounter = 0;       
               
                GD_TIM_Encoder_MspInit(TIMER3);       
                timer_init(TIMER3, &timer_initpara);
               
                /* TIMER3 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    = 0x05;
                timer_input_capture_config(TIMER3,TIMER_CH_0,&timer_icinitpara);               
                timer_input_capture_config(TIMER3,TIMER_CH_1,&timer_icinitpara);
               
                timer_quadrature_decoder_mode_config(TIMER3,TIMER_ENCODER_MODE1,TIMER_IC_POLARITY_RISING,TIMER_IC_POLARITY_RISING);
               
                timer_interrupt_flag_clear(TIMER3, TIMER_INT_FLAG_CH0);
                timer_interrupt_flag_clear(TIMER3, TIMER_INT_FLAG_CH1);               
                timer_interrupt_enable(TIMER3, TIMER_INT_UP);
                timer_interrupt_enable(TIMER3, TIMER_INT_CH0 |TIMER_INT_CH1);       
               
                /* auto-reload preload enable */
//                timer_auto_reload_shadow_enable(TIMER3);
                timer_enable(TIMER3);

使用特权

评论回复
| 2021-1-8 19:49 | 显示全部楼层
亲测有效,不用中断,然后用timer_counter_read(TIMER3)读取值即可

使用特权

评论回复
| 2021-1-21 16:04 | 显示全部楼层
93162555 发表于 2021-1-8 19:49
亲测有效,不用中断,然后用timer_counter_read(TIMER3)读取值即可

请问,
可以提供完整代码?

使用特权

评论回复
| 2021-1-21 16:04 | 显示全部楼层
原厂不提供编码器的代码吧

使用特权

评论回复
| 2021-1-22 10:42 | 显示全部楼层
Silenus 发表于 2021-1-21 16:04
请问,
可以提供完整代码?

编码器可以参考https://blog.csdn.net/weixin_42831633/article/details/94641573,你把里面的读取替换成GD的就行,配置代码就是这样的

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表