STM32 PWMI模式测频率占空比

2024-02-27 07:52

本文主要是介绍STM32 PWMI模式测频率占空比,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

单片机学习!

目录

前言

一、PWMI模式测频率占空比配置步骤

二、代码示例及注意事项

2.1 RCC开启时钟

2.2 GPIO初始化

2.3 配置时基单元

2.4 配置输入捕获单元

2.5 选择从模式的触发源

2.6 配置从模式为Reset

2.7 开启定时器

总结


前言

        博文介绍如何配置输入捕获电路来测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。


一、PWMI模式测频率占空比配置步骤

第一步、RCC开启时钟,把GPIO和TIM的时钟打开。

第二步、GPIO初始化,把GPIO配置成输入模式。一般选择上拉输入或者浮空输入模式。

第三步、配置时基单元,让CNT计数器在内部时钟的驱动下自增运行。

第四步、配置输入捕获单元,包括滤波器、极性、直连通道还是交叉通道、分频器这些参数。用一个结构体就可以统一进行配置了。配置成两个通道同时捕获同一个引脚的模式。

第五步、选择从模式的触发源,触发源选择为TI1FP1,这里调用一个库函数,给一个参数就行。

第六步、选择触发之后执行的操作,执行Reset操作,这里也是调用一个库函数就行了。

第七步、开启定时器,调用TIM_Cmd函数。

二、代码示例及注意事项

2.1 RCC开启时钟

        将需要的TIM外设GPIO外设的时钟打开。打开时钟后定时器的基准时钟和整个外设的工作时钟就会同时打开。

代码示例:

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使用APB1的开启时钟函数,因为TIM3是APB1总线的外设。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

2.2 GPIO初始化

        GPIO口可以在引脚定义表中查看:

        默认复用功能这一列就是片上外设的端口和GPIO的连接关系。可以找到 TIM3的通道1和通道2对应PA6和PA7;TIM3的通道3和通道4对应PB0和PB1.本文举例使用TIM3的通道1引脚,所以就初始化PA6引脚。

        GPIO配置成输入模式,选择上拉输入。

代码示例:

	GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IPU;//这里选择上拉输入GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6;GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);

2.3 配置时基单元

        配置时基单元,包括时钟源选择的配置。

  1. 时基单元选择时钟源。
  2. 配置时基单元,包括预分频器、自动重装器、计数模式等,这些参数可用结构体配置。

代码示例:

	TIM_InternalClockConfig(TIM3);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;//指定时钟分频TIM_TimeBaseInitStructure.TIM_CounterMode= TIM_CounterMode_Up;//计数器模式TIM_TimeBaseInitStructure.TIM_Period= 65536-1;//ARR自动重装器的值TIM_TimeBaseInitStructure.TIM_Prescaler= 72-1;//PSC预分频器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter= 0;//重复计数器的值TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

结构体成员:

  • TIM_ClockDivision:指定时钟分频,用于信号经过滤波器时的滤波采样频率。
  • TIM_CounterMode:计数器模式,这里选择向上计数模式TIM_CounterMode_Up。
  • TIM_Period :ARR自动重装器的值,设置大一些防止计数溢出。这里设置65536-1,也就是16位的计数器满量程计数。
  • TIM_Prescaler:PSC预分频器的值,这个值决定了测周法的标准频率fc,72M / 预分频,就是计数器自增的频率,就是计数标准频率。这里给 72-1,这样标准频率就是72M / 72 = 1MHz。
  • TIM_RepetitionCounter:重复计数器的值,只有高级定时器才有,本文初始化通用寄存器,所以值给0。

2.4 配置输入捕获单元

        配置成两个通道同时捕获同一个引脚的模式。

        简单直接的方法就是把两个通道初始化分别初始化,使用一个结构体定义,配置通道1直连输入,上升沿触发;配置通道2交叉输入,下降沿触发。这里对应PWMI基本结构框图。输入捕获单元配置详细内容可参考上一篇博文:STM32 输入捕获模式测频率STM32 输入捕获模式测频率-CSDN博客。

代码示例1:

TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;//TIM_Channel选择通道
TIM_ICInitStructure.TIM_ICFilter=0xF;//TIM_ICFilter配置输入捕获的滤波器
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//TIM_ICPolarity极性
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICSelection_DirectTI;//TIM_ICPrescaler分频器
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//TIM_ICSelection配置数据选择器
TIM_ICInit(TIM3,&TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;//TIM_Channel选择通道
TIM_ICInitStructure.TIM_ICFilter=0xF;//TIM_ICFilter用来配置输入捕获的滤波器
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Falling;//TIM_ICPolarity极性,
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICSelection_DirectTI;//TIM_ICPrescaler分频器
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_IndirectTI;//TIM_ICSelection配置数据选择器
TIM_ICInit(TIM3,&TIM_ICInitStructure);

        TIM_PWMIConfig函数可以快捷的把电路配置成PWMI模式的标准结构。

        以上配置也可以直接调用TIM_PWMIConfig函数,只需要传入一个通道的参数,在函数里,会自动把剩下的一个通道初始化成相反的配置。如传入通道1,直连输入,上升沿触发,那函数里面就会顺带配置通道2,交叉输入,下降沿触发。

代码示例2:

TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;//TIM_Channel选择通道
TIM_ICInitStructure.TIM_ICFilter=0xF;//TIM_ICFilter配置输入捕获的滤波器
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//TIM_ICPolarity极性
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICSelection_DirectTI;//TIM_ICPrescaler分频器
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//TIM_ICSelection配置数据选择器TIM_PWMIConfig(TIM3,&TIM_ICInitStructure);

        注意:TIM_PWMIConfig函数只支持通道1和通道2的配置,使用函数时不要传入通道3和通道4.

2.5 选择从模式的触发源

        配置TRGI的触发源为TI1FP1.

代码示例:

	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);

  *     @arg TIM_TS_ITR0: Internal Trigger 0*     @arg TIM_TS_ITR1: Internal Trigger 1*     @arg TIM_TS_ITR2: Internal Trigger 2*     @arg TIM_TS_ITR3: Internal Trigger 3*     @arg TIM_TS_TI1F_ED: TI1 Edge Detector*     @arg TIM_TS_TI1FP1: Filtered Timer Input 1*     @arg TIM_TS_TI2FP2: Filtered Timer Input 2*     @arg TIM_TS_ETRF: External Trigger input

        这里给出的8个可选触发源对应上图触发源选择的8个模式。这里选择TIM_TS_TI1FP1。
 

2.6 配置从模式为Reset

代码示例:

	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);

  *     @arg TIM_SlaveMode_Reset: Rising edge of the selected trigger signal (TRGI) re-initializes*                               the counter and triggers an update of the registers.*     @arg TIM_SlaveMode_Gated:     The counter clock is enabled when the trigger signal (TRGI) is high.*     @arg TIM_SlaveMode_Trigger:   The counter starts at a rising edge of the trigger TRGI.*     @arg TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter.

        这里的4种从模式对应上图中的4种从模式。从模式中还有3个Encoder从模式,是给编码器接口用的,有其他函数可以配置。

        例子中选择Reset这个模式。

2.7 开启定时器

        开启定时器,调用TIM_Cmd函数。

代码示例:

	TIM_Cmd(TIM3,ENABLE);

        启动定时器之后,CNT就会在内部时钟的驱动下不断自增。即使信号没有过来,它也会不断自增,等到有信号来的时候,会在从模式的作用下自动清零,不会影响测量。

        初始化之后整个电路就可以全自动测量了。


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了配置输入捕获电路来测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。

这篇关于STM32 PWMI模式测频率占空比的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/751724

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者