打印

GD32F303 定时器计数AB相脉冲计数不准

[复制链接]
4343|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jsrdczy|  楼主 | 2021-10-29 16:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jsrdczy 于 2021-10-29 16:37 编辑

1.配置timer1 为正交译码接收,用来计数AB相脉冲个数。
2.首先将另外两个io口接到tim的ch0和ch1上,手动拉高拉低进行计数测试,按照表中的四种情况进行手动测试1)当ch0低电平,ch1上升下降沿无计数
2)当ch0高电平,ch1上升下降沿计数+1 -1
3)ch1低电平,ch0沿变化+1 -1
4)ch1高电平,ch0沿变化+1 -1
总结:ch0 为低电平时,ch1上升沿下降沿均未计数。其余三种情况计数值正确计数。

初始化代码如下,我试过tim1和tim2,均是此现象
    rcu_periph_clock_enable(encoder->per_clk);
    rcu_periph_clock_enable(encoder->ch0_clk);
    rcu_periph_clock_enable(encoder->ch1_clk);
         
          /*configture ch0 ch1*/
    gpio_init(encoder->ch0_port, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, encoder->ch0_pin);
    gpio_init(encoder->ch1_port, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, encoder->ch1_pin);
         
          /*set irqn and enable*/
          nvic_irq_enable(encoder->encoder_irqn,4U,0U);

          timer_parameter_struct tim_initpara;
                                tim_initpara.prescaler         = 0U;
                                tim_initpara.alignedmode       = TIMER_COUNTER_EDGE;
                                tim_initpara.counterdirection  = TIMER_COUNTER_UP;
                                tim_initpara.period            = 0x7FFF;
                                tim_initpara.clockdivision     = TIMER_CKDIV_DIV1;
                                tim_initpara.repetitioncounter = 0U;        
        timer_init(gd32_device->tim_periph,&tim_initpara);
                          
        /*time encoder config*/
                          timer_quadrature_decoder_mode_config(gd32_device->tim_periph,TIMER_ENCODER_MODE2,TIMER_IC_POLARITY_RISING,TIMER_IC_POLARITY_RISING);
                          /*ic config*/
                          ic_initpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
                          ic_initpara.icpolarity = TIMER_IC_POLARITY_RISING;
                          ic_initpara.icprescaler = TIMER_IC_PSC_DIV1;
                          ic_initpara.icfilter = 0;
                          timer_input_capture_config(gd32_device->tim_periph,TIMER_CH_0,&ic_initpara);
                          ic_initpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
                          ic_initpara.icpolarity = TIMER_IC_POLARITY_RISING;
                          ic_initpara.icprescaler = TIMER_IC_PSC_DIV1;
                          ic_initpara.icfilter = 0;
                          timer_input_capture_config(gd32_device->tim_periph,TIMER_CH_1,&ic_initpara);
                        
                          /*clear update flag*/
                          timer_interrupt_flag_clear(gd32_device->tim_periph,TIMER_INT_FLAG_UP);
                          /*update source only cnt overflow*/
        timer_update_source_config(gd32_device->tim_periph,TIMER_UPDATE_SRC_REGULAR);         

                          /*update interrupt*/
                          timer_interrupt_enable(gd32_device->tim_periph,TIMER_INT_UP);
                          /*start cnt enable*/
                          timer_enable(gd32_device->tim_periph);  

希望有人能一起探探讨下,很迷惑



使用特权

评论回复
沙发
jsrdczy|  楼主 | 2021-10-29 17:04 | 只看该作者
已经找到原因了,代码问题:当计数值为0,反向计数到-1时,更新中断里需要用(圈数)*(重装载值+1)+重装载值 = 当前计数,这里乘数忘记+1。

使用特权

评论回复
评论
LSZLSZ 2021-11-4 14:19 回复TA
例程方便发一下学习学习嘛楼主,感谢感谢lsz9473@outlook.com 可有偿 
板凳
cooldog123pp| | 2021-10-30 09:55 | 只看该作者
虽然我不是很明白,但是路过了就帮忙楼主顶贴一下,希望楼主问题早日解决。

使用特权

评论回复
地板
LSZLSZ| | 2021-11-4 14:19 | 只看该作者
例程方便发一下学习学习嘛楼主,感谢感谢lsz9473@outlook.com

使用特权

评论回复
5
cyclefly| | 2021-11-6 13:41 | 只看该作者
不是很明白啊~

使用特权

评论回复
6
chenqianqian| | 2021-11-6 18:06 | 只看该作者
刚好也遇到相同问题

使用特权

评论回复
7
sparrow054| | 2021-11-9 09:54 | 只看该作者
没遇到过这种应用,感觉有点复杂啊

使用特权

评论回复
8
两只袜子| | 2021-11-9 16:26 | 只看该作者
论坛的大神哪里去了

使用特权

评论回复
9
yangxiaor520| | 2021-11-11 08:08 | 只看该作者
班主勒?快来答惑解疑。

使用特权

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

本版积分规则

2

主题

4

帖子

0

粉丝