STM32高级控制定时器应用之检测输入PWM周期和占空比

目录

概述

1  PWM 输入模式

1.1 原理介绍

1.2 应用实例

1.3 示例时序图

2 使用STM32Cube配置工程

2.1  软件环境

2.2 配置参数

2.3 生成项目文件

3 功能实现

3.1 PWM占空比函数

3.2 输入捕捉回调函数

4 功能测试

4.1 测试软件框架结构

4.2 实验实现

4.2.1 测试实验1

4.2.2 测试实验2


STM32高级控制定时器(STM32F103):PWM 输入模式,测速pwm的占空比,频率参数

源代码下载地址:

STM32高级控制定时器(STM32F103):PWM输入模式资源-CSDN文库

概述

本文主要介绍STM32高级定时器的用法至输入捕获功能,该功能可用于捕捉外部输入信号的频率,并且计算出PWM的占空比。笔者通过详细的案例介绍这个功能,包括理论知识,实现原理,以及如何使用STM32Cube配置基本的参数,编写实用代码,实现捕捉频率当的功能。

1  PWM 输入模式

1.1 原理介绍

这种模式是输入捕获模式的一种特殊情况。程序相同,只是:

1)两个ICx信号映射在同一个TIx输入上

2)这2个ICx信号在具有相反极性的边缘上是活动的

3)选择两个TIxFP信号中的一个作为触发输入和从模式控制器在重置模式下配置。

1.2 应用实例

用户可以测量周期(在TIMx_CCR1寄存器中)和占空比(在TIMx_CCR2寄存器)使用以下程序(取决于在CK_INT频率和预分频器值上):

1)选择TIMx_CCR1的激活输入:将CC1S位写入TIMx_CCMR1中的01寄存器(选择TI1)。

2)选择TI1FP1的有效极性(用于TIMx_CCR1和计数器中的捕获清除):将CC1P位写入“0”(上升沿激活)。

3)选择TIMx_CCR2的激活输入:将CC2S位写入TIMx_CCMR1中的10寄存器(选择TI1)。

4)选择TI1FP2的有效极性(用于TIMx_CCR2中的捕获):写入CC2P位到“1”(在下降沿上有效)。

5) 选择有效的触发输入:将TS位写入TIMx_SMCR寄存器中的101(已选择TI1FP1)。

6) 在重置模式下配置从属模式控制器:将SMS位写入TIMx_SMCR寄存器。

7) 启用捕获:将CC1E和CC2E位写入TIMx_CCER寄存器中的“1”。

1.3 示例时序图

PWM输入模式只能与TIMx_CH1/TIMx_CH2信号一起使用,因为只有TI1FP1和TI2FP2连接到从模式控制器。

2 使用STM32Cube配置工程

2.1  软件环境

软件名称版本信息
STM32CubeSTM32CubeMX 6.11
STM32 HALSTM32Cube_FW_F1_V1.8.5

2.2 配置参数

1)配置系统时钟:72M Hz,Timer的工作时钟为72M Hz

2)  使用定时器1配置输入捕获功能

 其对应的IO口配置

 计数器时钟参数和捕获通道参数

 3)配置PWM相关参数

选择定时器8作为控制PWM的输出

PWM波对应的IO接口

 Timer-8定时器相关参数

和PWM相关的参数配置

 

2.3 生成项目文件

 使用STM32FCube完成项目配置后,就可以生成工程文件。生成代码如下:

3 功能实现

3.1 PWM占空比函数

在tim.c文件中实现配置输出PWM占空比函数,函数代码如下:

参数介绍

1)Pluse:  占空比

2)Channel: 输出通道号

void HAL_TIM_SetPWM_Pulse( uint32_t Pulse, uint32_t Channel)
{TIM_OC_InitTypeDef sConfigOC = {0};sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = Pulse;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, Channel) != HAL_OK){Error_Handler();}
}

3.2 输入捕捉回调函数

在input_capture.c实现输入捕捉回调函数。

函数功能介绍

1)计算输入的PWM的频率

2)计算输入的PWM的周期

3)计算输入的PWM的占空比

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{uint32_t uwIC2Value1 = 0;uint32_t uwIC2Value2 = 0;uint32_t cycle,pluse,freq;static uint32_t uwIC2Value2_list[2];static uint8_t count = 0;float dutyfactor;if(htim->Instance == TIM1) {if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){/* Get the 1st Input Capture value */}else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){uwIC2Value1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);/* Get the 1st Input Capture value */uwIC2Value2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);if( uwIC2Value2 > uwIC2Value1){pluse = uwIC2Value2- uwIC2Value1; uwIC2Value2_list[count] = uwIC2Value1;count++;if( count == 2 ){count = 0;if( uwIC2Value2_list[1] > uwIC2Value2_list[0]){cycle = uwIC2Value2_list[1]- uwIC2Value2_list[0];freq =  1000000/cycle;dutyfactor = (pluse*100)/cycle;printf("PWM cycle = %d us, PWM freq = %d Hz\r\n",  cycle, freq);printf("PWM dutyfactor = %d%s\r\n", (int)dutyfactor,"%");}}}}}
}

4 功能测试

4.1 测试软件框架结构

4.2 实验实现

PWM的工作的使用频率为1us, 一个PWM的周期为10 000 us, 通过调制Pulse的值就可以改变占空比,其中每一个Plus表示1us,举个例子:

设置Pluse = 500, 表示占空比为:500/10000 *100 % = 5%

4.2.1 测试实验1

1)配置PWM参数,输出频率为100Hz,占空比为5%

 
void pwm_ctrl_Init( void )
{HAL_TIM_Base_Start( &htim8 );HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_1);  // PC6 HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_2);  // PC7HAL_TIM_SetPWM_Pulse( 500, TIM_CHANNEL_1);HAL_TIM_SetPWM_Pulse( 500, TIM_CHANNEL_2);
}

2)配置输入捕捉电平信号触发类型

void Input_CaptureInit( void )
{set_captureMode(TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);set_captureMode(TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
}

3) 编译代码,下载到板卡运行,结果如下:

逻辑分析仪测试到的波形

调试终端打印的数据log:

 

 4.2.2 测试实验2

1)配置PWM参数,输出频率为100Hz,占空比为50%

 
void pwm_ctrl_Init( void )
{HAL_TIM_Base_Start( &htim8 );HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_1);  // PC6 HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_2);  // PC7HAL_TIM_SetPWM_Pulse( 5000, TIM_CHANNEL_1);HAL_TIM_SetPWM_Pulse( 5000, TIM_CHANNEL_2);
}

2) 编译代码,下载到板卡运行,结果如下:

逻辑分析仪测试到的波形

 调试终端打印的数据log:

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

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

相关文章

整数之间的赋值问题

前言:我们在初学C语言的时候,总是避免不了一些数据类型的转换,例如int-->char,char-->int,如果我们仅仅只学习这些语法,而不去了解底层原理,对于这些输出的内容,我们可能会感觉…

2024还不会安装NodeJs

2024还不会安装NodeJs 1、官网下载 由于本地是windows,所以选择 Prebuilt Installer 64位 NodeJs官网下载 LTS长期支持版本 当然这里我用的 Snipastate 截屏软件,这里也配下载链接 Snipasate下载链接 2、配置环境变量 由于是自己的电脑&#xff0c…

SpringBoot启动流程分析之设置系统属性spring.beaninfo.ignore、自定义banner图(五)

SpringBoot启动流程分析之设置系统属性spring.beaninfo.ignore、自定义banner图(五) 参考 目录 文章目录 SpringBoot启动流程分析之设置系统属性spring.beaninfo.ignore、自定义banner图(五)1、设置sping.beaninfo.ignore属性2、…

代码随想录leetcode200题之动态规划算法

目录 1 介绍2 训练3 参考 1 介绍 本博客用来记录代码随想录leetcode200题之动态规划算法相关题目。 2 训练 题目1&#xff1a;509. 斐波那契数 C代码如下&#xff0c; class Solution { public:int fib(int n) {if (n < 1) { //特判return n;}int a 0, b 1;for (int …

C语言进程编程:探索操作系统的核心机制

C语言进程编程&#xff1a;探索操作系统的核心机制 在C语言的广阔领域中&#xff0c;进程编程无疑是一块充满挑战与机遇的阵地。进程作为操作系统分配资源的基本单位&#xff0c;其编程涉及到系统调用、进程控制、通信与同步等多个复杂而关键的概念。本文将围绕四个方面、五个…

限流算法整理——滑动窗口限流算法

限流算法描述 滑动窗口限流需要将每个窗口空间划分为无限小的窗口区间&#xff0c;并且动态调整区间的起始点&#xff0c;并且在调整完毕之后需要判断各个区间&#xff0c;累加各个区间的请求&#xff0c;查看是否到达最大的阈值&#xff0c;以此返回允许请求还是拒绝请求 算…

计算机常用的英语单词

在计算机科学与技术领域&#xff0c;有一些常用的英语单词和术语是学习者需要掌握的。以下是一些常见的计算机必会英语单词&#xff0c;分为不同的类别&#xff1a; 1. 编程语言和技术&#xff1a; Algorithm - 算法Programming - 编程Code - 代码Variable - 变量Function - …

PyTorch学习(11):PyTorch的形状变换(view, reshape)与维度变换(transpose, permute)

PyTorch学习&#xff08;1&#xff09;&#xff1a;torch.meshgrid的使用-CSDN博客 PyTorch学习&#xff08;2&#xff09;&#xff1a;torch.device-CSDN博客 PyTorch学习&#xff08;9&#xff09;&#xff1a;torch.topk-CSDN博客 PyTorch学习&#xff08;10&#xff09;…

数据库与数据库管理系统 MySQL的安装 SQL语言学习:DDL、DML

day51 数据库 数据库&#xff08;database&#xff09;就是一个存储数据的仓库。为了方便数据的存储和管理&#xff0c;它将数据按照特定的规律存储在磁盘上。 通过数据库管理系统&#xff0c;可以有效地组织和管理存储在数据库中的数据&#xff0c;如数据库管理系统MySQL 数据…

Java学习Lambda表达式

Lambda表达式 有且只有一个未实现的方法叫做Lambda表达式&#xff0c;可以实现函数式编程 // 这个注解是用来检查你写的函数是否是函数式接口 FunctionalInterfaceinterface Myinterface {int sum(int a, int b);default String priteTitle(String name, int age, String sex)…

Kubernetes资源调度策略及实现机制

目录 一、资源调度策略 1.默认调度器&#xff08;Default Scheduler&#xff09; 2.自定义调度器&#xff08;Custom Scheduler&#xff09; 3.亲和性与反亲和性&#xff08;Affinity and Anti-Affinity&#xff09; 4.污点与容忍&#xff08;Taint and Tolerations&#…

时间序列差分顺序的讨论

生成出一组时间序列数据 服从标准正态分布的50个 随机数据 分别给出4步季节差分&#xff0c;再进行1步1阶差分的结果 和 1步1阶差分再进行 4步季节差分 的结果 讨论&#xff1a; 先进行4步季节差分再进行1步1阶差分与先进行1步1阶差分再进行4步季节差分的结果看起来是相同的

计算机网络复习(2)性能指标 带宽

计算机网络的性能指标是衡量网络效率、可靠性和服务质量的重要参数&#xff0c;它们帮助我们理解网络如何工作以及如何优化网络性能。以下是计算机网络中几个关键的性能指标的详细介绍&#xff1a; 1. 速率 (Rate) / 比特率 (Bit Rate) / 数据率 (Data Rate) 速率指的是数据在…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:潍柴雷沃智慧农业无人驾驶

潍柴雷沃智慧农业科技股份有限公司&#xff0c;是潍柴集团重要的战略业务单元&#xff0c;旗下收获机械、拖拉机等业务连续多年保持行业领先&#xff0c;是国内少数可以为现代农业提供全程机械化整体解决方案的品牌之一。潍柴集团完成对潍柴雷沃智慧农业战略重组后&#xff0c;…

kaggle:房价预测

比赛链接 结果展示 结果链接 8848是密码 文章目录 数据处理调包部分拒绝掉包岭回归理论代码实践结果 自助采样理论代码 集成学习前言Bagging理论Bagging-Ridge代码Bagging-Ridge实践Bagging-Ridge结果 Tricks 数据处理 #打开文件 import pandas as pd dataset1pd.read_csv(&q…

Arduino编程变量:深度探索与实际应用

Arduino编程变量&#xff1a;深度探索与实际应用 在Arduino编程中&#xff0c;变量扮演着至关重要的角色。它们用于存储程序运行过程中的临时数据&#xff0c;是实现各种功能和算法的关键。然而&#xff0c;对于初学者来说&#xff0c;变量的理解和使用往往充满了困惑和挑战。…

Java 基础面试300题 (111-140)

Java 基础面试300题 &#xff08;111-140&#xff09; 111.什么是Java包&#xff1f; 有什么优点&#xff1f; 包是相关Java类型的集合。包中可以包括相关的类、接口和枚举。使用包来组织软件代码有几方面的优点&#xff1a; 包有助于将相关代码保存在一起。包有助于避免命名…

How to install a dataset from huggingface?

当我从抱抱脸上git clone imdb数据集时&#xff0c;plain_text里的文件是这样的&#xff1a;

梦想的味道,特别的邀约 —— 蒙自源六一儿童节特别活动

每个孩子心中都有一颗梦想的种子&#xff0c;只需一点阳光和雨露&#xff0c;便能生根发芽&#xff0c;开出绚烂的花朵。六一儿童节&#xff0c;是孩子们的节日&#xff0c;也是他们梦想起航的日子。蒙自源希望成为孩子们梦想的沃土&#xff0c;用美食和爱滋养他们的成长。在这…

【Qt知识】Qt框架中的信号(Signals)与槽(Slots)机制

Qt框架中的信号&#xff08;Signals&#xff09;与槽&#xff08;Slots&#xff09;机制是一种强大的通信方式&#xff0c;允许对象之间相互通信而无需对象之间直接引用或了解对方。这一机制简化了应用程序的事件处理和组件之间的交互&#xff0c;是Qt的一大特色和核心概念。 …