野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26703|回复: 42

STM32 PWM 输入捕获,计算占空比和频率时,捕获的值都必须加1,千万注意。

[复制链接]
发表于 2016-9-20 16:08:21 | 显示全部楼层 |阅读模式
STM32 PWM 输入捕获,计算占空比和频率时,捕获的值都必须加1,千万注意。
1-如果你捕获的PWM的频率很低,都是在1KHZ以内,那么加一个1和少一个1去计算,对结果的影响不是很大,这个时候你就会认为是误差,而不是错误
2-当你捕获的PWM频率在100KHZ以上时,这个时候少一个1和加一个1,那么对结果的影响就很大了,如果你不知道原理,你就会认为是你自己的程序写错了。
1.jpg
3-PWM输入是输入捕获的特殊例子,很多初学者是不知道我说什么的,即使你用过,你一般也是捕获低频率的PWM信号,基本用的都是错误的公式,因为网络上还有ST官方的例程提供的都是没有加1的错误例程。
4-输入捕获能捕获到的最低的PWM频率为:// 输入捕获能捕获到的最小的频率为 TIM_CLK /{ (ARR+1)*(PSC+1) },这个前提是 捕获定时器没有溢出的情况下,如果计数溢出了,那么需要在中断里面进行额外的处理,但是这种应用非常少,基本不会溢出。

5-该例程已经在霸道和指南者上面验证过,实验设计为:通过定时器TIM3的通道1:PA6 产生一个 100K 的 PWM 波,然后通过 高级定时器TIM1的通道1:PA8来捕获,然后计算出PWM信号的频率和占空比,其中TIM1的能捕获到的最低的PWM频率为1K,所以大于1K的PWM信号都可以被捕获到。
TIM—高级定时器-PWM输入.zip (380.81 KB, 下载次数: 1333)

  1. /*
  2. * 如果是第一个上升沿中断,计数器会被复位,锁存到CCR1寄存器的值是0,CCR2寄存器的值也是0,
  3. * 无法计算频率和占空比。当第二次上升沿到来的时候,CCR1和CCR2捕获到的才是有效的值。其中
  4. * CCR1对应的是周期,CCR2对应的是占空比。
  5. */
  6. void ADVANCE_TIM_IRQHandler(void)
  7. {
  8.   /* 清除中断标志位 */
  9.   TIM_ClearITPendingBit(ADVANCE_TIM, TIM_IT_CC1);

  10.   /* 获取输入捕获值 */
  11.   IC1Value = TIM_GetCapture1(ADVANCE_TIM);
  12.   IC2Value = TIM_GetCapture2(ADVANCE_TIM);
  13.         
  14.   // 注意:捕获寄存器CCR1和CCR2的值在计算占空比和频率的时候必须加1
  15.         if (IC1Value != 0)
  16.   {
  17.     /* 占空比计算 */
  18.     DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);

  19.     /* 频率计算 */
  20.     Frequency = 1000000/(float)(IC1Value+1);
  21.                 printf("占空比:%0.2f%%   频率:%0.2fHz\n",DutyCycle,Frequency);
  22.   }
  23.   else
  24.   {
  25.     DutyCycle = 0;
  26.     Frequency = 0;
  27.   }
  28. }
复制代码




回复

使用道具 举报

 楼主| 发表于 2016-9-20 16:13:02 | 显示全部楼层
当我捕获一个100KHZ的PWM信号的时候,周期我设置的是10,占空比我设置的是5,可捕获出来的周期即CCR1的值是9,占空比即CCR2的值却是4,所以都要加1.
QQ图片20160920161102.png
回复 支持 反对

使用道具 举报

发表于 2016-9-20 16:16:39 | 显示全部楼层
这个只是32才存在的问题吗?我以前用过stm8做过这个实验,不用加1
回复 支持 反对

使用道具 举报

发表于 2016-9-20 16:17:34 | 显示全部楼层
本帖最后由 panxing 于 2016-9-20 16:21 编辑

                                                                                            
回复 支持 反对

使用道具 举报

发表于 2016-9-20 16:19:14 | 显示全部楼层
为什么在低频的时候不加1影响却很小?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-20 16:22:15 | 显示全部楼层
蔚慧雅 发表于 2016-9-20 16:19
为什么在低频的时候不加1影响却很小?

1-频率低,那周期就大,在计算占空比和频率的时候,周期都是作为分母,当分母很大的时候,分子和分母少加了一个1对计算结果影响是很小的,不知道的人都会认为是误差,而不是错误。

2-当频率高的时候,周期就很小,当一个很小的数做分母的时候,少加了1,那对结果就影响很大。
回复 支持 2 反对 0

使用道具 举报

发表于 2016-9-20 16:23:03 | 显示全部楼层
fire 发表于 2016-9-20 16:13
当我捕获一个100KHZ的PWM信号的时候,周期我设置的是10,占空比我设置的是5,可捕获出来的周期即CCR1的值是 ...

帮顶,还没用过,不知道以后会不会用到,打个预防针先。
回复 支持 反对

使用道具 举报

发表于 2016-9-20 16:24:51 | 显示全部楼层
fire 发表于 2016-9-20 16:22
1-频率低,那周期就大,在计算占空比和频率的时候,周期都是作为分母,当分母很大的时候,分子和分母少加 ...

学习了                                 
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-20 16:29:34 | 显示全部楼层
没有伞的孩子 发表于 2016-9-20 16:16
这个只是32才存在的问题吗?我以前用过stm8做过这个实验,不用加1

你测试的频率如果是1KHZ以内,你是发现不出来的,因为频率太低,具体的原因看我6楼的分析。
回复 支持 反对

使用道具 举报

发表于 2016-9-20 16:30:20 | 显示全部楼层
学习了,居然不用先评论就能看帖了,哈哈哈
回复 支持 反对

使用道具 举报

发表于 2016-9-20 16:30:55 | 显示全部楼层
研究这些细节的人都是越来越少了,网络上的那些博客都你抄我我抄你,而且有些还是错的。
回复 支持 反对

使用道具 举报

发表于 2016-9-20 16:59:41 | 显示全部楼层
fire 发表于 2016-9-20 16:29
你测试的频率如果是1KHZ以内,你是发现不出来的,因为频率太低,具体的原因看我6楼的分析。

额,好像我的频率是没有达到1K,就几百Hz
回复 支持 反对

使用道具 举报

发表于 2016-9-20 17:55:55 | 显示全部楼层
对于这个资料,我只能跪拜了,谢谢火哥
回复 支持 反对

使用道具 举报

发表于 2016-9-20 17:56:48 | 显示全部楼层
最近火哥为群里的小伙伴解答问题很积极啊,还专门写个帖子,GOOD
回复 支持 反对

使用道具 举报

发表于 2016-9-20 17:58:48 | 显示全部楼层
火哥,这个例程可以用在F429上面吗
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:06:22 | 显示全部楼层
可以哦,分析的很到位。我点赞
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:24:48 | 显示全部楼层
默默的看大神们分享,期待自己有一天可以做个资料分享的楼主
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:25:21 | 显示全部楼层
火哥用了多长时间发现这个问题的
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:27:01 | 显示全部楼层
支持支持!!!
回复

使用道具 举报

发表于 2016-9-20 18:27:21 | 显示全部楼层
谢谢火哥的总结和开源,简直是初学者的指路明灯啊
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:27:36 | 显示全部楼层
v2的板子可以用吗
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:28:59 | 显示全部楼层
意思就是ST官方给的例程也是有BUG的吗?
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:29:32 | 显示全部楼层
赶紧下载资料压压惊
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:30:31 | 显示全部楼层
5-该例程已经在霸道和指南者上面验证过,实验设计为:通过定时器TIM3的通道1:PA6 产生一个 100K 的 PWM 波,然后通过 高级定时器TIM1的通道1:PA8来捕获,然后计算出PWM信号的频率和占空比,其中TIM1的能捕获到的最低的PWM频率为1K,所以大于1K的PWM信号都可以被捕获到。
我也去验证下,看看结果和火哥的是否一致
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-20 18:31:40 | 显示全部楼层
几折荒年 发表于 2016-9-20 17:58
火哥,这个例程可以用在F429上面吗

可以,差不多                           
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:32:14 | 显示全部楼层
如果误以为是程序问题,那就尴尬了,调死都调不出来
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:33:07 | 显示全部楼层
我刚学习到PWM就遇到了这么给力的资料?牛逼
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:33:17 | 显示全部楼层
谢谢火哥的分享
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:33:40 | 显示全部楼层
在群里讨论的很激烈啊,这么快有大神分享了
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:34:26 | 显示全部楼层
捕获低频率的PWM信号的时候,用的都是错误的公式
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:35:04 | 显示全部楼层
这个公式要来个命名嘛,野火PWM捕获公式
回复 支持 反对

使用道具 举报

发表于 2016-9-20 18:36:05 | 显示全部楼层

那意思就是要修改了
回复 支持 反对

使用道具 举报

发表于 2016-9-21 16:30:28 | 显示全部楼层
简逸致 发表于 2016-9-20 18:30
5-该例程已经在霸道和指南者上面验证过,实验设计为:通过定时器TIM3的通道1:PA6 产生一个 100K 的 PWM 波 ...

试出来了吗?
回复 支持 反对

使用道具 举报

发表于 2016-10-19 19:39:32 | 显示全部楼层
用TIM的CH1和CH2捕捉一路PWM的同时,CH3和CH4还能捕捉另一路吗?
回复 支持 反对

使用道具 举报

发表于 2016-10-19 22:02:31 | 显示全部楼层
多谢提醒,学习了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-4 11:17:49 | 显示全部楼层
没有伞的孩子 发表于 2016-9-20 16:59
额,好像我的频率是没有达到1K,就几百Hz

还是有误差的,只是误差很小而已,这个时候我们就会以为不是错误,而仅仅是误差。
回复 支持 反对

使用道具 举报

发表于 2016-11-5 17:51:38 | 显示全部楼层
似曾相识JK 发表于 2016-10-19 19:39
用TIM的CH1和CH2捕捉一路PWM的同时,CH3和CH4还能捕捉另一路吗?

同问能不能检测多路PWM
回复 支持 反对

使用道具 举报

发表于 2017-6-11 23:44:04 | 显示全部楼层
fire 发表于 2016-9-20 16:13
当我捕获一个100KHZ的PWM信号的时候,周期我设置的是10,占空比我设置的是5,可捕获出来的周期即CCR1的值是 ...

火哥  我用了高级定时器PWM输入捕获的例程测一个10K的方波  
ADVANCE_TIM_PERIOD            (1000-1)
ADVANCE_TIM_PSC                  (72-1)

IC1Value的值在99和一百之间来回跳动  导致频率跳的很大
不知道是为什么

然后我想让IC1Value大一点好让跳动小一点  就改了下
ADVANCE_TIM_PERIOD            (10000-1)
ADVANCE_TIM_PSC                  (2-1)
结果IC1Value是变大了   但是跳动也大了  几十几十的跳


回复 支持 反对

使用道具 举报

发表于 2017-6-14 17:13:17 | 显示全部楼层


为什么只有大于1K才能捕获呢,有没有地方可以调整呢
回复 支持 反对

使用道具 举报

发表于 2017-6-14 17:17:50 | 显示全部楼层
其中TIM1的能捕获到的最低的PWM频率为1K,所以大于1K的PWM信号都可以被捕获到

请问为什么大于1K才能捕获到呢,能不能调整呢
回复 支持 反对

使用道具 举报

发表于 2017-6-14 19:26:54 来自手机 | 显示全部楼层
火哥 通用定时器pwm4路输出时 仿真时PB.0无波形显示 其他三路均有波形
回复 支持 反对

使用道具 举报

发表于 2018-5-18 22:06:55 | 显示全部楼层
PWM输入捕获能捕获的最大频率为   72MHZ/{ (PSC+1) }
根据这个公式  理论最大值1M吧
但是我实测100K
为什么这么大的误差  
回复 支持 反对

使用道具 举报

发表于 2018-6-11 09:55:14 | 显示全部楼层
中断这个地方我这么写值更不对了,怎么回事
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 18:59 , Processed in 0.046951 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表