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

PWM输出频率计

1.PWM任务

1.1利用PWM信号,产生周期为2s,占空比为25%的PWM信号来控制Nucleo开发板上的用户指示灯LD2

1.1.1原理

(1)引脚与定时器选择:Nucleo 开发板上,引脚 PA5 的复用功能中,与定时器输出功能相关的是 TIM2_CH1,因此选用定时器 2 的通道 1 输出 PWM 信号。定时器 2 挂接在 APB2 总线上,其定时器时钟 TIM2CLK 为 100MHz。

(2)关键参数计算依据

周期计算公式:Period (s) = (ARR + 1) × (PSC + 1) / TIMx_CLK,其中 ARR 为自动重载值,PSC 为预分频系数,TIMx_CLK 为定时器时钟频率。

占空比计算公式:Duty = (CCR / (ARR + 1)) × 100%,其中 CCR 为捕获 / 比较值。

本次任务参数确定:为得到周期 2s、占空比 25% 的 PWM 信号,经计算设置预分频系数 PSC 为 50000 - 1,自动重载值 ARR 为 4000 - 1,捕获 / 比较值 CCR 为 2000。

1.1.2设置部分

(1)在cubemx选择f4板子

(2)配置PA5管脚

功能模式:将 PA5 管脚配置为定时器 2 的通道 1,作为 PWM 输出。

时钟源选择:选择内部时钟作为定时器 2 的时钟源。

通道模式设置:将定时器 2 的通道 1 设置为 PWM 输出模式(具体为 PWM mode 1)。

参数设置

预分频系数 PSC:设置为 50000 - 1,结合 ARR 值可确保 PWM 信号周期为 2s。

自动重载值 ARR:设置为 4000 - 1,与 PSC 配合实现目标周期。

捕获 / 比较值 CCR:设置为 2000,以达到 25% 的占空比。

注意:在大多数情况下,选择开启CCR寄存器的预装载功能,让占空比的变化在下一个PWM信号周期才生效

1.1.3代码编写部分(简单的输出PWM即可)

需求为实现简单的 PWM 信号输出,以控制 LD2 指示灯。代码编写需基于上述在 CubeMX 中的配置,调用相关的定时器和 GPIO 初始化函数,使定时器 2 通道 1 能按照设定的参数输出 PWM 信号,进而控制 LD2 指示灯的亮灭状态

1.2利用PWM实现呼吸灯

设置PWM周期为20ms(利用人眼的视觉暂留效果,扫描频率需大于50Hz,以避免闪烁),占空比从0%开始,步进为20%。递增到100%后,又从0%开始,并重复整个过程。占空比修改的时间间隔为100ms。

1.2.1原理

(1)引脚与定时器选择:Nucleo 开发板上,引脚 PA5 的复用功能中,与定时器输出功能相关的是 TIM2_CH1,因此选用定时器 2 的通道 1 输出 PWM 信号。定时器 2 挂接在 APB2 总线上,其定时器时钟 TIM2_CLK 为 100MHz。

(2)关键参数计算依据

周期计算公式:Period (s) = (ARR + 1) × (PSC + 1) / TIMx_CLK,其中 ARR 为自动重载值,PSC 为预分频系数,TIMx_CLK 为定时器时钟频率。

占空比计算公式:Duty = (CCR / (ARR + 1)) × 100%,其中 CCR 为捕获 / 比较值。

本次任务参数确定:为得到周期20ms、占空比从0%开始,步进为20%。递增到100%后,又从0%开始,并重复整个过程的功能,经计算设置预分频系数 PSC 为 9999,自动重载值 ARR 为 199,利用改变 捕获 / 比较值 CCR 为实现改变占空比的操作。

1.2.2设置部分

(1)在cubemx选择f4板子

(2)配置PA5管脚

功能模式:将 PA5 管脚配置为定时器 2 的通道 1,作为 PWM 输出。

时钟源选择:选择内部时钟作为定时器 2 的时钟源。

通道模式设置:将定时器 2 的通道 1 设置为 PWM 输出模式(具体为 PWM mode 1)。

参数设置

预分频系数 PSC:设置为 50000 - 1,结合 ARR 值可确保 PWM 信号周期为 2s。

自动重载值 ARR:设置为 4000 - 1,与 PSC 配合实现目标周期。

捕获 / 比较值 CCR:设置为 2000,以达到 25% 的占空比。

1.2.3代码编写部分

方法一:DUTY直接改变

方法二:设立变量(主流

2.定时器输入捕获制作频率计

要求:利用定时器2的通道1(对应引脚PA0)来测量一个外部脉冲信号的周期和频率,外部脉冲信号利用引脚PA6输入

2.1原理

在输入捕获模式下,当捕获单元捕捉到外部信号的有效边沿(上升沿/下降沿/双边沿)时,将计数器的当前值锁存到捕获/比较寄存器TIMX_CCR供用户读取。(由于输入捕获与PWM输出都是TIMX_CCR寄存器,所以两个功能二选一)

捕获过程示意图

假设上升沿捕获,递增计数模式.第一次捕获在中断回调函数中保存Tb时刻的捕获值;第二次捕获在中断回调函数中保存Td时刻的捕获值;将两次捕获值相减,再乘以计数时间可计算出信号周期。

计算方法:

(1)一切正常

(2)当待测信号不大于定时器的一个完整计数周期(从0到ARR)时

假设两次连续的捕获值分别为CCRx1和CCRx2,则捕获差值可以按照如下方法计算:

注:如果待测信号大于定时器的一个完整计数周期,注意:则需要结合定时器的更新中断次数来计算捕获差值

2.2设计思路

(1)配置定时器2的通道1为输入捕获模式,采用上升沿触发。不设置预分频系数,计数时钟CK_CNT的频率为100MHz;

(2)设置引脚PA6为定时器3的通道1(TIM3CH1),利用定时器3的PWM2输出功能,输出一个频率为100KHz,占空比10%的方波;采用前后台编程模式。

(3)在输入捕获中断的回调函数中,设置测量完成标志主程序中检测该标志一旦置位则计算信号的周期和频率,并清除标志位。

2.3设置部分

(1)在cubemx选择f4板子(选择开发板不选择mcu)

(2)串口通信已经默认,不需要更改

(3)定时器2:时钟源用内部时钟,模式为输入捕获,定时器二的全局中断使能

、(4)定时器3:时钟源用内部时钟,模式为PWM CH1的输出。pcs:999.ARR:9.CRR:5周期设定为100us,占空比为50%..

(5)更改总时钟为100M

2.4代码编写部分

(1)为串口能使用printf做准备

(2)设置全局变量

(3)打开定时器,输出标题等等。注意只要使用时钟就得start

(4)主函数中计算

(5)it.c声明变量

(6)中断函数编写

频率计整体思路总结:

整个代码的核心目标是 “生成 PWM 信号→捕获 PWM 信号关键参数→计算并通过串口输出参数”,整体思路可分为 4 个核心阶段,各阶段通过 “硬件外设 + 全局变量” 联动,形成完整闭环。

阶段 1:系统初始化(为所有功能打基础)

核心任务:初始化硬件外设(时钟、GPIO、定时器、串口),为后续 PWM 生成和捕获做准备。涉及代码:main.c 中的 HAL_Init()、SystemClock_Config()、MX_XXX_Init() 系列函数。

外设初始化:

USART2(串口):配置为 115200 波特率,用于后续打印测量结果;通过 __io_putchar 重定向 printf 函数,让标准输出指向串口。

TIM3(PWM 生成):配置为 PWM1 模式,生成固定参数的 PWM 信号(如 10kHz 频率、50% 占空比),具体通过预分频器(999)、自动重装载值(9)、脉冲宽度(5)实现。

TIM2(输入捕获):配置为输入捕获模式,用于检测 PWM 信号的边沿(上升沿 / 下降沿),无预分频(确保计数精度),自动重装载值设为最大值(避免计数溢出影响测量)。

GPIO:配置 TIM3_CH1(PWM 输出)、TIM2_CH1(输入捕获)对应的引脚为复用功能,确保 PWM 信号能被正确输出和捕获。

阶段 2:PWM 信号生成(提供测量对象)

核心任务:启动 TIM3 的 PWM 输出,生成稳定的 PWM 信号作为测量对象。涉及代码:main.c 中的 HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1)。

TIM3 启动后,其通道 1 会持续输出 PWM 信号,参数由初始化时的配置决定(如周期 100μs、高电平 50μs,对应 10kHz 频率、50% 占空比)。

硬件上需将 TIM3_CH1(PWM 输出引脚)与 TIM2_CH1(输入捕获引脚)短接,确保 TIM2 能 “看到” TIM3 生成的 PWM 信号。

阶段 3:PWM 信号捕获(记录关键时间点)

核心任务:通过 TIM2 的输入捕获功能,记录 PWM 信号的 3 个关键时间点(上升沿→下降沿→下一个上升沿),为后续计算提供原始数据。涉及代码:main.c 中的捕获启动函数 + stm32f4xx_it.c 中的 TIM2 中断服务函数。

启动捕获:主程序通过 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1) 启动 TIM2 的输入捕获中断,此时 TIM2 开始等待 PWM 信号的边沿触发中断。

中断捕获流程(核心逻辑):当 PWM 信号的边沿触发 TIM2 中断时,TIM2_IRQHandler 函数被调用,通过 CapIndex 控制捕获的 3 个阶段:

阶段 0(CapIndex=0):捕获第一个上升沿,记录计数值到 CapVal[0],然后将 TIM2 的捕获极性改为 “下降沿”(准备捕获高电平结束),CapIndex 设为 1。

阶段 1(CapIndex=1):捕获第一个下降沿,记录计数值到 CapVal[1],然后将捕获极性改回 “上升沿”(准备捕获下一个周期开始),CapIndex 设为 2(注意:原代码此处极性设置错误,需修正为上升沿)。

阶段 2(CapIndex=2):捕获第二个上升沿,记录计数值到 CapVal[2],然后停止 TIM2 捕获中断(避免重复触发),CapIndex 重置为 0,CapFlag 设为 1(标记 “捕获完成”)。

阶段 3 参数计算与输出(完成测量闭环)

核心任务:主循环检测到 “捕获完成” 后,计算 PWM 的周期、频率、高电平时间、占空比,并通过串口打印。涉及代码:main.c 中 while(1) 循环内的逻辑。

等待捕获完成:主循环持续检测 CapFlag,当 CapFlag=1 时,说明已获取 CapVal[0](第一个上升沿)、CapVal[1](第一个下降沿)、CapVal[2](第二个上升沿)三个关键值,可进行计算。

串口输出:通过 printf 函数将计算结果(周期单位为 ms、频率为 Hz、高电平时间为 ms、占空比为 %)打印到串口,用户可通过串口助手查看。

重置与循环:打印完成后,重置 CapFlag=0,延迟 1 秒后重新启动 TIM2 捕获(HAL_TIM_IC_Start_IT),进入下一轮测量循环。

http://www.dtcms.com/a/478729.html

相关文章:

  • RuntimeBroker.exe应用程序错误?3种专业修复方法
  • PHP网站开发有哪些框架互联网推广品牌
  • [Power BI] VALUES函数
  • Idea 启动报 未找到有效的 Maven 安装问题
  • 智慧公厕管理系统全流程智能化
  • Pinia 状态管理:从入门到精通
  • 江苏城乡住房建设厅网站做公众号微网站
  • iBizModel 系统数据同步代理(PSSYSDATASYNCAGENT)与实体数据同步(PSDEDATASYNC)模型详解
  • 深度相机结构光vs.激光雷达
  • 我的全栈学习之旅:Colcon, CMake, Ninja/Make,编译器之间的关系
  • 【数值分析】解线性方程组的迭代法经典算法
  • 东莞网站空间wordpress迁移hexo
  • 小白如何建网站wordpress gstatic
  • 关于JMM
  • 嵌入式学习笔记- 单片机的低功耗以及唤醒
  • Dify从入门到精通 第12天 RAG知识库概念引入:深入理解知识库、分词与向量化
  • C语言项目:文本统计程序
  • 龙游县建设局网站晋州建设规划局网站
  • Java-Spring入门指南(二十四)SSM整合HTML:解决CSS/JS静态资源被过滤问题
  • 安阳做网站多少钱邢台最新通告今天
  • 如何做高并发网站的架构设计地方型旅游网站
  • 网站文章伪原创怎么做网站建设策划基本流程图
  • 条件概率、全概率、贝叶斯
  • 用mvc做网站报告自己的电脑做服务器搭建网站
  • 更换网站模板html所有标签大全
  • 软件模拟存储,SCSI映射StarWind5.4 企业版
  • DFS和BFS算法和回溯算法
  • c++ 标准模板库练习
  • 购物网站建设费用wordpress调用python脚本
  • 基于深度学习的数字图像分类实验与分析