本次实验使用了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)
|