使用Stm32CubeMx 完成PWM输入模式采集频率和占空比

最近使用Stm32CubeMx来完成PWM输入模式做PI,在网上看了些别人写的用法,结合自己的使用,做一个小记录。

Stm32CubeMx配置

	Stm32的芯片参考手册里面关于定时器的PWM输入模式的操作介绍,我这里就不贴出来了,详细的资料网上有很多的。我们直接开始关于
CubeMx的配置介绍。
	选芯片的操作就不贴图了,直接从芯片的功能配置开始:

使用Stm32CubeMx 完成PWM输入模式采集频率和占空比_第1张图片
这里是选择外部晶振高速时钟输入。
使用Stm32CubeMx 完成PWM输入模式采集频率和占空比_第2张图片
RCC配置完了,个人习惯马上把时钟配置好。
使用Stm32CubeMx 完成PWM输入模式采集频率和占空比_第3张图片
我使用的是DAP仿真器,使用的SW接口。这里特别提醒一下新手,记得将这个Debug选项选好,不然等下程序的时候,第一次下进去了,后面可能就会下不了程序。具体原因啥的就不在这说明了。然后选择基本时钟资源SysTick。
使用Stm32CubeMx 完成PWM输入模式采集频率和占空比_第4张图片
我这里举例使用的是普通的TIM4定时器。Clock Source选择内部时钟资源;模式选择Combined Channels 为PWM输入模式,上图中的PWM Input on CH2 指的是我使用的Input Trigger 是TI2FP2,stm32的手册举例中使用的是TI1FP1。然后,TIM4在APB1上,即时钟频率是72MHz。所以Parameter Settings中我们使用(71 + 1)分频,使用1M的计数频率去测量PI。然后其他的不需要动,我们来说说Parameter Settings中最主要的PWM Input CH2的设定。
使用Stm32CubeMx 完成PWM输入模式采集频率和占空比_第5张图片
当我们的选择PWM Input On CH2时,Input Trigger就自动的选定为TI2FP2。然后需要重点说明的关于Channel 1和Channel 2的设定:由stm32官方手册关于PWM输入介绍,我们可以知道,我们需要一路只采上跳沿来获取周期,另一路只采集下跳沿来获取占空比,所以我们这里选择通道2采集上跳沿,那么等下在代码中我们就得从通道2的捕获寄存器中取值来计算频率,从通道1的捕获寄存器取值来计算占空比。至于参数Input Filter就是用来设置输入触发滤波器,这个手册有介绍。
使用Stm32CubeMx 完成PWM输入模式采集频率和占空比_第6张图片
打开TIM4的中断,其他的定时器可能选项有些不同,但是你将鼠标移到NVIC Interru Settings栏中的各个中断选项名上,stm32cubemx就会显示出他是对应的什么中断的IRQ通道,然后对照手册选择你需要的中断勾选上就可以了。
使用Stm32CubeMx 完成PWM输入模式采集频率和占空比_第7张图片
引脚设置这里提一句,如果想保证保证没有信号输入的时候电平稳定,就把它设置为下拉。
使用Stm32CubeMx 完成PWM输入模式采集频率和占空比_第8张图片
使用Stm32CubeMx 完成PWM输入模式采集频率和占空比_第9张图片
主要的已经设置完了,现在就是最后的工程文件的设置了,这个就网上的解释有很多,我就不多赘述了。下面我们来看生成的工程。

代码说明

使用Stm32CubeMx 完成PWM输入模式采集频率和占空比_第10张图片
使用Stm32CubeMx 完成PWM输入模式采集频率和占空比_第11张图片
stm32cubemx生成的代码中,中断处理函数已经写好,大部分的操作,我们就只需要用它的回调函数就行了。具体是哪个回调函数,就看stm32f1xx_hal_tim.h中已经定义申明好的,我们直接选择我们要的拿过来填入实体就行了。
在这里,我们使用HAL_TIM_ReadCapturedValue函数从TIM4的通道一捕获寄存器中读取了代表占空比的值,从通道二捕获寄存器中读取了代表整个输入PI周期的计数值。
使用Stm32CubeMx 完成PWM输入模式采集频率和占空比_第12张图片
最后在main函数开始我们使用HAL_TIM_IC_Start_IT函数来开启捕获,然后再while循环中计算频率和占空比。我这里是隔1S计算一次,使用了HAL_GetTick函数来获取当前的系统时钟计数。
这里来说明一下频率和占空比计算的公式:
频率:TIM4在APB1时钟总线上,频率是72M,我们一开始设置的分频比是71(+1),所以我们的定时器计数频率是1M,即计数一次的时间是1/1M。那么我们通过读取的周期计数值计算出周期=TempPIpre*(1/1M),然后频率是周期的倒数,故我们需要的PI频率=1/(TempPIpre*(1/1M))=1M/TempPIpre。
占空比:TempPIpul是高电平计数值,TempPIpre是整个周期的计数值,所以TempPIpul/TempPIpre就是我们的正占空比,这里我TempPIpul*100是将小数显示扩大100倍成百分比显示。

你可能感兴趣的:(程序人生,stm32)