这段时间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的信号。如果再大,将无法测量。
测试例程
- /*
- 本例程为使用输入捕获模式测量一个PWM信号的周期和频率
- */
- #include "ebox.h"
- IN_CAPTURE ic(&PA0);//创建一个输入捕获的对象
- PWM pwm1(&PB8);//创建一个PWM输出对象
- uint32_t value1;
- uint32_t value2;
- void mesure_frq()//输入捕获中断事件
- {
- ic.set_count(0);
- value1 = ic.get_capture() + 170;//此处是一个校正值,查表可得。
- }
- void update_event()
- {
- ic.overflow_event_process();
- }
- uint16_t p;
- void setup()
- {
- ebox_init();
- uart1.begin(115200);
- p = 1;
- ic.begin(p);//初始化输入捕获参数,p分频
- ic.attch_ic_interrupt(mesure_frq);//绑定捕获中断事件函数
- ic.attch_update_interrupt(update_event);
- pwm1.begin(1000,900);
- pwm1.set_oc_polarity(1);
-
- }
- int main(void)
- {
- setup();
- while(1)
- {
- if(value1)
- {
- uart1.printf("overtimes = %drn",ic.get_overflow_state());
- uart1.printf("value1 = %drn",value1);//输出PWM周期
- uart1.printf("frq = %0.0frn",(72000000.0/p)/(value1));//输出PWM频率
- value1 = 0;
- }
- }
应用场合
1.红外遥控接收解码。
2.DS18B20温度解读。DHT11温湿度模块读取温度
3.测电机转速。
等等,只要是需要测频率、周期、占空比相关的,都可以用此代码来实现!
上传一个工程:
我的众筹项目地址:http://z.elecfans.com/30.html 期待大家一起来完善和发展eBox,打造国人自己的库,不仅仅支持STM32,更能支持飞思卡尔MCU、NXP MCU······