利用旋钮控制小灯亮度

news/2025/10/9 21:35:36/文章来源:https://www.cnblogs.com/nailongtch/p/19132042

利用旋钮控制小灯亮度

1、初始化

该项目以复刻旋钮的项目为基础进行扩展,前置步骤请参考以下帖子:复刻江协旋钮控制模块

(1)PWM配置

  • 将时钟按照如下方式重新配置
    img
  • 使能TIM3计时器
    img

(2)写入代码

  • 在主循环外启用计时器的PWM模式
	HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);/* USER CODE END 2 */

2、写入代码

(1)OLED显示

  • 已知旋钮转动一圈会触发20次,所以在该项目中需要在转满一圈后清零相对位置
/*** @brief This function handles EXTI line1 interrupt.*/
void EXTI1_IRQHandler(void)
{/* USER CODE BEGIN EXTI1_IRQn 0 */if(__HAL_GPIO_EXTI_GET_FLAG(PinA_Pin)){if(Flag == false){FlagToggle();//判断是否转满一圈if(Counter >= 20)Counter = 0;Counter++;}		}/* USER CODE END EXTI1_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(PinA_Pin);/* USER CODE BEGIN EXTI1_IRQn 1 *//* USER CODE END EXTI1_IRQn 1 */
}

同理,在PinB的中断处理函数中也需加入是否转满的判断

/*** @brief This function handles EXTI line2 interrupt.*/
void EXTI2_IRQHandler(void)
{/* USER CODE BEGIN EXTI2_IRQn 0 */if(__HAL_GPIO_EXTI_GET_FLAG(PinB_Pin)){if(Flag == false){FlagToggle();if(-Counter >= 20)Counter = 0;Counter--;}		}/* USER CODE END EXTI2_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(PinB_Pin);/* USER CODE BEGIN EXTI2_IRQn 1 *//* USER CODE END EXTI2_IRQn 1 */
}/* USER CODE BEGIN 1 */
int16_t GetCounter(){return Counter;
}
void FlagToggle(void){Flag = !Flag;
}
bool ReturnFlag(void){return Flag;
}

(2)PWM部分

  • 在项目放置头文件和源文件的地方分别加入LED.hLED.c
    img
  • LED.h内写入相应函数的声明
#ifndef __LED_H
#define __LED_H
void SetValue(int32_t Value);#endif
  • 因为PWM的预装载值为20000,所以装载值计算按照如下公式:
    \(预装载值 \div 2 + 旋钮相对位置 \times 500\)
  • 因此,LED.c内部代码如下:
#include "tim.h"
#include "LED.h"
// 设置重装载值的函数
void SetValue(int32_t Value){__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, (Value * 500 + 10000));
}

3、流程图

(1)主程序部分

img

(2)中断部分

graph TD;subgraph EXTI_line1Begin((触发中断)) ---> PendSource{判断触发来源是否为PinA}PendSource --> |是|PendFlag{判断当前是否空闲}PendSource --> |否|End[退出中断]PendFlag --> |否|EndPendFlag --> |是|Toggle[翻转标识位] ---> PendRound{判断是否转满一圈}PendRound --> |否|Operation[对相对位置进行操作]PendRound --> |是|Clear[清零相对位置]Clear ---> EndOperation ---> Endendsubgraph EXTI_line2Begin1((触发中断)) ---> PendSource1{判断触发来源是否为PinB}PendSource1 --> |是|PendFlag1{判断当前是否空闲}PendSource1 --> |否|End1[退出中断]PendFlag1 --> |否|End1PendFlag1 --> |是|Toggle1[翻转标识位] ---> PendRound1{判断是否转满一圈}PendRound1 --> |否|Operation1[对相对位置进行操作]PendRound1 --> |是|Clear1[清零相对位置]Clear1 ---> End1Operation1 ---> End1end

4、实验效果

  • 顺时针转动,亮度增加
    img
  • 逆时针转动,亮度减小
    img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/933864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ai 对话框一直往下滚可能要成为过云,当初只是为了快速现实ai的演示界面而己,是该走入正题 了

谢双军以为:在AI发展初期,为了迅速展示其能力,开发者采用了一个简易的对话窗口设计,消息不断向下堆叠。这种设计是临时性的,因为当时的主要精力集中在功能实现上,而非优化用户体验。随着AI技术的成熟,我们计划重…

脚手架安全巡检智能化!AI 让隐患识别更精准、整改更高效

在建筑施工脚手架巡检场景中,传统人工巡检模式正面临多重痛点:全靠肉眼排查钢管开裂、锈蚀,易因经验不足或视觉疲劳漏检;材料堆积仅靠人工记录,无法快速判断是否占用施工通道、是否超过安全高度;拍摄环境复杂(光…

实用指南:provthrd.dll propsys.dll profsvc.dll profprov.dll procinst.dll prntvpt.dll prnntfy.dll

实用指南:provthrd.dll propsys.dll profsvc.dll profprov.dll procinst.dll prntvpt.dll prnntfy.dllpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…

37 ACwing 298 Fence 题解

Fence 题面 有 N 块木板从左到右排成一行,有 M 个工匠对这些木板进行粉刷,每块木板至多被粉刷一次。 第 i 个木匠要么不粉刷,要么粉刷包含木板 \(S_i\) 的,长度不超过 \(L_i\) 的连续的一段木板,每粉刷一块可以得…

35 ACwing 297 The Battle Chibi 题解

The Battle of Chibi 题面 给定一个长度为 \(N\) 的序列 \(A\) ,求 \(A\) 有多少个长度为 \(M\) 的严格递增子序列 \(1 \le M \le N \le 1000,\ |A_i| \le 10^9\) 答案对 \(10^9\) 取模 题解 设 \(f(i,j)\) 表示以 \(…

一款由网易出品的免费、低延迟、专业的远程控制软件,支持手机、平板、Mac 、PC、TV 与掌机等多设备远控电脑!

前言 在多设备协同日益普及的今天,高效、流畅的远程控制已成为工作与生活的刚需。网易出品的这款免费远程控制软件,凭借低延迟、高画质与跨平台兼容性,轻松实现手机、平板、Mac、PC、TV 乃至掌机对电脑的远程操控,…

计划管理

计划管理核心是围绕 “期货工具” 与 “现货业务” 的协同,提前制定明确的操作计划,确保期现两端(如现货采购 / 销售、期货套保 / 交割)目标一致、节奏匹配,本质是通过 “事前规划” 降低期现错配风险,提升业务收…

苍穹外卖第二天(Nginx如何配置、MD5加密)

一、关于Nginx 1、Nginx反向代理的配置方式。监听的端口号是80,当请求路径中含有“api”这种字符串时,Nginx就会将请求转发给后面的地址,并且在/后面拼接上请求中后面的employee/login 2、Nginx负载均衡的配置方式。…

aardio跨窗口传递变量

aardio跨窗口传递变量把需要传递的变量写在用户库里, 右键用户库,新建WindowParamnamespace WindowParam{add_type="" }然后在需要使用的窗口里import WindowParam WindowParam.add_type参考

AI在简单视觉推理谜题中的挑战

ARC Prize测试通过看似简单的视觉谜题评估机器的推理、抽象和泛化能力,这些能力被认为是实现通用人工智能的核心要素。本文介绍了该基准测试的设计理念及其在衡量AI进展中的重要性。ARC Prize挑战:AI在简单谜题中的困…

自动引入的element-plus覆盖tailwindcss样式冲突解决方法

用el-card时发现自带的padding非常烦人,又不想通过:deep修改就想着tailwind一把梭,参考过github上issue的解决方案但好像那些都是想让element去覆盖tailwindcss的,想到antd有对应的解决方案便参考其文档 antd文档ht…

已严肃完成今日96种状态的超级神仙DP大学习

传送门 官方题解做法。 注:因为黑格子上只能放黑棋,白格子上只能放白棋,所以有的时候没必要区分是格子还是棋 Step 1 - 找性质对于一个极大棋子联通块,我们可以在它左边或者右边放一个棋子(具体来讲选择对应位置格…

P3388 【模板】割点(割顶) tarjan

解题思路 割点(割顶):在一个无向图中,如果删除某个顶点以及与之相连的所有边后,图的连通分量数量增加,则该顶点称为割点。 Tarjan算法求割点的核心思想:使用深度优先搜索遍历图维护两个数组:dfn[i]:顶点i的深…

new day

今日进行离散数学作业,进行四级备考,打算明日继续复习java。过完国庆有些懒散,努力调整状态。

数据结构——受限线性表之栈 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

vLLM 吞吐量优化实战:10个KV-Cache调优方法让tokens/sec翻倍

GPU 性能没问题,模型也训练得不错,但 token 吞吐量就是上不去?问题多半出在 KV-cache 上。本文整理了 10 个实际可用的优化方向,都是能直接上生产环境的那种。https://avoid.overfit.cn/post/321dd7c3c76444b59e97…

Linux之周期性定时任务实践

一、每日凌晨1点,删除指定文件 1.首先选择一个目录创建两个文件。我这里是/home/zxj touch bat1 bat22.进入任务编辑界面 crontab -e 3.插入任务并保存退出 0 1 * * * rm -f /home/zxj/bat1 0 1 * * * 表示 “每天凌晨…

MyBatis-Plus 的 QueryWrapper 应用以及在内存中处理JSON数组字符串匹配

需求分析: 咨询师筛选: 列表浏览:展示“全部咨询师”列表,包含姓名、从业时长、擅长领域、用户好评率等基础信息;精准筛选:支持按“困扰类型(如焦虑、婚姻家庭)”“性别”“咨询方式”“流派”标签筛选;关键词…

P9461 「EZEC-14」众数 II

思路:若区间包含的\(a_i\)完整,最小众数为\(1\);若\(a_l\)只有后缀\([x,a_l]\)且\(a_r\)只有前缀\([1,y]\),当且仅当\(\forall i \in [l,r], a_i \ge x\)时最小众数是\(x\),否则为\(1\)。为方便求解,先求出所有最…

从 ZooKeeper 到 ELK:分布式中间件与日志分析系统全解析 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …