GD32,正交编码器反转时,计数脉冲丢失

[复制链接]
1342|5
 楼主| Aist2018 发表于 2023-12-28 10:10 | 显示全部楼层 |阅读模式
GD32,正交编码器反转时,计数脉冲丢失,正转时计数正常,反转读计数没了值。
  1. int16_t Encoder_Get(void)
  2. {
  3. int16_t Temp;
  4. Temp = timer_counter_read(TIMER0);
  5. //timer_counter_value_config(TIMER0, 0x7FFF);
  6. return Temp;
  7. }

这个函数反转时读的值是0,下面是编码器初始化函数
  1. void timer0_config(void)
  2. {
  3.                 timer_parameter_struct baseConfig;
  4.     timer_oc_parameter_struct  occonfig;
  5.     timer_ic_parameter_struct   ICConfig;
  6.     /* Enable TMR0 Periph Clock */
  7.     rcu_periph_clock_enable(RCU_TIMER0);
  8.     /* Config TMR0 */
  9.     baseConfig.clockdivision = TIMER_CKDIV_DIV1;
  10.     baseConfig.counterdirection = TIMER_COUNTER_UP;
  11.     baseConfig.prescaler = 0;
  12.     baseConfig.period = 4800;
  13.     baseConfig.repetitioncounter = 0;
  14.     timer_init(TIMER0, &baseConfig);
  15.                 timer_counter_value_config(TIMER0, 0);
  16.        
  17.     timer_slave_mode_select(TIMER0, TIMER_QUAD_DECODER_MODE2);
  18.     /* Encoder mode */   
  19.     timer_quadrature_decoder_mode_config(TIMER0, 3, TIMER_IC_POLARITY_RISING, TIMER_IC_POLARITY_RISING);
  20.     //timer_flag_clear(TIMER0, TIMER_FLAG_UP);

  21.     /* Enable TMR1,TMR3 Interrupt */
  22.     //timer_interrupt_enable(TIMER2, TIMER_INT_CH1);
  23.     timer_interrupt_enable(TIMER0, TIMER_INT_UP);
  24.                 //timer_interrupt_enable(TIMER0, TIMER_INT_CH1);
  25.                 nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);
  26.     //nvic_irq_enable(TIMER2_IRQn, 1,1);
  27.     nvic_irq_enable(TIMER0_UP_IRQn, 1,1);

  28.     /* Enable TMR1,TMR3 */
  29.     //timer_enable(TIMER2);
  30.     timer_enable(TIMER0);
  31. }
 楼主| Aist2018 发表于 2023-12-28 11:49 | 显示全部楼层
DIR 方向
GD32F10x 用户手册
290
0:向上计数
1:向下计数
当计数器配置为中央对齐计数模式或编码器模式时,该位只读。也不能写时钟控制寄存器0的这个位设置方向,编码器模式这位是只读。为何编码器反转计数值就为0了呢?
 楼主| Aist2018 发表于 2023-12-28 12:16 | 显示全部楼层
反转中断还产生,可是计数值是0
GlenX 发表于 2023-12-28 12:40 | 显示全部楼层
本帖最后由 GlenX 于 2023-12-28 12:41 编辑

一般将计数初值设定到一个比较高的值,
例如最大计数为32760,则初始化这个值为10000,否则减到最小0就没法再减了!
然后根据当前计数值求差即可。
 楼主| Aist2018 发表于 2023-12-28 12:48 | 显示全部楼层
没事了,向下CNT_REG的值的确为0。
flycamelaaa 发表于 2023-12-29 15:08 | 显示全部楼层
检查编码器连接
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

90

帖子

0

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