STM32高级控制定时器(STM32F103):检测输入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/18506.shtml

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

相关文章

视觉语音识别挑战赛 CNVSRC 2024

CNVSRC 2024由NCMMSC 2024组委会发起,清华大学、北京邮电大学、海天瑞声、语音之家共同主办。竞赛的目标是通过口唇动作来推断发音内容,进一步推动视觉语音识别技术的发展。视觉语音识别(也称为读唇技术)是一种通过观察唇部动作推…

二叉树顺序结构实现【堆的实现】【详细图解】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 目录 1、二叉树的顺序结构2、堆的概念3、堆的实现3.1 堆实现的前提3.1.1 向上调整3.1.2 向下调…

采用java语言+B/S架构+后端SpringBoot前端Vue开发的ADR药品不良反应智能监测系统源码

采用java语言+B/S架构+后端SpringBoot前端Vue开发的ADR药品不良反应智能监测系统源码 ADR监测引擎每日主动获取检验数据、病历内容(可拓展)、以及其他临床数据,根据知识库内容自动判定患者是否有不良反应迹象&#xf…

算法基础之Nim游戏

Nim游戏 核心思想&#xff1a;博弈论 结论&#xff1a;将所有堆的石子数全部异或起来 得到的结果若为1 则先手必胜 若为0 则先手必败 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 100010;int a[N];int n…

k8s笔记——client-go与 Kubernetes APIServer 交互的客户端

文章目录 四种Kubernetes APIServer 交互的客户端RESTClientclientSetdynamicClientDiscoveryClient 创建、更新、查询、删除Deployment参考资料 四种Kubernetes APIServer 交互的客户端 Client-Go 共提供了 4 种与 Kubernetes APIServer 交互的客户端。分别是 RESTClient、Di…

LeetCode精华75题(持续更新)

LeetCode刷题笔记 数组/字符串 交替合并字符串 题目&#xff1a; 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符…

【iOS】UI学习(一)

UI学习&#xff08;一&#xff09; UILabelUIButtonUIButton事件 UIViewUIView对象的隐藏UIView的层级关系 UIWindowUIViewController定时器与视图对象 UISwitch UILabel UILabel是一种可以显示在屏幕上&#xff0c;显示文字的一种UI。 下面使用代码来演示UILabel的功能&#…

AI学习指南数学工具篇-Python中的凸优化库

AI学习指南数学工具篇-Python中的凸优化库 在人工智能和机器学习领域&#xff0c;凸优化是一个非常重要的数学工具。它可以帮助我们解决各种问题&#xff0c;包括线性规划、二次规划、半定规划等。而在Python中&#xff0c;有一个非常优秀的凸优化库&#xff0c;即CVXPY。本文…

做好开源快速开发平台研发创新 助力行业高效发展!

随着信息化时代的到来&#xff0c;科技的力量无处不在。为了提高办公效率&#xff0c;很多大中型企业倾向于使用更为先进的软件平台来助力企业降本增效。在众多助力神器之中&#xff0c;开源快速开发平台低代码技术平台深得广大新老客户朋友的喜爱&#xff0c;它与生俱来的优势…

结合PyTest和Selenium进行网页自动化测试的例子

一个结合PyTest和Selenium进行网页自动化测试的示例。 这个测试用例模拟了一个简单的用户登录过程&#xff0c;并包含了对登录后页面状态的断言。我们将使用Selenium的WebDriver来控制浏览器&#xff0c;并使用PyTest来进行断言。 import pytest from selenium import webdri…

vue2+echarts地图下钻+地图遮盖物散点

一、下载工具 npm i echarts echarts-gl axios -S -S是生产依赖默认是-S不写也可以 -D是开发依赖 二、引入工具 import * as echarts from "echarts"; import "echarts-gl"; import axios from "axios"; 三、HTML部分代码 <div class&…

微信小程序路由跳转

1. wx.navigateTo 作用&#xff1a;保留当前页面&#xff0c;跳转到应用内的某个页面。特点&#xff1a;跳转后目标页面的生命周期函数 onLoad 和 onShow 会被触发。使用场景&#xff1a;一般用于跳转到应用内的其他页面&#xff0c;保留当前页面的状态&#xff0c;例如从文章…

Java数据类型

一、每种数据都定义了 明确的数据类型&#xff0c;在内存中分配了不同大小的 内存空间(字节)。 二、Java数据类型分为两种&#xff1a; 基本数据类型&#xff1a; 数值型&#xff1a; 整数类型&#xff0c;存放整数(byte[1] , short[2] , int[4] , long[8]) 浮点类型&#xff0…

UE5 读取本地图片并转换为base64字符串

调试网址&#xff1a;在线图像转Base64 - 码工具 (matools.com) 注意要加&#xff08;data:image/png;base64,&#xff09; FString UBasicFuncLib::LoadImageToBase64(const FString& ImagePath) {TArray<uint8> ImageData;// Step 1: 读取图片文件到字节数组if (!…

【蓝桥杯】第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组

答题结果页 - 蓝桥云课 (lanqiao.cn) 0子2023 - 蓝桥云课 (lanqiao.cn)&#xff08;暴力枚举 #include<bits/stdc.h> using lllong long; using ullunsigned long long; #define fir first #define sec second //#define int llconst int N1e510; const int mod1e97;int…

C++标准模板(STL)- C 内存管理库 - 分配内存 (std::malloc)

C 内存管理库 分配内存 std::malloc 定义于头文件 <cstdlib> void* malloc( std::size_t size ); 分配 size 字节的未初始化存储。 若分配成功&#xff0c;则返回指向分配的适合对任何标量类型对齐的内存块中&#xff0c;最低&#xff08;首&#xff09;字节的指针…

HT46R002 贴片 SOP8 经济型AD型OTP MCU单片机芯片

HT46R002在智能家居中的具体应用案例可以包括以下几个方面&#xff1a; 1. 智能照明控制&#xff1a;可以用于控制LED灯的亮度和色温&#xff0c;甚至可以通过手机APP远程控制开关和调节灯光效果。 2. 环境监测&#xff1a;用于监测室内温度、湿度、空气质量等&#xff0c;当检…

PostgreSQL和GaussDB对比

PostgreSQL和GaussDB对比 GaussDB 是华为推出的一款基于 PostgreSQL 的企业级数据库产品&#xff0c;通过对 PostgreSQL 进行一系列优化和扩展&#xff0c;使其更加适应企业应用的需求。以下是 PostgreSQL 和 GaussDB 两者之间的对比&#xff0c;从多个方面进行分析&#xff0…

httpJVM

目录 HTTPS如何保证安全 1&#xff09;引入非对称加密 2&#xff09;引入非对称加密 3.中间人攻击 4.解决中间人攻击 JVM 1.JVM内存划分 2.JVM类加载过程 八股内容 3.JVM中的垃圾回收机制 释放垃圾的策略 1.标记-清除 2.复制算法 3.标记-整理 分代回收 HTTPS如何…

GB-T 43696-2024 网络安全技术 零信任参考体系架构

GB-T 43696-2024 网络安全技术 零信任参考体系架构 编写背景 随着网络环境的日益复杂&#xff0c;传统的网络安全策略已经难以满足现代企业的需求。为了应对不断变化的安全威胁&#xff0c;零信任安全模型应运而生。GB-T 43696-2024《网络安全技术 零信任参考体系架构》是中国…