一、工程配置
关于编码器的介绍很多博主有介绍,这里就不再多说,直接上工程配置。1.选择定时器2作为编码定时器,直接下拉到Combined Channels选择Encoder Mode。2.选择双通道编码模式。3.设置触发方式和滤波系数Input Filter(0-15)。预分频系数和重装载值可以先设置为0和4294967295(最大),如果发现编码器输出值不对可以适当修改预分频系数。
实物图中将CLK和DT接到定时器对应的GPIO上即可
二、旋转方向和编码数值获取
打开生成的代码,在main中添加简单代码就可以读取编码器值。
先开启定时器编码器通道(双通道),在while中获取旋转方向和编码值,通过printf输出到串口调试助手。
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_1);
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//获取旋转方向
uint8_t dir=__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2);
//打印编码值和旋转方向
printf("%d,%d\r\n",TIM2->CNT,dir);
HAL_Delay(100);
}
/* USER CODE END 3 */
}
三、效果验证
打开串口调试助手,旋转编码器,观察编码值和旋转方向,可以使用定时器定时读取编码值可以计算旋转速度,可以应用于编码电机等。