当前位置: 首页 > news >正文

【STM32】增量型旋钮编码器

1.增量型旋钮编码器原理

该编码器有A,B两相,当顺时针旋转时
在这里插入图片描述
B相会提前A相90度(匀速转的时候),也就是A相上升沿时,B相对应高电平,计数器会+1,A相下降沿时,B相为低电平时,计数器也会+1;
当逆时针转时
在这里插入图片描述
B相会落后A相90度(匀速转的时候),也就是A相上升沿时,B相对应低电平,计数器会-1,A相下降沿时,B相为高电平时,计数器也会-1;
编码器旋转一圈,会有20个脉冲信号,360°分20,一个脉冲是18°。
而单片机有他的编码器模式,只需要将编码器的A,B相接入TI1,TI2。

2.配置实现编码器调节灯亮度以及屏幕上进度条的进度

在这里插入图片描述
根据原理图可知编码器的A,B相分别对应的是PA8,PA9口。
在这里插入图片描述
在这里插入图片描述
而PA8,PA9分别对应着定时器1的通道1和通道2
在这里插入图片描述
在这里插入图片描述
将PB_15设置为输入模式,使用编码器按键来切换灯的颜色
在这里插入图片描述
这三个口分别是定时器3的通道1,2,3
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2a751643740a4108b941ecdb51c4eb2b.png
i2c配置要使用显示屏
在这里插入图片描述
代码:

int count=0;
char message[50]="";
int main(void)
{

 


  
  OLED_Init();
  HAL_TIM_Encoder_Start(&htim1,TIM_CHANNEL_ALL);//开启定时器1的编码器
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//先开启定时器3的通道1,蓝灯
 
  while (1)
  {
	  count=__HAL_TIM_GET_COUNTER(&htim1);
	  if(count>60000)//逆时针
	  {
		  count=0;

		  __HAL_TIM_SET_COUNTER(&htim1,0);

	  }
	  else if(count>100)//顺时针
	  {
		  count=100;//count也要作为灯的占空比0~100
		  __HAL_TIM_SET_COUNTER(&htim1,100);

	  }

	  __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,count);//只是改变蓝灯占空比
       OLED_NewFrame();
       sprintf(message,"count:%d",count);
       OLED_PrintString(10,10,message, &font16x16, OLED_COLOR_NORMAL);
       OLED_DrawRectangle(10,30, 100,10,OLED_COLOR_NORMAL);//绘制进度条外边框(宽102,高10)
       OLED_DrawFilledRectangle(10,30 ,count, 10, OLED_COLOR_NORMAL);//进度条,宽随count变化0~100
	   OLED_ShowFrame();
 
  }
 
}

旋转编码器1

根据视频我们发现有两个问题
1.每次扭动,count+2,或-2
2.顺时针是减,逆时针是+。
因为对上下边沿都敏感,A相的一个脉冲会计数两次,我们采用2分频即可
在这里插入图片描述
对于顺时针还是逆时针,我们需要将A相或B相任意一个反相即可
在这里插入图片描述

旋转编码器2

然后需要加旋转编码器的按键来切换三个灯,每次按下按钮,需要停止对应定时器通道下的PWM,开启另一个,在此之前,我们需要将PB15配置上拉模式,要不然,按钮不好识别
在这里插入图片描述

int count=0;
char message[50]="";
uint32_t chan[3]={TIM_CHANNEL_1,TIM_CHANNEL_2,TIM_CHANNEL_3};
int ins=0;
int main(void)
{

  

  OLED_Init();
  HAL_TIM_Encoder_Start(&htim1,TIM_CHANNEL_ALL);//开启定时器1的编码器
  HAL_TIM_PWM_Start(&htim3,chan[ins]);//先开启定时器3的通道1,蓝灯
 
  while (1)
  {
	  count=__HAL_TIM_GET_COUNTER(&htim1);
	  if(count>60000)//逆时针
	  {
		  count=0;

		  __HAL_TIM_SET_COUNTER(&htim1,0);

	  }
	  else if(count>100)//顺时针
	  {
		  count=100;//count也要作为灯的占空比0~100
		  __HAL_TIM_SET_COUNTER(&htim1,100);

	  }
	  
	   if(HAL_GPIO_ReadPin(Key_GPIO_Port,Key_Pin)==GPIO_PIN_RESET)
	   {
		   HAL_Delay(10);
		   if(HAL_GPIO_ReadPin(Key_GPIO_Port,Key_Pin)==GPIO_PIN_RESET)
		   {
			   
			   HAL_TIM_PWM_Stop(&htim3,chan[ins]);//关闭当前通道的PWM
			   ins=(ins+1)%3;//通道下标
			   HAL_TIM_PWM_Start(&htim3,chan[ins]);//打开下一个通道的PWM
			   while(HAL_GPIO_ReadPin(Key_GPIO_Port,Key_Pin)==GPIO_PIN_RESET);
			   
			   
		   }
		   
		   
		   
		   
	   }
	  
	  
	  
	  
	  
	  
	  
         
	  __HAL_TIM_SET_COMPARE(&htim3,chan[index],count);
       OLED_NewFrame();
       sprintf(message,"count:%d",count);
       OLED_PrintString(10,10,message, &font16x16, OLED_COLOR_NORMAL);
       OLED_DrawRectangle(10,30, 100,10,OLED_COLOR_NORMAL);//绘制进度条外边框(宽102,高10)
       OLED_DrawFilledRectangle(10,30 ,count, 10, OLED_COLOR_NORMAL);//进度条,宽随count变化0~100
	   OLED_ShowFrame();
  }
 
}

旋转编码器3

相关文章:

  • 泛型 类 接口 方法 通配符
  • AI前端开发的学习成本与回报——效率革命的曙光
  • 初阶c语言(循环语句习题,完结)
  • AI前端开发的崛起与ScriptEcho的助力
  • css面试题
  • 通过IDEA傻瓜式快速分析java堆内存快照
  • 使用 Docker 安装 Open WebUI 并集成 Ollama 的 DeepSeek 模型
  • React 低代码项目:组件设计
  • Golang的并发编程案例详解
  • Linux相关知识点(持续更新)
  • 【戒抖音系列】短视频戒除-1-对推荐算法进行干扰
  • PostgreSQL错误: 编码“UTF8“的字符0x0xe9 0x94 0x99在编码“WIN1252“没有相对应值
  • YOLO11 【三】 【速通 训练+推理+导出 续】
  • 【MySQL】InnoDB单表访问方法
  • 【逆向工程】破解unity的安卓apk包
  • 如何使用DHTMLX Scheduler的拖放功能,在 JS 日程安排日历中创建一组相同的事件
  • AI软件外包需要注意什么 外包开发AI软件的关键因素是什么 如何选择AI外包开发语言
  • 基于 STM32 的病房监控系统
  • 数据库数据恢复—MongoDB丢失_mdb_catalog.wt文件导致报错的数据恢复案例
  • 【含开题报告+文档+PPT+源码】基于Spring+Vue的拾光印记婚纱影楼管理系统
  • 马上评丨岂能为流量拿自己的生命开玩笑
  • Manus向全球用户开放注册
  • 男子退机票被收90%的手续费,律师:虽然合规,但显失公平
  • 教育部基础教育教指委:小学阶段禁止学生独自使用开放式内容生成功能
  • 上海消防全面推行“检查码”,会同相关部门推行“综合查一次”
  • 安徽亳州涡阳县司法局党组书记刘兴连落马