打印

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

[复制链接]
1828|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qlkcbjyy|  楼主 | 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);
                        //处理过零点信号       
   }

}


使用特权

评论回复
沙发
hadio| | 2020-11-29 12:13 | 只看该作者
楼主解决了吗?我也是遇到同样问题,原来STM32挺容易就配置好了, 我用GD32F330, 整了一周了都没搞定

使用特权

评论回复
板凳
发呆二极管| | 2020-11-29 17:50 | 只看该作者
记得很久以前调过编码器,就是寄存器不同而已……对照着TIMER的固件库看看就行了

使用特权

评论回复
地板
sonicll| | 2020-11-30 08:54 | 只看该作者
要不要用中断,由你自己的应用需求来定,只要配置了编码器模式,计数值就是硬件计数的,和STM32是一样的

使用特权

评论回复
5
93162555| | 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);

使用特权

评论回复
6
93162555| | 2021-1-8 19:49 | 只看该作者
亲测有效,不用中断,然后用timer_counter_read(TIMER3)读取值即可

使用特权

评论回复
评论
tc0605001 2021-3-14 11:12 回复TA
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); 确定有效,我看你是在开玩笑吧,你看看你第二行写的是啥,应该是要input写成output,输入输出都搞反了如何有效 
7
Silenus| | 2021-1-21 16:04 | 只看该作者
93162555 发表于 2021-1-8 19:49
亲测有效,不用中断,然后用timer_counter_read(TIMER3)读取值即可

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

使用特权

评论回复
8
Silenus| | 2021-1-21 16:04 | 只看该作者
原厂不提供编码器的代码吧

使用特权

评论回复
9
93162555| | 2021-1-22 10:42 | 只看该作者
Silenus 发表于 2021-1-21 16:04
请问,
可以提供完整代码?

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

使用特权

评论回复
10
515192147| | 2021-3-29 15:41 | 只看该作者
您好,我们有 GDF103C8T6开发的CAN总线步进电机控制器,带一个编码器,
99个步进电机共用一根CAN总线,可Web页面调试步进电机,
可通过RS485或以太网modbus协议与PLC或计算机高速通信!!!
性价比极高,并可开放源码,详细见:

https://bbs.21ic.com/forum.php?mod=viewthread&tid=3003716&page=1&extra=#pid11352836

使用特权

评论回复
11
93162555| | 2024-1-18 14:44 | 只看该作者
时隔多年,早忘记当时还在这个地方发了贴,现在回复一下:
         if(timer_periph == TIMER3)
        {
                timer_initpara.period = arr;
                timer_initpara.prescaler = psc;
                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);
        }

主函数下初始化配置初始化
GD_TIM_Init(TIMER3, 2000, 0); /* enc */       
timer_counter_value_config(TIMER3, 500);       

然后就是监控:
    #define CMP_VALUE    (500)

    if(timer_counter_read(TIMER3) > CMP_VALUE)
    {
        //  往右旋转了       
        timer_counter_value_config(TIMER3, CMP_VALUE);

    } else if(timer_counter_read(TIMER3) < CMP_VALUE) {
       
        //  往左旋转了       
        timer_counter_value_config(TIMER3, CMP_VALUE);
    }



使用特权

评论回复
12
黑心单片机| | 2024-1-29 21:39 | 只看该作者
有硬件的啊,我用过的,直接读取计数值就行的

使用特权

评论回复
13
elephant00| | 2024-1-30 10:26 | 只看该作者
建议参考GD32的官方技术手册或数据表

使用特权

评论回复
14
两只袜子| | 2024-1-30 10:26 | 只看该作者
关于硬件计数的问题,具体取决于所选的定时器和编码器的规格以及它们的配置。一些定时器可能具有内置的硬件计数器,而其他定时器可能不具备。对于那些没有内置硬件计数器的定时器,可以通过软件或外部逻辑电路来实现计数功能。

使用特权

评论回复
15
发呆爱好者| | 2024-1-30 13:37 | 只看该作者
使用硬件编码器进行配置

使用特权

评论回复
16
呐咯密密| | 2024-1-30 14:10 | 只看该作者
必须具备啊,很好用的,在E230上实现过,计数很准,在2500线的3000RPM下不丢

使用特权

评论回复
17
中国龙芯CDX| | 2024-1-30 22:13 | 只看该作者
不用中断,然后用timer_counter_read(TIMER3)读取值即可

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝