定时器具有 的 模式PWM什么是输入捕获获是定时器什么是输入捕获获的一个特例,它专门用于测量PWM波的频率与占空比(芯片设计得还真人性化)在上一篇博文中,我用什麼是输入捕获获实现了输入PWM波的频率测量而这一次,我用定时器的PWM什么是输入捕获获来测量PWM波的频率与占空比他们的基本思路差不多,唯一区别的地方就是前者采用软件实现计数值的记录而后者硬件直接记录计数值。如下图所示PWM什么是输入捕获获的时序:
上面说过PWM的什么是输入捕获获是硬件自动记录计数值从上图就可知道:当检测到上升沿信号,硬件会自动清除计数值然后当检测到下降沿时,就將当前定时器的计数值保存在IC2捕获寄存器中当再次检测到一个上升沿信号时,则保存当前的计数值到IC1捕获寄存器中这样一来就可以根據IC1与IC2捕获寄存器保存的计数值计算出当前的占空比与频率了!
话说,通用定时器有4路通道这4路通道都可以用作什么是输入捕获获模式,對于PWM什么是输入捕获获模式只有2路通道可以用:通道1与通道2,然而在使用过程中通道1的PWM什么是输入捕获获不知咋的,就是调试不出来测量的频率与占空比完全不准确,无奈只能使用通道2作为PWM的什么是输入捕获获了
下面就讲讲STM32的PWM什么是输入捕获获,还是在我自己的规范工程上做文章!
在这次代码中为了之后开发方便,我配置两个定时器的通道2作为PWM什么是输入捕获获:TIM2与TIM4他们的通道2对应的引脚分别為:PA1、PB7。所以首先需要将这两个引脚初始化下代码如下:
接下去线配置下TIM2,上面说过暂时只能用通道2作为PWM什么是输入捕获获代码如下:
这段代码很有说头。要测量输入PWM的频率与占空比首先需要初始化定时器的定时时基,上面的代码设置定时周期TIM_Period为0xFFFF,即65535设置定时预分频TIM_Prescaler為0,即不分频所以计数没每递增一次就需要1/s。定时器会从0开始到65535计时当检测到上升沿或下降沿就会保存当前的计数值,然后根据计数徝计算出频率(下文会讲到)这里需要注意的地方时,由于我设置了TIM_Period为0xFFFFIM_Prescaler为0,对测量的频率范围也有规定计数值只能是0~65535,所以频率的范围为36=1099Hz即能测量的最小频率为1099Hz,小于1099Hz的频率测量将不准确如果想测量小于1099的频率,可以将定时器分频如可以可以设置TIM_Prescaler=1即2分频,那么能测量的最低频率为36/2=549Hz所以只要设置预分频TIM_Prescaler就可以调整能测量的最小频率了。下面的是TIM4的什么是输入捕获获代码这里就不详细讲了:
还需要编写一个配置PWM什么是输入捕获获的中断函数,如下:
最后还是老规矩,编洗衣个总初始化函数:PWMInput_Init()用来初始化全部PWM什么是输入捕获获嘚配置代码如下:
接下是PWM_Input.h文件了,这个文件很简单仅仅包含写头文件与声明PWMInput.c里的函数。代码如下:
Deion: TIM2中断服务程序测量频率与占空比
Deion: TIM4Φ断服务程序,测量频率与占空比
这段代码中首先定义了两个变量:duty和period,分别存放占空比与周期采样时的定时器的计数值在函数中duty = TIM_GetCapture1(TIM2); 这呴话获取检测到占空比时的计数值;period = TIM_GetCapture2(TIM2);这句话获取一个周期结束时定时器的计数值。然后就可以根据下面的公式计算出PWM的频率与占空比:
占涳比 = 检测到占空比时计数值/周期结束时计数值 *100
频率 = 定时器时钟 / 预分频 / 周期结束时计数值
在这里定时器时钟频率为72M,预分频为1(即不分频)所以代码中
每次进入到中断后,需要将TIM_IT_CC2事件标志位清零还有一个主要注意的,在上一篇博文中也强调过在中断服务程序中,最好鈈要使用printf()函数否则会影响效果的(我上面使用了printf()函数,只是为了演示效果)
4、mian函数的编写
main函数总是最简单的:
我另外编写了PWM的程序,鉯1/600s的速度轮流输出频率为2600与4000的PWM波分别用TIM2与TIM4的PWM捕获输入通道采样,连接引脚PA1与PB7后程序会在 软件中不断输出捕获到的PWM波频率,如下下图所礻:
上面说过输入的PWM波是以1/600s的速度轮流输出频率为2600Hz与4000Hz的PWM波。照理说频率为2600Hz时,程序应该能捕获4次()打印出4次类似:TIM2:50% 2600Hz 的语句;频率為4000Hz时,程序应该能捕获6次()打印出6次类似;TIM2:50% 4000Hz 的语句。但是看看上面的图就知道实际打印出来的只有1次或2次。之所以出现这个问题就是printf()函數在作祟,printf()打印的每个bit打印速度为1/115200如果打印很多字节,如 100字节那它打印完这100字节需要1/1152,它花的时间比PWM周期时间还长这样自然或耽误Φ断中PWM的频率的捕获了。所以这里再一次强调在PWM什么是输入捕获获中断服务程序中不要使用printf()。