|
本帖最后由 shentqlf 于 2016-1-9 16:31 编辑
时隔两个月,时间太快了!最近我将慢慢的更新这段时间对ebox的完善,一点点带大家熟悉eBox固件库的最新特点!
这段时间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-测量周期、频率
- /*
- file : *.cpp
- author : shentq
- version: V1.0
- date : 2015/7/5
- Copyright 2015 shentq. All Rights Reserved.
- */
- /*
- 本例程为使用输入捕获模式测量一个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 = %d\r\n",ic.get_overflow_state());
- uart1.printf("value1 = %d\r\n",value1);//输出PWM周期
- uart1.printf("frq = %0.0f\r\n",(72000000.0/p)/(value1));//输出PWM频率
- value1 = 0;
- }
- }
- }
复制代码
测试例程2-测量占空比
- #include "ebox.h"
- IN_CAPTURE ic(&PA0);//创建一个输入捕获的对象
- PWM pwm1(&PB8);//创建一个PWM输出对象
- uint32_t value1;
- uint32_t value2;
- void mesure_frq()//输入捕获中断事件
- {
- ic.set_count(0);
- if(ic.polarity == TIM_ICPOLARITY_FALLING)//测量高电平时间完成
- {
- value1 = ic.get_capture() + 170;//校正值,查表可得
- ic.set_polarity_rising();//切换至测量低电平时间完成
- }
- else//测量低电平时间完成
- {
- value2 = ic.get_capture() + 170;//校正值,查表可得
- ic.set_polarity_falling();//切换至测量高电平时间完成
- }
- }
- 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 && value2)
- {
- uart1.printf("value1 = %d\r\n",value1);
- uart1.printf("value2 = %d\r\n",value2);
- uart1.printf("frq = %0.0f\r\n",(72000000.0/p)/(value1+value2));
- uart1.printf("pluse = %0.2f\r\n",value1*100.0/(value1+value2));
- value1 = 0;
- value2 = 0;
- }
- }
- }
复制代码
工程代码
上个小链接:
https://item.taobao.com/item.htm ... ;abbucket=14#detail
望大家支持!嘿嘿 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|