完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛
很多低端MCU没有像STM32 那样拥有强大脉冲捕获测频率,那么MCU只能依靠自身有的资源来实现这个功能,比较通用的方法是使用了外部中断+定时器来实现,该方法经过我在实际项目中的使用来看,频率50/60Hz 完全没问题,最好加个滤波算法,效果会更好。 一、实现原理 思路:
2.1 封装结构 typedef struct GET_FRE { u32 cnt; /*计数*/ u32 cnt_value; /*脉冲计数值*/ u16 timeout; /*超时*/ u16 fre; /*频率*/ u8 flag; }; 2.2 瑞萨单片机定时中断函数 CS+ 中配置定时间隔时间 注意:定时器周期512us_ __interrupt static void r_tau0_channel0_interrupt(void) { get_fre.cnt++; /*******2s 内未检测到电平跳变则清零********/ get_fre.timeout++; if(get_fre.timeout>=3906) { get_fre.timeout=0; get_fre.fre=0; get_fre.cnt=0; } } 2.3 瑞萨单片机外部中断函数 配置外中断,上升沿触发,最高优先级,最后点击生成代码即可 __interrupt static void r_intc0_interrupt(void) { get_fre.cnt_value=get_fre.cnt; get_fre.cnt=0; get_fre.timeout=0; get_fre.flag=1; } 2.4 例子 if(get_fre.flag) { get_fre.flag=0; /* 频率f=1/t get_fre.cnt_value<<9 =计数值*512us =周期 此时单位是 us,也就是MHz f=1000000/t,1 MHz =1000 000 Hz */ get_fre.fre =(10000000/(get_fre.cnt_value<<9)); //hz 为提高精度比真数据扩大10 } 2.5 图片 注意:实际程序中加了滤波算法单片机采集结果:74.9Hz |
|
|
|
|
只有小组成员才能发言,加入小组>>
1599 浏览 0 评论
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
4738 浏览 0 评论
4229 浏览 9 评论
3822 浏览 16 评论
4398 浏览 1 评论
4209浏览 3评论
2379浏览 0评论
3393浏览 0评论
1158浏览 0评论
2843浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 18:35 , Processed in 1.562191 second(s), Total 76, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1012