[活动专区] 【AT-START-F425测评】4、ENCODE

[复制链接]
 楼主| lisingch 发表于 2022-3-15 22:39 | 显示全部楼层 |阅读模式
      本次实验使用了TMR3的编码器模式检测EC11旋转编码器的正、反转,对旋转脉冲进行计数,将结果通过串口传至PC端进行显示。

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

二、程序实现
      实验程序在例程基础上修改面成,增加了中断,EC11每次旋转即会产生中断事件。
2022-03-15_223619.bmp
2022-03-15_202720.bmp
  1. void encode_config(void)
  2. {
  3.         gpio_init_type gpio_init_struct;

  4.   crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);
  5.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  6.   
  7.   gpio_init_struct.gpio_pins = GPIO_PINS_6 | GPIO_PINS_7;
  8.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  9.   gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  10.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  11.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  12.   gpio_init(GPIOA, &gpio_init_struct);
  13.   
  14.   gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE6, GPIO_MUX_1);
  15.   gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_1);
  16.   
  17.   tmr_base_init(TMR3, 1, 0);
  18.   tmr_cnt_dir_set(TMR3, TMR_COUNT_UP);
  19.   
  20.   tmr_encoder_mode_config(TMR3,
  21.                                                                                                         TMR_ENCODER_MODE_C,
  22.                                                                                                         TMR_INPUT_RISING_EDGE,
  23.                                                                                                         TMR_INPUT_RISING_EDGE);

  24.         nvic_irq_enable(TMR3_GLOBAL_IRQn, 0, 0);
  25.         tmr_interrupt_enable(TMR3, TMR_OVF_INT, TRUE);
  26.        
  27.   tmr_counter_enable(TMR3, TRUE);
  28. }
  1. void TMR3_GLOBAL_IRQHandler(void)
  2. {
  3.         static int8_t num;
  4.         if(tmr_flag_get(TMR3,TMR_OVF_FLAG) != RESET)
  5.         {
  6.                 tmr_flag_clear(TMR3,TMR_OVF_FLAG);
  7.                 ec11_flag=1;
  8.         }
  9. }
  1. int main(void)
  2. {
  3.         uint8_t counter;
  4.         static int8_t num=0;
  5.        
  6.   system_clock_config();

  7.   at32_board_init();
  8.   
  9.         encode_config();
  10.        
  11.   uart_print_init(115200);
  12.        
  13.         printf("EC11 test\r\n");
  14.        
  15.   while(1)
  16.   {
  17.                 if(ec11_flag)
  18.                 {
  19.                         ec11_flag=0;
  20.                         counter = tmr_counter_value_get(TMR3);

  21.                         if(counter)
  22.                         {
  23.                                 num++;
  24.                                 if(num==100)
  25.                                         num=0;
  26.                         }
  27.                         else
  28.                         {
  29.                                 num--;
  30.                                 if(num<0)
  31.                                         num=99;
  32.                         }
  33.                         printf("num = %d\r\n",num);
  34.                 }
  35.   }
  36. }


三、实验结果
2022-03-15_201742.bmp
      测试中发现有失步现象,暂时还没找到问题所在。

encoder_tmr3.rar (291.06 KB, 下载次数: 7)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

15005

帖子

19

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