GD32F303编码器数据读取

最近闲着没事干找到了一块GD32F303的最小系统和一个编码器,寻思着想把这个编码器做一个无极调速开关,奈何网上找的例程都是缺胳膊少腿的用不了,只能花点时间去研究配置一个读取编码器的程序,把它记录下来。

具体配置直接附代码,我相信能搜到我这篇博客的基本上都是有点知识储备的了,看代码应该都能理解。

encoder.c文件

#include "encoder.h"
#include "usart.h"
void Encoder_Init(void)         //编码电机速初始化  
{ 
	MotorEncoder_Init(); 
}

static void encoderGPIOConfiguration(void)
{
    /* TIM2 clock enable */
    rcu_periph_clock_enable(RCU_TIMER2);
    rcu_periph_clock_enable(RCU_GPIOA);
	//使能复用时钟
    rcu_periph_clock_enable(RCU_AF);
	
    /**TIM2 GPIO Configuration
    PA6     ------> TIM2_CH1
    PA7     ------> TIM2_CH2 */
  gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);
}
/*------------------------------------------------------------------------------
* Function Name : encoderTimerConfiguration
* Description   : Encoder timer config function
* Input         : None
* Output        : None
* Return        : None
------------------------------------------------------------------------------*/
static void encoderTimerConfiguration(void)
{
	  timer_parameter_struct timer_initpara;
    timer_ic_parameter_struct timer_icinitpara;
	
    timer_deinit(TIMER2);

    timer_initpara.period = ENCODER_TIM_PERIOD;
    timer_initpara.prescaler = ENCODER_TIM_PSC;//预分频
    timer_initpara.alignedmode = TIMER_COUNTER_EDGE;//对齐方式
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;//配置计数方向为向上计数
    timer_initpara.clockdivision = TIMER_CKDIV_DIV1;//时钟不分频
    timer_initpara.repetitioncounter = 0;//重载
    timer_init(TIMER2, &timer_initpara);

    /* TIMER3 CH0 input capture configuration */
    timer_icinitpara.icfilter    = 0x05;//配置滤波器
    timer_icinitpara.icpolarity  = TIMER_IC_POLARITY_RISING;
    timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
    timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
 

    timer_input_capture_config(TIMER2, TIMER_CH_0, &timer_icinitpara);
    timer_input_capture_config(TIMER2, TIMER_CH_1, &timer_icinitpara);

    timer_quadrature_decoder_mode_config(TIMER2, TIMER_ENCODER_MODE2,
																				TIMER_IC_POLARITY_BOTH_EDGE, TIMER_IC_POLARITY_BOTH_EDGE);
																				
		timer_slave_mode_select(TIMER2,TIMER_ENCODER_MODE2);
		
    timer_interrupt_enable(TIMER2, TIMER_INT_UP);
		//timer_interrupt_enable(TIMER2, TIMER_INT_CH0);
    nvic_irq_enable(TIMER2_IRQn, 1, 1);//使能中断并设置优先级
    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER2);
		
    timer_enable(TIMER2);
	
}
void MotorEncoder_Init(void)
{
encoderGPIOConfiguration();
encoderTimerConfiguration();
}
#define ENCODER_TIM_PSC  0               /*计数器分频*/
#define ENCODER_TIM_PERIOD  65535        /*计数器最大值*/

 主函数

void task3_task(void *pvParameters)
{
	  while(1)
    {
		printf("Encoder reads data: = %d ,dir: %d\r\n",TIMER_CNT(TIMER2),(TIMER_CTL0(TIMER2)&TIMER_CTL0_DIR)==TIMER_CTL0_DIR);			
		vTaskDelay(100);
	}
}

程序编译下载到板子,最后用串口打印出来结果如下图


版权声明:本文为qq_48453068原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。