资讯详情

STM32CubeMX学习——旋转编码器模块

前言

雨打灯难灭,风吹色更明。 若飞上天空,定制月边星——李白的《咏萤火虫》


一、介绍旋转编码器

旋转编码器是一种可以左右旋转,也可以按下,也可以按下旋转设备,通过左右旋转对应不同开关的内部,同时也可以旋转,旋转编码器可以实现非常复杂的功能,简单的左右旋转可以调整音量、亮、暗功能,按钮可以发挥普通按钮的作用,同时左右旋转可以区分普通旋转按钮,因此,旋转编码器可以同时调整音量和亮度(例如),不同的功能也可以通过不同的速度实现。综上所述,它的功能非常复杂和有用。

旋转编码器用于测量转速和配合 PWM 该技术可以实现快速调速装置。光电旋转编码器可以通过光电转换将输出轴的角位移、角速度等机械量转换为数字输出的相应电脉冲(REP)

  • 电压输出、集电极开路输出、推拉互补输出和长期驱动输出。
  • 有轴型:轴型可分为夹紧法兰型、同步法兰型和伺服安装型。 轴套型:轴套型可分为半空型、全空型和大口径型。 光电、磁电和触点刷。 编码器可分为增量式和绝对式。

旋转编码器的原理和特点

1.增量编码器

它是将位移转换为周期性电信号,然后将电信号转换为计数脉冲,用脉冲数表示位移的大小。增量编码器,又称正交编码器,通过两条信号线的脉冲输出进行数据处理。输出脉冲对应于增量位移。每次编码器旋转一定位移,都会产生脉冲信号。,达到的效果(v = s / t),通过 计算距离的效果的效果(s = n * d)

顺时针运动 逆时针运动
A B A B
1 1 1 1
0 1 1 0
0 0 0 0
1 0 0 1


二、引脚配置

我使用的旋转编码器有五个引脚,可能还有其他不同类型的引脚, 这五个引脚分别为GND, VCC( ), SW, DT, CLK,具体的引脚已经在简介的图中标明了。

  • VCC:接电源正极 3.3~5V
  • GND:接地;
  • SWPA7(TIM3_CH2)
  • DTPA6(TIM3_CH1)
  • CLKPA5

旋转编码器的接口 STM32的IO口 设置的工作模式
VCC VCC(3.3V) -
GND GND -
SW(Switch:开关) PA7 定时器编码模式
DT(DT:数据) PA6 定时器编码模式
CLK(CLK:时钟) PA5 GPIO_Mode_IPU(上拉输入模式)
- PA9 TX(USART1 串口1通信)
- PA10 RX(USART1 串口1通信)

三、新建工程

1.打开STM32CubeMX软件,点击“新建工程”

2. 选择 MCU 和封装

3.配置时钟

博客网站-RCC学习

4.配置调试模式

5.串口(USART1)配置

6.定时器(TIM)配置

7.生成代码

输入项目名称和路径。 选择应用的IDE,开发环境MDK-ARM V5

  • 所有初始化代码都生成在 main.c
  • 初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。

8.构建工程

芯片进行选择:


四、编写代码

main.c文件中,添加一下代码:

  • 重写fgetfput函数:,添加头文件<stdio.h>
/* USER CODE BEGIN Includes */
#include<stdio.h>
/* USER CODE END Includes */
/**
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
 
/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

#include "encoder.h"
#include "encoder.h"

uint8_t lock;    //旋钮死标志(1表示锁死)
uint16_t count; //计数标志

uint8_t ENCODER_READ(void)
{
  uint8_t key = 0;       //存放按键的值
  uint8_t level;         //记录按钮另一端的电平值
  
  if(HAL_GPIO_ReadPin(encoder_port_A, encoder_right) && HAL_GPIO_ReadPin(encoder_port_A, encoder_left)) //读取此时
  {
    lock = 0;  //判断旋钮是否锁死
  }
  if(!HAL_GPIO_ReadPin(encoder_port_A, encoder_right) && lock == 0) //判断是否旋转按钮,同时判断是否有按钮锁死
  {
    HAL_Delay(100);
    
    level = HAL_GPIO_ReadPin(encoder_port_A,encoder_left);       //把旋钮另一端电平状态记录
    
    HAL_Delay(13);  //延时
    
    if(!HAL_GPIO_ReadPin(encoder_port_A, encoder_right))     //去抖
    {
      if(level == 0)
      {
        key = 1;  //右转
      }
      else
      {
        key = 2;  //左转
      }
      count = 0; //初始锁死判断计数器
      while(!HAL_GPIO_ReadPin(encoder_port_A, encoder_right) && count < 60000)  //等待放开旋钮,同时累加判断锁死
      {
        count++;
        lock = 1;
        HAL_Delay(200);
      }
    }
  }
  
  if(!HAL_GPIO_ReadPin(encoder_port_A,encoder_down) && lock == 0)
  {
    HAL_Delay(20);
    if(!HAL_GPIO_ReadPin(encoder_port_A,encoder_down))    //消抖
    {
      key=3;
    }
  }
  return key;
}
#ifndef _ENCODER_H_
#define _ENCODER_H_

#include "main.h"
#include "tim.h"


#define encoder_port_A    GPIOA

#define encoder_left      GPIO_PIN_6	//定义IO接口,DT, 旋钮左转
#define encoder_right     GPIO_PIN_5	//定义IO接口,CLK,旋钮右转
#define encoder_down      GPIO_PIN_7	//定义IO接口,SW, 旋钮按下

uint8_t ENCODER_READ(void);     //接口读取值

#endif

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
  int b;
  /* 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_TIM3_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  printf("encoder is ready:\r\n");
  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    b = ENCODER_READ(); //读出旋转器编码器值
    
    HAL_Delay(1000);  
    
    if(b==1)
    {
      printf("编码器右转\r\n");
    }
    if(b==2)
    {
      printf("编码器左转\r\n");
    }
    if(b==3)
    {
      printf("编码器按下\r\n");
    }

  }
  /* USER CODE END 3 */
}


五、实验结果

谢谢阅读!!!

标签: 218辩色型发射传感器位移传感器pa1c

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台