打印
[活动专区]

【AT-START-F425测评】4、ENCODE

[复制链接]
870|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
      本次实验使用了TMR3的编码器模式检测EC11旋转编码器的正、反转,对旋转脉冲进行计数,将结果通过串口传至PC端进行显示。

一、知识准备
       AT32F425R8T7片上的定时器资源非常丰富,这其中包括1个高级定时器(TMR1);7个通用定时器(TMR2、TMR3、TMR13、TMR14、TMR15、TMR16、TMR17);2个基本定时器(TMR6、TMR7)。本次实验使用的通用定时器TMR3,这是一个16位定时器,支持向上、向下、向上/向下计数工作方式,具有4个比较、捕获通道,支持DMA及PWM输入,功能非常强大。本次实验所使用的只是TMR3中的一个小功能。





二、程序实现
      实验程序在例程基础上修改面成,增加了中断,EC11每次旋转即会产生中断事件。


void encode_config(void)
{
        gpio_init_type gpio_init_struct;

  crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);
  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  
  gpio_init_struct.gpio_pins = GPIO_PINS_6 | GPIO_PINS_7;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init(GPIOA, &gpio_init_struct);
  
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE6, GPIO_MUX_1);
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_1);
  
  tmr_base_init(TMR3, 1, 0);
  tmr_cnt_dir_set(TMR3, TMR_COUNT_UP);
  
  tmr_encoder_mode_config(TMR3,
                                                                                                        TMR_ENCODER_MODE_C,
                                                                                                        TMR_INPUT_RISING_EDGE,
                                                                                                        TMR_INPUT_RISING_EDGE);

        nvic_irq_enable(TMR3_GLOBAL_IRQn, 0, 0);
        tmr_interrupt_enable(TMR3, TMR_OVF_INT, TRUE);
       
  tmr_counter_enable(TMR3, TRUE);
}
void TMR3_GLOBAL_IRQHandler(void)
{
        static int8_t num;
        if(tmr_flag_get(TMR3,TMR_OVF_FLAG) != RESET)
        {
                tmr_flag_clear(TMR3,TMR_OVF_FLAG);
                ec11_flag=1;
        }
}
int main(void)
{
        uint8_t counter;
        static int8_t num=0;
       
  system_clock_config();

  at32_board_init();
  
        encode_config();
       
  uart_print_init(115200);
       
        printf("EC11 test\r\n");
       
  while(1)
  {
                if(ec11_flag)
                {
                        ec11_flag=0;
                        counter = tmr_counter_value_get(TMR3);

                        if(counter)
                        {
                                num++;
                                if(num==100)
                                        num=0;
                        }
                        else
                        {
                                num--;
                                if(num<0)
                                        num=99;
                        }
                        printf("num = %d\r\n",num);
                }
  }
}


三、实验结果

      测试中发现有失步现象,暂时还没找到问题所在。

encoder_tmr3.rar (291.06 KB)

使用特权

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

本版积分规则

99

主题

14989

帖子

17

粉丝