输入捕获模式测频率&PWM输入模式(PWMI)测占空比

这篇具有很好参考价值的文章主要介绍了输入捕获模式测频率&PWM输入模式(PWMI)测占空比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概念介绍

输出比较:

比较电路输入的CNT、CCR大小关系 ,在通道引脚输出高低电平

输入捕获模式测频率&PWM输入模式(PWMI)测占空比,单片机,嵌入式硬件

二、*频率知识、测量方法补充 *

输入捕获模式测频率&PWM输入模式(PWMI)测占空比,单片机,嵌入式硬件

N/fc得到标准频率的时长,也就是待测频率的周期

测频法代码实现:修改对射式红外传感器计次(上升沿计次)、定时器外部时钟(1s中断) 

测频法:定时器中断,并记录捕获次数;测周法:捕获中断,并记录定时器次数。

三、输入捕获电路分析如何实现测周法:

输入捕获模式测频率&PWM输入模式(PWMI)测占空比,单片机,嵌入式硬件

异或门其实还是为三相无刷电机服务,三个霍尔传感器检测转子位置,根据转子位置进行换相,在前三个通道接上霍尔传感器,这个定时器就作为无刷电机的接口定时器,去驱动换相电路工作

输入滤波器:避免毛刺

3.1设计成交叉状的目的:

TI1FP1(TI1 Filter Polarity 1) -->IC1<--TI2FP1

TI1FP2-->IC2<--TI2FP2

(1)灵活切换后续捕获电路输入 CH1变成CH2   即一个通道切换两个引脚

(2)把一个引脚的输入,同时映射到两个捕获单元(PWMI模式经典结构) 即两个捕获单元捕获一个引脚

输入捕获模式测频率&PWM输入模式(PWMI)测占空比,单片机,嵌入式硬件

举例:

第一个捕获通道?TI1FP1上升沿触发,用来捕获周期

第二个捕获通道TI1FP2下降沿触发,用来捕获占空比

两个通道同时对一个引脚进行捕获

3.2预分频器(测周法实现)&捕获中断

*设置上升沿触发,分频后的触发信号每来一次,CNT就会向CCR转运一次,又因为CNT是内部的标准时钟驱动的,CNT数值就可以记录两个上升沿之间的时间间隔,也就是周期,取倒数得到频率

上升沿用于触发输入捕获,CNT用于计数计时

捕获中断:同时产生捕获事件,这个事件在状态寄存器置标志位,同时也可以产生中断

3.3应用场景:超声波模块检测电路

3.4细节问题

每次捕获后,把CNT清零,这样下次上升沿再捕获,取出的CNT 才是两个上升沿的时间间隔

用主从触发模式自动完成

四、电路执行细节

输入捕获模式测频率&PWM输入模式(PWMI)测占空比,单片机,嵌入式硬件

输入捕获模式测频率&PWM输入模式(PWMI)测占空比,单片机,嵌入式硬件

输入捕获模式测频率&PWM输入模式(PWMI)测占空比,单片机,嵌入式硬件 注意:

CNT的值是有上限的(65535=ARRmax),若信号频率太低,CNT计数值会溢出

 从模式的触发源选择:TI1FP1 TI2FP2没有3,4 想用从模式自动清零CNT,只能用通道1和通道2,对于通道3和通道4只能开启捕获中断,手动清零

-->Q:能否外部中断? AS:概念不清,外部中断那是CPU了啊,这里是硬件映射主模式,然后配置从模式

输入捕获模式测频率&PWM输入模式(PWMI)测占空比,单片机,嵌入式硬件 也可以捕获第二个引脚:TI2FP1 TI2FP2

五、函数学习


/*****初始化输入捕获单元******/
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);//只配置一个通道

void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);//配置两个通道(PWMI模式)

/*****给输入捕获结构体赋初值*****/
void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);


*****************************选择从模式*********************************

/*****选择从模式输入触发源*****/

void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
/*****选择主模式输出触发源*****/
void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);
/*****选择从模式*****/
void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);

/*****配置分频器*****/ 
结构体里也能配置,一个效果

void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);

/*****读取CRR*****/
输入捕获模式下只读,输出比较只写(TIM_SetComparex),函数是不一样的
uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);

Q&AnS

为什么ARR要大一些?

-->防止N过大计数溢出,为了防止cnt到了某个值就重装了

psc也不能给的太小,防止测量的信号频率过低,导致计数器溢出

注意:

1.滤波器 VS分频器

滤波器计次不会改变信号原有频率,因为滤波器采样频率远远高于信号频率,只会滤除高频噪声,使信号更平滑

分频器对信号本身计次,会改变频率

这里用上升沿触发归零,后边用下降沿不触发归零,两个值一减就是占空比。归零一次是一个周期,从0开始计高电平方便得出占空比,不然还得用1再减一下

2.Fc = 72MHz/(psc+1)

 六、输入捕获模式测频率代码分析

输入捕获模式测频率&PWM输入模式(PWMI)测占空比,单片机,嵌入式硬件

main.c 

为什么PWM那里还是 720-1 IC却要改72-1?

#include "stm32f10x.h"    // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"


int main(void)
{
	OLED_Init();
	PWM_Init();
	IC_Init();
	
	OLED_ShowString(1,1,"Freq:00000Hz");
	
	PWM_SetPreScaler(720-1);             //Freq= 72M / (PSC+1) / 100
	PWM_SetCompare1(50);                 //Duty = CRR / 100
	
	while(1)
	{
		OLED_ShowNum(1,6,IC_GetFreq(),5);
	}
	
}

IC.C

#include "stm32f10x.h"                  // Device header

void IC_Init(void)
{
	/*****STEP1 开启时钟*****/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//TIM2要输出PWM 换成3捕获
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//TIM3_CH1 在PA6口
	
	/*****STEP2 配置GPIO*****/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;						
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	/*****STEP3 配置时基单元*****/	
	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 1MHz
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

	/*****STEP 4 输入捕获配置*****/
	TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;                     //选择通道
	TIM_ICInitStructure.TIM_ICFilter = 0xF;                      //配置滤波器参数,数值越大过滤效果越好
	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;          //极性选择
	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;                 //分频器
	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;     //配置数据选择器
	TIM_ICInit(TIM3,&TIM_ICInitStructure);
	/*****STEP 5 配置主从触发模式 *****/
	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);         //触发源选择
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);     //配置从模式
	/*****STEP6 启动定时器*****/
	TIM_Cmd(TIM3,ENABLE);
}

uint32_t IC_GetFreq(void)
{
	return 1000000 / TIM_GetCapture1(TIM3);      //Fc = 72MHz/(psc+1)
}

现象

10001Hz 

原因:

计数到1000Hz那个数信号刚好跳变,导致数没记上

有朋友说是因为:读取的是N,但实际上计了N+1个数,因为计数器CNT是从0开始计的,所以这里要加一,错,自行探讨

改进:
uint32_t IC_GetFreq(void)
{
    return 1000000 /( TIM_GetCapture1(TIM3)+1;      //Fc = 72MHz/(psc+1)
}

七、PWMI测占空比代码分析

输入捕获模式测频率&PWM输入模式(PWMI)测占空比,单片机,嵌入式硬件

与上一个代码不同的地方:

1.输入捕获初始化需要升级:

两个通达捕获同一个引脚,比较朴素的想法就是再定义一遍结构体参数

通道1 直连输入,上升沿触发 通道2 交叉输入(通道2相当于通道1 的交叉输入结果)下降沿触发

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;                     //选择通道
	TIM_ICInitStructure.TIM_ICFilter = 0xF;                      //配置滤波器参数,数值越大过滤效果越好
	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;          //极性选择
	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;                 //分频器
	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;     //配置数据选择器
	TIM_ICInit(TIM3,&TIM_ICInitStructure);

简单的办法 (只支持通道1、2之间):

	TIM_PWMIConfig(TIM3,&TIM_ICInitStructure);    //自动把剩下的通道配置成相反的配置

2.占空比函数

uint32_t IC_GetDuty(void)
{
	return (TIM_GetCapture2(TIM3) + 1) * 100 /(TIM_GetCapture1(TIM3) + 1);
}

3.main变动

/***main 变动***/
OLED_ShowString(2,1,"Duty:00%");

/***while 变动***/
OLED_ShowNum(2,6,IC_GetDuty(),2);

八、探究测频率性能

测频率范围 

fc 1MHz Nmax = 65535  最低频率是15Hz左右

要是再想降最低频率限制,PSC加大(这里fc=72M/(PSC+1)就是1M,当fc越小,能够测量的信号频率就越小,所以你要想测频率更小的信号,就可以减小fc,也就是增大PSC值)

频率上限,就是标准频率了,再高,没法测,误差(正负一误差=1/计数值)大,提高上限就要降低PSC或者尝试测频法文章来源地址https://www.toymoban.com/news/detail-826182.html

到了这里,关于输入捕获模式测频率&PWM输入模式(PWMI)测占空比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32输入捕获测频率&PWM模式测频率占空比

    本文章转自B站江科大自化协    1,输入捕获测频率 接线图  目录结构 IC.h IC.c pwm.c PWM.h      main.c 编译下载出结果   2.PWM模式测频率占空比 接线图同上 目录结构同上 IC.c  IC.h main.c 编译下载测试     PS:测h   

    2024年02月15日
    浏览(33)
  • STM32——输入捕获IC(测试频率以及PWMI测试频率占空比)

    目录 一、IC介绍 1.1、IC作用 1.2、电路部分  1.2.1、详细电路作用  1.2.2、从模式控制器 1.3、输入捕获配置基本结构 1.3.1、PWMI模式 二、代码配置 2.1、从模式函数 2.1.1、TIM_SelectInputTrigger() 2.1.2、TIM_SelectSlaveMode() 2.1.3、TIM_SelectSlaveMode() 2.2.输入捕获及时基单元函数 2.2.1、

    2024年01月25日
    浏览(40)
  • STM32笔记——定时器输入捕获功能(测量PWM的频率和占空比)

    目录 一、概述 二、输入捕获功能 2.1 输入捕获简介 2.2 输入捕获通道  三、输入捕获功能测量PWM波的频率和占空比 3.1 测量频率的方法 3.2 测量过程         主要介绍通用定时器的输入捕获功能,输入信号由GPIO口进入输入捕获通道,之后输入部分对相应的TIx输入信号采样,并

    2024年02月06日
    浏览(79)
  • STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断

    2023年04月19日
    浏览(54)
  • 基于HAL库的STM32单定时器多路输入捕获测量PWM的频率和占空比实现(状态机方式实现)

    目录  写在前面 先回顾下定时器的单路捕获PWM 多路捕获PWM的频率和占空比(状态机实现) 我的思路: 状态图 配置 给出示例代码 测试效果         先有了这篇文章实现了单定时器的多通道测量频率,以外部时钟的方式可测量任意频率的方波),奈何不能多路测试PWM波的频率,

    2024年02月12日
    浏览(46)
  • STM32 TIM输入捕获测频率占空比库函数

    目录 一、输入捕获初始化函数 TIM_ICInit TIM_PWMIConfig TIM_ICStructInit 二、主从触发模式对应函数 TIM_SelectInputTrigger TIM_SelectOutputTrigger TIM_SelectSlaveMode 三、配置分频器函数 TIM_SetIC1Prescaler TIM_SetIC2Prescaler TIM_SetIC3Prescaler TIM_SetIC4Prescaler 四、读取CCR函数 TIM_GetCapture1 TIM_GetCapture2 TIM_GetCap

    2024年02月20日
    浏览(32)
  • 一文搞懂STM32定时器翻转模式(产生多路频率、占空比的PWM)

    在STM32定时器配置中,我们知道可以将定时器配置为PWM输出模式,也叫输出比较模式,通过修改ARR寄存器中的值可以改变PWM周期,通过修改CCR寄存器中的值可以修改,PWM的占空比,但是这种普通的PWM输出模式较为单一,能输出PWM的定时器有4个通道,这种方式只能够产生4路周期

    2024年02月12日
    浏览(54)
  • STM32主从模式实现两路同步PWM脉冲输出,频率、占空比可调

    原理:定时器1为主模式,定时器8为从模式,TIM1的定时器使能操作作为触发输出[TRGO]触发TIM8并使能TIM8的计数器,同时输出两路频率、占空比以及脉冲数量(小于256个,高级定时器重复计数功能为8位)可调PWM波形。 关键代码: 定时器1(TIM1)设为主模式: 定时器2(TIM8)设为从

    2024年02月13日
    浏览(38)
  • stm32 笔记 PWM输入模式测量脉宽和占空比原理

    在测量占空比之前,我们先一步一步来,先让 STM32 可以测量脉宽。 TIM3_CH1(tim3 定时器通道 1)捕获模式测量脉宽步骤如下: 1.输入捕获到 PWM 上升沿触发 2.发送中断,通知用户此时被触发,用户获得当前计数器值 3.计数器清零,然后继续计数... 让 STM32 芯片一直重复这三步即

    2024年01月15日
    浏览(40)
  • STM32 HAL 检测PWM频率/占空比

    配置的系统时钟是100M,Timer的时钟也是100M Timer 的频率为:100M 分频 1000 = 0.1MHz 也就是定时器 每10us 计一个数 打开TIM4_CH2引脚中断 在 main.c 中开启中断 TIM4_CH2引脚中断回调 占空比%: TempPIpre *100 / TempPIpul 周期T: TempPIpul * 10us 频率f: 1 / T

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包