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…

【iOS】UI学习(一)

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

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

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

Java数据类型

一、每种数据都定义了 明确的数据类型,在内存中分配了不同大小的 内存空间(字节)。 二、Java数据类型分为两种: 基本数据类型: 数值型: 整数类型,存放整数(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…

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

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

httpJVM

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

Android Graphics图形栈SurfaceFlinger之间各种Layer以及对应Buffer之间的关系

Android Graphics图形栈SurfaceFlinger之间各种Layer以及对应Buffer之间的关系 SurfaceFlinger layer之间的对应关系

MyBatis学习笔记(周五前学完)

MyBatis-Plus是一个MyBatis的增强工具。在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 通过MyBatis-Plus来进行数据插入时&#xff0c;它默认会 使用雪花算法来生成id&#xff0c;长度比较长 增删改的返回值都是统一的&#xff0c;影响的只有行数。…

给pdf加水印,python实现

from PyPDF2 import PdfReader, PdfWriterdef add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out):"""把水印添加到pdf中"""pdf_output PdfWriter()input_stream open(pdf_file_in, rb)pdf_input PdfReader(input_stream, strictFalse…

基于魔搭开源推理引擎 DashInfer实现CPU服务器大模型推理--理论篇

前言 在人工智能技术飞速发展的今天&#xff0c;如何高效地在CPU上运行大规模的预训练语言模型&#xff08;LLM&#xff09;成为了加速生成式AI应用广泛落地的核心问题。阿里巴巴达摩院模型开源社区ModelScope近期推出了一款名为DashInfer的推理引擎&#xff0c;旨在解决这一挑…

机器学习补充学习

1、Adaboost算法 Adaboost算法是一种集成学习方法&#xff0c;通过结合多个弱学习器来构建一个强大的预测模型。核心思想&#xff1a;如果一个简单的分类器在训练数据上犯错误&#xff0c;那么它在测试数据上也可能犯错误。 Adaboost通过迭代地训练一系列的分类器&#xff0c…

QT-demo:0轴分布图表

版本&#xff1a;5.9 第一种: 使用 PyQt5 和 Matplotlib 库 安装所需的库&#xff1a; pip install PyQt5 matplotlib创建和显示图表&#xff1a; import sys import numpy as np import matplotlib.pyplot as plt from PyQt5.QtWidgets import QApplication, QMainWindow f…

【busybox记录】【shell指令】ln

目录 内容来源&#xff1a; 【GUN】【ln】指令介绍 【busybox】【ln】指令介绍 【linux】【ln】指令介绍 使用示例&#xff1a; 创建链接文件 - 链接文件&#xff08;默认 - 硬链接&#xff09; 创建链接文件 - 链接文件&#xff08;软链接&#xff09; 创建链接文件 -…

JeeSite 4.x and 5.x快速开发平台前端技术探索与实践

一、引言 随着企业信息化建设的不断推进&#xff0c;对于快速、高效、安全的企业级应用需求日益增长。JeeSite作为一款企业级快速开发平台&#xff0c;以其强大的后端功能和灵活的前端架构&#xff0c;为开发者提供了强大的支持。本文旨在探讨JeeSite快速开发平台在前端技术方…

新零售收银解决方案:传统门店超市的数字化-亿发

在数字化浪潮的推动下&#xff0c;零售行业正经历着前所未有的变革。阿里巴巴提出的“新零售”概念&#xff0c;不仅仅是一个商业口号&#xff0c;它代表了一种全新的商业模式和运营理念。随着时代的进步和消费需求的不断升级&#xff0c;新零售的兴起已成为行业发展的必然趋势…

学习笔记之——2D Gaussian Splatting(2DGS)

3DGS在辐射场重建中取得了巨大的成就&#xff0c;实现高质量的新视图合成和快速渲染。最近新出了3DGS的升级版本&#xff0c;2DGS。写下本博文记录本人学习及测试2DGS的过程&#xff0c;本博文仅为本人学习记录用~ Project WebsiteGithub CodeOriginal paper 目录 原理解读 …