STM32/STM8技术论坛
直播中

ebox生态圈

10年用户 104经验值
擅长:可编程逻辑 电源/新能源 控制/MCU
私信 关注
[资料]

【eBox生态圈】连载十:最新支持STM32输入捕获模式测频率、周期、占空比,简洁而完美!

这段时间eBox在不断的更新内容,先上一个最新的支持!定时器输入捕获模式

基础知识:
STM32输入捕获模式,主要用于测量输入信号的周期,进而计算波形的频率。正常情况下。输入捕获模式只能测量周期,因为stm32在输入捕获模式设置为检测上升沿或者下降沿。当检测到边沿后,保存定时器的当前值到tiMx->CCR1寄存器。在中断中读取此寄存器就可以得到两个上升沿或者下降沿之间的脉冲数,然后在根据定时器的时钟去计算波形的周期。
如果要测量占空比就要在中断中重新设置边沿即可。
特点
1.支持TIM2,3,4的ch1,2,3,4.共计12个通道
2.支持测量周期、频率、高级用法支持测量占空比
3.定时器计数器最大值为0xffff,为了突破这个限制,
    在本例程中,如果使用了update溢出中断调用overflow_event_process可以将计数器
    拓展至2^32。大大提高测量范围,可以实现最高频率(1分频)测量周期低于60s的信号,如果信号长度。
    如果使用2分频,可测量周期低于120s的信号,如果信号长度。以此类推。
4.get_captur()的精度补偿值
    //此处要加一个简单的修正值,此数为测试大致测试结果
    //分频系数 | 补偿值 | TIM时钟频率 | 测试频率
    //7200分频 | 0      | 0.01M       |  1hz-100hz
    //720分频  | 1      | 0.10M       |  100-1K
    //72分频   | 2      | 1.00M       |  1K
    //64分频   | 3      | 1.125M      |  1K
    //36分频   | 5      | 2.00M       |  1K
    //32分频   | 6      | 2.25M       |  1K
    //18分频   | 11     | 4.00M       |  1K
    //16分频   | 11     | 4.50M       |  1K
    //9分频    | 18     | 8.00M       |  10K
    //8分频    | 21     | 9.00M       |  10K-50K
    //4分频    | 42     | 18.0M       |  10K-50K
    //2分频    | 84     | 36.0M       |  10K-50K
    //1分频    | 168    | 72.0M       |  10K-50K
5.关于分频系数和脉冲宽度测量的计算关系,要遵循一个原则:在不溢出的情况下尽量使用低分频系数(高TIM时钟)去检测对象
重点:
    在采用低分频系数的时候,可以保证测量精度,但是会增大定时器溢出频率,进而增大cpu开销,
    在采用高分频系数的时候,测量精度较低,但是会降低定时器溢出频率,进而降低cpu开销,
    stm32在72M主频下,最高可测160Khz的信号。如果再大,将无法测量。
测试例程
  1. /*
  2. 本例程为使用输入捕获模式测量一个PWM信号的周期和频率
  3. */
  4. #include "ebox.h"

  5. IN_CAPTURE ic(&PA0);//创建一个输入捕获的对象
  6. PWM pwm1(&PB8);//创建一个PWM输出对象

  7. uint32_t value1;
  8. uint32_t value2;

  9. void mesure_frq()//输入捕获中断事件
  10. {
  11.     ic.set_count(0);
  12.     value1 = ic.get_capture() + 170;//此处是一个校正值,查表可得。
  13. }
  14. void update_event()
  15. {
  16.     ic.overflow_event_process();
  17. }
  18. uint16_t p;
  19. void setup()
  20. {
  21.         ebox_init();
  22.         uart1.begin(115200);   
  23.     p = 1;
  24.     ic.begin(p);//初始化输入捕获参数,p分频
  25.     ic.attch_ic_interrupt(mesure_frq);//绑定捕获中断事件函数
  26.     ic.attch_update_interrupt(update_event);
  27.     pwm1.begin(1000,900);
  28.     pwm1.set_oc_polarity(1);
  29.    
  30. }
  31. int main(void)
  32. {
  33.         setup();
  34.         while(1)
  35.     {

  36.         if(value1)
  37.         {
  38.             uart1.printf("overtimes = %drn",ic.get_overflow_state());
  39.             uart1.printf("value1 = %drn",value1);//输出PWM周期
  40.             uart1.printf("frq = %0.0frn",(72000000.0/p)/(value1));//输出PWM频率
  41.             value1 = 0;
  42.         }
  43.         }

应用场合

1.红外遥控接收解码。
2.DS18B20温度解读。DHT11温湿度模块读取温度
3.测电机转速。
等等,只要是需要测频率、周期、占空比相关的,都可以用此代码来实现!
上传一个工程:
ebox_stm32_输入捕获.rar (1.79 MB)
(下载次数: 183, 2016-1-9 15:34 上传)



我的众筹项目地址:http://z.elecfans.com/30.html 期待大家一起来完善和发展eBox,打造国人自己的库,不仅仅支持STM32,更能支持飞思卡尔MCU、NXP MCU······









回帖(3)

himol

2016-1-11 14:25:28
学习学习。。。。。。。。。。。。。
举报

ddd

2016-1-13 21:40:48
非常好下载看看
举报

花不语怪风

2017-9-5 23:08:14
挺好的,下载下来学习下,谢谢分享
举报

更多回帖

发帖
×
20
完善资料,
赚取积分