本次实验使用了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, 下载次数: 7)
|