四、Stm32学习-输入捕获_PWMI模式

坚持完成你所想要做的事。学习需要功利一些。

阅读手册的定时器结构,输出比较和输入捕获是不能够同时使用的。

1.输入捕获简介

注意,当通道输入的引脚出现指定的电平跳变时候,当前CNT的计数值将被所存到CRR中。然后就可以通过一些函数把CCR的值读取出来。

PWMI模式是一种交叉输入,捕获电平极性相反等,可以同时测量频率与占空比。

主从触发模式可以去阅读“定时器同步”的部分。

2.测量频率的三种方法

测频法:就是计次N就是有几个上升沿(也可以设置下降沿捕获),那就意味着你知道了经历了几个周期,那么我们又知道总的时间,总的时间T/总的计次N就等于一个周期的时间,它的倒数就是频率咯~

测周法:相当于,在一个周期内,我们以一个我们自己设置的频率fc计次,那么计次1次的时间就有了,就是Tc,fc的倒数。所以我们又能够在CRR寄存器中拿到计次N的值。所以N * Tc就是周期,那么他的倒数就是频率咯~

中界频率忘记了有用再找。

注意:测频法适合高频信号,数据更新慢,更加准确;测周法适合低频信号,数据更新快,跳变大。

3.主从触发模式

很重要,可以实现硬件自动化,测量一个方波的占空比,频率等,用到再学。

4.输入捕获基本结构

5.PWMI模式基本结构

 6.输入捕获模式测量频率

(1)配置输出PWM波

和之前的配置一样,只不过调用了一个新函数来修改PWM的PSC。为什么不修改ARR呢?因为ARR修改了,占空比也会跟着修改。(其实也是懒得找修改ARR的函数了,应该是有)

(2)配置输入捕获IC

1.开启外设时钟

2.配置捕获的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);	

需要注意的是,这边GPIO的模式选择。阅读手册发现配置为浮空输入。但是配置为上拉输入也可以。

我的理解是:浮空输入容易受到干扰,导致实验结果不准。单片机是弱上拉,强下拉,所以设置上拉,这样解决了干扰,同时在引脚接收低电平时会被拉低

3.配置时钟源

选择TIM3为内部时钟,若不调用此函数,TIM默认也为内部时钟

TIM_InternalClockConfig(TIM3);	

4.时基单元的初始化

	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的值 配置为最大值65535,使用测频法,arr越大越好
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;               //预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);   

 要注意的是ARR的值的设置,为什么把它设置为最大65535呢?首先,本次程序是通过输入捕获的方式,在上升沿的时候将CNT里面的值传递给CCR;并且CNT的值上限是受到CRR的影响,CRR越大越好;而且程序采用的是测周法,你想想,如果一个信号频率很低,意味着周期很大,那你一直以一个很快的标准频率去计次,那不是容易达到最大值,导致你测量的结果有问题。所以才将它设置为最大。

然后上面的PSC设置为72,这个就是影响着我们自己设置的标准频率fc。例如这边设置72,那么我们的标准频率就是CLK_PSC/PSC即72M/72 = 1MHZ。这个是需要根据你信号的频率来配置。

5.输入捕获单元初始化

	/*输入捕获初始化*/
	TIM_ICInitTypeDef TIM_ICInitStructure;						
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;				//选择配置定时器通道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);		

1.第一个选择通道。

2.第二个选滤波器的滤波力度。

3.第三个是捕获极性的选择。

4.第四个是捕获的预分频,如果选择不分频,就是信号上升沿来一次触发一次;但是如果选择2分频,就是上升沿信号来2次然后触发一次捕获。

5.选择直连通道或者选择交叉通道(有个印象就好,PWMI模式用的交叉通道多)

6.配置触发源

TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);					//触发源选择TI1FP1

具体看手册,有用到再学。

7.配置从模式

TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);					//从模式选择复位
																	//即TI1产生上升沿时,会触发CNT归零。CNT的值会存入CRR寄存器

这个从模式会置0CNT的值,在一次触发之后。 

从模式选择“Reset”。上面四个的话主要用在三相,在另外的函数里面。

(3)编写业务代码

uint32_t IC_GetFreq(void)
{
	return 1000000 / (TIM_GetCapture1(TIM3) + 1);		//测周法得到频率fx = fc / N,这里不执行+1的操作也可
}

fc=72M/72=1000000,这是标准频率,我们采用测周法来计算频率:fx = fc / N。

7.PWMI模式测量频率和占空比

(1)输出PWM波配置和前面一样

(2)IC配置

不一样的点在于输入捕获的初始化。

使用下面的函数,因为PWMI的通道是两个互相对应,所以配置完一个,直接调用这个函数就能帮你配置好了。如果不放心,去看看函数里面的操作,或者再配置另一个通道。

TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);	

(3)业务代码编写

/**
  * 函    数:获取输入捕获的占空比
  * 参    数:无
  * 返 回 值:捕获得到的占空比
  */
uint32_t IC_GetDuty(void)
{
	return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);	//占空比Duty = CCR2 / CCR1 * 100,这里不执行+1的操作也可
}

高电平计数值存在CCR2里面,整个周期的计数值存在CCR1里面(看视频讲解,手册没看到,有用再去找)

所以duty就是等于CCR2 / CCR1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值