最近闲着没事干找到了一块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版权协议,转载请附上原文出处链接和本声明。