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

从零开始学嵌入式之STM32——27.基于STM32F103C8T6MCU的寄存器方式实现按键调整PWM占空比,调整输出功率

前言本文以项目的角度出发实现了一个简单的PWM占空比调整的功能。目录一、需求二、逻辑分析1.基础调节功能2. 调节规则定义3. 边界行为规则4. 暂不支持的功能三、功能模块与接口汇总四、硬件分析1.LED硬件电路2.独立按键电路五、代码实现1.PWM输出部分1涉及到的寄存器2配置代码2.按键检测部分3.主函数六、实际效果一、需求通过按键交互实现对 LED亦可扩展至电机转速、液晶屏背光亮度等负载的输出功率 / 亮度调节控制。二、逻辑分析1.基础调节功能亮度增加按下 “亮度 ” 按键时LED 亮度按固定步长提升亮度降低按下 “亮度 -” 按键时LED 亮度按固定步长下降。2. 调节规则定义调节范围亮度值量化为 0~100 的整数对应输出功率 0%~100%其中亮度值 0LED 无输出完全熄灭亮度值 100LED 满功率输出达到最大亮度。调节步长单次按键操作的亮度调节步长为 5兼顾调节实用性与亮度变化的连续性。3. 边界行为规则当亮度值已达到上限100时继续按下 “亮度 ” 按键亮度保持 100 不变当亮度值已达到下限0时继续按下 “亮度 -” 按键亮度保持 0 不变。4. 暂不支持的功能按键长按调节功能仅支持单次按键触发单次调节。三、功能模块与接口汇总序号功能模块具体功能函数接口1独立按键模块采集按键信号当按键按下时发出中断信号void Key_Init(void);中断服务函数2定时器模块按照输入的占空比数值产生PWM方波void TIM2_Init(void);void TIM2_CH2_Set_DutyCycle(uint8_t dutycycle);四、硬件分析1.LED硬件电路2.独立按键电路根据LED硬件电路的分析要点亮LED需要将GPIO引脚拉低也就是说PWM占空比为0的时候LED亮度达到峰值。根据独立按键硬件电路的分析按键按键按下后GPIO引脚会被接入到3.3V高电平因此检测按键的引脚需要工作在下拉输入模式。根据硬件信息机芯片的特性可以统计出本次使用到的GPIO引脚及其初始的工作状态序号引脚编号工作模式接入电路1PA1复用功能推挽输出模式CNF-10;MODE-11LED1_R2PA0下拉输入模式CNF-10;MODE-00SW13PC13下拉输入模式CNF-10;MODE-00SW2五、代码实现1.PWM输出部分1涉及到的寄存器本方案使用STM32F103C8T6这款非常通用的芯片作为MCU使用芯片自带的通用定时器中的PWM输出模块。在使用寄存器配置的方式实现输出PWM方波时需要使用到的寄存器统计如下序号寄存器 / 控制位名称功能配置值说明1预分频器 (PSC)对输入的时钟信号进行分频处理7199分频系数 PSC1720072MHz 输入时钟分频后得到 10KHz 的计数器计数频率2自动重装载寄存器 (ARR)与 PSC 配合实现时钟计数的溢出周期9910KHz 频率下计数 100 次0~99溢出PWM 频率 10KHz/100100Hz3CR1-ARPE控制 ARR 的预装载功能1使能预装载功能ARR 修改后需等待更新事件才生效保证 PWM 周期稳定4CR1-DIR控制寄存器的计数方向0向上计数DIR0计数器从 0 递增到 ARR匹配 PWM 模式 1 的常规使用逻辑5CCMR1-CC2S[1:0]配置定时器通道的输入 / 输出模式00二进制 00配置通道 2 为输出模式用于 PWM 输出6CCMR1-OC2M[2:0]配置通道输出模式下的工作模式110二进制 110配置为 PWM 模式 1向上计数时计数值 CCR2 输出有效电平反之无效7CCMR1-OC2PE控制 CCR2 的预装载功能1使能预装载功能CCR2 修改后需等待更新事件生效避免占空比中途突变8CCER-CC2E使能对应的通道开始输出1使能通道 2 的 PWM 输出功能9捕获 / 比较寄存器 (CCR2)比较值与 ARR 配合计算 PWM 占空比99占空比 CCR2/ARR×100%99/99×100%100%结合硬件逻辑 LED 亮度最低熄灭10EGR-UG产生更新事件同步预装载寄存器到影子寄存器1置 1 触发更新事件硬件自动清零将 ARR/CCR2 预装载值刷入影子寄存器11CR1-CEN使能定时器开始输出 PWM 波形1定时器主使能位置 1 后计数器开始计数通道 2 输出 PWM 波形2配置代码文件名tim2.c#include tim2.h // 初始化 void TIM2_Init(void) { // 1.开启时钟 RCC-APB1ENR | RCC_APB1ENR_TIM2EN; RCC-APB2ENR | RCC_APB2ENR_IOPAEN; // 2.设置GPIOA1引脚的工作模式PWM方波输出引脚需要工作在复用功能推挽输出模式CNF-10;MODE-11; GPIOA-CRL GPIO_CRL_CNF1_0; GPIOA-CRL | GPIO_CRL_CNF1_1; GPIOA-CRL | GPIO_CRL_MODE1; // 3.设置TIM2定时器为了使得LED刷新频率可以达到合适的效果需要考虑人眼的余晖效应这里将频率定为100Hz // 3.1.设置定时器的输入频率假设ARR的值为99100次计数输出100Hz的频率在输入的时钟频率为72MHz的前提下PSC的值的计算过程为 // 输出频率 1 / [(1 / (定时器输入时钟频率 / (PSC1))) * (ARR 1)] // 由频率计算公式推到出周期计算公式 // 输出时钟周期 (1 / (定时器输入时钟频率 / (PSC1))) * (ARR 1) // 已知输如频率 72MHz ARR1 100; 计算PSC // 1/100Hz (1 / (72MHz / (PSC1))) * 100 // 72MHz / (PSC1) 100Hz * 100 // 72MHz / (100Hz * 100) (PSC1) // PSC1 7200 // PSC 7199 // 不开启预装载功能默认 TIM2-CR1 ~TIM_CR1_ARPE; TIM2-PSC 7199; // 3.2.设置预装载寄存器的值为了方便调整PWM的占空比这个值设定为99也就是计数100次后溢出。 TIM2-ARR 99; // 3.3.设置定时器的计数方向,0代表向上计数 TIM2-CR1 ~TIM_CR1_DIR; // 3.4.设置定时器的通道方向输出,CCxS-00 TIM2-CCMR1 ~TIM_CCMR1_CC2S; // 3.5.配置定时2器通道2的输出模式PWM模式1 TIM2-CCMR1 ~TIM_CCMR1_OC2M_0; TIM2-CCMR1 | TIM_CCMR1_OC2M_1; TIM2-CCMR1 | TIM_CCMR1_OC2M_2; // 3.6.配置一个默认的占空比99%因为LED是共阳因此占空比高代表LED暗。 TIM2-CCR2 99; // 3.7.开启定时器通道输出使能 TIM2-CCER | TIM_CCER_CC2E; } // 开启定时器开始输出PWM方波 void TIM2_Start(void) { TIM2-CR1 | TIM_CR1_CEN; } // 停止定时器停止输出PWM方波 void TIM2_Stop(void) { TIM2-CR1 ~TIM_CR1_CEN; } // 设置PWM占空比 void SET_DutyCycle(uint8_t dutycycle) { TIM2-CCR2 dutycycle; }头文件tim2.h#ifndef __TIME2_H #define __TIME2_H #include stm32f10x.h // 函数声明 // 初始化 void TIM2_Init(void); // 开启定时器开始输出PWM方波 void TIM2_Start(void); // 停止定时器停止输出PWM方波 void TIM2_Stop(void); // 设置PWM占空比 void SET_DutyCycle(uint8_t dutycycle); #endif2.按键检测部分文件名key.c#include key.h void Key_Init(void) { // 1.打开对应的时钟 RCC-APB2ENR | RCC_APB2ENR_IOPAEN; RCC-APB2ENR | RCC_APB2ENR_IOPCEN; RCC-APB2ENR | RCC_APB2ENR_AFIOEN; // 2.配置GPIO引脚模式 // 检测按键下拉输入模式CNF-10;MODE-00 GPIOA-CRL ~GPIO_CRL_CNF0_0; GPIOA-CRL | GPIO_CRL_CNF0_1; GPIOA-CRL ~GPIO_CRL_MODE0; GPIOC-CRH ~GPIO_CRH_CNF13_0; GPIOC-CRH | GPIO_CRH_CNF13_1; GPIOC-CRH ~GPIO_CRH_MODE13; // 初始化GPIO引脚为低电平 GPIOA-ODR GPIO_ODR_ODR0; GPIOC-ODR GPIO_ODR_ODR13; // 3.配置AFIO复用功能选择 AFIO-EXTICR[0] | AFIO_EXTICR1_EXTI0_PA; AFIO-EXTICR[3] | AFIO_EXTICR4_EXTI13_PC; // 4.配置中断触发条件上升沿触发 EXTI-RTSR | EXTI_RTSR_TR0; EXTI-RTSR | EXTI_RTSR_TR13; // 5.关闭对应的中断标志位 EXTI-IMR | EXTI_IMR_MR0; EXTI-IMR | EXTI_IMR_MR13; // 6.配置NVIC中断分组及优先级并开启中断 NVIC_SetPriorityGrouping(3); NVIC_SetPriority(EXTI0_IRQn, 3); NVIC_SetPriority(EXTI15_10_IRQn, 3); NVIC_EnableIRQ(EXTI0_IRQn); NVIC_EnableIRQ(EXTI15_10_IRQn); } // 按键中断服务函数 void EXTI0_IRQHandler(void) { // 判断中断源 if((EXTI-PR EXTI_PR_PR0) ! 0) { // 清除中断挂起标志(置1清除) EXTI-PR | EXTI_PR_PR0; // 延时消抖 Delay_nms(10); if(GPIOA-IDR GPIO_IDR_IDR0) { add 1; } } } // 按键中断服务函数 void EXTI15_10_IRQHandler(void) { // 判断中断源 if((EXTI-PR EXTI_PR_PR13) ! 0) { // 清除中断挂起标志(置1清除) EXTI-PR | EXTI_PR_PR13; // 延时消抖 Delay_nms(10); if(GPIOC-IDR GPIO_IDR_IDR13) { sub 1; } } }头文件key.h#ifndef __KEY_H #define __KEY_H #include stm32f10x.h #include delay.h // 引入外部变量 extern uint8_t add; extern uint8_t sub; // 函数声明 // 初始化 void Key_Init(void); #endif3.主函数文件名main.c#include tim2.h #include delay.h #include key.h // 定义全局变量用于检测按键的状态 uint8_t add 0; uint8_t sub 0; int main(void) { // 初始化定时器2 TIM2_Init(); // 开启定时器 TIM2_Start(); // 初始化按键 Key_Init(); // 定义占空比的初始值 int8_t dutycycle 100; while(1) { if(add) // 按下增加按键 { dutycycle 5; // 判断当前的占空比的值是否超过边界并作调整 if(dutycycle 100) { dutycycle 100; } // 清除标志位 add 0; } if(sub) // 按下增加按键 { dutycycle - 5; // 判断当前的占空比的值是否超过边界并作调整 if(dutycycle 0) { dutycycle 0; } // 清除标志位 sub 0; } // 占空比调整 SET_DutyCycle(dutycycle); } }六、实际效果https://mp.csdn.net/mp_others/manage/video

相关文章:

从零开始学嵌入式之STM32——27.基于STM32F103C8T6MCU的寄存器方式实现按键调整PWM占空比,调整输出功率

前言 本文以项目的角度出发实现了一个简单的PWM占空比调整的功能。 目录 一、需求 二、逻辑分析 1.基础调节功能 2. 调节规则定义 3. 边界行为规则 4. 暂不支持的功能 三、功能模块与接口汇总 四、硬件分析 1.LED硬件电路 2.独立按键电路 五、代码实现 1.PWM输出部…...

项目文章 | Nat Commun四川农业大学发现增强水稻的雄蕊外露和杂种种子产量的机制

杂交水稻可大幅增产,但制种效率受限于不育系的低异交率。柱头外露率是决定异交率的关键性状,然而其遗传调控机制,特别是独立于粒形调控的直接通路,尚不明确。近期,四川大学水稻研究所团队在国际知名期刊Nature Communi…...

投影仪液晶片检测专用软件|三色重合调试工具|偏色故障诊断利器

温馨提示:文末有联系方式投影仪液晶组件智能诊断软件 本款专业级测试工具专为投影仪维修场景设计,聚焦液晶片(LCD/LCoS)及配套偏光组件的性能评估,可替代传统目测与经验判断,大幅提升故障初筛效率。偏色问一…...

商业数据分析到底在分析什么?一文讲清商业数据分析的核心逻辑

在很多公司里,几乎每天都会听到一个词:商业数据分析。很多岗位招聘都会写:需要具备商业数据分析能力。 很多企业也在建设数据平台,希望通过商业数据分析提升经营效率。但如果认真问一句:商业数据分析到底是什么&#x…...

非饱和非均质土坡三维稳定性极限分析MATLAB程序功能说明

Matlab代码源码实现:复杂条件下非饱和非均质土坡三维稳定性极限分析概述 本MATLAB程序集实现了复杂条件下非饱和非均质土坡的三维稳定性极限分析,采用极限分析上限定理结合优化算法,能够准确评估考虑毛细作用、非均质特性和地震荷载的边坡稳定…...

【安卓工具实测】影视仓更新!追剧党狂喜!影视仓无广告版太香了!

影视仓v3.2.8/TVv6.1.9:跨端影视播放工具的高效体验方案 影视仓作为一款跨Android/TV端的影视播放工具,凭借轻量化设计和丰富功能成为玩机圈热门选择。 迅雷网盘 百度网盘点击链接自取! 夸克网盘点击链接自取! 核心优势体现在…...

第二篇:Xilinx 7系列FPGA详解——从Spartan到Virtex

引言Xilinx的7系列FPGA采用统一的28nm架构,覆盖了从低功耗、低成本到超高带宽、高逻辑密度的广阔应用范围。无论是工业控制、消费电子,还是通信基础设施、航空航天,7系列都能提供合适的解决方案。本文将详细介绍该系列的四个成员:…...

实测SpeedAI等三个平台的降论文AI率效果!哪个工具网站更好用性价比更高?

实测零感AI 、嘎嘎降AI和比话AI的降论文AI率效果!哪个工具网站更好用性价比更高? 最近后台快被私信炸毁了,清一色都是同一个问题:“论文AI率90%,学校用知网查,有没有靠谱的降AI工具?”作为一个帮…...

西门子S7系列PLC C#上位机通信系统功能说明文档

C#编写西门子S7系列PLC上位机通信,ⅤS2017编写,涵盖读写寄存器,中间继电器,外部IO读写。 数据采集好帮手。 无密码,无使用时间限制。一、系统概述 西门子S7系列PLC C#上位机通信系统是基于Visual Studio 2017开发环境&…...

二进制枚举算法 cpp

3.2 二进制枚举 用一个数的二进制表示中的0/1表示两种状态,从而达到枚举的各种情况 涉及位运算知识0/1表示状态的方法,动态规划中的状态压缩dp中会继续使用二进制枚举也可使用递归实现位运算优先级不确定 加括号 3.2.1 子集 [!力扣] 78. 子集 中等 给你…...

PS 抠图干货:5 种高效方法,一键把白色背景转为透明

抠图去白底是每个PS新手必学的基础技巧,很多初学者在一开始会遇到各种问题:比如抠图不干净、边缘有锯齿、耗时半天还达不到效果"。无论是制作商品主图、设计海报素材,还是处理证件照,掌握这一技巧都能大幅提升工作效率。那么…...

Spring Boot 实现事件监听(监听器+自定义事件)完整指南

Spring Boot 实现事件监听(监听器自定义事件)完整指南 Spring Boot 的事件监听机制基于 观察者模式,核心是「自定义事件 事件发布者 事件监听器」,可实现业务解耦(如订单创建后触发库存扣减、日志记录、消息推送等&a…...

如何看待AI Agent(智能体)的伪效率问题

对 **AI Agent 的“伪效率提升”**(或者说很多场景下的假性/虚幻生产力增长)有几个比较清晰的观察角度,目前(2026年3月)整个行业其实已经开始从“狂热宣传期”进入“冷静复盘期”,很多早期吹得天花乱坠的效…...

小白验证:打破“小白”偏见,重塑软件安全新标杆

小白网络验证:打破“小白”偏见,重塑软件安全新标杆在软件保护领域,"小白"二字常被误解为技术门槛低、安全性不足的代名词。然而,小白网络验证平台凭借其企业级安全架构、全语言兼容能力和智能防护体系,彻底…...

0基础学测试:入门第三课(实战篇)| 需求评审:测试人的“第一次亮剑”,如何优雅地“怼”出高质量?

👋 欢迎回到《0基础开展软件测试》系列!上一章我们学会了如何独自“吃透”需求文档。 今天,我们要进入实战第一战——需求评审会(Requirement Review)。🛑 新手常见心态: “我是新人&#xff0c…...

蓄电池超级电容混合储能系统Simulink能量管理仿真模型与光伏发电+电池储能仿真

蓄电池超级电容混合储能系统simulink能量管理仿真模型 光伏发电电池储能仿真 simulink仿真,MPPT(增量导纳法),双向buck/boost 电路 【含笔记+建模参考】 包含相关参考文献及原理介绍文档 采用扰动观察法实现光能最大功…...

解码CCL17/TARC:QuantiCyto® ELISA助力靶点深度探索

CC趋化因子配体17(CCL17)也称为胸腺活化调节趋化因子(Thymus and Activation-Regulated Chemokine, TARC),属于Cys-Cys(CC)趋化因子家族的小细胞因子。CCL17可由多种细胞产生,包括树突状细胞、单核细胞、巨噬细胞、嗜酸性粒细胞、上皮细胞、朗格汉斯细胞…...

程序员进阶教程:大模型微调原理深度剖析,一篇搞懂

大模型微调,简单来说,就是在一个已经训练好的通用的大模型(比如qwen3、deepseek等)的基础上,再给它“补课”,让它更擅长处理特定任务或领域的需求。 想象一下,大模型就像一个全能学霸&#xff…...

02-大模型部署之Kubernetes+vLLM安装大模型和容器调度

02-大模型部署之KubernetesvLLM安装大模型和容器调度 1. Kubernetes基础与vLLM集成概述 1.1 为什么使用Kubernetes部署vLLM Kubernetes提供了企业级的容器编排能力,特别适合vLLM部署的以下场景: 弹性伸缩:根据负载自动调整vLLM实例数量高可用…...

Linux系统基础安全总结

只开放必要端口 80、443、SSH 等 禁用或删除无用账号 禁止使用 root 直接登录清理多余系统账号、测试账号启用防火墙强化密码策略◦密码长度 ≥8 位,字母 数字 符号◦ 定期更换、禁止使用历史密码 关闭无用端口与服务 用 ss -tulnp 查看监听端口停止并禁用无用…...

传统企业每一次招聘,本质都是一次“盲选”

传统企业招聘确实常陷入"盲选困局"。据统计,超过60%的企业因招聘失误导致人才流失,平均每位错误招聘造成损失达入职薪资的30%以上。究其根源,在于三大痛点:面试主观性强、评价标准模糊、缺乏系统化人才甄别工具。HR往往…...

计算机毕业设计之基于SpringBoot的自驾游出行一站式物资商城

随着社会的发展,系统的管理形势越来越严峻。越来越多的用户利用互联网获得信息,但各种信息鱼龙混杂,信息真假难以辨别。为了方便用户更好的获得自驾游出行物资信息,因此,设计一种安全高效的基于SpringBoot的自驾游出行…...

191.Vue3 + OpenLayers 实战:可控化版权信息(Attribution)详解与完整示例

🧩 一、效果目标我们要实现以下效果:✅ 自定义版权内容(HTML)✅ 内置版权(右下角,可折叠)✅ 外部版权(自定义位置展示)✅ 自定义按钮样式✅ 控制是否折叠🧠 二…...

CCF-GESP 等级考试 2026年3月认证C++一级真题解析

2026年3月真题 一、单选题(每题2分,共30分)正确答案:B 考察知识点:计算机相关知识 解析:输入设备是从外界获取信息交付计算机进行处理,重力传感器检测重心,遥控器接受指令&#xff0…...

UV胶粘度硬度伸长率详解 如何选对UV胶

工程师必读:UV胶性能参数解读——粘度、硬度、伸长率意味着什么?UV胶(光固化胶粘剂)因其秒级固化、高透明度、低收缩率等优势,已成为电子、光学、医疗器械、精密组装等领域工程师的首选材料。但要选对UV胶,…...

全球六维力传感器行业发展洞察:高速增长下的国产突围与市场机遇

QYResearch(恒州博智)作为全球领先的专业咨询机构,长期深耕各行业细分市场调研,尤其聚焦高端制造领域存在“卡脖子”风险的高科技赛道。依托全球化调研网络与深度数据挖掘能力,机构重点追踪国内外标杆企业,…...

YTM32

记录一个很愚蠢的小bug在用云途系列MCU时,我喜欢先用串口打印功能,但是多次卡在PRINTF里,于是花了很多时间在串口配置上。解决后没有当回事,结果就是今天再次卡死在这个问题,又浪费一个多小时的时间在这个愚蠢的bug上&…...

颠覆“回老家更轻松”,计算机会,收入,生活成本,颠覆安逸幻想,输出长期发展路线。

颠覆"回老家更轻松" - 长期发展路线规划系统一、实际应用场景描述场景:李明,28岁,北京某互联网大厂高级工程师,年薪45万。面对北京的高房价、996工作制和通勤压力,他经常被家人劝说"回老家发展"。…...

高精度毫米级室内定位:机器人导航的“最后一厘米”难题如何破解

在机器人技术加速落地的今天,一个看似简单的问题始终困扰着行业:机器人到底能不能知道自己“精确”在哪?这个问题听起来有些哲学,但在工程实践中却极为现实。一台AGV在仓库中穿梭数百米后,能否准确停在货架前5毫米的位…...

大模型理论学习之基本概念理解

大模型,agentagentic工具调用MCP向量模型RAG大语言模型(large language model):理解自然语言,生成自然语言。多模态大模型:不仅可以处理文本,同时可以处理图片,音频,视频…...